
Sessenta contêineres em um servidor
Uma caixa bare-metal executa dezenas a centenas de contêineres Hoody. KSM e BTRFS dedup fazem o custo marginal próximo a zero.
A maioria dos pipelines de CI queima dinheiro em tráfego de cache — push de artefatos para o S3, pull no próximo job, paga por armazenamento, paga por egress, paga de novo quando os runners trocam de região. Na Hoody, o cache é uma pasta no mesmo bare metal que roda seu contêiner de build. Push do tarball com curl. Pull com curl. Os bytes nunca saem da máquina.
os mesmos 47,2 GB de cache · duas faturas diferentes
O cache de CI inteiro são três comandos e um job de limpeza. PUT para escrever um tarball. GET para ler. find -atime para podar. Não tem quarta peça — sem IAM policy, sem bucket lifecycle, sem cerimônia de signed URL.
Após o install, o runner faz stream de node_modules por tar | zstd para um único PUT contra /files/cache. A Hoody escreve o body em disco como um único blob binário. Sem multipart, sem part-uploader, sem SDK.
O primeiro passo do próximo job é um curl. O body sai do NVMe na velocidade da linha porque o cache mora na mesma máquina física que o runner — sem hop de egress, sem pull cross-AZ, sem edge do CloudFront.
O Hoody Cron dispara uma vez por noite. find /files/cache -atime +30 -delete joga fora qualquer coisa que nenhum job leu em um mês. Sem política de retenção, sem tier do Glacier, sem JSON de lifecycle para manter.
PUT escreve. GET lê. find poda. A Files API da Hoody é o servidor de cache, o motor de cleanup e o audit log — tudo atrás da mesma URL /files/[path].
Empurrar o cache para um fornecedor separado fazia sentido quando armazenamento era escasso. Em um contêiner bare-metal, isso só adiciona um fornecedor.
O S3 cobra três medidores: armazenamento, egress e por-request. O Hoody Files vem com o contêiner — o disco que você já paga é o disco onde o cache fica. Os bytes nunca cruzam fronteira de cobrança.
As leituras saem da mesma máquina física que roda o build. Não há endpoint S3 para resolver, sem TLS handshake para uma região, sem rate limit de throughput de prefixo. Um Rust target de 1,4 GB é desempacotado em segundos.
Seu runner e seu cache moram na mesma instância, faturados na mesma invoice, debugados com a mesma sessão SSH. Quando você desliga o contêiner, o cache é a imagem de disco — de volta online no momento em que você o inicia.
Uma pegada típica de CI de tamanho médio movimenta cerca de 1,4 TB de tráfego de cache por mês. Aqui está o item de linha que isso cria na AWS, e o item de linha que cria na Hoody.
Quando o cache mora na máquina que roda o build, o medidor que o S3 estava rodando não tem nada para ler. O item de linha não se mexe porque não há transação para cobrar.
O Hoody Files não é um wrapper fino — é um backend persistente real com hashing, histórico, range reads e um journal de auditoria. O cache de CI usa uma fatia fina do que de fato está exposto.
PUT para escrever, GET para ler, HEAD para ETag e Content-Length, ?hash para SHA256, ?stat para metadata. O cache é a mesma família de endpoint que alimenta logs, builds e artefatos compartilhados.
Toda escrita passa pelo journal de arquivos. Pull do cache de ontem por timestamp ou por número de revisão por path — debugar um flake para de exigir uma ferramenta de snapshot separada.
Se o cache realmente precisar morar no S3, B2 ou em uma pasta do Drive, monte como backend e mantenha a mesma URL /files/[path]. O código do runner nunca muda — o cache só muda.
Os números refletem a superfície publicada da Files API da Hoody — `GET/PUT/HEAD/PATCH /api/v1/files/[path]`, os parâmetros de query `?hash`/`?stat`/`?at`/`?revision`/`?history` e os endpoints de journal de arquivos sob `/api/v1/journal`.
Seu cache de CI deixa de ser um fornecedor separado. É uma pasta na máquina que você já aluga.
Os backends de cache padrão cada um cobra de você uma relação de fornecedor, uma conta de egress ou uma taxa por build. O /files não cobra nenhum desses.
Pare de alugar um cache de uma segunda nuvem. Escreva o tarball no disco que você já paga, e curl de volta.