
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.
O Hoody Cron carrega o agendamento. O Hoody Exec carrega a lógica de renovação. Domingo às 04:00 um curl dispara, o certbot roda, o novo bundle é enviado via PATCH para o proxy, e o reload é confirmado. Sem sessão de shell, sem chave em ~/.ssh, sem jump host entre você e o certificado.
# weekly · Sunday 04:00 0 4 * * 0 bash /scripts/renew.shsemanal · POST uma vez · roda sozinho para sempre
sem chave SSH · sem jump host · o agendamento é uma linha numa API JSON
O pipeline inteiro de renovação é dois endpoints e um agendamento de 5 campos. O Cron dispara o Exec. O Exec chama a ACME e faz PATCH no proxy. A confirmação volta como 200.
POST /users/me/entries com schedule "0 4 * * 0" e command "curl /scripts/certs/renew". O serviço do cron escreve no crontab do usuário e começa a marcar. Você fez isso uma vez, de qualquer lugar com HTTPS.
Domingo 04:00, o cron faz curl na URL do exec. O Exec sobe o script, conversa com o endpoint ACME do Let's Encrypt, valida o desafio http-01 e escreve o bundle renovado em /files. Sem nó logando, sem sessão necessária.
O script faz PATCH do novo cert e key no endpoint de bundle do proxy Hoody. O proxy recarrega a quente — sem restart — e o próximo handshake TLS serve o novo certificado. O ciclo inteiro fica em menos de um minuto.
Cada passo é uma chamada HTTP que você pode replay de um terminal — `curl --dry-run` se quiser depurar, `curl -i` se quiser os headers. O pipeline não depende de uma sessão logada em nenhum momento.
À esquerda, a entrada de cron que agenda o job. À direita, o script exec que faz o trabalho. Ambos endereçáveis por HTTP — ambos auditáveis, ambos replicáveis a partir de qualquer laptop ou celular.
# register the weekly renewal curl -X POST \ https://cron.containers.hoody.com/users/me/entries \ -H "Content-Type: application/json" \ -d '[ "schedule":"0 4 * * 0", "command":"curl -fsS https://exec.containers.hoody.com/scripts/certs/renew", "comment":"weekly TLS renewal", "enabled":true ]' # response HTTP/1.1 201 Created { "id":"7a92", "schedule":"0 4 * * 0", "enabled":true }
// scripts/certs/renew.ts // @mode serverless // @timeout 120000 const domains = ["your-app.com", "api.your-app.com", ...]; for (const d of domains) { const cert = await acme.order(d); await fetch("/api/v1/proxy/cert/bundle", { method: "PATCH", body: JSON.stringify({ d, cert }) }); } return { "renewed": domains.length };
Duas URLs, uma manhã de domingo, zero SSH. A entrada de cron é dado — POST uma vez e ela está lá até você dar DELETE. O script exec é um arquivo — altere via API e a próxima execução pega a nova lógica. Nada nesse loop exige uma pessoa em uma máquina.
Mesmo resultado — um certificado renovado toda semana — com três propriedades que o setup legado nunca teve.
Auth é um token de URL, não uma chave SSH. Rotacione via API e o token antigo para de funcionar em todo lugar de uma vez. Sem agent forwarding, sem bastion, sem arquivo de chave que você esqueceu que copiou para uma máquina de CI três anos atrás.
Cada execução é uma linha no log do cron e uma linha de requisição no log do exec. Grepe por quem disparou, quando, qual cert, qual response code. O 200 do proxy é o recibo de que o reload aterrissou.
Replay a renovação do seu laptop com `curl /scripts/certs/renew?dry_run=true`. Veja a resposta, conserte o script via API de escrita do exec, tente de novo. O loop inteiro acontece sobre HTTPS — o mesmo cano que o agendamento de produção usa.
Números do deployment, não benchmarks. A forma é o que importa: pouquíssimas peças móveis, todas falando HTTP.
Setup é um POST. Renovação é um GET no agendamento. Debug é um curl. Não há sessão de shell no pipeline em momento algum — sua chave privada nunca precisa estar na máquina.
Uma entrada de cron para agendar a execução. Uma rota exec que roda o script. A terceira URL — o PATCH no bundle do proxy — vive dentro do script e recarrega o cert.
Expressão padrão de 5 campos "0 4 * * 0" — domingo 04:00. Ou `@weekly` se você não se importa com o dia. O serviço do cron aceita ambos, mais auto-expiração para renovações de uma só vez.
Serviço de cron: expressões de 5 campos e macros (`@hourly`, `@daily`, `@weekly`, `@monthly`, `@yearly`), isolamento por usuário, `expires_at` opcional. Exec: V8 isolates, runtime Bun, magic comments para mode/timeout/CORS. Fluxo ACME tratado no seu script — o Hoody não roda o certbot por você, ele roda o seu código no agendamento.
Renovação é um curl no agendamento — sem sessão de shell, sem chave, sem jump host.
Os jeitos padrão de manter TLS válido em produção. Cada um quer ou uma sessão de shell, ou um serviço de control-plane, ou os dois. O par cron-mais-exec não quer nenhum.
Pare de logar para renovar certs. POST o agendamento uma vez. Veja o proxy se recarregar todo domingo de manhã.