[{"data":1,"prerenderedAt":31518},["ShallowReactive",2],{"tag-open-source":3},[4,3395,4411,5381,6399,7516,8779,11792,12757,13851,14950,15818,16740,17817,18377,19115,19803,20403,21765,22486,23039,23631,24187,25349,25902,26425,27071,27527,28319,29016,29778,30388,31063],{"id":5,"title":6,"author":7,"body":8,"category":3379,"cover":3380,"date":3381,"description":3382,"draft":3383,"extension":3384,"lastReviewed":3380,"meta":3385,"navigation":411,"path":3386,"readingTime":3387,"seo":3388,"sitemap":3389,"stem":3390,"tags":3391,"__hash__":3394},"blog_pt\u002Fblog\u002Fdeploy-zero-downtime-sem-kubernetes-tutorial.md","Deploy zero-downtime sem Kubernetes: tutorial prático em 2026","Equipe HeroCtl",{"type":9,"value":10,"toc":3354},"minimark",[11,15,18,23,39,42,56,59,63,66,88,91,95,102,105,108,111,115,118,205,208,211,213,217,220,223,275,286,289,314,317,339,346,350,357,367,372,916,920,1000,1004,1080,1094,1097,1101,1104,1140,1143,1208,1211,1236,1239,1243,1246,1249,1252,1266,1273,1363,1369,1372,1434,1440,1457,1460,1464,1467,2346,2357,2383,2386,2444,2447,2451,2454,2457,2506,2509,2520,2525,2533,2536,2538,2542,2545,2607,2611,2618,2624,2638,2710,2713,2727,2731,2734,2755,2758,2762,2765,2783,2786,2790,2793,2941,2944,2947,2968,2971,2975,3168,3171,3175,3223,3227,3232,3239,3244,3247,3252,3255,3260,3266,3271,3274,3279,3285,3290,3293,3298,3305,3307,3311,3314,3317,3333,3347,3350],[12,13,14],"p",{},"Tem um mito persistente que zero-downtime deploy é exclusividade de quem rodou Kubernetes em produção. Não é. A técnica existe desde antes do colosso ter nome — qualquer time que rodou um par de servidores físicos atrás de um balanceador na década passada já fazia isso, com scripts de cinquenta linhas e nenhum CRD na vida. O que mudou foi o marketing em volta da prática, não a prática em si.",[12,16,17],{},"Esse post é um tutorial passo a passo pra montar deploy sem downtime do zero, em duas máquinas Linux, sem orquestrador pesado, sem painel mágico. No fim você vai ter um script de bash que troca uma instância por vez, espera a nova ficar saudável, e rola pra próxima — exatamente o algoritmo que orquestradores grandes implementam, só que sem o boilerplate.",[19,20,22],"h2",{"id":21},"tldr","TL;DR",[12,24,25,26,30,31,34,35,38],{},"Zero-downtime deploy depende de três ingredientes, não de uma ferramenta específica. Primeiro: ",[27,28,29],"strong",{},"duas ou mais instâncias da aplicação rodando em paralelo",", atrás de um proxy básico. Segundo: ",[27,32,33],{},"um endpoint de health check confiável"," que valida dependências reais (banco, cache, fila), não só responde 200 instantaneamente. Terceiro: ",[27,36,37],{},"um script ou orquestrador que substitua um contêiner por vez",", esperando o novo ficar saudável antes de prosseguir pro próximo.",[12,40,41],{},"Esse tutorial monta o setup completo em duas VPS Linux com Docker, Caddy na frente como proxy + balanceador, e um script bash de cinquenta linhas que faz rolling update com health check ativo, tempo mínimo saudável, e rollback automático se falhar. Resultado: deploy sem 5xx visível pro usuário, em menos de um minuto, sem janela de manutenção.",[12,43,44,47,48,51,52,55],{},[27,45,46],{},"Pré-requisitos:"," duas VPS Linux com Docker (Hetzner CPX11 a R$30 cada), domínio com DNS controlável, app com health check decente. ",[27,49,50],{},"Tempo de setup:"," duas a três horas. ",[27,53,54],{},"Custo mensal:"," R$60 (R$75 se você quiser uma terceira VPS dedicada ao proxy). No fim mostramos a versão \"robusta\" via HeroCtl pra quem quer parar de scriptar.",[57,58],"hr",{},[19,60,62],{"id":61},"os-tres-ingredientes-sem-isso-nao-e-zero-downtime","Os três ingredientes (sem isso, não é zero-downtime)",[12,64,65],{},"Antes de qualquer comando, vale fixar a teoria — porque toda configuração mais elaborada que você vai ver na internet é variação dessas três peças.",[67,68,69,76,82],"ol",{},[70,71,72,75],"li",{},[27,73,74],{},"Múltiplas instâncias da app rodando em paralelo."," Mínimo dois. Se você só tem uma, qualquer reinício é janela de erro. Não tem como contornar isso com truque de configuração.",[70,77,78,81],{},[27,79,80],{},"Um proxy\u002Fbalanceador na frente, fazendo health check."," O proxy decide pra qual instância mandar tráfego. Se uma cai (ou foi tirada deliberadamente pro deploy), o proxy só manda pras restantes.",[70,83,84,87],{},[27,85,86],{},"Um script que troca instâncias uma por vez."," Nunca todas juntas. Espera a nova ficar saudável antes de mexer na próxima. Se a nova falha, para o deploy e mantém as antigas servindo.",[12,89,90],{},"É só isso. O resto — Kubernetes, painéis modernos, orquestradores leves — é embalagem em volta desses três pontos.",[19,92,94],{"id":93},"por-que-single-server-nunca-e-zero-downtime-mesmo-se-for-rapido","Por que single-server NUNCA é zero-downtime (mesmo se for rápido)",[12,96,97,98,101],{},"Vejo essa pergunta toda semana no Discord da comunidade: \"consigo zero-downtime com um servidor só, se o deploy for rápido o suficiente?\". Resposta curta: ",[27,99,100],{},"não",".",[12,103,104],{},"Numa máquina única, o ciclo de deploy é: para o contêiner antigo, sobe o novo. Mesmo que tudo aconteça em três segundos, esses três segundos existem. Conexões TCP em curso são cortadas. Requisições que chegam nesse intervalo levam connection refused ou 502. Se você tem cinco requests por segundo, são quinze usuários vendo erro a cada deploy.",[12,106,107],{},"Tem variação esperta — subir o novo numa porta diferente, mudar o proxy local, derrubar o antigo. Isso melhora, mas não elimina. Se a app demora pra fechar conexões em curso, o cutover ainda gera erros. Se health check é fraco, o proxy aponta tráfego pra app que ainda não terminou de subir. Sempre tem uma janela.",[12,109,110],{},"A única forma confiável de eliminar a janela é ter pelo menos uma instância sempre disponível durante todo o deploy. Isso exige duas máquinas. Ponto.",[19,112,114],{"id":113},"o-setup-minimo-duas-vps-um-proxy","O setup mínimo (duas VPS + um proxy)",[12,116,117],{},"A topologia mais barata que entrega zero-downtime real:",[119,120,121,140],"table",{},[122,123,124],"thead",{},[125,126,127,131,134,137],"tr",{},[128,129,130],"th",{},"Componente",[128,132,133],{},"Tamanho",[128,135,136],{},"Custo",[128,138,139],{},"Função",[141,142,143,158,170,189],"tbody",{},[125,144,145,149,152,155],{},[146,147,148],"td",{},"VPS A",[146,150,151],{},"2 vCPU \u002F 2 GB RAM",[146,153,154],{},"R$30\u002Fmês",[146,156,157],{},"App instância 1",[125,159,160,163,165,167],{},[146,161,162],{},"VPS B",[146,164,151],{},[146,166,154],{},[146,168,169],{},"App instância 2",[125,171,172,175,183,186],{},[146,173,174],{},"Proxy",[146,176,177,178,182],{},"rodando em VPS A ",[179,180,181],"em",{},"ou"," terceira VPS",[146,184,185],{},"R$0 (compartilhado) ou R$15\u002Fmês",[146,187,188],{},"Caddy\u002Fnginx fazendo balance",[125,190,191,194,199,202],{},[146,192,193],{},"Banco",[146,195,196,197,182],{},"Postgres gerenciado ",[179,198,181],{},[146,200,201],{},"varia",[146,203,204],{},"Estado compartilhado entre A e B",[12,206,207],{},"Ter o proxy compartilhado em uma das próprias VPS economiza, mas tem trade-off: se a VPS que hospeda o proxy cair inteira, o site cai junto (mesmo com a outra VPS rodando). Pra time pequeno isso é aceitável. Quando crescer, o proxy migra pra VPS dedicada ou vira par redundante.",[12,209,210],{},"DNS A record do seu domínio aponta pro IP do proxy. Apps em A e B se conectam ao mesmo banco — sem essa parte compartilhada, as duas instâncias divergem e o usuário vê resultado diferente dependendo de qual respondeu.",[57,212],{},[19,214,216],{"id":215},"passo-1-provisionar-duas-vps-15-min","Passo 1 — Provisionar duas VPS (15 min)",[12,218,219],{},"Eu uso Hetzner CPX11 (€4,75 ≈ R$30) como referência. DigitalOcean Droplet de US$6, Vultr Cloud Compute de US$6 ou Linode Nanode de US$5 entregam algo parecido. O importante é Linux moderno (Ubuntu 24.04 LTS ou Debian 12) com Docker.",[12,221,222],{},"Provisione as duas máquinas com a mesma chave SSH:",[224,225,230],"pre",{"className":226,"code":227,"language":228,"meta":229,"style":229},"language-bash shiki shiki-themes github-dark-default","# do seu laptop\nssh-keygen -t ed25519 -f ~\u002F.ssh\u002Fdeploy_key -C \"deploy@meudominio.com\"\n# adicione ~\u002F.ssh\u002Fdeploy_key.pub na console do provedor antes de criar a VPS\n","bash","",[231,232,233,242,269],"code",{"__ignoreMap":229},[234,235,238],"span",{"class":236,"line":237},"line",1,[234,239,241],{"class":240},"sH3jZ","# do seu laptop\n",[234,243,245,249,253,257,260,263,266],{"class":236,"line":244},2,[234,246,248],{"class":247},"sQhOw","ssh-keygen",[234,250,252],{"class":251},"sFSAA"," -t",[234,254,256],{"class":255},"s9uIt"," ed25519",[234,258,259],{"class":251}," -f",[234,261,262],{"class":255}," ~\u002F.ssh\u002Fdeploy_key",[234,264,265],{"class":251}," -C",[234,267,268],{"class":255}," \"deploy@meudominio.com\"\n",[234,270,272],{"class":236,"line":271},3,[234,273,274],{"class":240},"# adicione ~\u002F.ssh\u002Fdeploy_key.pub na console do provedor antes de criar a VPS\n",[12,276,277,278,281,282,285],{},"Crie cada VPS, anote os IPs. Vou usar ",[231,279,280],{},"203.0.113.10"," (VPS A) e ",[231,283,284],{},"203.0.113.20"," (VPS B) como placeholders no resto do post.",[12,287,288],{},"Instale Docker em cada uma:",[224,290,292],{"className":226,"code":291,"language":228,"meta":229,"style":229},"ssh root@203.0.113.10 \"curl -fsSL https:\u002F\u002Fget.docker.com | sh\"\nssh root@203.0.113.20 \"curl -fsSL https:\u002F\u002Fget.docker.com | sh\"\n",[231,293,294,305],{"__ignoreMap":229},[234,295,296,299,302],{"class":236,"line":237},[234,297,298],{"class":247},"ssh",[234,300,301],{"class":255}," root@203.0.113.10",[234,303,304],{"class":255}," \"curl -fsSL https:\u002F\u002Fget.docker.com | sh\"\n",[234,306,307,309,312],{"class":236,"line":244},[234,308,298],{"class":247},[234,310,311],{"class":255}," root@203.0.113.20",[234,313,304],{"class":255},[12,315,316],{},"Configure firewall pra permitir só 22 (SSH) e 8080 (porta interna onde a app vai escutar). Tráfego HTTP\u002FHTTPS chega só no proxy:",[224,318,320],{"className":226,"code":319,"language":228,"meta":229,"style":229},"ssh root@203.0.113.10 \"ufw allow 22 && ufw allow 8080\u002Ftcp && ufw --force enable\"\nssh root@203.0.113.20 \"ufw allow 22 && ufw allow 8080\u002Ftcp && ufw --force enable\"\n",[231,321,322,331],{"__ignoreMap":229},[234,323,324,326,328],{"class":236,"line":237},[234,325,298],{"class":247},[234,327,301],{"class":255},[234,329,330],{"class":255}," \"ufw allow 22 && ufw allow 8080\u002Ftcp && ufw --force enable\"\n",[234,332,333,335,337],{"class":236,"line":244},[234,334,298],{"class":247},[234,336,311],{"class":255},[234,338,330],{"class":255},[12,340,341,342,345],{},"Validação: ",[231,343,344],{},"docker run --rm hello-world"," em cada máquina deve completar sem erro.",[19,347,349],{"id":348},"passo-2-app-com-health-check-decente-30-min","Passo 2 — App com health check decente (30 min)",[12,351,352,353,356],{},"O endpoint ",[231,354,355],{},"\u002Fhealthz"," é o coração do esquema. Se ele retorna 200 quando a app não está realmente pronta, o proxy manda tráfego pra instância quebrada e o usuário vê erro. Se ele retorna 500 quando a app está saudável, o proxy tira a instância boa do balanceamento. Ou seja: o health check é a fonte de verdade do sistema inteiro.",[12,358,359,360,362,363,366],{},"Regra de ouro: o ",[231,361,355],{}," valida ",[27,364,365],{},"dependências reais que a app precisa pra responder",". Mínimo: conexão com o banco. Se você tem cache (Redis), inclui. Se você tem fila (SQS, RabbitMQ), inclui. NÃO retorne 200 logo no boot — espere assets compilarem, cache aquecer, conexões abrirem.",[368,369,371],"h3",{"id":370},"nodejs-express","Node.js (Express)",[224,373,377],{"className":374,"code":375,"language":376,"meta":229,"style":229},"language-js shiki shiki-themes github-dark-default","import express from \"express\"\nimport { Pool } from \"pg\"\n\nconst app = express()\nconst pool = new Pool({ connectionString: process.env.DATABASE_URL })\n\nlet ready = false\n\n\u002F\u002F warm-up assíncrono — só fica ready quando dependencies validam\n;(async () => {\n  await pool.query(\"SELECT 1\")\n  \u002F\u002F outras inicializações: cache prime, etc.\n  ready = true\n})()\n\napp.get(\"\u002Fhealthz\", async (_req, res) => {\n  if (!ready) return res.status(503).send(\"warming up\")\n  try {\n    await pool.query(\"SELECT 1\")\n    res.status(200).send(\"ok\")\n  } catch (e) {\n    res.status(503).send(\"db down\")\n  }\n})\n\napp.get(\"\u002F\", (_req, res) => res.send(\"Hello v1\"))\n\nconst server = app.listen(8080, () => console.log(\"listening 8080\"))\n\n\u002F\u002F graceful shutdown — drena conexões antes de morrer\nprocess.on(\"SIGTERM\", () => {\n  ready = false  \u002F\u002F health check passa a falhar imediatamente\n  setTimeout(() => {\n    server.close(() => process.exit(0))\n  }, 5000)  \u002F\u002F 5s pro proxy notar e parar de mandar tráfego novo\n})\n","js",[231,378,379,395,407,413,432,457,462,477,482,488,506,527,533,544,550,555,592,633,641,657,681,693,715,721,727,732,769,774,813,818,824,844,857,870,896,911],{"__ignoreMap":229},[234,380,381,385,389,392],{"class":236,"line":237},[234,382,384],{"class":383},"suJrU","import",[234,386,388],{"class":387},"sZEs4"," express ",[234,390,391],{"class":383},"from",[234,393,394],{"class":255}," \"express\"\n",[234,396,397,399,402,404],{"class":236,"line":244},[234,398,384],{"class":383},[234,400,401],{"class":387}," { Pool } ",[234,403,391],{"class":383},[234,405,406],{"class":255}," \"pg\"\n",[234,408,409],{"class":236,"line":271},[234,410,412],{"emptyLinePlaceholder":411},true,"\n",[234,414,416,419,422,425,429],{"class":236,"line":415},4,[234,417,418],{"class":383},"const",[234,420,421],{"class":251}," app",[234,423,424],{"class":383}," =",[234,426,428],{"class":427},"sc3cj"," express",[234,430,431],{"class":387},"()\n",[234,433,435,437,440,442,445,448,451,454],{"class":236,"line":434},5,[234,436,418],{"class":383},[234,438,439],{"class":251}," pool",[234,441,424],{"class":383},[234,443,444],{"class":383}," new",[234,446,447],{"class":427}," Pool",[234,449,450],{"class":387},"({ connectionString: process.env.",[234,452,453],{"class":251},"DATABASE_URL",[234,455,456],{"class":387}," })\n",[234,458,460],{"class":236,"line":459},6,[234,461,412],{"emptyLinePlaceholder":411},[234,463,465,468,471,474],{"class":236,"line":464},7,[234,466,467],{"class":383},"let",[234,469,470],{"class":387}," ready ",[234,472,473],{"class":383},"=",[234,475,476],{"class":251}," false\n",[234,478,480],{"class":236,"line":479},8,[234,481,412],{"emptyLinePlaceholder":411},[234,483,485],{"class":236,"line":484},9,[234,486,487],{"class":240},"\u002F\u002F warm-up assíncrono — só fica ready quando dependencies validam\n",[234,489,491,494,497,500,503],{"class":236,"line":490},10,[234,492,493],{"class":387},";(",[234,495,496],{"class":383},"async",[234,498,499],{"class":387}," () ",[234,501,502],{"class":383},"=>",[234,504,505],{"class":387}," {\n",[234,507,509,512,515,518,521,524],{"class":236,"line":508},11,[234,510,511],{"class":383},"  await",[234,513,514],{"class":387}," pool.",[234,516,517],{"class":427},"query",[234,519,520],{"class":387},"(",[234,522,523],{"class":255},"\"SELECT 1\"",[234,525,526],{"class":387},")\n",[234,528,530],{"class":236,"line":529},12,[234,531,532],{"class":240},"  \u002F\u002F outras inicializações: cache prime, etc.\n",[234,534,536,539,541],{"class":236,"line":535},13,[234,537,538],{"class":387},"  ready ",[234,540,473],{"class":383},[234,542,543],{"class":251}," true\n",[234,545,547],{"class":236,"line":546},14,[234,548,549],{"class":387},"})()\n",[234,551,553],{"class":236,"line":552},15,[234,554,412],{"emptyLinePlaceholder":411},[234,556,558,561,564,566,569,572,574,577,580,582,585,588,590],{"class":236,"line":557},16,[234,559,560],{"class":387},"app.",[234,562,563],{"class":427},"get",[234,565,520],{"class":387},[234,567,568],{"class":255},"\"\u002Fhealthz\"",[234,570,571],{"class":387},", ",[234,573,496],{"class":383},[234,575,576],{"class":387}," (",[234,578,579],{"class":247},"_req",[234,581,571],{"class":387},[234,583,584],{"class":247},"res",[234,586,587],{"class":387},") ",[234,589,502],{"class":383},[234,591,505],{"class":387},[234,593,595,598,600,603,606,609,612,615,617,620,623,626,628,631],{"class":236,"line":594},17,[234,596,597],{"class":383},"  if",[234,599,576],{"class":387},[234,601,602],{"class":383},"!",[234,604,605],{"class":387},"ready) ",[234,607,608],{"class":383},"return",[234,610,611],{"class":387}," res.",[234,613,614],{"class":427},"status",[234,616,520],{"class":387},[234,618,619],{"class":251},"503",[234,621,622],{"class":387},").",[234,624,625],{"class":427},"send",[234,627,520],{"class":387},[234,629,630],{"class":255},"\"warming up\"",[234,632,526],{"class":387},[234,634,636,639],{"class":236,"line":635},18,[234,637,638],{"class":383},"  try",[234,640,505],{"class":387},[234,642,644,647,649,651,653,655],{"class":236,"line":643},19,[234,645,646],{"class":383},"    await",[234,648,514],{"class":387},[234,650,517],{"class":427},[234,652,520],{"class":387},[234,654,523],{"class":255},[234,656,526],{"class":387},[234,658,660,663,665,667,670,672,674,676,679],{"class":236,"line":659},20,[234,661,662],{"class":387},"    res.",[234,664,614],{"class":427},[234,666,520],{"class":387},[234,668,669],{"class":251},"200",[234,671,622],{"class":387},[234,673,625],{"class":427},[234,675,520],{"class":387},[234,677,678],{"class":255},"\"ok\"",[234,680,526],{"class":387},[234,682,684,687,690],{"class":236,"line":683},21,[234,685,686],{"class":387},"  } ",[234,688,689],{"class":383},"catch",[234,691,692],{"class":387}," (e) {\n",[234,694,696,698,700,702,704,706,708,710,713],{"class":236,"line":695},22,[234,697,662],{"class":387},[234,699,614],{"class":427},[234,701,520],{"class":387},[234,703,619],{"class":251},[234,705,622],{"class":387},[234,707,625],{"class":427},[234,709,520],{"class":387},[234,711,712],{"class":255},"\"db down\"",[234,714,526],{"class":387},[234,716,718],{"class":236,"line":717},23,[234,719,720],{"class":387},"  }\n",[234,722,724],{"class":236,"line":723},24,[234,725,726],{"class":387},"})\n",[234,728,730],{"class":236,"line":729},25,[234,731,412],{"emptyLinePlaceholder":411},[234,733,735,737,739,741,744,747,749,751,753,755,757,759,761,763,766],{"class":236,"line":734},26,[234,736,560],{"class":387},[234,738,563],{"class":427},[234,740,520],{"class":387},[234,742,743],{"class":255},"\"\u002F\"",[234,745,746],{"class":387},", (",[234,748,579],{"class":247},[234,750,571],{"class":387},[234,752,584],{"class":247},[234,754,587],{"class":387},[234,756,502],{"class":383},[234,758,611],{"class":387},[234,760,625],{"class":427},[234,762,520],{"class":387},[234,764,765],{"class":255},"\"Hello v1\"",[234,767,768],{"class":387},"))\n",[234,770,772],{"class":236,"line":771},27,[234,773,412],{"emptyLinePlaceholder":411},[234,775,777,779,782,784,787,790,792,795,798,800,803,806,808,811],{"class":236,"line":776},28,[234,778,418],{"class":383},[234,780,781],{"class":251}," server",[234,783,424],{"class":383},[234,785,786],{"class":387}," app.",[234,788,789],{"class":427},"listen",[234,791,520],{"class":387},[234,793,794],{"class":251},"8080",[234,796,797],{"class":387},", () ",[234,799,502],{"class":383},[234,801,802],{"class":387}," console.",[234,804,805],{"class":427},"log",[234,807,520],{"class":387},[234,809,810],{"class":255},"\"listening 8080\"",[234,812,768],{"class":387},[234,814,816],{"class":236,"line":815},29,[234,817,412],{"emptyLinePlaceholder":411},[234,819,821],{"class":236,"line":820},30,[234,822,823],{"class":240},"\u002F\u002F graceful shutdown — drena conexões antes de morrer\n",[234,825,827,830,833,835,838,840,842],{"class":236,"line":826},31,[234,828,829],{"class":387},"process.",[234,831,832],{"class":427},"on",[234,834,520],{"class":387},[234,836,837],{"class":255},"\"SIGTERM\"",[234,839,797],{"class":387},[234,841,502],{"class":383},[234,843,505],{"class":387},[234,845,847,849,851,854],{"class":236,"line":846},32,[234,848,538],{"class":387},[234,850,473],{"class":383},[234,852,853],{"class":251}," false",[234,855,856],{"class":240},"  \u002F\u002F health check passa a falhar imediatamente\n",[234,858,860,863,866,868],{"class":236,"line":859},33,[234,861,862],{"class":427},"  setTimeout",[234,864,865],{"class":387},"(() ",[234,867,502],{"class":383},[234,869,505],{"class":387},[234,871,873,876,879,881,883,886,889,891,894],{"class":236,"line":872},34,[234,874,875],{"class":387},"    server.",[234,877,878],{"class":427},"close",[234,880,865],{"class":387},[234,882,502],{"class":383},[234,884,885],{"class":387}," process.",[234,887,888],{"class":427},"exit",[234,890,520],{"class":387},[234,892,893],{"class":251},"0",[234,895,768],{"class":387},[234,897,899,902,905,908],{"class":236,"line":898},35,[234,900,901],{"class":387},"  }, ",[234,903,904],{"class":251},"5000",[234,906,907],{"class":387},")  ",[234,909,910],{"class":240},"\u002F\u002F 5s pro proxy notar e parar de mandar tráfego novo\n",[234,912,914],{"class":236,"line":913},36,[234,915,726],{"class":387},[368,917,919],{"id":918},"python-django-gunicorn","Python (Django + gunicorn)",[224,921,925],{"className":922,"code":923,"language":924,"meta":229,"style":229},"language-python shiki shiki-themes github-dark-default","# health\u002Fviews.py\nfrom django.db import connection\nfrom django.http import JsonResponse, HttpResponse\nimport redis, os\n\n_r = redis.from_url(os.environ[\"REDIS_URL\"])\n\ndef healthz(request):\n    try:\n        with connection.cursor() as c:\n            c.execute(\"SELECT 1\")\n        _r.ping()\n        return HttpResponse(\"ok\", status=200)\n    except Exception as e:\n        return HttpResponse(f\"unhealthy: {e}\", status=503)\n","python",[231,926,927,932,937,942,947,951,956,960,965,970,975,980,985,990,995],{"__ignoreMap":229},[234,928,929],{"class":236,"line":237},[234,930,931],{},"# health\u002Fviews.py\n",[234,933,934],{"class":236,"line":244},[234,935,936],{},"from django.db import connection\n",[234,938,939],{"class":236,"line":271},[234,940,941],{},"from django.http import JsonResponse, HttpResponse\n",[234,943,944],{"class":236,"line":415},[234,945,946],{},"import redis, os\n",[234,948,949],{"class":236,"line":434},[234,950,412],{"emptyLinePlaceholder":411},[234,952,953],{"class":236,"line":459},[234,954,955],{},"_r = redis.from_url(os.environ[\"REDIS_URL\"])\n",[234,957,958],{"class":236,"line":464},[234,959,412],{"emptyLinePlaceholder":411},[234,961,962],{"class":236,"line":479},[234,963,964],{},"def healthz(request):\n",[234,966,967],{"class":236,"line":484},[234,968,969],{},"    try:\n",[234,971,972],{"class":236,"line":490},[234,973,974],{},"        with connection.cursor() as c:\n",[234,976,977],{"class":236,"line":508},[234,978,979],{},"            c.execute(\"SELECT 1\")\n",[234,981,982],{"class":236,"line":529},[234,983,984],{},"        _r.ping()\n",[234,986,987],{"class":236,"line":535},[234,988,989],{},"        return HttpResponse(\"ok\", status=200)\n",[234,991,992],{"class":236,"line":546},[234,993,994],{},"    except Exception as e:\n",[234,996,997],{"class":236,"line":552},[234,998,999],{},"        return HttpResponse(f\"unhealthy: {e}\", status=503)\n",[368,1001,1003],{"id":1002},"ruby-rails","Ruby (Rails)",[224,1005,1009],{"className":1006,"code":1007,"language":1008,"meta":229,"style":229},"language-ruby shiki shiki-themes github-dark-default","# config\u002Froutes.rb\nget \"\u002Fhealthz\", to: \"health#show\"\n\n# app\u002Fcontrollers\u002Fhealth_controller.rb\nclass HealthController \u003C ApplicationController\n  def show\n    ActiveRecord::Base.connection.execute(\"SELECT 1\")\n    Rails.cache.read(\"__healthcheck__\")\n    head :ok\n  rescue => e\n    Rails.logger.warn(\"healthcheck failed: #{e.message}\")\n    head :service_unavailable\n  end\nend\n","ruby",[231,1010,1011,1016,1021,1025,1030,1035,1040,1045,1050,1055,1060,1065,1070,1075],{"__ignoreMap":229},[234,1012,1013],{"class":236,"line":237},[234,1014,1015],{},"# config\u002Froutes.rb\n",[234,1017,1018],{"class":236,"line":244},[234,1019,1020],{},"get \"\u002Fhealthz\", to: \"health#show\"\n",[234,1022,1023],{"class":236,"line":271},[234,1024,412],{"emptyLinePlaceholder":411},[234,1026,1027],{"class":236,"line":415},[234,1028,1029],{},"# app\u002Fcontrollers\u002Fhealth_controller.rb\n",[234,1031,1032],{"class":236,"line":434},[234,1033,1034],{},"class HealthController \u003C ApplicationController\n",[234,1036,1037],{"class":236,"line":459},[234,1038,1039],{},"  def show\n",[234,1041,1042],{"class":236,"line":464},[234,1043,1044],{},"    ActiveRecord::Base.connection.execute(\"SELECT 1\")\n",[234,1046,1047],{"class":236,"line":479},[234,1048,1049],{},"    Rails.cache.read(\"__healthcheck__\")\n",[234,1051,1052],{"class":236,"line":484},[234,1053,1054],{},"    head :ok\n",[234,1056,1057],{"class":236,"line":490},[234,1058,1059],{},"  rescue => e\n",[234,1061,1062],{"class":236,"line":508},[234,1063,1064],{},"    Rails.logger.warn(\"healthcheck failed: #{e.message}\")\n",[234,1066,1067],{"class":236,"line":529},[234,1068,1069],{},"    head :service_unavailable\n",[234,1071,1072],{"class":236,"line":535},[234,1073,1074],{},"  end\n",[234,1076,1077],{"class":236,"line":546},[234,1078,1079],{},"end\n",[12,1081,1082,1083,1086,1087,1090,1091,1093],{},"O detalhe que diferencia health check amador de profissional é o ",[27,1084,1085],{},"graceful shutdown",": ao receber ",[231,1088,1089],{},"SIGTERM",", a app passa a retornar 503 no ",[231,1092,355],{}," imediatamente, mas continua aceitando conexões em curso por mais alguns segundos. O proxy nota o 503, para de mandar tráfego novo, e quando o app finalmente fecha não tem mais ninguém esperando resposta.",[12,1095,1096],{},"Sem isso, o cutover sempre vaza alguns erros mesmo com tudo o resto certo.",[19,1098,1100],{"id":1099},"passo-3-subir-duas-instancias-docker-15-min","Passo 3 — Subir duas instâncias Docker (15 min)",[12,1102,1103],{},"Faça build da sua app em imagem Docker. Pro tutorial vou usar uma imagem genérica que você substitui:",[224,1105,1107],{"className":226,"code":1106,"language":228,"meta":229,"style":229},"# no seu laptop, push pra registry (Docker Hub, ECR, GHCR)\ndocker build -t meuusuario\u002Fmyapp:v1 .\ndocker push meuusuario\u002Fmyapp:v1\n",[231,1108,1109,1114,1130],{"__ignoreMap":229},[234,1110,1111],{"class":236,"line":237},[234,1112,1113],{"class":240},"# no seu laptop, push pra registry (Docker Hub, ECR, GHCR)\n",[234,1115,1116,1119,1122,1124,1127],{"class":236,"line":244},[234,1117,1118],{"class":247},"docker",[234,1120,1121],{"class":255}," build",[234,1123,252],{"class":251},[234,1125,1126],{"class":255}," meuusuario\u002Fmyapp:v1",[234,1128,1129],{"class":255}," .\n",[234,1131,1132,1134,1137],{"class":236,"line":271},[234,1133,1118],{"class":247},[234,1135,1136],{"class":255}," push",[234,1138,1139],{"class":255}," meuusuario\u002Fmyapp:v1\n",[12,1141,1142],{},"Sobe instância em VPS A:",[224,1144,1146],{"className":226,"code":1145,"language":228,"meta":229,"style":229},"ssh root@203.0.113.10 \"\n  docker pull meuusuario\u002Fmyapp:v1 &&\n  docker run -d --name app --restart=unless-stopped \\\n    -p 8080:8080 \\\n    -e DATABASE_URL='postgres:\u002F\u002Fuser:pass@db.example.com:5432\u002Fapp' \\\n    --health-cmd='curl -f http:\u002F\u002Flocalhost:8080\u002Fhealthz || exit 1' \\\n    --health-interval=5s --health-timeout=2s --health-retries=3 \\\n    meuusuario\u002Fmyapp:v1\n\"\n",[231,1147,1148,1157,1162,1170,1177,1184,1191,1198,1203],{"__ignoreMap":229},[234,1149,1150,1152,1154],{"class":236,"line":237},[234,1151,298],{"class":247},[234,1153,301],{"class":255},[234,1155,1156],{"class":255}," \"\n",[234,1158,1159],{"class":236,"line":244},[234,1160,1161],{"class":255},"  docker pull meuusuario\u002Fmyapp:v1 &&\n",[234,1163,1164,1167],{"class":236,"line":271},[234,1165,1166],{"class":255},"  docker run -d --name app --restart=unless-stopped ",[234,1168,1169],{"class":383},"\\\n",[234,1171,1172,1175],{"class":236,"line":415},[234,1173,1174],{"class":255},"    -p 8080:8080 ",[234,1176,1169],{"class":383},[234,1178,1179,1182],{"class":236,"line":434},[234,1180,1181],{"class":255},"    -e DATABASE_URL='postgres:\u002F\u002Fuser:pass@db.example.com:5432\u002Fapp' ",[234,1183,1169],{"class":383},[234,1185,1186,1189],{"class":236,"line":459},[234,1187,1188],{"class":255},"    --health-cmd='curl -f http:\u002F\u002Flocalhost:8080\u002Fhealthz || exit 1' ",[234,1190,1169],{"class":383},[234,1192,1193,1196],{"class":236,"line":464},[234,1194,1195],{"class":255},"    --health-interval=5s --health-timeout=2s --health-retries=3 ",[234,1197,1169],{"class":383},[234,1199,1200],{"class":236,"line":479},[234,1201,1202],{"class":255},"    meuusuario\u002Fmyapp:v1\n",[234,1204,1205],{"class":236,"line":484},[234,1206,1207],{"class":255},"\"\n",[12,1209,1210],{},"Repete pra VPS B trocando o IP. Valide:",[224,1212,1214],{"className":226,"code":1213,"language":228,"meta":229,"style":229},"curl http:\u002F\u002F203.0.113.10:8080\u002Fhealthz   # deve retornar \"ok\"\ncurl http:\u002F\u002F203.0.113.20:8080\u002Fhealthz   # deve retornar \"ok\"\n",[231,1215,1216,1227],{"__ignoreMap":229},[234,1217,1218,1221,1224],{"class":236,"line":237},[234,1219,1220],{"class":247},"curl",[234,1222,1223],{"class":255}," http:\u002F\u002F203.0.113.10:8080\u002Fhealthz",[234,1225,1226],{"class":240},"   # deve retornar \"ok\"\n",[234,1228,1229,1231,1234],{"class":236,"line":244},[234,1230,1220],{"class":247},[234,1232,1233],{"class":255}," http:\u002F\u002F203.0.113.20:8080\u002Fhealthz",[234,1235,1226],{"class":240},[12,1237,1238],{},"Se as duas voltam 200, a base está pronta.",[19,1240,1242],{"id":1241},"passo-4-caddy-como-reverse-proxy-balanceador-30-min","Passo 4 — Caddy como reverse proxy + balanceador (30 min)",[12,1244,1245],{},"Caddy é mais fácil de começar que nginx por causa do TLS automático embutido — Let's Encrypt funciona out of the box, sem configurar bot externo. nginx é mais flexível e tem ecossistema maior; Caddy é mais simples pra esse caso. Pro tutorial vou de Caddy.",[12,1247,1248],{},"Vou rodar o Caddy na VPS A, compartilhando a máquina com uma das instâncias da app. Se preferir uma terceira VPS dedicada, troca o IP onde for relevante.",[12,1250,1251],{},"Primeiro, libere portas 80 e 443 na VPS A:",[224,1253,1255],{"className":226,"code":1254,"language":228,"meta":229,"style":229},"ssh root@203.0.113.10 \"ufw allow 80 && ufw allow 443\"\n",[231,1256,1257],{"__ignoreMap":229},[234,1258,1259,1261,1263],{"class":236,"line":237},[234,1260,298],{"class":247},[234,1262,301],{"class":255},[234,1264,1265],{"class":255}," \"ufw allow 80 && ufw allow 443\"\n",[12,1267,1268,1269,1272],{},"Crie o ",[231,1270,1271],{},"Caddyfile",":",[224,1274,1278],{"className":1275,"code":1276,"language":1277,"meta":229,"style":229},"language-caddyfile shiki shiki-themes github-dark-default","meudominio.com {\n    reverse_proxy 203.0.113.10:8080 203.0.113.20:8080 {\n        lb_policy round_robin\n        health_uri \u002Fhealthz\n        health_interval 5s\n        health_timeout 2s\n        health_status 200\n\n        fail_duration 30s\n        max_fails 2\n        unhealthy_status 5xx\n\n        transport http {\n            dial_timeout 2s\n        }\n    }\n}\n","caddyfile",[231,1279,1280,1285,1290,1295,1300,1305,1310,1315,1319,1324,1329,1334,1338,1343,1348,1353,1358],{"__ignoreMap":229},[234,1281,1282],{"class":236,"line":237},[234,1283,1284],{},"meudominio.com {\n",[234,1286,1287],{"class":236,"line":244},[234,1288,1289],{},"    reverse_proxy 203.0.113.10:8080 203.0.113.20:8080 {\n",[234,1291,1292],{"class":236,"line":271},[234,1293,1294],{},"        lb_policy round_robin\n",[234,1296,1297],{"class":236,"line":415},[234,1298,1299],{},"        health_uri \u002Fhealthz\n",[234,1301,1302],{"class":236,"line":434},[234,1303,1304],{},"        health_interval 5s\n",[234,1306,1307],{"class":236,"line":459},[234,1308,1309],{},"        health_timeout 2s\n",[234,1311,1312],{"class":236,"line":464},[234,1313,1314],{},"        health_status 200\n",[234,1316,1317],{"class":236,"line":479},[234,1318,412],{"emptyLinePlaceholder":411},[234,1320,1321],{"class":236,"line":484},[234,1322,1323],{},"        fail_duration 30s\n",[234,1325,1326],{"class":236,"line":490},[234,1327,1328],{},"        max_fails 2\n",[234,1330,1331],{"class":236,"line":508},[234,1332,1333],{},"        unhealthy_status 5xx\n",[234,1335,1336],{"class":236,"line":529},[234,1337,412],{"emptyLinePlaceholder":411},[234,1339,1340],{"class":236,"line":535},[234,1341,1342],{},"        transport http {\n",[234,1344,1345],{"class":236,"line":546},[234,1346,1347],{},"            dial_timeout 2s\n",[234,1349,1350],{"class":236,"line":552},[234,1351,1352],{},"        }\n",[234,1354,1355],{"class":236,"line":557},[234,1356,1357],{},"    }\n",[234,1359,1360],{"class":236,"line":594},[234,1361,1362],{},"}\n",[12,1364,1365,1366,1368],{},"Quinze linhas. Tudo o que importa está aí: round-robin entre os dois IPs, health check ativo a cada cinco segundos no ",[231,1367,355],{},", marca como unhealthy depois de duas falhas seguidas em 30s, timeout de dois segundos pra abrir conexão.",[12,1370,1371],{},"Sobe Caddy:",[224,1373,1375],{"className":226,"code":1374,"language":228,"meta":229,"style":229},"ssh root@203.0.113.10 \"\n  mkdir -p \u002Fetc\u002Fcaddy &&\n  docker run -d --name caddy --restart=unless-stopped \\\n    --network host \\\n    -v \u002Fetc\u002Fcaddy\u002FCaddyfile:\u002Fetc\u002Fcaddy\u002FCaddyfile \\\n    -v caddy_data:\u002Fdata \\\n    -v caddy_config:\u002Fconfig \\\n    caddy:2-alpine\n\"\n",[231,1376,1377,1385,1390,1397,1404,1411,1418,1425,1430],{"__ignoreMap":229},[234,1378,1379,1381,1383],{"class":236,"line":237},[234,1380,298],{"class":247},[234,1382,301],{"class":255},[234,1384,1156],{"class":255},[234,1386,1387],{"class":236,"line":244},[234,1388,1389],{"class":255},"  mkdir -p \u002Fetc\u002Fcaddy &&\n",[234,1391,1392,1395],{"class":236,"line":271},[234,1393,1394],{"class":255},"  docker run -d --name caddy --restart=unless-stopped ",[234,1396,1169],{"class":383},[234,1398,1399,1402],{"class":236,"line":415},[234,1400,1401],{"class":255},"    --network host ",[234,1403,1169],{"class":383},[234,1405,1406,1409],{"class":236,"line":434},[234,1407,1408],{"class":255},"    -v \u002Fetc\u002Fcaddy\u002FCaddyfile:\u002Fetc\u002Fcaddy\u002FCaddyfile ",[234,1410,1169],{"class":383},[234,1412,1413,1416],{"class":236,"line":459},[234,1414,1415],{"class":255},"    -v caddy_data:\u002Fdata ",[234,1417,1169],{"class":383},[234,1419,1420,1423],{"class":236,"line":464},[234,1421,1422],{"class":255},"    -v caddy_config:\u002Fconfig ",[234,1424,1169],{"class":383},[234,1426,1427],{"class":236,"line":479},[234,1428,1429],{"class":255},"    caddy:2-alpine\n",[234,1431,1432],{"class":236,"line":484},[234,1433,1207],{"class":255},[12,1435,1436,1437,1439],{},"Aponte o DNS A do seu domínio pra ",[231,1438,280],{},". Em alguns minutos:",[224,1441,1443],{"className":226,"code":1442,"language":228,"meta":229,"style":229},"curl https:\u002F\u002Fmeudominio.com\u002F\n# deve retornar \"Hello v1\" (alternando entre as duas instâncias)\n",[231,1444,1445,1452],{"__ignoreMap":229},[234,1446,1447,1449],{"class":236,"line":237},[234,1448,1220],{"class":247},[234,1450,1451],{"class":255}," https:\u002F\u002Fmeudominio.com\u002F\n",[234,1453,1454],{"class":236,"line":244},[234,1455,1456],{"class":240},"# deve retornar \"Hello v1\" (alternando entre as duas instâncias)\n",[12,1458,1459],{},"Caddy emitiu certificado Let's Encrypt automaticamente. Isso funciona porque o domínio resolve pro IP onde Caddy está escutando na porta 80 (challenge HTTP-01).",[19,1461,1463],{"id":1462},"passo-5-script-bash-de-deploy-60-min","Passo 5 — Script bash de deploy (60 min)",[12,1465,1466],{},"Esse é o coração do tutorial. Um script que orquestra rolling update entre as duas VPS:",[224,1468,1470],{"className":226,"code":1469,"language":228,"meta":229,"style":229},"#!\u002Fusr\u002Fbin\u002Fenv bash\n# deploy.sh — rolling deploy zero-downtime entre duas VPS\nset -euo pipefail\n\nIMAGE=\"${1:?Uso: .\u002Fdeploy.sh meuusuario\u002Fmyapp:v2}\"\nHOSTS=(\"203.0.113.10\" \"203.0.113.20\")\nHEALTH_DEADLINE=300   # max segundos esperando health check\nMIN_HEALTHY_TIME=10   # segundos saudável sustentado antes de prosseguir\nSSH_OPTS=\"-o StrictHostKeyChecking=no -o ConnectTimeout=5\"\n\ndeploy_host() {\n  local host=$1\n  local image=$2\n  echo \"==> [${host}] pulling ${image}\"\n  ssh ${SSH_OPTS} \"root@${host}\" \"docker pull ${image}\"\n\n  # guarda imagem antiga pro caso de rollback\n  local old_image\n  old_image=$(ssh ${SSH_OPTS} \"root@${host}\" \"docker inspect app --format '{{.Config.Image}}' 2>\u002Fdev\u002Fnull || echo none\")\n  echo \"==> [${host}] versão atual: ${old_image}\"\n\n  echo \"==> [${host}] substituindo contêiner\"\n  ssh ${SSH_OPTS} \"root@${host}\" \"\n    docker stop app 2>\u002Fdev\u002Fnull || true\n    docker rm app 2>\u002Fdev\u002Fnull || true\n    docker run -d --name app --restart=unless-stopped \\\n      -p 8080:8080 \\\n      -e DATABASE_URL='${DATABASE_URL}' \\\n      --health-cmd='curl -f http:\u002F\u002Flocalhost:8080\u002Fhealthz || exit 1' \\\n      --health-interval=5s --health-timeout=2s --health-retries=3 \\\n      ${image}\n  \"\n\n  echo \"==> [${host}] esperando health check (max ${HEALTH_DEADLINE}s)\"\n  local start=$(date +%s)\n  local healthy_since=0\n  while true; do\n    local now=$(date +%s)\n    if (( now - start > HEALTH_DEADLINE )); then\n      echo \"!!  [${host}] healthy_deadline excedido — fazendo rollback pra ${old_image}\"\n      ssh ${SSH_OPTS} \"root@${host}\" \"\n        docker stop app && docker rm app &&\n        docker run -d --name app --restart=unless-stopped \\\n          -p 8080:8080 -e DATABASE_URL='${DATABASE_URL}' \\\n          ${old_image}\n      \"\n      return 1\n    fi\n\n    if curl -sf --max-time 2 \"http:\u002F\u002F${host}:8080\u002Fhealthz\" > \u002Fdev\u002Fnull; then\n      if (( healthy_since == 0 )); then\n        healthy_since=${now}\n        echo \"    [${host}] saudável — confirmando por ${MIN_HEALTHY_TIME}s\"\n      elif (( now - healthy_since >= MIN_HEALTHY_TIME )); then\n        echo \"==> [${host}] saudável sustentado — promovendo\"\n        return 0\n      fi\n    else\n      healthy_since=0\n    fi\n    sleep 2\n  done\n}\n\necho \"### Deploy ${IMAGE} em ${#HOSTS[@]} hosts (rolling, max_parallel=1)\"\nfor host in \"${HOSTS[@]}\"; do\n  if ! deploy_host \"${host}\" \"${IMAGE}\"; then\n    echo \"### Deploy abortado em ${host}. Hosts anteriores mantidos como estavam.\"\n    exit 1\n  fi\ndone\necho \"### Deploy completo: todos os hosts em ${IMAGE}\"\n",[231,1471,1472,1477,1482,1493,1497,1550,1567,1580,1593,1603,1607,1615,1628,1640,1660,1683,1687,1692,1699,1724,1740,1744,1755,1769,1774,1779,1786,1793,1805,1812,1819,1828,1833,1837,1853,1872,1884,1899,1918,1942,1960,1976,1982,1990,2002,2012,2018,2027,2033,2038,2073,2093,2104,2123,2144,2156,2165,2171,2177,2187,2192,2201,2207,2212,2217,2245,2273,2300,2314,2322,2328,2334],{"__ignoreMap":229},[234,1473,1474],{"class":236,"line":237},[234,1475,1476],{"class":240},"#!\u002Fusr\u002Fbin\u002Fenv bash\n",[234,1478,1479],{"class":236,"line":244},[234,1480,1481],{"class":240},"# deploy.sh — rolling deploy zero-downtime entre duas VPS\n",[234,1483,1484,1487,1490],{"class":236,"line":271},[234,1485,1486],{"class":251},"set",[234,1488,1489],{"class":251}," -euo",[234,1491,1492],{"class":255}," pipefail\n",[234,1494,1495],{"class":236,"line":415},[234,1496,412],{"emptyLinePlaceholder":411},[234,1498,1499,1502,1504,1507,1510,1513,1516,1518,1521,1524,1527,1529,1532,1535,1537,1540,1542,1545,1548],{"class":236,"line":434},[234,1500,1501],{"class":387},"IMAGE",[234,1503,473],{"class":383},[234,1505,1506],{"class":255},"\"",[234,1508,1509],{"class":251},"${1",[234,1511,1512],{"class":383},":?",[234,1514,1515],{"class":387},"Uso",[234,1517,1272],{"class":383},[234,1519,1520],{"class":255}," .",[234,1522,1523],{"class":383},"\u002F",[234,1525,1526],{"class":387},"deploy",[234,1528,101],{"class":255},[234,1530,1531],{"class":387},"sh",[234,1533,1534],{"class":387}," meuusuario",[234,1536,1523],{"class":383},[234,1538,1539],{"class":387},"myapp",[234,1541,1272],{"class":383},[234,1543,1544],{"class":387},"v2",[234,1546,1547],{"class":251},"}",[234,1549,1207],{"class":255},[234,1551,1552,1555,1557,1559,1562,1565],{"class":236,"line":459},[234,1553,1554],{"class":387},"HOSTS",[234,1556,473],{"class":383},[234,1558,520],{"class":387},[234,1560,1561],{"class":255},"\"203.0.113.10\"",[234,1563,1564],{"class":255}," \"203.0.113.20\"",[234,1566,526],{"class":387},[234,1568,1569,1572,1574,1577],{"class":236,"line":464},[234,1570,1571],{"class":387},"HEALTH_DEADLINE",[234,1573,473],{"class":383},[234,1575,1576],{"class":255},"300",[234,1578,1579],{"class":240},"   # max segundos esperando health check\n",[234,1581,1582,1585,1587,1590],{"class":236,"line":479},[234,1583,1584],{"class":387},"MIN_HEALTHY_TIME",[234,1586,473],{"class":383},[234,1588,1589],{"class":255},"10",[234,1591,1592],{"class":240},"   # segundos saudável sustentado antes de prosseguir\n",[234,1594,1595,1598,1600],{"class":236,"line":484},[234,1596,1597],{"class":387},"SSH_OPTS",[234,1599,473],{"class":383},[234,1601,1602],{"class":255},"\"-o StrictHostKeyChecking=no -o ConnectTimeout=5\"\n",[234,1604,1605],{"class":236,"line":490},[234,1606,412],{"emptyLinePlaceholder":411},[234,1608,1609,1612],{"class":236,"line":508},[234,1610,1611],{"class":427},"deploy_host",[234,1613,1614],{"class":387},"() {\n",[234,1616,1617,1620,1623,1625],{"class":236,"line":529},[234,1618,1619],{"class":383},"  local",[234,1621,1622],{"class":387}," host",[234,1624,473],{"class":383},[234,1626,1627],{"class":247},"$1\n",[234,1629,1630,1632,1635,1637],{"class":236,"line":535},[234,1631,1619],{"class":383},[234,1633,1634],{"class":387}," image",[234,1636,473],{"class":383},[234,1638,1639],{"class":247},"$2\n",[234,1641,1642,1645,1648,1651,1654,1657],{"class":236,"line":546},[234,1643,1644],{"class":251},"  echo",[234,1646,1647],{"class":255}," \"==> [${",[234,1649,1650],{"class":387},"host",[234,1652,1653],{"class":255},"}] pulling ${",[234,1655,1656],{"class":387},"image",[234,1658,1659],{"class":255},"}\"\n",[234,1661,1662,1665,1668,1671,1673,1676,1679,1681],{"class":236,"line":552},[234,1663,1664],{"class":247},"  ssh",[234,1666,1667],{"class":387}," ${SSH_OPTS} ",[234,1669,1670],{"class":255},"\"root@${",[234,1672,1650],{"class":387},[234,1674,1675],{"class":255},"}\"",[234,1677,1678],{"class":255}," \"docker pull ${",[234,1680,1656],{"class":387},[234,1682,1659],{"class":255},[234,1684,1685],{"class":236,"line":557},[234,1686,412],{"emptyLinePlaceholder":411},[234,1688,1689],{"class":236,"line":594},[234,1690,1691],{"class":240},"  # guarda imagem antiga pro caso de rollback\n",[234,1693,1694,1696],{"class":236,"line":635},[234,1695,1619],{"class":383},[234,1697,1698],{"class":387}," old_image\n",[234,1700,1701,1704,1706,1709,1711,1713,1715,1717,1719,1722],{"class":236,"line":643},[234,1702,1703],{"class":387},"  old_image",[234,1705,473],{"class":383},[234,1707,1708],{"class":387},"$(",[234,1710,298],{"class":247},[234,1712,1667],{"class":387},[234,1714,1670],{"class":255},[234,1716,1650],{"class":387},[234,1718,1675],{"class":255},[234,1720,1721],{"class":255}," \"docker inspect app --format '{{.Config.Image}}' 2>\u002Fdev\u002Fnull || echo none\"",[234,1723,526],{"class":387},[234,1725,1726,1728,1730,1732,1735,1738],{"class":236,"line":659},[234,1727,1644],{"class":251},[234,1729,1647],{"class":255},[234,1731,1650],{"class":387},[234,1733,1734],{"class":255},"}] versão atual: ${",[234,1736,1737],{"class":387},"old_image",[234,1739,1659],{"class":255},[234,1741,1742],{"class":236,"line":683},[234,1743,412],{"emptyLinePlaceholder":411},[234,1745,1746,1748,1750,1752],{"class":236,"line":695},[234,1747,1644],{"class":251},[234,1749,1647],{"class":255},[234,1751,1650],{"class":387},[234,1753,1754],{"class":255},"}] substituindo contêiner\"\n",[234,1756,1757,1759,1761,1763,1765,1767],{"class":236,"line":717},[234,1758,1664],{"class":247},[234,1760,1667],{"class":387},[234,1762,1670],{"class":255},[234,1764,1650],{"class":387},[234,1766,1675],{"class":255},[234,1768,1156],{"class":255},[234,1770,1771],{"class":236,"line":723},[234,1772,1773],{"class":255},"    docker stop app 2>\u002Fdev\u002Fnull || true\n",[234,1775,1776],{"class":236,"line":729},[234,1777,1778],{"class":255},"    docker rm app 2>\u002Fdev\u002Fnull || true\n",[234,1780,1781,1784],{"class":236,"line":734},[234,1782,1783],{"class":255},"    docker run -d --name app --restart=unless-stopped ",[234,1785,1169],{"class":383},[234,1787,1788,1791],{"class":236,"line":771},[234,1789,1790],{"class":255},"      -p 8080:8080 ",[234,1792,1169],{"class":383},[234,1794,1795,1798,1800,1803],{"class":236,"line":776},[234,1796,1797],{"class":255},"      -e DATABASE_URL='${",[234,1799,453],{"class":387},[234,1801,1802],{"class":255},"}' ",[234,1804,1169],{"class":383},[234,1806,1807,1810],{"class":236,"line":815},[234,1808,1809],{"class":255},"      --health-cmd='curl -f http:\u002F\u002Flocalhost:8080\u002Fhealthz || exit 1' ",[234,1811,1169],{"class":383},[234,1813,1814,1817],{"class":236,"line":820},[234,1815,1816],{"class":255},"      --health-interval=5s --health-timeout=2s --health-retries=3 ",[234,1818,1169],{"class":383},[234,1820,1821,1824,1826],{"class":236,"line":826},[234,1822,1823],{"class":255},"      ${",[234,1825,1656],{"class":387},[234,1827,1362],{"class":255},[234,1829,1830],{"class":236,"line":846},[234,1831,1832],{"class":255},"  \"\n",[234,1834,1835],{"class":236,"line":859},[234,1836,412],{"emptyLinePlaceholder":411},[234,1838,1839,1841,1843,1845,1848,1850],{"class":236,"line":872},[234,1840,1644],{"class":251},[234,1842,1647],{"class":255},[234,1844,1650],{"class":387},[234,1846,1847],{"class":255},"}] esperando health check (max ${",[234,1849,1571],{"class":387},[234,1851,1852],{"class":255},"}s)\"\n",[234,1854,1855,1857,1860,1862,1864,1867,1870],{"class":236,"line":898},[234,1856,1619],{"class":383},[234,1858,1859],{"class":387}," start",[234,1861,473],{"class":383},[234,1863,1708],{"class":387},[234,1865,1866],{"class":247},"date",[234,1868,1869],{"class":255}," +%s",[234,1871,526],{"class":387},[234,1873,1874,1876,1879,1881],{"class":236,"line":913},[234,1875,1619],{"class":383},[234,1877,1878],{"class":387}," healthy_since",[234,1880,473],{"class":383},[234,1882,1883],{"class":251},"0\n",[234,1885,1887,1890,1893,1896],{"class":236,"line":1886},37,[234,1888,1889],{"class":383},"  while",[234,1891,1892],{"class":251}," true",[234,1894,1895],{"class":387},"; ",[234,1897,1898],{"class":383},"do\n",[234,1900,1902,1905,1908,1910,1912,1914,1916],{"class":236,"line":1901},38,[234,1903,1904],{"class":383},"    local",[234,1906,1907],{"class":387}," now",[234,1909,473],{"class":383},[234,1911,1708],{"class":387},[234,1913,1866],{"class":247},[234,1915,1869],{"class":255},[234,1917,526],{"class":387},[234,1919,1921,1924,1927,1930,1933,1936,1939],{"class":236,"line":1920},39,[234,1922,1923],{"class":383},"    if",[234,1925,1926],{"class":387}," (( now ",[234,1928,1929],{"class":383},"-",[234,1931,1932],{"class":387}," start ",[234,1934,1935],{"class":383},">",[234,1937,1938],{"class":387}," HEALTH_DEADLINE )); ",[234,1940,1941],{"class":383},"then\n",[234,1943,1945,1948,1951,1953,1956,1958],{"class":236,"line":1944},40,[234,1946,1947],{"class":251},"      echo",[234,1949,1950],{"class":255}," \"!!  [${",[234,1952,1650],{"class":387},[234,1954,1955],{"class":255},"}] healthy_deadline excedido — fazendo rollback pra ${",[234,1957,1737],{"class":387},[234,1959,1659],{"class":255},[234,1961,1963,1966,1968,1970,1972,1974],{"class":236,"line":1962},41,[234,1964,1965],{"class":247},"      ssh",[234,1967,1667],{"class":387},[234,1969,1670],{"class":255},[234,1971,1650],{"class":387},[234,1973,1675],{"class":255},[234,1975,1156],{"class":255},[234,1977,1979],{"class":236,"line":1978},42,[234,1980,1981],{"class":255},"        docker stop app && docker rm app &&\n",[234,1983,1985,1988],{"class":236,"line":1984},43,[234,1986,1987],{"class":255},"        docker run -d --name app --restart=unless-stopped ",[234,1989,1169],{"class":383},[234,1991,1993,1996,1998,2000],{"class":236,"line":1992},44,[234,1994,1995],{"class":255},"          -p 8080:8080 -e DATABASE_URL='${",[234,1997,453],{"class":387},[234,1999,1802],{"class":255},[234,2001,1169],{"class":383},[234,2003,2005,2008,2010],{"class":236,"line":2004},45,[234,2006,2007],{"class":255},"          ${",[234,2009,1737],{"class":387},[234,2011,1362],{"class":255},[234,2013,2015],{"class":236,"line":2014},46,[234,2016,2017],{"class":255},"      \"\n",[234,2019,2021,2024],{"class":236,"line":2020},47,[234,2022,2023],{"class":383},"      return",[234,2025,2026],{"class":251}," 1\n",[234,2028,2030],{"class":236,"line":2029},48,[234,2031,2032],{"class":383},"    fi\n",[234,2034,2036],{"class":236,"line":2035},49,[234,2037,412],{"emptyLinePlaceholder":411},[234,2039,2041,2043,2046,2049,2052,2055,2058,2060,2063,2066,2069,2071],{"class":236,"line":2040},50,[234,2042,1923],{"class":383},[234,2044,2045],{"class":247}," curl",[234,2047,2048],{"class":251}," -sf",[234,2050,2051],{"class":251}," --max-time",[234,2053,2054],{"class":251}," 2",[234,2056,2057],{"class":255}," \"http:\u002F\u002F${",[234,2059,1650],{"class":387},[234,2061,2062],{"class":255},"}:8080\u002Fhealthz\"",[234,2064,2065],{"class":383}," >",[234,2067,2068],{"class":255}," \u002Fdev\u002Fnull",[234,2070,1895],{"class":387},[234,2072,1941],{"class":383},[234,2074,2076,2079,2082,2085,2088,2091],{"class":236,"line":2075},51,[234,2077,2078],{"class":383},"      if",[234,2080,2081],{"class":387}," (( healthy_since ",[234,2083,2084],{"class":383},"==",[234,2086,2087],{"class":251}," 0",[234,2089,2090],{"class":387}," )); ",[234,2092,1941],{"class":383},[234,2094,2096,2099,2101],{"class":236,"line":2095},52,[234,2097,2098],{"class":387},"        healthy_since",[234,2100,473],{"class":383},[234,2102,2103],{"class":387},"${now}\n",[234,2105,2107,2110,2113,2115,2118,2120],{"class":236,"line":2106},53,[234,2108,2109],{"class":251},"        echo",[234,2111,2112],{"class":255}," \"    [${",[234,2114,1650],{"class":387},[234,2116,2117],{"class":255},"}] saudável — confirmando por ${",[234,2119,1584],{"class":387},[234,2121,2122],{"class":255},"}s\"\n",[234,2124,2126,2129,2131,2133,2136,2139,2142],{"class":236,"line":2125},54,[234,2127,2128],{"class":383},"      elif",[234,2130,1926],{"class":387},[234,2132,1929],{"class":383},[234,2134,2135],{"class":387}," healthy_since ",[234,2137,2138],{"class":383},">=",[234,2140,2141],{"class":387}," MIN_HEALTHY_TIME )); ",[234,2143,1941],{"class":383},[234,2145,2147,2149,2151,2153],{"class":236,"line":2146},55,[234,2148,2109],{"class":251},[234,2150,1647],{"class":255},[234,2152,1650],{"class":387},[234,2154,2155],{"class":255},"}] saudável sustentado — promovendo\"\n",[234,2157,2159,2162],{"class":236,"line":2158},56,[234,2160,2161],{"class":383},"        return",[234,2163,2164],{"class":251}," 0\n",[234,2166,2168],{"class":236,"line":2167},57,[234,2169,2170],{"class":383},"      fi\n",[234,2172,2174],{"class":236,"line":2173},58,[234,2175,2176],{"class":383},"    else\n",[234,2178,2180,2183,2185],{"class":236,"line":2179},59,[234,2181,2182],{"class":387},"      healthy_since",[234,2184,473],{"class":383},[234,2186,1883],{"class":255},[234,2188,2190],{"class":236,"line":2189},60,[234,2191,2032],{"class":383},[234,2193,2195,2198],{"class":236,"line":2194},61,[234,2196,2197],{"class":247},"    sleep",[234,2199,2200],{"class":251}," 2\n",[234,2202,2204],{"class":236,"line":2203},62,[234,2205,2206],{"class":383},"  done\n",[234,2208,2210],{"class":236,"line":2209},63,[234,2211,1362],{"class":387},[234,2213,2215],{"class":236,"line":2214},64,[234,2216,412],{"emptyLinePlaceholder":411},[234,2218,2220,2223,2226,2228,2231,2234,2236,2239,2242],{"class":236,"line":2219},65,[234,2221,2222],{"class":251},"echo",[234,2224,2225],{"class":255}," \"### Deploy ${",[234,2227,1501],{"class":387},[234,2229,2230],{"class":255},"} em ${",[234,2232,2233],{"class":383},"#",[234,2235,1554],{"class":387},[234,2237,2238],{"class":255},"[",[234,2240,2241],{"class":383},"@",[234,2243,2244],{"class":255},"]} hosts (rolling, max_parallel=1)\"\n",[234,2246,2248,2251,2254,2257,2260,2262,2264,2266,2269,2271],{"class":236,"line":2247},66,[234,2249,2250],{"class":383},"for",[234,2252,2253],{"class":387}," host ",[234,2255,2256],{"class":383},"in",[234,2258,2259],{"class":255}," \"${",[234,2261,1554],{"class":387},[234,2263,2238],{"class":255},[234,2265,2241],{"class":383},[234,2267,2268],{"class":255},"]}\"",[234,2270,1895],{"class":387},[234,2272,1898],{"class":383},[234,2274,2276,2278,2281,2284,2286,2288,2290,2292,2294,2296,2298],{"class":236,"line":2275},67,[234,2277,597],{"class":383},[234,2279,2280],{"class":383}," !",[234,2282,2283],{"class":247}," deploy_host",[234,2285,2259],{"class":255},[234,2287,1650],{"class":387},[234,2289,1675],{"class":255},[234,2291,2259],{"class":255},[234,2293,1501],{"class":387},[234,2295,1675],{"class":255},[234,2297,1895],{"class":387},[234,2299,1941],{"class":383},[234,2301,2303,2306,2309,2311],{"class":236,"line":2302},68,[234,2304,2305],{"class":251},"    echo",[234,2307,2308],{"class":255}," \"### Deploy abortado em ${",[234,2310,1650],{"class":387},[234,2312,2313],{"class":255},"}. Hosts anteriores mantidos como estavam.\"\n",[234,2315,2317,2320],{"class":236,"line":2316},69,[234,2318,2319],{"class":251},"    exit",[234,2321,2026],{"class":251},[234,2323,2325],{"class":236,"line":2324},70,[234,2326,2327],{"class":383},"  fi\n",[234,2329,2331],{"class":236,"line":2330},71,[234,2332,2333],{"class":383},"done\n",[234,2335,2337,2339,2342,2344],{"class":236,"line":2336},72,[234,2338,2222],{"class":251},[234,2340,2341],{"class":255}," \"### Deploy completo: todos os hosts em ${",[234,2343,1501],{"class":387},[234,2345,1659],{"class":255},[12,2347,2348,2349,2352,2353,2356],{},"Salva como ",[231,2350,2351],{},"deploy.sh",", dá ",[231,2354,2355],{},"chmod +x",", e:",[224,2358,2360],{"className":226,"code":2359,"language":228,"meta":229,"style":229},"export DATABASE_URL='postgres:\u002F\u002Fuser:pass@db.example.com:5432\u002Fapp'\n.\u002Fdeploy.sh meuusuario\u002Fmyapp:v2\n",[231,2361,2362,2375],{"__ignoreMap":229},[234,2363,2364,2367,2370,2372],{"class":236,"line":237},[234,2365,2366],{"class":383},"export",[234,2368,2369],{"class":387}," DATABASE_URL",[234,2371,473],{"class":383},[234,2373,2374],{"class":255},"'postgres:\u002F\u002Fuser:pass@db.example.com:5432\u002Fapp'\n",[234,2376,2377,2380],{"class":236,"line":244},[234,2378,2379],{"class":247},".\u002Fdeploy.sh",[234,2381,2382],{"class":255}," meuusuario\u002Fmyapp:v2\n",[12,2384,2385],{},"O algoritmo é literalmente o que orquestradores grandes fazem internamente:",[67,2387,2388,2394,2408,2414,2419,2425,2438],{},[70,2389,2390,2393],{},[27,2391,2392],{},"Para cada host, sequencialmente"," (max_parallel = 1)",[70,2395,2396,2399,2400,2403,2404,2407],{},[27,2397,2398],{},"Pull da nova imagem"," antes de mexer no contêiner — assim o downtime entre ",[231,2401,2402],{},"docker stop"," e ",[231,2405,2406],{},"docker run"," é mínimo",[70,2409,2410,2413],{},[27,2411,2412],{},"Guarda referência da imagem antiga"," pra rollback se algo der errado",[70,2415,2416],{},[27,2417,2418],{},"Substitui o contêiner",[70,2420,2421,2424],{},[27,2422,2423],{},"Loop esperando health check"," com deadline de cinco minutos",[70,2426,2427,2430,2431,2433,2434,2437],{},[27,2428,2429],{},"Min healthy time de dez segundos",": só avança quando o ",[231,2432,355],{}," retornou 200 ",[179,2435,2436],{},"sustentadamente"," por dez segundos (se cair no meio, reinicia a contagem)",[70,2439,2440,2443],{},[27,2441,2442],{},"Rollback automático"," se passar do deadline",[12,2445,2446],{},"Os números (max_parallel: 1, min_healthy_time: 10s, healthy_deadline: 300s) são exatamente os defaults que usamos no HeroCtl. Não é coincidência — são os valores que sobreviveram a anos de tentativa e erro. Min healthy time muito curto detecta sintomas transitórios como \"saudável\" e quebra; muito longo deixa o deploy lento sem ganho. Dez segundos é o ponto onde ruído some e o deploy ainda termina rápido.",[19,2448,2450],{"id":2449},"passo-6-validar-com-teste-de-carga-durante-deploy-15-min","Passo 6 — Validar com teste de carga durante deploy (15 min)",[12,2452,2453],{},"Esse é o teste de fogo: rodar carga sustentada e fazer deploy ao mesmo tempo. Se algum 5xx aparecer, alguma parte do esquema está quebrada.",[12,2455,2456],{},"Numa máquina externa (seu laptop ou outra VPS):",[224,2458,2460],{"className":226,"code":2459,"language":228,"meta":229,"style":229},"# instale hey\ngo install github.com\u002Frakyll\u002Fhey@latest\n\n# carga sustentada de 60s, 5 conexões concorrentes\nhey -z 60s -c 5 https:\u002F\u002Fmeudominio.com\u002F\n",[231,2461,2462,2467,2478,2482,2487],{"__ignoreMap":229},[234,2463,2464],{"class":236,"line":237},[234,2465,2466],{"class":240},"# instale hey\n",[234,2468,2469,2472,2475],{"class":236,"line":244},[234,2470,2471],{"class":247},"go",[234,2473,2474],{"class":255}," install",[234,2476,2477],{"class":255}," github.com\u002Frakyll\u002Fhey@latest\n",[234,2479,2480],{"class":236,"line":271},[234,2481,412],{"emptyLinePlaceholder":411},[234,2483,2484],{"class":236,"line":415},[234,2485,2486],{"class":240},"# carga sustentada de 60s, 5 conexões concorrentes\n",[234,2488,2489,2492,2495,2498,2501,2504],{"class":236,"line":434},[234,2490,2491],{"class":247},"hey",[234,2493,2494],{"class":251}," -z",[234,2496,2497],{"class":255}," 60s",[234,2499,2500],{"class":251}," -c",[234,2502,2503],{"class":251}," 5",[234,2505,1451],{"class":255},[12,2507,2508],{},"Em outra janela, simultaneamente:",[224,2510,2512],{"className":226,"code":2511,"language":228,"meta":229,"style":229},".\u002Fdeploy.sh meuusuario\u002Fmyapp:v2\n",[231,2513,2514],{"__ignoreMap":229},[234,2515,2516,2518],{"class":236,"line":237},[234,2517,2379],{"class":247},[234,2519,2382],{"class":255},[12,2521,2522,2523,1272],{},"No final do ",[231,2524,2491],{},[224,2526,2531],{"className":2527,"code":2529,"language":2530},[2528],"language-text","Status code distribution:\n  [200] 1847 responses\n","text",[231,2532,2529],{"__ignoreMap":229},[12,2534,2535],{},"Só 200. Se aparecer um 502 ou 503, alguma das três peças tá fraca: health check retornando 200 cedo demais, graceful shutdown ausente, ou min healthy time curto. Investiga e corrige.",[57,2537],{},[19,2539,2541],{"id":2540},"os-seis-detalhes-que-separam-zero-downtime-real-de-aproximacao","Os seis detalhes que separam zero-downtime real de aproximação",[12,2543,2544],{},"Cobrimos boa parte deles ao longo do tutorial, mas vale consolidar — porque um único desses ausentes converte o esquema todo em \"mostly zero-downtime\", que é diferente.",[67,2546,2547,2556,2573,2589,2595,2601],{},[70,2548,2549,2552,2553,2555],{},[27,2550,2551],{},"Connection draining no SIGTERM."," Quando o contêiner recebe sinal de parada, a app marca ",[231,2554,355],{}," como falhando imediatamente, mas continua aceitando conexões em curso por alguns segundos. Sem isso, conexões abertas no momento do stop são cortadas.",[70,2557,2558,2561,2562,2565,2566,2569,2570,101],{},[27,2559,2560],{},"Pre-stop hook se você tem worker assíncrono."," Filas que processam jobs em background precisam de pausa explícita antes de matar o processo, ou o job em execução fica órfão. Em Sidekiq, é o ",[231,2563,2564],{},":quiet"," antes de ",[231,2567,2568],{},":term",". Em Celery, é ",[231,2571,2572],{},"--soft-time-limit",[70,2574,2575,2578,2579,2582,2583,2585,2586,2588],{},[27,2576,2577],{},"Health check ANTES de promover, não \"container running\"."," ",[231,2580,2581],{},"docker ps"," mostra \"running\" milisegundos depois do ",[231,2584,2406],{},". Não significa nada. Promover só depois de ",[231,2587,355],{}," retornar 200 sustentadamente.",[70,2590,2591,2594],{},[27,2592,2593],{},"Min healthy time de dez segundos sustentados."," Não vale ver um único 200 e seguir em frente — apps com warm-up irregular passam um momento e voltam a falhar.",[70,2596,2597,2600],{},[27,2598,2599],{},"Versão anterior pré-puxada pra rollback rápido."," Se você confiou em \"manter a imagem antiga em cache do Docker\", em algum momento ela é apagada por garbage collection e o rollback fica lento. Mantenha as últimas três imagens explicitamente.",[70,2602,2603,2606],{},[27,2604,2605],{},"Auto-revert ao passar do healthy deadline."," Sem isso, o deploy trava num estado parcial — metade dos hosts em v2, metade em v1, sem ninguém pra decidir o que fazer.",[19,2608,2610],{"id":2609},"database-migrations-zero-downtime-a-parte-que-quebra-deploy-de-gente-experiente","Database migrations + zero-downtime (a parte que quebra deploy de gente experiente)",[12,2612,2613,2614,2617],{},"Esse é o tópico que eu mais vejo desenvolvedor sênior errar. Rolling deploy assume que ",[27,2615,2616],{},"as duas versões da app rodam simultaneamente em produção por algum período",". Se a v2 espera schema incompatível com o que a v1 entende, alguma das duas quebra durante a janela de transição.",[12,2619,2620,2621,101],{},"Regra de ouro inegociável: ",[27,2622,2623],{},"migrations são sempre backward-compatible",[12,2625,2626,2627,2630,2631,2634,2635,2637],{},"Caso clássico: você quer renomear coluna ",[231,2628,2629],{},"email"," pra ",[231,2632,2633],{},"email_address",". Solução errada: faz a migration que renomeia direto antes do deploy. Resultado: durante o rolling, instâncias v1 ainda escrevem em ",[231,2636,2629],{}," (que não existe mais) e quebram. Solução certa, em três deploys:",[119,2639,2640,2653],{},[122,2641,2642],{},[125,2643,2644,2647,2650],{},[128,2645,2646],{},"Deploy",[128,2648,2649],{},"Migration",[128,2651,2652],{},"Código v*",[141,2654,2655,2677,2695],{},[125,2656,2657,2660,2666],{},[146,2658,2659],{},"1",[146,2661,2662,2663,2665],{},"Adiciona ",[231,2664,2633],{}," (nullable). Nenhuma remoção.",[146,2667,2668,2669,2671,2672,2674,2675,101],{},"App escreve em ",[231,2670,2629],{}," E em ",[231,2673,2633],{},"; lê de ",[231,2676,2629],{},[125,2678,2679,2682,2689],{},[146,2680,2681],{},"2",[146,2683,2684,2685,2688],{},"Backfill: ",[231,2686,2687],{},"UPDATE users SET email_address = email WHERE email_address IS NULL",". NOT NULL constraint.",[146,2690,2691,2692,2694],{},"App lê de ",[231,2693,2633],{},"; ainda escreve nas duas.",[125,2696,2697,2700,2705],{},[146,2698,2699],{},"3",[146,2701,2702,2703,101],{},"Drop ",[231,2704,2629],{},[146,2706,2707,2708,101],{},"App só usa ",[231,2709,2633],{},[12,2711,2712],{},"Três deploys, semanas de espaçamento. É chato, é o jeito. Drop de coluna direto sempre quebra. Mudança de tipo direto sempre quebra. Adicionar NOT NULL sem default direto sempre quebra.",[12,2714,2715,2716,2403,2719,2722,2723,2726],{},"Ferramentas que ajudam: ",[231,2717,2718],{},"pg-osc",[231,2720,2721],{},"pgroll"," (Postgres), ",[231,2724,2725],{},"gh-ost"," (MySQL) — fazem schema change online, sem lock longo. Pra migrations leves, o jeito manual em três passos resolve.",[19,2728,2730],{"id":2729},"padroes-alem-de-rolling","Padrões além de rolling",[12,2732,2733],{},"Rolling é o padrão default e mais econômico. Tem outros que valem conhecer:",[2735,2736,2737,2743,2749],"ul",{},[70,2738,2739,2742],{},[27,2740,2741],{},"Blue-green."," Dois ambientes paralelos completos — \"blue\" rodando v1, \"green\" provisionado com v2 vazio. Você sobe v2 inteiro em green, valida, troca DNS (ou cutover do balanceador). Vantagem: rollback instantâneo (volta DNS pra blue). Desvantagem: custa o dobro de recursos durante a janela de deploy.",[70,2744,2745,2748],{},[27,2746,2747],{},"Canary."," Manda 5% do tráfego pra v2, observa métricas (erros, latência, taxa de conversão), decide se promove pra 100% ou aborta. Detecta bugs sutis que health check não pega — tipo regression em conversão de checkout. Exige proxy com weighted routing e observabilidade decente.",[70,2750,2751,2754],{},[27,2752,2753],{},"Rainbow \u002F N+1."," Generalização do blue-green com N versões coexistindo. Útil quando você quer A\u002FB test de longa duração entre versões inteiras.",[12,2756,2757],{},"Pro tutorial, rolling é o que faz sentido. Os outros valem quando o tamanho do tráfego justifica investimento extra.",[19,2759,2761],{"id":2760},"versao-facil-coolify-ou-dokploy","Versão \"fácil\" — Coolify ou Dokploy",[12,2763,2764],{},"Se você não quer scriptar, dois painéis modernos fazem rolling deploy automaticamente:",[2735,2766,2767,2773],{},[70,2768,2769,2772],{},[27,2770,2771],{},"Coolify"," em modo multi-server faz rolling com health check configurável. Multi-server foi adicionado nas versões mais recentes — antes era single-server only. Vale checar a versão.",[70,2774,2775,2778,2779,2782],{},[27,2776,2777],{},"Dokploy"," em cima de Docker Swarm faz rolling com ",[231,2780,2781],{},"--update-parallelism 1 --update-delay",". Aproveita o que o Swarm já oferece.",[12,2784,2785],{},"Trade-off: você troca o script de cinquenta linhas (que entende tudo o que está acontecendo) por um painel (que é mais rápido pra subir, mas vira caixa-preta quando algo dá errado). Pra time pequeno onde uma pessoa cuida de operação parcialmente, o painel ganha. Pra time onde você precisa entender exatamente o que rolou na 3h da manhã, o script ganha.",[19,2787,2789],{"id":2788},"versao-robusta-heroctl","Versão \"robusta\" — HeroCtl",[12,2791,2792],{},"Pra quem quer parar de scriptar mas não quer caixa-preta, o HeroCtl combina rolling deploy automático com plano de controle replicado. Você descreve o serviço em arquivo de configuração e o orquestrador faz o resto:",[224,2794,2798],{"className":2795,"code":2796,"language":2797,"meta":229,"style":229},"language-hcl shiki shiki-themes github-dark-default","job \"minhaapp\" {\n  group \"web\" {\n    count = 2\n\n    task \"app\" {\n      driver = \"docker\"\n      config {\n        image = \"meuusuario\u002Fmyapp:v2\"\n        ports = [\"http\"]\n      }\n\n      service {\n        port = \"http\"\n        check {\n          type     = \"http\"\n          path     = \"\u002Fhealthz\"\n          interval = \"5s\"\n          timeout  = \"2s\"\n        }\n      }\n    }\n\n    update {\n      max_parallel      = 1\n      min_healthy_time  = \"10s\"\n      healthy_deadline  = \"5m\"\n      auto_revert       = true\n    }\n  }\n}\n","hcl",[231,2799,2800,2805,2810,2815,2819,2824,2829,2834,2839,2844,2849,2853,2858,2863,2868,2873,2878,2883,2888,2892,2896,2900,2904,2909,2914,2919,2924,2929,2933,2937],{"__ignoreMap":229},[234,2801,2802],{"class":236,"line":237},[234,2803,2804],{},"job \"minhaapp\" {\n",[234,2806,2807],{"class":236,"line":244},[234,2808,2809],{},"  group \"web\" {\n",[234,2811,2812],{"class":236,"line":271},[234,2813,2814],{},"    count = 2\n",[234,2816,2817],{"class":236,"line":415},[234,2818,412],{"emptyLinePlaceholder":411},[234,2820,2821],{"class":236,"line":434},[234,2822,2823],{},"    task \"app\" {\n",[234,2825,2826],{"class":236,"line":459},[234,2827,2828],{},"      driver = \"docker\"\n",[234,2830,2831],{"class":236,"line":464},[234,2832,2833],{},"      config {\n",[234,2835,2836],{"class":236,"line":479},[234,2837,2838],{},"        image = \"meuusuario\u002Fmyapp:v2\"\n",[234,2840,2841],{"class":236,"line":484},[234,2842,2843],{},"        ports = [\"http\"]\n",[234,2845,2846],{"class":236,"line":490},[234,2847,2848],{},"      }\n",[234,2850,2851],{"class":236,"line":508},[234,2852,412],{"emptyLinePlaceholder":411},[234,2854,2855],{"class":236,"line":529},[234,2856,2857],{},"      service {\n",[234,2859,2860],{"class":236,"line":535},[234,2861,2862],{},"        port = \"http\"\n",[234,2864,2865],{"class":236,"line":546},[234,2866,2867],{},"        check {\n",[234,2869,2870],{"class":236,"line":552},[234,2871,2872],{},"          type     = \"http\"\n",[234,2874,2875],{"class":236,"line":557},[234,2876,2877],{},"          path     = \"\u002Fhealthz\"\n",[234,2879,2880],{"class":236,"line":594},[234,2881,2882],{},"          interval = \"5s\"\n",[234,2884,2885],{"class":236,"line":635},[234,2886,2887],{},"          timeout  = \"2s\"\n",[234,2889,2890],{"class":236,"line":643},[234,2891,1352],{},[234,2893,2894],{"class":236,"line":659},[234,2895,2848],{},[234,2897,2898],{"class":236,"line":683},[234,2899,1357],{},[234,2901,2902],{"class":236,"line":695},[234,2903,412],{"emptyLinePlaceholder":411},[234,2905,2906],{"class":236,"line":717},[234,2907,2908],{},"    update {\n",[234,2910,2911],{"class":236,"line":723},[234,2912,2913],{},"      max_parallel      = 1\n",[234,2915,2916],{"class":236,"line":729},[234,2917,2918],{},"      min_healthy_time  = \"10s\"\n",[234,2920,2921],{"class":236,"line":734},[234,2922,2923],{},"      healthy_deadline  = \"5m\"\n",[234,2925,2926],{"class":236,"line":771},[234,2927,2928],{},"      auto_revert       = true\n",[234,2930,2931],{"class":236,"line":776},[234,2932,1357],{},[234,2934,2935],{"class":236,"line":815},[234,2936,720],{},[234,2938,2939],{"class":236,"line":820},[234,2940,1362],{},[12,2942,2943],{},"Os mesmos parâmetros do script bash, declarativos. A diferença é que o orquestrador coordena rolling entre N servidores (não só dois), faz eleição automática de coordenador em torno de sete segundos se o nó atual cair, e mantém o plano de controle distribuído entre os primeiros três servidores. Cluster sobrevive a perda de qualquer servidor único sem intervenção humana.",[12,2945,2946],{},"Instalação:",[224,2948,2950],{"className":226,"code":2949,"language":228,"meta":229,"style":229},"curl -sSL https:\u002F\u002Fget.heroctl.com\u002Finstall.sh | sh\n",[231,2951,2952],{"__ignoreMap":229},[234,2953,2954,2956,2959,2962,2965],{"class":236,"line":237},[234,2955,1220],{"class":247},[234,2957,2958],{"class":251}," -sSL",[234,2960,2961],{"class":255}," https:\u002F\u002Fget.heroctl.com\u002Finstall.sh",[234,2963,2964],{"class":383}," |",[234,2966,2967],{"class":247}," sh\n",[12,2969,2970],{},"Plano Community é gratuito permanente — sem limite de servidores ou jobs, com todas as features de orquestração descritas no tutorial. Plano Business adiciona SSO\u002FSAML, RBAC granular, auditoria detalhada e suporte com SLA, pra times que têm requisitos formais de plataforma. Plano Enterprise adiciona escrow de código-fonte, contrato de continuidade e suporte 24×7. Os preços de Business e Enterprise estão publicados na página de planos — sem \"fale com vendas\" obrigatório.",[19,2972,2974],{"id":2973},"comparativo-cinco-caminhos-lado-a-lado","Comparativo: cinco caminhos lado a lado",[119,2976,2977,3002],{},[122,2978,2979],{},[125,2980,2981,2984,2987,2990,2993,2996,2999],{},[128,2982,2983],{},"Critério",[128,2985,2986],{},"Script bash (2 servers)",[128,2988,2989],{},"Coolify multi-server",[128,2991,2992],{},"Dokploy + Swarm",[128,2994,2995],{},"HeroCtl",[128,2997,2998],{},"Kamal",[128,3000,3001],{},"Kubernetes",[141,3003,3004,3026,3049,3071,3089,3106,3128,3148],{},[125,3005,3006,3009,3012,3015,3018,3021,3023],{},[146,3007,3008],{},"Tempo de setup",[146,3010,3011],{},"2-3h",[146,3013,3014],{},"30 min",[146,3016,3017],{},"1h",[146,3019,3020],{},"5 min",[146,3022,3017],{},[146,3024,3025],{},"4h-4 dias",[125,3027,3028,3031,3034,3037,3040,3043,3046],{},[146,3029,3030],{},"Linhas de config",[146,3032,3033],{},"~50 (script)",[146,3035,3036],{},"UI",[146,3038,3039],{},"~20",[146,3041,3042],{},"~50",[146,3044,3045],{},"~40",[146,3047,3048],{},"300+",[125,3050,3051,3054,3057,3060,3063,3066,3068],{},[146,3052,3053],{},"HA do plano de controle",[146,3055,3056],{},"N\u002FA",[146,3058,3059],{},"Não",[146,3061,3062],{},"Limitado",[146,3064,3065],{},"Sim",[146,3067,3056],{},[146,3069,3070],{},"Sim (5+ componentes)",[125,3072,3073,3076,3079,3081,3083,3085,3087],{},[146,3074,3075],{},"Health check declarativo",[146,3077,3078],{},"Manual",[146,3080,3065],{},[146,3082,3065],{},[146,3084,3065],{},[146,3086,3065],{},[146,3088,3065],{},[125,3090,3091,3093,3096,3098,3100,3102,3104],{},[146,3092,2442],{},[146,3094,3095],{},"Manual no script",[146,3097,3065],{},[146,3099,3065],{},[146,3101,3065],{},[146,3103,3065],{},[146,3105,3065],{},[125,3107,3108,3111,3114,3117,3120,3123,3125],{},[146,3109,3110],{},"Escala alvo",[146,3112,3113],{},"1-3 servers",[146,3115,3116],{},"1-10 servers",[146,3118,3119],{},"1-20 servers",[146,3121,3122],{},"1-500 servers",[146,3124,3116],{},[146,3126,3127],{},"50+ servers",[125,3129,3130,3133,3136,3138,3141,3144,3146],{},[146,3131,3132],{},"Caixa-preta?",[146,3134,3135],{},"Não (você escreveu)",[146,3137,3065],{},[146,3139,3140],{},"Parcial",[146,3142,3143],{},"Não (declarativo curto)",[146,3145,3059],{},[146,3147,3065],{},[125,3149,3150,3153,3156,3158,3161,3163,3165],{},[146,3151,3152],{},"Curva de aprendizado",[146,3154,3155],{},"Baixa",[146,3157,3155],{},[146,3159,3160],{},"Média",[146,3162,3155],{},[146,3164,3155],{},[146,3166,3167],{},"Alta",[12,3169,3170],{},"Cada coluna tem seu nicho. Script bash é insuperável quando você quer entender cada linha. Coolify ganha quando você só quer um painel. HeroCtl ganha quando você precisa de HA real sem montar plano de controle externo. Kubernetes ganha em escala planetária — onde a complexidade compensa.",[19,3172,3174],{"id":3173},"os-cinco-erros-mais-comuns","Os cinco erros mais comuns",[67,3176,3177,3189,3195,3205,3217],{},[70,3178,3179,3185,3186,3188],{},[27,3180,3181,3182,3184],{},"Health check em ",[231,3183,1523],{}," retornando 200 sem validar dependências."," A app retorna 200 antes de conectar no banco, o proxy promove, e o usuário vê erro 500 nas primeiras requests. Solução: ",[231,3187,355],{}," valida banco, cache, fila — qualquer coisa que a app precise pra responder de verdade.",[70,3190,3191,3194],{},[27,3192,3193],{},"Min healthy time de 1 segundo."," Apps com warm-up irregular podem retornar 200 num momento e 503 logo depois (cache populando, classe sendo lazy-loaded). O orquestrador promove na primeira janela boa, e a próxima request bate em estado ruim. Dez segundos sustentados eliminam noventa por cento desses casos.",[70,3196,3197,3200,3201,3204],{},[27,3198,3199],{},"Sem max_parallel (ou max_parallel = N)."," Se você troca todas as instâncias juntas, durante a janela do cutover não tem ninguém saudável servindo. É single-server downtime disfarçado. Sempre ",[231,3202,3203],{},"max_parallel = 1"," pra começar.",[70,3206,3207,3210,3211,3213,3214,3216],{},[27,3208,3209],{},"Mix de versões em produção sem schema compat."," v1 escreve em ",[231,3212,2629],{},", v2 lê de ",[231,3215,2633],{},", e durante o rolling de cinco minutos as duas convivem — usuários que pegam v2 não veem dados que v1 acabou de gravar. Migration backward-compatible em três passos resolve.",[70,3218,3219,3222],{},[27,3220,3221],{},"Cache stale no cliente (CDN, browser, service worker)."," Backend já é v2 mas o usuário tem o JS de v1 em cache, e o JS antigo chama API que não existe mais. Solução: mantém endpoints antigos por uma janela; versionamento de API; cache-busting forte em assets críticos.",[19,3224,3226],{"id":3225},"faq","FAQ",[12,3228,3229],{},[27,3230,3231],{},"Posso fazer zero-downtime com um servidor só?",[12,3233,3234,3235,3238],{},"Não. Toda variação que prometa isso tem janela de erro mensurável quando você mede com ",[231,3236,3237],{},"hey -c 20",". A única forma de ter zero-downtime real é manter pelo menos uma instância sempre saudável durante todo o deploy — o que exige duas máquinas no mínimo.",[12,3240,3241],{},[27,3242,3243],{},"DNS round-robin funciona como balanceador?",[12,3245,3246],{},"Funciona como balanceador básico, mas não como mecanismo de health check. DNS não tira IP morto da rotação rapidamente — TTLs caching em ISPs e clientes mantêm o IP errado em uso por minutos ou horas. Pra zero-downtime você precisa de um proxy real (Caddy, nginx, HAProxy) que tira instância unhealthy do balanceamento em segundos.",[12,3248,3249],{},[27,3250,3251],{},"Caddy ou Traefik — qual é melhor pra esse setup?",[12,3253,3254],{},"Pra dois servidores e um setup estático, Caddy é mais simples — Caddyfile de quinze linhas resolve. Traefik brilha quando você tem descoberta dinâmica de serviços (tipo Docker labels ou Consul) e muitos backends mudando o tempo todo. nginx fica no meio: mais flexível, sem TLS automático embutido (precisa de certbot externo). Pra esse tutorial, Caddy.",[12,3256,3257],{},[27,3258,3259],{},"WebSocket connections sobrevivem durante rolling?",[12,3261,3262,3263,3265],{},"Conexões abertas em instância que está sendo derrubada são cortadas. O cliente tem que reconectar. Boa biblioteca de WebSocket (Socket.IO, Phoenix Channels) reconecta automaticamente — usuário vê uma piscada de meio segundo no estado. Connection draining ajuda: a instância marca ",[231,3264,355],{}," falhando, o proxy para de mandar conexões novas, mas as existentes continuam até o pre-stop timer. Trinta segundos de drain costumam ser suficientes pra que conexões longas se esvaziem naturalmente.",[12,3267,3268],{},[27,3269,3270],{},"Database migrations — qual a regra de ouro?",[12,3272,3273],{},"Toda migration tem que ser backward-compatible. Drop de coluna nunca direto. Rename nunca direto. Mudança de tipo nunca direto. Em vez disso, três deploys: adiciona estrutura nova, backfill, remove a antiga. Lento, sim. Mas o rolling deploy depende disso pra não quebrar.",[12,3275,3276],{},[27,3277,3278],{},"Rollback automático — como implementar?",[12,3280,3281,3282,101],{},"Duas peças: deadline (tempo máximo esperando health check) e referência da imagem anterior pré-puxada. Se passar do deadline sem ficar saudável, o script reinstala a versão anterior. O exemplo no Passo 5 faz exatamente isso. Em orquestradores declarativos, vira ",[231,3283,3284],{},"auto_revert = true",[12,3286,3287],{},[27,3288,3289],{},"Sticky sessions complicam zero-downtime?",[12,3291,3292],{},"Sim. Se a app guarda estado de sessão em memória do processo, derrubar a instância derruba as sessões dos usuários conectados a ela. Solução: tira sessão da memória — Redis, Postgres ou JWT signed. Aí qualquer instância serve qualquer usuário, e rolling não corta nenhuma sessão.",[12,3294,3295],{},[27,3296,3297],{},"Quanto tempo demora um deploy completo?",[12,3299,3300,3301,3304],{},"Dois servidores, app que sobe em quinze segundos: cerca de um minuto. Detalhamento: pull da imagem (5-15s, depende da rede e do tamanho), substituição do contêiner (1s), warm-up + health check (10-30s), min healthy time de 10s, total uns 30-50s por host, multiplicado por dois hosts em sequência = 1-2 min. Quatro servidores ficam em torno de 2-4 min. Com cinquenta servidores, deploy começa a tomar dez ou quinze minutos — momento de aumentar ",[231,3302,3303],{},"max_parallel"," pra dois ou três (mantendo health check rigoroso).",[57,3306],{},[19,3308,3310],{"id":3309},"fechamento","Fechamento",[12,3312,3313],{},"Zero-downtime deploy é arquitetura, não ferramenta. Os três ingredientes — múltiplas instâncias, proxy com health check, rolling controlado — funcionam com bash e Caddy tanto quanto com orquestrador grande. A diferença está em quanto da operação você quer escrever na mão e quanto delegar.",[12,3315,3316],{},"Pra um SaaS pequeno, três VPS e um script de cinquenta linhas resolvem indefinidamente. Quando o cluster cresce pra dezenas de servidores ou o time precisa de HA real do plano de controle, vale subir pro orquestrador declarativo:",[224,3318,3319],{"className":226,"code":2949,"language":228,"meta":229,"style":229},[231,3320,3321],{"__ignoreMap":229},[234,3322,3323,3325,3327,3329,3331],{"class":236,"line":237},[234,3324,1220],{"class":247},[234,3326,2958],{"class":251},[234,3328,2961],{"class":255},[234,3330,2964],{"class":383},[234,3332,2967],{"class":247},[12,3334,3335,3336,3341,3342,3346],{},"Mais sobre o algoritmo de rolling em ",[3337,3338,3340],"a",{"href":3339},"\u002Fblog\u002Frolling-deploy-seguro-por-que-o-seu-talvez-nao-seja","Rolling deploy seguro: por que o seu talvez não seja",". Pra quem está saindo de Compose pra setup multi-servidor, ",[3337,3343,3345],{"href":3344},"\u002Fblog\u002Fdeploy-docker-producao-do-compose-ao-cluster","Deploy Docker em produção: do compose ao cluster"," cobre o caminho intermediário.",[12,3348,3349],{},"Orquestração de contêineres, sem cerimônia.",[3351,3352,3353],"style",{},"html pre.shiki code .sH3jZ, html code.shiki .sH3jZ{--shiki-default:#8B949E}html pre.shiki code .sQhOw, html code.shiki .sQhOw{--shiki-default:#FFA657}html pre.shiki code .sFSAA, html code.shiki .sFSAA{--shiki-default:#79C0FF}html pre.shiki code .s9uIt, html code.shiki .s9uIt{--shiki-default:#A5D6FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .suJrU, html code.shiki .suJrU{--shiki-default:#FF7B72}html pre.shiki code .sZEs4, html code.shiki .sZEs4{--shiki-default:#E6EDF3}html pre.shiki code .sc3cj, html code.shiki .sc3cj{--shiki-default:#D2A8FF}",{"title":229,"searchDepth":244,"depth":244,"links":3355},[3356,3357,3358,3359,3360,3361,3366,3367,3368,3369,3370,3371,3372,3373,3374,3375,3376,3377,3378],{"id":21,"depth":244,"text":22},{"id":61,"depth":244,"text":62},{"id":93,"depth":244,"text":94},{"id":113,"depth":244,"text":114},{"id":215,"depth":244,"text":216},{"id":348,"depth":244,"text":349,"children":3362},[3363,3364,3365],{"id":370,"depth":271,"text":371},{"id":918,"depth":271,"text":919},{"id":1002,"depth":271,"text":1003},{"id":1099,"depth":244,"text":1100},{"id":1241,"depth":244,"text":1242},{"id":1462,"depth":244,"text":1463},{"id":2449,"depth":244,"text":2450},{"id":2540,"depth":244,"text":2541},{"id":2609,"depth":244,"text":2610},{"id":2729,"depth":244,"text":2730},{"id":2760,"depth":244,"text":2761},{"id":2788,"depth":244,"text":2789},{"id":2973,"depth":244,"text":2974},{"id":3173,"depth":244,"text":3174},{"id":3225,"depth":244,"text":3226},{"id":3309,"depth":244,"text":3310},"engenharia",null,"2026-06-09","Você não precisa de Kubernetes pra ter deploy sem downtime. Tutorial completo com 2 servidores, Caddy\u002FTraefik na frente, e rolling update via script ou orquestrador leve.",false,"md",{},"\u002Fblog\u002Fdeploy-zero-downtime-sem-kubernetes-tutorial","15 min",{"title":6,"description":3382},{"loc":3386},"blog\u002Fdeploy-zero-downtime-sem-kubernetes-tutorial",[1526,3392,3393,3379],"zero-downtime","tutorial","6-My071frsY_ilBftAnrX2BPg0OBLI-wOOVTkQBW3O0",{"id":3396,"title":3397,"author":7,"body":3398,"category":3379,"cover":3380,"date":4397,"description":4398,"draft":3383,"extension":3384,"lastReviewed":3380,"meta":4399,"navigation":411,"path":4400,"readingTime":4401,"seo":4402,"sitemap":4403,"stem":4404,"tags":4405,"__hash__":4410},"blog_pt\u002Fblog\u002Fapi-gateway-self-hosted-traefik-kong-quando-instalar.md","API Gateway self-hosted: quando vale instalar Kong, Traefik ou similar",{"type":9,"value":3399,"toc":4377},[3400,3403,3406,3410,3417,3420,3427,3431,3434,3516,3522,3582,3585,3589,3592,3596,3599,3605,3611,3617,3621,3624,3629,3634,3639,3643,3646,3651,3656,3661,3665,3668,3673,3678,3683,3687,3690,3695,3700,3705,3709,3712,3750,3753,3757,3760,3812,3815,3819,3822,3828,3831,3834,3838,4124,4131,4135,4138,4144,4150,4156,4162,4168,4171,4175,4178,4184,4190,4196,4202,4206,4209,4241,4245,4255,4261,4267,4277,4283,4289,4295,4309,4315,4319,4322,4325,4328,4331,4347,4361,4371,4374],[12,3401,3402],{},"\"API gateway\" é uma das categorias mais sobrecarregadas de jargão na arquitetura de back-end. O termo virou guarda-chuva pra coisas que reverse proxy simples já faz há vinte anos — rotear, terminar TLS, balancear entre instâncias — misturadas com coisas que de fato exigem um componente dedicado: validação de chave de API por cliente, limite de requisições por usuário, transformação de corpo da requisição, agregação de múltiplos back-ends numa só resposta. A confusão vende muito produto. E faz muita startup instalar componente crítico que ela não precisava — pagando depois em latência, RAM, complexidade operacional e área de superfície de falha.",[12,3404,3405],{},"Este post separa o que cada coisa cobre, lista os cinco jogadores principais com números honestos de consumo de recursos, e desenha uma régua prática: quando o reverse proxy embutido no orquestrador resolve, quando vale subir um Traefik standalone, e quando você de fato precisa de um Kong com plug-ins de autenticação. A audiência é o tech lead que está olhando pro stack atual e tentando decidir se a próxima dor merece mais um componente no caminho crítico — ou se a dor é falsa.",[19,3407,3409],{"id":3408},"tldr-instalar-gateway-dedicado-e-decisao-cara-mantenha-a-regua-curta","TL;DR — instalar gateway dedicado é decisão cara, mantenha a régua curta",[12,3411,3412,3413,3416],{},"Reverse proxy simples cobre o tronco do problema: HTTPS terminado, certificados Let's Encrypt automáticos, roteamento por host e caminho, balanceamento entre back-ends, health check, compressão. Pra um SaaS B2B típico com web app + alguns micro-serviços HTTP, ",[27,3414,3415],{},"isso basta",". Não precisa instalar Kong, não precisa Tyk, não precisa KrakenD.",[12,3418,3419],{},"API gateway dedicado vira investimento defensável quando aparecem três sinais simultâneos: você publica uma API pra terceiros consumirem (não só sua própria web\u002Fmobile), você precisa de limite de requisições por chave de cliente (não por IP), e você quer documentação interativa com tentar-aqui pros consumidores. Nesse cenário, Kong, Tyk ou Traefik com middlewares ricos pagam o próprio custo. Fora desse cenário, você está adicionando 100–300 MB de RAM no caminho crítico, de 1 a 3 milissegundos de latência por requisição, e mais um componente que pode cair em produção — em troca de funcionalidades que ninguém vai usar.",[12,3421,3422,3423,3426],{},"A régua mais simples que conhecemos: ",[27,3424,3425],{},"se o seu cliente final é uma pessoa abrindo um navegador, reverse proxy basta. Se o seu cliente final é um desenvolvedor com chave de API, considere o gateway."," Tudo o mais é variação em cima dessas duas linhas.",[19,3428,3430],{"id":3429},"o-que-reverse-proxy-simples-ja-cobre-e-o-que-ainda-falta","O que reverse proxy simples já cobre, e o que ainda falta",[12,3432,3433],{},"Antes de comparar gateways, vale fixar o piso. Um reverse proxy decente — Caddy, nginx, ou o roteador integrado de um orquestrador moderno — entrega bastante coisa de graça. Esta lista representa o estado da arte em 2026, não o mínimo histórico:",[2735,3435,3436,3442,3448,3465,3471,3477,3483,3489,3495,3501],{},[70,3437,3438,3441],{},[27,3439,3440],{},"Terminação HTTP\u002FHTTPS com HTTP\u002F2 e HTTP\u002F3."," O proxy fala com o cliente em qualquer protocolo moderno e fala com o back-end em HTTP\u002F1.1 limpo se for o caso.",[70,3443,3444,3447],{},[27,3445,3446],{},"Certificados Let's Encrypt automáticos."," Emissão, renovação aos 60 dias, recuperação de erro. Hoje isso é commodity — qualquer roteador sério faz.",[70,3449,3450,2578,3453,3456,3457,3460,3461,3464],{},[27,3451,3452],{},"Roteamento por host e caminho.",[231,3454,3455],{},"api.exemplo.com.br"," vai pra um back-end, ",[231,3458,3459],{},"app.exemplo.com.br"," vai pra outro, ",[231,3462,3463],{},"\u002Fv1\u002Fusuarios"," vai pra um terceiro. Regras com prefixo, regex e prioridade.",[70,3466,3467,3470],{},[27,3468,3469],{},"Balanceamento entre instâncias."," Round-robin, menos conexões, hash por IP. Suficiente pra distribuir carga entre as réplicas de um mesmo serviço.",[70,3472,3473,3476],{},[27,3474,3475],{},"Health check ativo e passivo."," Tira instância doente do pool. Re-inclui quando ela volta.",[70,3478,3479,3482],{},[27,3480,3481],{},"Compressão gzip e brotli."," Negocia com o cliente, comprime o que vale a pena.",[70,3484,3485,3488],{},[27,3486,3487],{},"Cache de conteúdo estático."," Pra arquivos imutáveis, evita ida ao back-end.",[70,3490,3491,3494],{},[27,3492,3493],{},"Limite básico por IP."," Trinta requisições por segundo por endereço, por exemplo. Cobre boa parte de abuso bobo.",[70,3496,3497,3500],{},[27,3498,3499],{},"Timeouts e tentativas."," Falha rápido, tenta de novo num back-end alternativo se for caso.",[70,3502,3503,2578,3506,571,3509,571,3512,3515],{},[27,3504,3505],{},"Cabeçalhos de proxy.",[231,3507,3508],{},"X-Forwarded-For",[231,3510,3511],{},"X-Real-IP",[231,3513,3514],{},"X-Forwarded-Proto",". O back-end enxerga o cliente real.",[12,3517,3518,3519,3521],{},"Isso é muita coisa. Pra 80% das aplicações web de SaaS B2B, é tudo o que se precisa no caminho de entrada. O que reverse proxy simples ",[27,3520,100],{}," cobre é o que diferencia gateway:",[2735,3523,3524,3530,3540,3546,3552,3558,3564,3570,3576],{},[70,3525,3526,3529],{},[27,3527,3528],{},"Validação de chave de API por cliente."," Cada consumidor recebe uma chave, o gateway valida, identifica o cliente, e usa essa identidade pra limites e auditoria.",[70,3531,3532,3535,3536,3539],{},[27,3533,3534],{},"Validação de token JWT com chaves rotacionáveis."," O gateway baixa as chaves públicas do emissor, valida assinatura e tempo, expõe ",[231,3537,3538],{},"claims"," pro back-end.",[70,3541,3542,3545],{},[27,3543,3544],{},"Limite de requisições por chave\u002Fusuário\u002Frota."," Cliente A pode fazer 1.000 chamadas\u002Fhora; cliente B, 100. Por rota, por dia, com janela deslizante. Difícil de fazer em proxy simples.",[70,3547,3548,3551],{},[27,3549,3550],{},"Transformação de requisição e resposta."," Adicionar\u002Fremover cabeçalhos, reescrever corpo JSON, traduzir entre versões da API.",[70,3553,3554,3557],{},[27,3555,3556],{},"Versionamento por cabeçalho ou caminho."," Conviver com clientes em v1 enquanto v2 ganha tração. Política de descontinuação.",[70,3559,3560,3563],{},[27,3561,3562],{},"Agregação de back-ends."," Endpoint composto que chama três micro-serviços e devolve uma resposta unificada (padrão back-end-for-frontend).",[70,3565,3566,3569],{},[27,3567,3568],{},"Validação de esquema da requisição."," Rejeitar no gateway o que não bate com o contrato OpenAPI antes de tocar no back-end.",[70,3571,3572,3575],{},[27,3573,3574],{},"Portal de documentação com tentar-aqui."," Página interativa pra desenvolvedores explorarem a API.",[70,3577,3578,3581],{},[27,3579,3580],{},"Métricas granulares por chave de API."," Quem chamou, quanto, quando, com que latência. Vital se a API é o produto.",[12,3583,3584],{},"Cada item dessa segunda lista é uma feature que custa caro pra fazer em código de aplicação espalhado. Se você precisa da maioria, gateway paga. Se você não precisa de quase nada — o que é o caso comum em SaaS de produto — gateway é peso morto.",[19,3586,3588],{"id":3587},"os-cinco-jogadores-que-importam-em-2026","Os cinco jogadores que importam em 2026",[12,3590,3591],{},"O mercado se assentou. Há cinco escolhas defensáveis pra gateway self-hosted, com perfis razoavelmente distintos. Os números de RAM e latência abaixo são medidos com configuração padrão e workload modesto (algumas dezenas de chamadas por segundo); plug-ins pesados ou volume alto mudam tudo.",[368,3593,3595],{"id":3594},"kong-baseado-em-lua-sobre-openresty","Kong (baseado em Lua, sobre OpenResty)",[12,3597,3598],{},"O nome mais conhecido da categoria. Kong começou em 2015 e tem o maior catálogo de plug-ins do espaço — autenticação OAuth, validação JWT, transformação, log pra Elasticsearch, integração com cofres externos, tudo pré-pronto. A versão de código aberto cobre a maioria dos casos; a paga adiciona portal de desenvolvedor mais polido, RBAC fino, e suporte com SLA.",[12,3600,3601,3604],{},[27,3602,3603],{},"Recursos:"," mínimo realista de 200 MB de RAM por instância, mais o banco de dados se você não usar modo sem-banco. Latência adicionada de 1 a 2 milissegundos por requisição em chamada simples. Plug-ins pesados (validação de esquema com OpenAPI grande, transformação JSON complexa) podem dobrar isso.",[12,3606,3607,3610],{},[27,3608,3609],{},"Quando faz sentido:"," API pública séria com vários consumidores externos, necessidade de plug-ins do catálogo, time disposto a aprender Lua se precisar customizar. Empresa de meio de pagamentos, plataforma de comunicação, qualquer negócio onde a API é o produto vendido.",[12,3612,3613,3616],{},[27,3614,3615],{},"Pegadinha:"," o modo com PostgreSQL coloca o banco no caminho crítico. Banco caiu, gateway não atualiza configuração. Use o modo sem-banco (configuração declarativa via arquivo) sempre que possível — elimina essa dependência.",[368,3618,3620],{"id":3619},"traefik-escrito-em-go-falando-varios-proxies-de-orquestrador","Traefik (escrito em Go, falando vários proxies de orquestrador)",[12,3622,3623],{},"Conhecido como controlador de entrada de Kubernetes, mas tem middlewares ricos suficientes pra cobrir muitos casos de gateway. Limite de requisições por cliente, validação básica de JWT, transformação de cabeçalho, redirecionamentos complexos, autenticação encaminhada (delegando pra serviço externo). Versão paga adiciona plug-ins comerciais e dashboard mais robusto.",[12,3625,3626,3628],{},[27,3627,3603],{}," 50 a 100 MB de RAM, latência adicionada de 0,5 a 1 milissegundo. Discovery automático de back-ends via etiquetas de contêiner é o ponto forte — você não escreve configuração de rota, ela aparece quando o serviço sobe.",[12,3630,3631,3633],{},[27,3632,3609],{}," já está usando Traefik como roteador de entrada e quer evitar adicionar mais um componente; precisa de middlewares razoáveis mas não do catálogo gigante de Kong; valoriza configuração declarativa por etiqueta em vez de banco de dados.",[12,3635,3636,3638],{},[27,3637,3615],{}," alguns padrões avançados (agregação de chamadas, validação OpenAPI completa, portal de documentação interativo) não cabem em Traefik. Se você precisa disso, a tentação de \"esticar\" Traefik via plug-ins customizados leva a complexidade que Kong resolveria mais limpo.",[368,3640,3642],{"id":3641},"tyk-escrito-em-go-foco-em-portal-de-desenvolvedor","Tyk (escrito em Go, foco em portal de desenvolvedor)",[12,3644,3645],{},"A versão de código aberto entrega muito mais do que a maioria — limite de requisições por chave, gerenciamento de chaves, portal de desenvolvedor, todos no plano grátis. A versão paga adiciona painel multi-tenant, replicação multi-região, e suporte.",[12,3647,3648,3650],{},[27,3649,3603],{}," 100 MB de RAM, latência adicionada de 1 a 2 milissegundos. Banco de dados (Redis) é parte central da arquitetura — limite de requisições e contadores vivem ali.",[12,3652,3653,3655],{},[27,3654,3609],{}," API com muitos consumidores externos, portal de desenvolvedor é parte do produto, você quer pagar menos do que Kong cobra pelo equivalente em recursos. Times pequenos publicando API pra parceiros têm encontrado bom encaixe aqui.",[12,3657,3658,3660],{},[27,3659,3615],{}," menos plug-ins prontos do que Kong. Se a sua integração esperada existe na lista de Kong mas não na de Tyk, o trade-off muda.",[368,3662,3664],{"id":3663},"krakend-escrito-em-go-sem-banco-de-dados-foco-em-agregacao","KrakenD (escrito em Go, sem banco de dados, foco em agregação)",[12,3666,3667],{},"KrakenD é o gateway pequeno que se especializa em agregação. Configuração 100% em arquivo, sem estado externo, projetado pra compor endpoints — o cliente faz uma chamada, KrakenD chama três back-ends em paralelo e devolve uma resposta combinada. Ótimo pra padrão back-end-for-frontend.",[12,3669,3670,3672],{},[27,3671,3603],{}," 50 MB de RAM, latência adicionada de 0,5 milissegundo. O mais leve da categoria. Sem banco, sem painel — tudo é arquivo de configuração estático.",[12,3674,3675,3677],{},[27,3676,3609],{}," você tem múltiplos micro-serviços e quer expor uma API mais limpa pro front-end mobile\u002Fweb. Você não precisa de gerenciamento dinâmico de chaves nem portal de desenvolvedor. Você gosta de configuração imutável: muda arquivo, faz deploy novo, pronto.",[12,3679,3680,3682],{},[27,3681,3615],{}," tudo é estático. Adicionar uma chave nova é deploy. Pra time pequeno isso é simplificação; pra plataforma de API com terceiros se cadastrando, vira gargalo.",[368,3684,3686],{"id":3685},"envoy-gateway-cncf-sobre-proxy-envoy","Envoy Gateway (CNCF, sobre proxy Envoy)",[12,3688,3689],{},"O caçula sério da lista. Envoy é o proxy de altíssimo desempenho usado em malhas de serviço grandes. Envoy Gateway é o projeto que empacota Envoy como gateway de API com configuração declarativa. Foco em Kubernetes, alta vazão, integração com malha.",[12,3691,3692,3694],{},[27,3693,3603],{}," Envoy puro consome 50 a 100 MB no proxy de dados; o plano de controle pesa mais. Latência adicionada baixa (\u003C 1 milissegundo) em chamada simples. Mas a complexidade operacional é a mais alta da lista.",[12,3696,3697,3699],{},[27,3698,3609],{}," você já roda malha de serviço com Envoy (Istio, Consul, Linkerd com proxy compatível) e quer consistência de configuração entre malha e gateway. Você opera em escala alta o suficiente pra que a vazão de Envoy importe (dezenas de milhares de requisições por segundo).",[12,3701,3702,3704],{},[27,3703,3615],{}," pra startup com 4 servidores e algumas dezenas de requisições por segundo, Envoy Gateway é overkill por dois ou três tamanhos. A complexidade de configuração não se paga.",[19,3706,3708],{"id":3707},"quando-reverse-proxy-simples-basta","Quando reverse proxy simples basta?",[12,3710,3711],{},"Esta é a pergunta que economiza dinheiro. A resposta honesta é: na grande maioria dos SaaS B2B brasileiros que vemos rodando, basta. Os critérios pra \"basta\":",[2735,3713,3714,3720,3726,3732,3738,3744],{},[70,3715,3716,3719],{},[27,3717,3718],{},"Público da sua API é a sua própria aplicação."," Web, mobile, integrações internas. Não há terceiros desconhecidos chamando endpoints com chaves emitidas por você.",[70,3721,3722,3725],{},[27,3723,3724],{},"Autenticação acontece no aplicativo, não no caminho."," Sessão por cookie, token JWT emitido pelo próprio back-end e validado por middleware da aplicação, OAuth via biblioteca dentro do código. O proxy não precisa enxergar o usuário.",[70,3727,3728,3731],{},[27,3729,3730],{},"Limite de requisições é \"evite abuso bobo\"."," Trinta por segundo por IP, talvez. Não há plano comercial que limite Cliente A a 1.000 chamadas\u002Fdia e Cliente B a 10.000.",[70,3733,3734,3737],{},[27,3735,3736],{},"Você não precisa combinar back-ends."," Cada chamada do front-end vai pra um endpoint, esse endpoint chama o que precisa internamente. Sem agregação no caminho.",[70,3739,3740,3743],{},[27,3741,3742],{},"Documentação da API é interna ou inexistente."," Não há portal de desenvolvedor com tentar-aqui pra terceiros.",[70,3745,3746,3749],{},[27,3747,3748],{},"Versionamento, se existir, é gerenciado em código."," O back-end roteia internamente entre v1 e v2 quando preciso. Não há política formal no gateway.",[12,3751,3752],{},"Se cinco dos seis itens acima são verdade, instalar gateway dedicado é caro pelo benefício real. Reverse proxy embutido no orquestrador, ou Caddy\u002Fnginx standalone, cobre tudo.",[19,3754,3756],{"id":3755},"quando-vale-gateway-dedicado","Quando vale gateway dedicado?",[12,3758,3759],{},"A inversão da lista anterior. Gateway compensa quando aparecem alguns destes:",[2735,3761,3762,3768,3774,3780,3794,3800,3806],{},[70,3763,3764,3767],{},[27,3765,3766],{},"API pública é parte do produto."," Você cobra (ou planeja cobrar) por uso de API. Terceiros se cadastram, recebem chave, consomem.",[70,3769,3770,3773],{},[27,3771,3772],{},"Limite por chave\u002Fusuário\u002Frota é regra de negócio."," Plano gratuito tem teto, plano pago tem teto maior, plano enterprise é negociado. Esse limite precisa viver em algum lugar — gateway é o lugar certo.",[70,3775,3776,3779],{},[27,3777,3778],{},"Múltiplos back-ends precisam ser combinados em uma resposta."," Padrão back-end-for-frontend, agregação de micro-serviços, fan-out e fan-in. Custos altos no aplicativo, custos modestos no gateway.",[70,3781,3782,3785,3786,3789,3790,3793],{},[27,3783,3784],{},"Versionamento formal de API."," Você suporta v1 e v2 simultaneamente, com data de descontinuação anunciada. Cabeçalho ",[231,3787,3788],{},"Accept-Version"," ou caminho ",[231,3791,3792],{},"\u002Fv2\u002F",". Cliente legado não pode quebrar.",[70,3795,3796,3799],{},[27,3797,3798],{},"Autenticação complexa."," Validação de JWT emitido por terceiro, com chaves públicas baixadas e cacheadas, com rotação automática. OAuth com vários provedores. Autenticação por certificado de cliente (TLS mútuo) pra integrações entre empresas.",[70,3801,3802,3805],{},[27,3803,3804],{},"Portal de desenvolvedor com tentar-aqui."," Documentação interativa, gerenciamento de chave self-service, painel de uso pro consumidor.",[70,3807,3808,3811],{},[27,3809,3810],{},"Métricas por chave de API."," Quem chama o quê, quando, latência por consumidor. Dashboards comerciais, relatórios de uso, SLA por cliente.",[12,3813,3814],{},"Três ou mais desses critérios verdadeiros, gateway é defensável. Um ou dois, ainda dá pra resolver de outras formas (autenticação no aplicativo, limite por aplicativo, métricas estruturadas no log).",[19,3816,3818],{"id":3817},"roteador-integrado-do-heroctl-onde-ele-fica-nessa-regua","Roteador integrado do HeroCtl — onde ele fica nessa régua",[12,3820,3821],{},"O roteador embutido no HeroCtl não tenta ser gateway. Cobre o lado de reverse proxy bem feito: HTTPS terminado, Let's Encrypt automático com renovação, roteamento por host e caminho, balanceamento entre as réplicas que o orquestrador subiu, health check coordenado com o agente em cada nó, compressão, cabeçalhos de proxy, limite básico por IP, política de tentativa em caso de falha de back-end.",[12,3823,3824,3825,3827],{},"O que o roteador integrado ",[27,3826,100],{}," faz: validação de chave de API por consumidor, limite por chave\u002Fusuário, transformação de corpo, agregação de back-ends, validação de esquema OpenAPI, portal de desenvolvedor. Pra os 80% dos casos onde o cliente final é navegador ou app mobile da própria empresa, o roteador embutido cobre o caminho de entrada inteiro — você não instala mais nada na frente.",[12,3829,3830],{},"Pros 20% que precisam de gateway dedicado, o caminho é direto: instale Kong, Traefik standalone, Tyk ou KrakenD como mais um job no cluster, atrás do roteador embutido. O roteador termina TLS na borda, o gateway faz o trabalho de gateway, os back-ends ficam atrás. Sem cerimônia, sem dependência circular.",[12,3832,3833],{},"Plano de controle do HeroCtl ocupa entre 200 e 400 MB por servidor — ou seja, um Kong instalado adiciona praticamente o mesmo peso do plano de controle inteiro. Vale lembrar a ordem de grandeza antes de \"só instalar\".",[19,3835,3837],{"id":3836},"tabela-comparativa-12-criterios","Tabela comparativa — 12 critérios",[119,3839,3840,3867],{},[122,3841,3842],{},[125,3843,3844,3846,3849,3852,3855,3858,3861,3864],{},[128,3845,2983],{},[128,3847,3848],{},"Reverse proxy simples (Caddy\u002Fnginx)",[128,3850,3851],{},"Roteador HeroCtl",[128,3853,3854],{},"Traefik standalone",[128,3856,3857],{},"KrakenD",[128,3859,3860],{},"Tyk OSS",[128,3862,3863],{},"Kong OSS",[128,3865,3866],{},"Envoy Gateway",[141,3868,3869,3895,3919,3940,3959,3978,3997,4017,4036,4057,4078,4099],{},[125,3870,3871,3874,3877,3880,3883,3886,3889,3892],{},[146,3872,3873],{},"RAM mínima",[146,3875,3876],{},"20–50 MB",[146,3878,3879],{},"embutido no plano de controle",[146,3881,3882],{},"50–100 MB",[146,3884,3885],{},"~50 MB",[146,3887,3888],{},"~100 MB",[146,3890,3891],{},"~200 MB",[146,3893,3894],{},"~100 MB + plano de controle",[125,3896,3897,3900,3903,3905,3908,3911,3914,3916],{},[146,3898,3899],{},"Latência adicionada",[146,3901,3902],{},"\u003C 0,5 ms",[146,3904,3902],{},[146,3906,3907],{},"0,5–1 ms",[146,3909,3910],{},"~0,5 ms",[146,3912,3913],{},"1–2 ms",[146,3915,3913],{},[146,3917,3918],{},"\u003C 1 ms (pode crescer)",[125,3920,3921,3924,3927,3929,3931,3934,3936,3938],{},[146,3922,3923],{},"Certificados automáticos",[146,3925,3926],{},"Sim (Caddy nativo)",[146,3928,3065],{},[146,3930,3065],{},[146,3932,3933],{},"Não direto",[146,3935,3065],{},[146,3937,3065],{},[146,3939,3065],{},[125,3941,3942,3945,3947,3949,3951,3953,3955,3957],{},[146,3943,3944],{},"Roteamento host\u002Fcaminho",[146,3946,3065],{},[146,3948,3065],{},[146,3950,3065],{},[146,3952,3065],{},[146,3954,3065],{},[146,3956,3065],{},[146,3958,3065],{},[125,3960,3961,3964,3966,3968,3970,3972,3974,3976],{},[146,3962,3963],{},"Balanceamento + health",[146,3965,3065],{},[146,3967,3065],{},[146,3969,3065],{},[146,3971,3065],{},[146,3973,3065],{},[146,3975,3065],{},[146,3977,3065],{},[125,3979,3980,3983,3985,3987,3989,3991,3993,3995],{},[146,3981,3982],{},"Limite por IP",[146,3984,3065],{},[146,3986,3065],{},[146,3988,3065],{},[146,3990,3065],{},[146,3992,3065],{},[146,3994,3065],{},[146,3996,3065],{},[125,3998,3999,4002,4004,4006,4009,4011,4013,4015],{},[146,4000,4001],{},"Limite por chave\u002Fusuário",[146,4003,3059],{},[146,4005,3059],{},[146,4007,4008],{},"Sim (com middleware)",[146,4010,3065],{},[146,4012,3065],{},[146,4014,3065],{},[146,4016,3065],{},[125,4018,4019,4022,4024,4026,4028,4030,4032,4034],{},[146,4020,4021],{},"Validação de JWT",[146,4023,3059],{},[146,4025,3059],{},[146,4027,3140],{},[146,4029,3065],{},[146,4031,3065],{},[146,4033,3065],{},[146,4035,3065],{},[125,4037,4038,4041,4043,4045,4047,4050,4052,4055],{},[146,4039,4040],{},"Agregação de back-ends",[146,4042,3059],{},[146,4044,3059],{},[146,4046,3059],{},[146,4048,4049],{},"Sim (foco)",[146,4051,3140],{},[146,4053,4054],{},"Sim (com plug-in)",[146,4056,3065],{},[125,4058,4059,4062,4064,4066,4068,4071,4073,4076],{},[146,4060,4061],{},"Validação OpenAPI",[146,4063,3059],{},[146,4065,3059],{},[146,4067,3059],{},[146,4069,4070],{},"Sim (assinante)",[146,4072,3065],{},[146,4074,4075],{},"Sim (plug-in)",[146,4077,3065],{},[125,4079,4080,4083,4085,4087,4089,4091,4094,4097],{},[146,4081,4082],{},"Portal de desenvolvedor",[146,4084,3059],{},[146,4086,3059],{},[146,4088,3059],{},[146,4090,3059],{},[146,4092,4093],{},"Sim (incluso)",[146,4095,4096],{},"Sim (pago no OSS robusto)",[146,4098,3059],{},[125,4100,4101,4104,4107,4110,4113,4115,4118,4121],{},[146,4102,4103],{},"Configuração",[146,4105,4106],{},"Arquivo",[146,4108,4109],{},"Painel + API",[146,4111,4112],{},"Etiquetas\u002Farquivo",[146,4114,4106],{},[146,4116,4117],{},"Arquivo + painel",[146,4119,4120],{},"Arquivo + painel + banco",[146,4122,4123],{},"Custom Resources",[12,4125,4126,4127,4130],{},"A tabela tem zonas claras. As três primeiras colunas resolvem o caminho de entrada com peso baixo. As quatro últimas resolvem caminho de entrada ",[27,4128,4129],{},"mais"," trabalho de gateway, com peso e complexidade crescentes.",[19,4132,4134],{"id":4133},"stack-tipica-por-estagio-da-empresa","Stack típica por estágio da empresa",[12,4136,4137],{},"Esta é a régua que recomendamos. Não é prescrição rígida — é o que vemos funcionar em times brasileiros de SaaS.",[12,4139,4140,4143],{},[27,4141,4142],{},"MVP (1 back-end, 1 desenvolvedor)."," Caddy standalone num servidor, ou roteador embutido se você já está em orquestrador. Não instala nada. Não pensa em gateway. Foca no produto.",[12,4145,4146,4149],{},[27,4147,4148],{},"Indie hacker (3 a 5 back-ends, time de 1 a 3)."," Roteador embutido no orquestrador, ponto. O caminho de entrada já cobre o que importa. Autenticação no aplicativo, limite básico por IP no proxy. Tempo gasto com gateway é tempo não gasto em feature do produto.",[12,4151,4152,4155],{},[27,4153,4154],{},"Startup early (10 a 20 back-ends, primeiros consumidores externos da API)."," Hora de avaliar. Se a API externa é experimento que ainda pode morrer, deixe a autenticação no aplicativo e limite por chave numa biblioteca compartilhada. Se a API é parte central da promessa do produto, instale Traefik standalone com middlewares de autenticação e limite, ou Tyk OSS pelo portal incluso. Kong nesta fase costuma ser pesado demais.",[12,4157,4158,4161],{},[27,4159,4160],{},"Startup mid (50+ back-ends, plataforma de API pública vira produto)."," Kong OSS ou Tyk pago. Você precisa de plug-ins, portal robusto, gerenciamento de chave self-service, métricas comerciais. O peso de Kong agora se justifica — você está cobrando por uso de API e o gateway é receita, não custo.",[12,4163,4164,4167],{},[27,4165,4166],{},"Empresa grande (centenas de serviços, integrações com parceiros sérios)."," Kong Enterprise ou Envoy Gateway, dependendo do contexto. Equipe dedicada cuidando do gateway. Política formal de versionamento, descontinuação, SLA por cliente.",[12,4169,4170],{},"A migração natural — reverse proxy → Traefik\u002FTyk → Kong — funciona porque cada degrau resolve dor real do degrau anterior. Pular degraus é caro: instalar Kong na fase de MVP é colocar um caminhão pra entregar uma pizza.",[19,4172,4174],{"id":4173},"os-4-erros-caros-mais-comuns-com-gateway","Os 4 erros caros mais comuns com gateway",[12,4176,4177],{},"Os tropeços que vemos em produção:",[12,4179,4180,4183],{},[27,4181,4182],{},"Instalar Kong com PostgreSQL no caminho crítico sem precisar."," O modo sem-banco existe e é perfeito pra maioria dos casos. Configuração declarativa via arquivo, sem dependência externa, sem ponto extra de falha. Muitos times caem na configuração padrão com banco e descobrem isso só quando o banco fica indisponível e o gateway não consegue mais propagar mudanças. Se você precisa de gerenciamento dinâmico de chaves (consumidores se cadastrando self-service), banco compensa. Senão, modo sem-banco.",[12,4185,4186,4189],{},[27,4187,4188],{},"Não monitorar o gateway com a mesma severidade dos back-ends."," Gateway na frente vira caixa-preta de fácil esquecimento. Latência cresce 5 ms, taxa de erro vai de 0,01% pra 0,5%, ninguém percebe até cliente reclamar. Métricas de gateway (latência por rota, taxa de erro 4xx\u002F5xx, uso de memória, lag de propagação de configuração) merecem dashboard próprio e alertas, não só inclusão tímida no painel geral.",[12,4191,4192,4195],{},[27,4193,4194],{},"Plug-in customizado em Lua\u002FJS rodando em produção."," Kong permite plug-in customizado em Lua. Tyk em JavaScript. Tentação enorme pra resolver \"só essa transformação\" no gateway. Bug nesse plug-in derruba o gateway inteiro — bug que você criou, sem teste de carga, no caminho crítico de tudo. Se você precisa de transformação custom, faça em micro-serviço atrás do gateway. Plug-in customizado só com revisão séria, teste de carga, e plano de rollback automático.",[12,4197,4198,4201],{},[27,4199,4200],{},"Versão do gateway desatualizada."," Kong, Envoy e Tyk recebem CVEs (vulnerabilidades de segurança) com regularidade. Gateway é exposto à internet — superfície de ataque relevante. Versão de 18 meses atrás é vulnerabilidade conhecida acumulando. Faça parte do ciclo de manutenção: atualizar o gateway é tão importante quanto atualizar o sistema operacional.",[19,4203,4205],{"id":4204},"cenarios-reais-em-que-nao-instalar-gateway","Cenários reais em que NÃO instalar gateway",[12,4207,4208],{},"Lista forte. Se você está em algum destes, evite o gateway dedicado mesmo que o tópico apareça no conselho:",[2735,4210,4211,4217,4223,4229,4235],{},[70,4212,4213,4216],{},[27,4214,4215],{},"SaaS web com 5 endpoints, sem API externa pública."," Cliente final é o navegador. Autenticação por sessão. Reverse proxy resolve o caminho de entrada inteiro. Adicionar gateway aqui é vaidade arquitetural.",[70,4218,4219,4222],{},[27,4220,4221],{},"Time pequeno (1 a 3 desenvolvedores)."," Curva de aprendizado de Kong custa duas a quatro semanas de produtividade total do time. Em time de 3 pessoas, isso é trimestre de feature parado. A não ser que o gateway resolva dor concreta hoje, adia.",[70,4224,4225,4228],{},[27,4226,4227],{},"Workload onde latência sub-10ms é requisito duro."," Trading de baixa latência, leilão em tempo real, jogo multiplayer. Cada milissegundo conta. Gateway adiciona 1 a 3 ms — em workload sensível, é caro. Coloque a inteligência no aplicativo.",[70,4230,4231,4234],{},[27,4232,4233],{},"Aplicação monolítica sem agregação."," O monolito atende o front-end direto, sem composição entre serviços. Não há o que agregar. Gateway é solução procurando problema.",[70,4236,4237,4240],{},[27,4238,4239],{},"Compliance que prefere superfície de ataque mínima."," Cada componente exposto à internet é mais um item pra auditoria, mais um patch a aplicar, mais um log a guardar. Se a auditoria valoriza minimalismo, justifique cada componente — gateway que não cobre dor concreta é minus.",[19,4242,4244],{"id":4243},"perguntas-frequentes","Perguntas frequentes",[12,4246,4247,4250,4251,4254],{},[27,4248,4249],{},"Kong sem banco é estável em 2026?","\nSim. O modo declarativo (",[231,4252,4253],{},"db_less = on",") é maduro, recomendado pelo próprio Kong pra grande parte dos casos, e elimina o PostgreSQL como dependência. Você perde gerenciamento dinâmico de chave via API admin (precisa fazer deploy de configuração nova), mas ganha simplicidade operacional enorme. Pra time pequeno, troca quase sempre vale.",[12,4256,4257,4260],{},[27,4258,4259],{},"Traefik faz tudo que Kong faz?","\nNão. Traefik com middlewares cobre a maioria dos casos comuns — autenticação básica, limite por chave simples, transformação de cabeçalho, encaminhamento de autenticação. Não cobre catálogo de plug-ins de Kong, validação OpenAPI nativa, portal de desenvolvedor robusto, integrações comerciais prontas. Se a sua dor cabe em middleware de Traefik, fica em Traefik (mais leve, mais simples). Se você precisa de coisa do catálogo de Kong, Kong.",[12,4262,4263,4266],{},[27,4264,4265],{},"Posso ter dois gateways em série?","\nTecnicamente sim, na prática quase sempre é sintoma de organização confusa. Dois gateways = duas configurações pra manter, duas latências somadas, dois pontos de falha. O caso defensável é: roteador de borda fazendo TLS e roteamento básico, gateway dedicado atrás fazendo trabalho específico (validação de chave, agregação). Isso é diferente de \"dois gateways completos em série\" — é divisão de responsabilidade.",[12,4268,4269,4272,4273,101],{},[27,4270,4271],{},"API gateway substitui malha de serviço?","\nNão. Gateway cuida do tráfego norte-sul (cliente externo → seu sistema). Malha cuida do tráfego leste-oeste (serviço interno → serviço interno). Funções parecidas (autenticação, limite, observabilidade) mas escopo diferente. Pra startup média, gateway resolve a parte que importa; malha de serviço completa só vira investimento defensável em escala maior. Tratamos esse limite em ",[3337,4274,4276],{"href":4275},"\u002Fblog\u002Fservice-mesh-quando-vale-pra-saas-pequeno-medio","service mesh: quando vale pra SaaS pequeno e médio",[12,4278,4279,4282],{},[27,4280,4281],{},"Quanta latência Kong adiciona em chamada típica?","\nEm hardware moderno, com configuração padrão e plug-ins leves (validação de chave + limite por chave): 1 a 2 milissegundos por requisição. Plug-ins pesados (validação OpenAPI completa em payload grande, transformação JSON complexa, log síncrono pra serviço externo) podem somar 3 a 10 ms. Meça antes e depois — não confie em número de blog post genérico.",[12,4284,4285,4288],{},[27,4286,4287],{},"Provedor de OAuth self-hosted — Keycloak ou Hydra?","\nKeycloak é o padrão pra quem quer painel de administração robusto, federação com LDAP\u002FSAML, gerenciamento de usuário completo. Pesa mais (1 GB de RAM mínimo, JVM). Hydra é minimalista, foca só em OAuth\u002FOIDC, sem gerenciamento de usuário (você integra com seu sistema de usuários existente). Pra time pequeno que já tem sistema de usuário próprio, Hydra é mais adequado. Pra empresa que quer um lugar único pra identidade, Keycloak. Os dois falam protocolos padrão, então o gateway não diferencia entre eles.",[12,4290,4291,4294],{},[27,4292,4293],{},"Validação de esquema — OpenAPI ou JSON Schema?","\nOpenAPI (anteriormente Swagger) é o padrão pra descrever API HTTP — engloba caminhos, métodos, requisição e resposta. Inclui JSON Schema pra descrever payloads. Kong, Tyk e validadores standalone falam OpenAPI direto. JSON Schema puro é mais portável (não amarrado a HTTP) mas exige mais cola. Use OpenAPI quando o gateway suportar; vale ter o esquema do contrato vivo, não desatualizado.",[12,4296,4297,4300,4301,4304,4305,4308],{},[27,4298,4299],{},"Posso fazer limite no aplicativo em vez de gateway?","\nPode. Bibliotecas como ",[231,4302,4303],{},"golang.org\u002Fx\u002Ftime\u002Frate"," ou Redis com ",[231,4306,4307],{},"INCR"," resolvem limite por usuário no nível da aplicação. A questão é onde o limite é mais barato: no gateway, antes do back-end ser tocado (economiza recursos do back-end, aplica antes do trabalho começar) ou no aplicativo, com regra de negócio mais perto do código (mais fácil de raciocinar, mais fácil de testar). Pra limite simples, aplicativo basta. Pra limite por plano comercial com múltiplos níveis e auditoria, gateway é o lugar certo.",[12,4310,4311,4314],{},[27,4312,4313],{},"Posso usar dois gateways diferentes em rotas distintas?","\nPode. Algumas empresas rodam Kong pra rotas \"produto\" (API pública vendida) e Traefik pra rotas \"interno\" (admin, ops, cron). A justificativa é que cada gateway resolve uma dor diferente, e ter um só forçaria comprometimento. Vale quando os perfis de uso de fato divergem. Não vale só pelo prazer de ter variedade — duas peças pra manter.",[19,4316,4318],{"id":4317},"fechamento-comece-pelo-minimo-suba-quando-a-dor-for-real","Fechamento — comece pelo mínimo, suba quando a dor for real",[12,4320,4321],{},"A cilada da categoria \"API gateway\" é tratar a decisão como binária — instalar ou não — quando ela é gradativa. Reverse proxy bem feito cobre 80% das aplicações. Roteador integrado no orquestrador cobre as mesmas 80% sem componente separado. Gateway dedicado é investimento defensável quando aparecem três ou quatro sinais simultâneos: API externa pública, limite por chave, agregação, portal de desenvolvedor.",[12,4323,4324],{},"A régua honesta: instale o mínimo até a dor concreta forçar o próximo degrau. Pular degraus custa caro em latência, RAM, complexidade, área de falha. Time pequeno que instala Kong \"porque vai precisar\" passa três semanas configurando algo que não usa, e ainda assim tem mais um componente pra monitorar.",[12,4326,4327],{},"HeroCtl entrega o degrau mais baixo embutido — roteador integrado com TLS automático, balanceamento, health check, limite por IP. Quando a dor de gateway aparecer pra valer, você sobe Kong, Traefik standalone, Tyk ou KrakenD como mais um job no cluster. Sem migração dolorosa, sem cerimônia.",[12,4329,4330],{},"Pra subir um cluster e testar:",[224,4332,4333],{"className":226,"code":2949,"language":228,"meta":229,"style":229},[231,4334,4335],{"__ignoreMap":229},[234,4336,4337,4339,4341,4343,4345],{"class":236,"line":237},[234,4338,1220],{"class":247},[234,4340,2958],{"class":251},[234,4342,2961],{"class":255},[234,4344,2964],{"class":383},[234,4346,2967],{"class":247},[12,4348,4349,4352,4353,4356,4357,4360],{},[27,4350,4351],{},"Community"," é gratuito pra sempre, sem teto de servidores, sem teto de jobs, sem feature gate. ",[27,4354,4355],{},"Business"," adiciona SSO\u002FSAML, RBAC granular, auditoria detalhada e suporte com SLA. ",[27,4358,4359],{},"Enterprise"," acrescenta escrow de código-fonte, contrato de continuidade e suporte 24×7.",[12,4362,4363,4364,2403,4366,4370],{},"Posts próximos: ",[3337,4365,4276],{"href":4275},[3337,4367,4369],{"href":4368},"\u002Fblog\u002Fmulti-tenant-saas-isolamento-real","multi-tenant SaaS: isolamento real entre clientes",". Os três tópicos juntos cobrem a maior parte das decisões de plataforma pra startup brasileira na faixa de 1 a 500 servidores.",[12,4372,4373],{},"Orquestração de contêineres, sem cerimônia. Gateway só quando a dor pedir.",[3351,4375,4376],{},"html pre.shiki code .sQhOw, html code.shiki .sQhOw{--shiki-default:#FFA657}html pre.shiki code .sFSAA, html code.shiki .sFSAA{--shiki-default:#79C0FF}html pre.shiki code .s9uIt, html code.shiki .s9uIt{--shiki-default:#A5D6FF}html pre.shiki code .suJrU, html code.shiki .suJrU{--shiki-default:#FF7B72}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":229,"searchDepth":244,"depth":244,"links":4378},[4379,4380,4381,4388,4389,4390,4391,4392,4393,4394,4395,4396],{"id":3408,"depth":244,"text":3409},{"id":3429,"depth":244,"text":3430},{"id":3587,"depth":244,"text":3588,"children":4382},[4383,4384,4385,4386,4387],{"id":3594,"depth":271,"text":3595},{"id":3619,"depth":271,"text":3620},{"id":3641,"depth":271,"text":3642},{"id":3663,"depth":271,"text":3664},{"id":3685,"depth":271,"text":3686},{"id":3707,"depth":244,"text":3708},{"id":3755,"depth":244,"text":3756},{"id":3817,"depth":244,"text":3818},{"id":3836,"depth":244,"text":3837},{"id":4133,"depth":244,"text":4134},{"id":4173,"depth":244,"text":4174},{"id":4204,"depth":244,"text":4205},{"id":4243,"depth":244,"text":4244},{"id":4317,"depth":244,"text":4318},"2026-06-03","API gateway resolve auth, rate limit, transformações e observabilidade — em troca de mais um componente crítico. Quando reverse proxy simples basta vs quando vale o gateway dedicado.",{},"\u002Fblog\u002Fapi-gateway-self-hosted-traefik-kong-quando-instalar","13 min",{"title":3397,"description":4398},{"loc":4400},"blog\u002Fapi-gateway-self-hosted-traefik-kong-quando-instalar",[4406,4407,4408,3379,4409],"api-gateway","kong","traefik","arquitetura","kBrp5dr1WQbf0cuzoPbd3WN6wGW7e6FTXkQ0XgGvTQs",{"id":4412,"title":4413,"author":7,"body":4414,"category":3379,"cover":3380,"date":5370,"description":5371,"draft":3383,"extension":3384,"lastReviewed":3380,"meta":5372,"navigation":411,"path":4275,"readingTime":4401,"seo":5373,"sitemap":5374,"stem":5375,"tags":5376,"__hash__":5380},"blog_pt\u002Fblog\u002Fservice-mesh-quando-vale-pra-saas-pequeno-medio.md","Service mesh é overkill pra startup brasileira? Quando vale instalar Istio\u002FLinkerd",{"type":9,"value":4415,"toc":5352},[4416,4419,4423,4426,4429,4433,4436,4526,4529,4533,4536,4577,4580,4584,4587,4621,4624,4628,4631,4707,4710,4736,4739,4743,4746,4763,4766,4773,4777,4780,4783,4803,4806,4820,4823,4827,4830,5028,5035,5039,5042,5068,5071,5075,5078,5110,5114,5117,5143,5146,5150,5153,5173,5176,5180,5183,5203,5206,5210,5213,5250,5252,5258,5267,5273,5279,5285,5291,5297,5303,5309,5311,5314,5317,5335,5347,5350],[12,4417,4418],{},"A pergunta chega sempre no mesmo formato. Um tech lead de uma SaaS brasileira com seis ou oito serviços rodando lê três posts em inglês sobre malha de serviço, vê toda a indústria americana usando Istio, e abre o terminal pra instalar — junto com a dúvida: \"isso aqui não é demais pro tamanho da minha empresa?\". Provavelmente é. Mas a resposta honesta exige separar quatro problemas que a malha de serviço resolve, mostrar o custo em RAM e CPU por servidor, e descrever o ponto exato em que o benefício passa a superar o overhead.",[19,4420,4422],{"id":4421},"tldr-service-mesh-vale-pra-startup-pequenamedia","TL;DR — Service mesh vale pra startup pequena\u002Fmédia?",[12,4424,4425],{},"Malha de serviço (Istio, Linkerd, Cilium Service Mesh, Consul Connect) resolve quatro problemas reais entre serviços de uma arquitetura de microserviços: criptografia automática (chamada entre pods sem TLS por default vaza tráfego em texto puro), retries e circuit breakers (resiliência configurável), observabilidade granular (qual serviço chama qual, com qual latência), e traffic shaping para canary releases. Em troca, adiciona um proxy paralelo em cada pod (normalmente Envoy) que consome entre 50 e 100 MB de RAM e adiciona 5 a 10 ms de latência por chamada interna.",[12,4427,4428],{},"Pra startup com menos de dez serviços ativos e menos de cinquenta pods, malha de serviço é overkill — o overhead operacional supera o benefício, e o time gasta semanas estudando uma camada que resolve um problema que ainda não tem. Pra empresa com cinquenta ou mais microserviços onde diagnosticar \"qual serviço está atrasando a chamada?\" leva horas, malha paga em produtividade. O meio-termo são clusters com criptografia entre serviços embutida no próprio plano de controle — cobrem cerca de 60% do que malha oferece sem o sidecar paralelo, e atendem a maioria dos casos brasileiros até a faixa dos trinta serviços.",[19,4430,4432],{"id":4431},"o-que-service-mesh-resolve-em-uma-frase","O que service mesh resolve, em uma frase",[12,4434,4435],{},"Antes de discutir custo, é preciso ser claro sobre o que está sendo comprado. Malha de serviço é uma camada de rede que se intromete em cada chamada entre serviços e adiciona seis comportamentos:",[2735,4437,4438,4451,4463,4475,4502,4511],{},[70,4439,4440,4443,4444,2630,4447,4450],{},[27,4441,4442],{},"Criptografia automática entre pods."," Sem malha, uma chamada de ",[231,4445,4446],{},"pedidos",[231,4448,4449],{},"usuarios"," dentro do cluster trafega em HTTP simples. Qualquer agente com acesso à rede do nó vê o conteúdo. Com malha, cada chamada é cifrada com certificados emitidos automaticamente, sem alteração no código da aplicação.",[70,4452,4453,4456,4457,4459,4460,4462],{},[27,4454,4455],{},"Retries automáticos em chamadas internas."," Quando ",[231,4458,4446],{}," chama ",[231,4461,4449],{}," e a primeira tentativa falha por uma flap de rede de 200 ms, a malha reenvia. Sem malha, a aplicação precisa implementar essa lógica em cada cliente HTTP que ela cria.",[70,4464,4465,4468,4469,4471,4472,4474],{},[27,4466,4467],{},"Circuit breakers configuráveis."," Se ",[231,4470,4449],{}," começa a responder com latência de cinco segundos, a malha abre o circuito e faz ",[231,4473,4446],{}," falhar rápido em vez de empilhar conexões. Sem malha, o time precisa adicionar uma biblioteca em cada serviço.",[70,4476,4477,4480,4481,571,4484,4487,4488,4490,4491,4493,4494,2403,4496,4499,4500,101],{},[27,4478,4479],{},"Distributed tracing automático."," A malha propaga cabeçalhos de correlação (",[231,4482,4483],{},"x-request-id",[231,4485,4486],{},"traceparent",") por toda a cadeia de chamadas. O time consegue ver, num painel, que uma requisição entrou no ",[231,4489,4406],{},", passou por ",[231,4492,4446],{},", chamou ",[231,4495,4449],{},[231,4497,4498],{},"estoque",", e gastou a maior parte do tempo no ",[231,4501,4498],{},[70,4503,4504,4507,4508,4510],{},[27,4505,4506],{},"Traffic shaping fino."," Encaminhar 5% do tráfego de ",[231,4509,4446],{}," pra uma versão nova (canary), espelhar 100% pra uma versão de teste sem afetar o cliente (mirror), ou alternar entre duas versões inteiras (blue-green) — tudo configurado declarativamente, sem código.",[70,4512,4513,4516,4517,2403,4519,4522,4523,4525],{},[27,4514,4515],{},"Authorization policies entre serviços."," Declarar que apenas ",[231,4518,4446],{},[231,4520,4521],{},"relatorios"," podem chamar ",[231,4524,4449],{},", e qualquer outro serviço recebe 403. É a base da chamada \"rede zero-trust\" entre pods.",[12,4527,4528],{},"Esses seis comportamentos são reais e o valor é mensurável. A pergunta é se o seu cluster de hoje tem volume e complexidade suficientes pra justificar pagar por eles.",[19,4530,4532],{"id":4531},"o-que-nao-e-problema-de-service-mesh","O que NÃO é problema de service mesh",[12,4534,4535],{},"Antes de avançar, vale eliminar quatro problemas que muito time confunde com motivo pra instalar malha — e que orquestrador moderno já resolve sozinho:",[2735,4537,4538,4552,4558,4567],{},[70,4539,4540,4543,4544,4547,4548,4551],{},[27,4541,4542],{},"Roteamento de entrada (ingress HTTP)."," Receber tráfego externo, terminar TLS, rotear ",[231,4545,4546],{},"api.exemplo.com"," pra um serviço e ",[231,4549,4550],{},"app.exemplo.com"," pra outro. Isso é trabalho de roteador integrado ao orquestrador, não de malha.",[70,4553,4554,4557],{},[27,4555,4556],{},"Balanceamento de carga simples."," Distribuir requisições entre três réplicas de um mesmo serviço com round-robin. Orquestrador faz isso com DNS interno e health checks. Malha agrega só quando a política de balanceamento precisa ser sofisticada (peso por região, sticky sessions complexas).",[70,4559,4560,4563,4564,4566],{},[27,4561,4562],{},"Service discovery."," Encontrar onde ",[231,4565,4449],{}," está rodando. DNS interno do cluster resolve. Malha não traz nada novo aqui.",[70,4568,4569,4572,4573,4576],{},[27,4570,4571],{},"Terminação HTTP\u002FHTTPS na borda."," Ingress controller resolve. Malha cuida do tráfego ",[179,4574,4575],{},"entre"," serviços, não da entrada.",[12,4578,4579],{},"Quem instala malha esperando que ela resolva esses quatro está pagando duas vezes pelo mesmo trabalho.",[19,4581,4583],{"id":4582},"os-quatro-jogadores-principais","Os quatro jogadores principais",[12,4585,4586],{},"Quatro produtos dominam essa categoria em 2026. As diferenças importam quando o tradeoff é overhead vs features.",[2735,4588,4589,4599,4609,4615],{},[70,4590,4591,4594,4595,4598],{},[27,4592,4593],{},"Istio."," O mais antigo, mais completo, mais documentado — e mais pesado. Usa Envoy como sidecar em cada pod. Padrão de fato em empresas grandes que adotaram malha entre 2019 e 2022. A versão Ambient Mode (sem sidecar, com ",[231,4596,4597],{},"ztunnel"," por nó) reduz overhead, mas ainda está estabilizando em produção.",[70,4600,4601,4604,4605,4608],{},[27,4602,4603],{},"Linkerd."," Foco em simplicidade. Proxy próprio escrito em Rust (",[231,4606,4607],{},"linkerd2-proxy","), bem mais leve que Envoy. Curva de aprendizado curta — instalação cabe num par de comandos. CNCF graduado, mas com comunidade menor que Istio.",[70,4610,4611,4614],{},[27,4612,4613],{},"Cilium Service Mesh."," Aproveita eBPF no kernel pra implementar boa parte da malha sem sidecar. Overhead por pod beira zero. Em troca, o setup do cluster precisa de kernel recente e CNI compatível, e algumas features avançadas (como autorização L7 sofisticada) ainda dependem de proxy auxiliar.",[70,4616,4617,4620],{},[27,4618,4619],{},"Consul Connect."," Da Hashicorp. Integra com o cofre de segredos da própria casa, e funciona bem em ambientes mistos (VMs + contêineres). Comunidade brasileira menor que Istio\u002FLinkerd.",[12,4622,4623],{},"Existem outros (Kuma, Open Service Mesh, AWS App Mesh), mas concentrar no quarteto acima cobre 95% das decisões reais que um tech lead brasileiro vai enfrentar.",[19,4625,4627],{"id":4626},"quanto-custa-em-ram-e-cpu","Quanto custa em RAM e CPU?",[12,4629,4630],{},"A pergunta que decide a discussão.",[119,4632,4633,4649],{},[122,4634,4635],{},[125,4636,4637,4640,4643,4646],{},[128,4638,4639],{},"Malha",[128,4641,4642],{},"RAM por pod",[128,4644,4645],{},"CPU por pod",[128,4647,4648],{},"Latência adicional",[141,4650,4651,4665,4679,4693],{},[125,4652,4653,4656,4659,4662],{},[146,4654,4655],{},"Istio (Envoy sidecar)",[146,4657,4658],{},"+80–120 MB",[146,4660,4661],{},"+10–15%",[146,4663,4664],{},"5–10 ms",[125,4666,4667,4670,4673,4676],{},[146,4668,4669],{},"Linkerd (linkerd2-proxy Rust)",[146,4671,4672],{},"+20–40 MB",[146,4674,4675],{},"+3–6%",[146,4677,4678],{},"1–3 ms",[125,4680,4681,4684,4687,4690],{},[146,4682,4683],{},"Cilium Service Mesh (eBPF)",[146,4685,4686],{},"~0 MB por pod",[146,4688,4689],{},"~2% no nó",[146,4691,4692],{},"\u003C1 ms",[125,4694,4695,4698,4701,4704],{},[146,4696,4697],{},"Consul Connect (Envoy sidecar)",[146,4699,4700],{},"+70–110 MB",[146,4702,4703],{},"+8–12%",[146,4705,4706],{},"4–8 ms",[12,4708,4709],{},"Em cluster com cem pods ativos:",[2735,4711,4712,4718,4724,4730],{},[70,4713,4714,4717],{},[27,4715,4716],{},"Istio"," consome cerca de 10 GB de RAM apenas em proxies paralelos, antes de qualquer aplicação.",[70,4719,4720,4723],{},[27,4721,4722],{},"Linkerd"," consome cerca de 3 GB.",[70,4725,4726,4729],{},[27,4727,4728],{},"Cilium"," consome quase nada por pod, mas exige um agente por nó (cerca de 200–400 MB cada).",[70,4731,4732,4735],{},[27,4733,4734],{},"Consul Connect"," fica próximo de Istio.",[12,4737,4738],{},"Pra cluster brasileiro típico de startup — quatro servidores com 4 GB de RAM cada, totalizando 16 GB — Istio sozinho ocupa um terço da memória do cluster antes de qualquer linha de código rodar. Linkerd ocupa um quinto. Cilium ocupa quase nada por pod, mas exige planejamento de CNI.",[19,4740,4742],{"id":4741},"minha-startup-precisa-disso","Minha startup precisa disso?",[12,4744,4745],{},"Resposta direta: provavelmente não. Os critérios honestos pra \"precisa\":",[2735,4747,4748,4751,4754,4757,4760],{},[70,4749,4750],{},"Trinta ou mais microserviços ativos em produção.",[70,4752,4753],{},"Tráfego entre serviços é mais de 50% do volume HTTP total do cluster.",[70,4755,4756],{},"Mais de um incidente por mês relacionado a \"qual serviço caiu, atrasou ou está estourando timeout\".",[70,4758,4759],{},"Compliance formal exige rede zero-trust entre pods (PCI-DSS nível 1, certos contratos com Banco Central, frameworks de saúde).",[70,4761,4762],{},"Time tem pelo menos uma pessoa dedicada à plataforma, com tempo pra estudar e operar a malha.",[12,4764,4765],{},"Se você não bate em pelo menos três desses cinco critérios, malha é overkill. A complexidade acrescentada não retorna em valor — retorna em chamadas no plantão tentando entender por que o sidecar está reciclando.",[12,4767,4768,4769,4772],{},"Critério mais importante e menos discutido: ",[27,4770,4771],{},"quanto do tráfego é interno?",". Aplicação que recebe requisição na borda, faz uma única consulta no banco e responde, gasta 95% do tempo entre cliente externo e banco — não entre serviços. Aplicação que recebe requisição na borda, chama dez serviços internos pra montar a resposta, gasta a maior parte do tempo no tráfego interno. Pra primeira, malha não acrescenta nada perceptível. Pra segunda, malha pode cortar horas de debugging por mês.",[19,4774,4776],{"id":4775},"o-substituto-cluster-native","O substituto cluster-native",[12,4778,4779],{},"Aqui mora a parte que o discurso americano subestima. Em 2026, vários orquestradores modernos — incluindo o HeroCtl e algumas distribuições do colosso ortodoxo — vêm com criptografia entre serviços embutida no plano de controle. Sem sidecar, sem proxy paralelo, sem instalar produto adicional.",[12,4781,4782],{},"O que isso cobre:",[2735,4784,4785,4791,4797],{},[70,4786,4787,4790],{},[27,4788,4789],{},"Criptografia entre serviços."," Cada serviço recebe certificado emitido automaticamente pelo cluster. Chamada interna é cifrada por padrão.",[70,4792,4793,4796],{},[27,4794,4795],{},"Identidade de serviço."," Cada serviço se autentica pelo certificado, não por IP ou DNS.",[70,4798,4799,4802],{},[27,4800,4801],{},"Authorization básica."," Listas de quem pode chamar quem, declarativas no arquivo de configuração do serviço.",[12,4804,4805],{},"O que isso NÃO cobre:",[2735,4807,4808,4811,4814,4817],{},[70,4809,4810],{},"Traffic shaping fino (canary com 5% de tráfego, mirror).",[70,4812,4813],{},"Distributed tracing completamente automático.",[70,4815,4816],{},"Circuit breakers configuráveis por chamada.",[70,4818,4819],{},"Políticas de retry sofisticadas.",[12,4821,4822],{},"Pra startup média que estava pensando em instalar malha apenas pra ter \"criptografia entre serviços\", o cluster-native já basta. Cobre o tópico de auditoria mais comum sem custar 10 GB de RAM.",[19,4824,4826],{"id":4825},"lado-a-lado-sem-floreio","Lado a lado, sem floreio",[12,4828,4829],{},"A tabela compara Istio, Linkerd, Cilium e a opção de não instalar malha (com criptografia cluster-native ativa) em doze critérios. Não tem coluna sem ressalva.",[119,4831,4832,4848],{},[122,4833,4834],{},[125,4835,4836,4838,4840,4842,4845],{},[128,4837,2983],{},[128,4839,4716],{},[128,4841,4722],{},[128,4843,4844],{},"Cilium SM",[128,4846,4847],{},"Sem malha + cluster-native",[141,4849,4850,4864,4877,4892,4909,4925,4941,4954,4968,4982,4995,5011],{},[125,4851,4852,4855,4857,4859,4862],{},[146,4853,4854],{},"RAM overhead por pod",[146,4856,4658],{},[146,4858,4672],{},[146,4860,4861],{},"~0",[146,4863,4861],{},[125,4865,4866,4869,4871,4873,4875],{},[146,4867,4868],{},"CPU overhead por pod",[146,4870,4661],{},[146,4872,4675],{},[146,4874,4689],{},[146,4876,4861],{},[125,4878,4879,4882,4884,4886,4889],{},[146,4880,4881],{},"Complexidade de setup",[146,4883,3167],{},[146,4885,3155],{},[146,4887,4888],{},"Média (kernel)",[146,4890,4891],{},"Mínima",[125,4893,4894,4897,4900,4903,4906],{},[146,4895,4896],{},"Documentação em PT-BR",[146,4898,4899],{},"Boa",[146,4901,4902],{},"Razoável",[146,4904,4905],{},"Pouca",[146,4907,4908],{},"Embutida no orquestrador",[125,4910,4911,4914,4917,4919,4922],{},[146,4912,4913],{},"Comunidade brasileira",[146,4915,4916],{},"Grande",[146,4918,3160],{},[146,4920,4921],{},"Pequena",[146,4923,4924],{},"Cresce com o orquestrador",[125,4926,4927,4930,4933,4936,4939],{},[146,4928,4929],{},"Sidecar paralelo",[146,4931,4932],{},"Sim (Envoy)",[146,4934,4935],{},"Sim (Rust)",[146,4937,4938],{},"Não (eBPF)",[146,4940,3059],{},[125,4942,4943,4946,4948,4950,4952],{},[146,4944,4945],{},"Criptografia entre serviços automática",[146,4947,3065],{},[146,4949,3065],{},[146,4951,3065],{},[146,4953,3065],{},[125,4955,4956,4959,4961,4963,4965],{},[146,4957,4958],{},"Distributed tracing automático",[146,4960,3065],{},[146,4962,3065],{},[146,4964,3140],{},[146,4966,4967],{},"Não (precisa OpenTelemetry)",[125,4969,4970,4973,4975,4977,4979],{},[146,4971,4972],{},"Traffic shaping fino (canary 5%)",[146,4974,3065],{},[146,4976,3065],{},[146,4978,3140],{},[146,4980,4981],{},"Básico (rolling, blue-green)",[125,4983,4984,4987,4989,4991,4993],{},[146,4985,4986],{},"Circuit breakers configuráveis",[146,4988,3065],{},[146,4990,3065],{},[146,4992,3062],{},[146,4994,3059],{},[125,4996,4997,4999,5002,5005,5008],{},[146,4998,3152],{},[146,5000,5001],{},"6–10 semanas",[146,5003,5004],{},"2–4 semanas",[146,5006,5007],{},"4–6 semanas",[146,5009,5010],{},"Dias",[125,5012,5013,5016,5019,5022,5025],{},[146,5014,5015],{},"Faixa de aplicação ideal",[146,5017,5018],{},"50+ serviços",[146,5020,5021],{},"10–50 serviços",[146,5023,5024],{},"30+ serviços com kernel novo",[146,5026,5027],{},"1–30 serviços",[12,5029,5030,5031,5034],{},"A coluna que importa é a última linha — ",[27,5032,5033],{},"faixa de aplicação ideal",". Quem está abaixo da faixa, paga overhead sem retorno. Quem está acima, sente que falta feature.",[19,5036,5038],{"id":5037},"quando-service-mesh-paga-o-preco","Quando service mesh paga o preço",[12,5040,5041],{},"Quatro cenários em que o investimento se justifica:",[2735,5043,5044,5050,5056,5062],{},[70,5045,5046,5049],{},[27,5047,5048],{},"Trinta ou mais microserviços ativos."," A complexidade operacional sem malha vira pior que com malha — diagnosticar uma cadeia de seis chamadas internas em três times diferentes é caro sem tracing automático.",[70,5051,5052,5055],{},[27,5053,5054],{},"Compliance enterprise com requisitos de zero-trust."," Alguns frameworks de auditoria pedem que a stack tenha \"rede zero-trust nominalmente\". Malha resolve a checkbox formalmente.",[70,5057,5058,5061],{},[27,5059,5060],{},"Federação multi-cluster."," Roteamento de serviço entre dois ou três clusters em regiões diferentes, com failover automático. Malha facilita esse cenário; cluster-native resolve mal.",[70,5063,5064,5067],{},[27,5065,5066],{},"Time de plataforma com cinco ou mais pessoas dedicadas."," Você tem capacidade pra extrair valor da malha — operar, evoluir, dimensionar o plano de controle dela. Sem esse time, a malha vira passivo.",[12,5069,5070],{},"Se você bate em dois ou mais desses, comece a avaliar. Comece pelo Linkerd — é o que dá menos dor por menos retorno relativo perdido.",[19,5072,5074],{"id":5073},"quando-nao-instala-a-maioria-dos-casos","Quando NÃO instala (a maioria dos casos)",[12,5076,5077],{},"Cinco cenários em que instalar malha hoje custa mais do que retorna:",[2735,5079,5080,5086,5092,5098,5104],{},[70,5081,5082,5085],{},[27,5083,5084],{},"Monolito com cinco a dez microserviços auxiliares."," Zero ganho, custo grande. O overhead em RAM cai direto em conta de servidor.",[70,5087,5088,5091],{},[27,5089,5090],{},"Time pequeno, menos de três pessoas em plataforma."," Operar malha exige plantão dedicado pra ela. Time pequeno absorve esse custo às custas de feature de produto.",[70,5093,5094,5097],{},[27,5095,5096],{},"Cluster com menos de trinta pods totais."," Gerenciar trinta pods é trabalho humano, não exige tracing automático. O custo de aprender a malha não retorna.",[70,5099,5100,5103],{},[27,5101,5102],{},"Workload HTTP simples sem requisitos de canary."," Se você nunca precisou liberar 5% do tráfego pra uma versão nova porque rolling update sempre serviu, malha é solução pra problema que não existe.",[70,5105,5106,5109],{},[27,5107,5108],{},"Custo de cluster sob pressão."," Se cada gigabyte de RAM tá sendo contado, gastar 10 GB em sidecars é decisão difícil de defender pra investidor.",[19,5111,5113],{"id":5112},"decisao-evolutiva-por-estagio","Decisão evolutiva, por estágio",[12,5115,5116],{},"A decisão correta muda com o tamanho do sistema. Quatro estágios:",[2735,5118,5119,5125,5131,5137],{},[70,5120,5121,5124],{},[27,5122,5123],{},"Estágio 1 — 1 a 10 serviços."," Sem malha. Se precisa de criptografia entre serviços, faça TLS no código (a maioria das linguagens tem cliente HTTPS pronto). Não vale o aprendizado. Foque em entregar produto.",[70,5126,5127,5130],{},[27,5128,5129],{},"Estágio 2 — 10 a 30 serviços."," Cluster com criptografia embutida no plano de controle (HeroCtl, alguns presets do colosso). Resolve criptografia + identidade + descoberta de serviço sem sidecar. Cobre a maior parte do que malha oferece, sem o custo.",[70,5132,5133,5136],{},[27,5134,5135],{},"Estágio 3 — 30 a 50 serviços com time de plataforma."," Avalie Linkerd primeiro. Curva curta, overhead baixo, resolve tracing e circuit breakers. Istio só se features avançadas (authorization L7 sofisticada, federação multi-cluster real) forem requisito imediato.",[70,5138,5139,5142],{},[27,5140,5141],{},"Estágio 4 — 50+ serviços, compliance enterprise."," Istio ou Cilium Service Mesh. Compliance vai pedir uma das duas; restante são detalhes.",[12,5144,5145],{},"Sair de um estágio pro próximo é decisão deliberada, não gradual. Adicione o componente quando o time topa o aprendizado e o cluster topa o overhead. Não antes.",[19,5147,5149],{"id":5148},"a-trampa-do-vamos-instalar-agora-pra-estar-preparado","A trampa do \"vamos instalar agora pra estar preparado\"",[12,5151,5152],{},"Argumento que aparece em toda discussão: \"se vou crescer pra cinquenta serviços ano que vem, melhor instalar agora e aprender\". A trampa tem três faces:",[2735,5154,5155,5161,5167],{},[70,5156,5157,5160],{},[27,5158,5159],{},"Aprender malha custa de quatro a oito semanas por pessoa do time."," Em time de cinco, são vinte a quarenta semanas-pessoa. Multiplicado por R$ 200\u002Fhora, dá entre R$ 160 mil e R$ 320 mil só em aprendizado. Esse dinheiro adquire feature ou compra prazo de runway.",[70,5162,5163,5166],{},[27,5164,5165],{},"Cada componente novo é mais um ponto de falha crítico."," Plano de controle da malha (Istio Pilot, Linkerd controller, Cilium operator) pode falhar e levar conectividade interna junto. Mais componentes em quórum, mais surface de incidente. Adicione apenas quando o ganho compensa esse risco.",[70,5168,5169,5172],{},[27,5170,5171],{},"Quando você precisar, instalar leva uma semana, não um mês."," Linkerd em particular é instalável num par de comandos. Cilium em algumas horas se o cluster topar kernel recente. Adiar a decisão não é dívida técnica — é dívida adiada com juros menores.",[12,5174,5175],{},"Não funciona \"antecipar pra estar preparado\". O que funciona é monitorar os critérios objetivos da seção anterior e instalar quando dois ou mais virarem realidade.",[19,5177,5179],{"id":5178},"como-o-heroctl-encara-o-problema","Como o HeroCtl encara o problema",[12,5181,5182],{},"A nossa posição é deliberada: malha de serviço, na maioria dos casos brasileiros, é decisão pra estágio três ou quatro. Pra cobrir os estágios um e dois, o HeroCtl traz embutido no plano de controle:",[2735,5184,5185,5191,5197],{},[70,5186,5187,5190],{},[27,5188,5189],{},"Criptografia entre serviços automática."," Cada serviço submetido recebe identidade própria. Chamada interna entre dois serviços é cifrada por padrão, sem alteração no código da aplicação e sem sidecar paralelo.",[70,5192,5193,5196],{},[27,5194,5195],{},"Distributed tracing via OpenTelemetry exporter integrado."," O cluster propaga cabeçalhos de correlação e exporta pra qualquer coletor que entenda OTLP. Não é tão rico quanto malha completa (que injeta tracing automaticamente nos sidecars), mas cobre 80% do uso real.",[70,5198,5199,5202],{},[27,5200,5201],{},"Traffic shaping básico embutido."," Rolling update, canary com porcentagem fixa de tráfego, blue-green. Suficiente pra startup que faz dez deploys por dia. Não cobre mirror nem canary com peso por header — pra isso, precisa instalar malha.",[12,5204,5205],{},"Pra startup brasileira até a faixa dos trinta serviços, isso cobre cerca de 80% do que uma malha completa entrega — sem o sidecar, sem as quatro semanas de aprendizado, sem os 10 GB de RAM. Quando o sistema cresce além disso, instalar Linkerd em cima do HeroCtl é caminho documentado.",[19,5207,5209],{"id":5208},"os-quatro-erros-mais-caros-instalando-service-mesh","Os quatro erros mais caros instalando service mesh",[12,5211,5212],{},"Pra time que decidiu pelo passo, quatro armadilhas que custam de duas semanas a três meses de retrabalho:",[2735,5214,5215,5221,5238,5244],{},[70,5216,5217,5220],{},[27,5218,5219],{},"Instalar antes de precisar."," Cobertura desnecessária vira passivo. Componente novo no quórum, custo de RAM, tempo de aprendizado — sem retorno equivalente.",[70,5222,5223,5226,5227,5230,5231,5234,5235,5237],{},[27,5224,5225],{},"Configurar criptografia estrita no dia um sem pensar em legacy."," Modo ",[231,5228,5229],{},"STRICT"," quebra qualquer serviço que ainda não foi migrado. A migração correta é gradual: modo ",[231,5232,5233],{},"PERMISSIVE"," no início (aceita tráfego cifrado e não-cifrado), só vira ",[231,5236,5229],{}," quando todos os serviços estão dentro da malha.",[70,5239,5240,5243],{},[27,5241,5242],{},"Não dimensionar o plano de controle."," Istio Pilot e similares precisam de RAM e CPU suficientes pra distribuir configuração pra todos os sidecars. Em cluster crescendo, virar gargalo do plano de controle é incidente clássico de quem não planejou.",[70,5245,5246,5249],{},[27,5247,5248],{},"Pular Linkerd pra Istio \"porque é mais popular\"."," Linkerd resolve 80% dos casos com 30% do overhead. A escolha por Istio só se justifica quando uma feature específica (authorization L7 sofisticada, integração com serviço de identidade externo, multi-cluster federation) for requisito real, não preferência de currículo.",[19,5251,4244],{"id":4243},[12,5253,5254,5257],{},[27,5255,5256],{},"Linkerd é leve o suficiente pra cluster pequeno?","\nMais leve que Istio em uma ordem de grandeza, mas ainda assim é sidecar paralelo em cada pod. Pra cluster com vinte pods e quatro nós de 4 GB, Linkerd come cerca de 600 MB de RAM total — significativo mas tolerável. Pra cluster com dez pods, ainda é exagero. Linkerd entra em cena no estágio três (10–50 serviços), não antes.",[12,5259,5260,5263,5264,5266],{},[27,5261,5262],{},"Istio Ambient Mode (sem sidecar) muda essa decisão?","\nReduz o overhead por pod (vai pra um agente por nó, ",[231,5265,4597],{},"), mas ainda exige operar o plano de controle do Istio inteiro. Em produção estável desde 2024, mas a comunidade brasileira ainda é pequena — esperar mais alguns trimestres pra adoção em projeto crítico é prudente.",[12,5268,5269,5272],{},[27,5270,5271],{},"Cilium eBPF realmente tem zero overhead?","\nPor pod, sim — não tem sidecar paralelo. Mas o agente Cilium em cada nó consome de 200 a 400 MB e adiciona carga no kernel. Pra cluster com kernel Linux moderno e CNI compatível, é a opção mais eficiente. Pra cluster que ainda roda kernel antigo ou usa CNI específico, o setup vira projeto.",[12,5274,5275,5278],{},[27,5276,5277],{},"Como faço criptografia entre serviços sem service mesh?","\nTrês caminhos. Primeiro, TLS no código da aplicação — cada serviço expõe HTTPS, cada cliente confia em CA interna. Funciona, mas exige distribuir certificados manualmente (ou via cofre de segredos). Segundo, plano de controle do orquestrador emitir certificados automaticamente — HeroCtl e algumas distribuições do colosso fazem isso, é o caminho mais limpo. Terceiro, VPN ou rede overlay cifrada (WireGuard) entre nós — protege o tráfego dentro do cluster, mas não a identidade serviço-a-serviço.",[12,5280,5281,5284],{},[27,5282,5283],{},"Distributed tracing precisa malha?","\nNão. OpenTelemetry SDK em cada serviço, exportando pra um coletor central (Tempo, Jaeger, ou serviço gerenciado), cobre 90% do uso. Malha automatiza a injeção sem mudar código, o que é confortável — mas não é requisito. Pra startup, começar com OpenTelemetry no código é mais barato.",[12,5286,5287,5290],{},[27,5288,5289],{},"Service mesh em cluster gerenciado é mais fácil?","\nMais fácil de instalar, sim — boa parte dos provedores oferece add-on de Istio ou Linkerd com um clique. Mais fácil de operar, não — você ainda precisa entender o plano de controle, dimensionar, debugar quando uma sidecar reciclar. Não ganhe tempo de instalação às custas de despreparo operacional.",[12,5292,5293,5296],{},[27,5294,5295],{},"Qual malha é mais usada em startup brasileira?","\nPor experiência de comunidade, Istio domina nas empresas que adotaram entre 2020 e 2022 (efeito moda CNCF). Linkerd cresce desde 2024 entre quem migrou ou começou novo, especialmente fintechs de tamanho médio. Cilium aparece em casos específicos (clusters muito grandes, otimização de custo). Consul Connect raríssimo no Brasil.",[12,5298,5299,5302],{},[27,5300,5301],{},"Vale a pena pra monolito + 3 microserviços?","\nNão. Monolito + três microserviços não tem complexidade interna que malha ajude a domar. TLS no código resolve criptografia. Logs centralizados resolvem visibilidade. Rolling update do orquestrador resolve deploy seguro. Instalar malha nesse cenário é trazer um problema pra resolver outro problema que não existe.",[12,5304,5305,5308],{},[27,5306,5307],{},"O HeroCtl substitui completamente uma service mesh?","\nPra estágios um e dois (até trinta serviços), substitui em cerca de 80% do uso real. Pra estágios três e quatro (acima de trinta serviços, ou compliance específico), o HeroCtl convive com Linkerd ou Istio rodando como jobs em cima. A criptografia entre serviços do plano de controle do HeroCtl coexiste com a malha — a malha cuida do tráfego entre seus pods, o HeroCtl cuida da identidade dos serviços e da comunicação com o plano de controle.",[19,5310,3310],{"id":3309},[12,5312,5313],{},"A regra prática que a gente recomenda pra tech lead brasileiro: instale malha quando dois ou mais dos critérios objetivos virarem realidade — trinta serviços ativos, mais de um incidente por mês relacionado a chamadas internas, compliance formal pedindo zero-trust, time de plataforma de cinco pessoas, federação multi-cluster real. Antes disso, cluster com criptografia embutida no plano de controle resolve a maior parte do que você ia comprar com malha, sem os 10 GB de RAM e sem as oito semanas de aprendizado.",[12,5315,5316],{},"Pra começar a explorar essa via — orquestrador com criptografia entre serviços já incluída, sem sidecar paralelo, plano de controle ocupando entre 200 e 400 MB por servidor e eleição de coordenador em cerca de sete segundos quando algo cai — instala em um servidor Linux qualquer e abre o painel:",[224,5318,5320],{"className":226,"code":5319,"language":228,"meta":229,"style":229},"curl -sSL get.heroctl.com\u002Finstall.sh | sh\n",[231,5321,5322],{"__ignoreMap":229},[234,5323,5324,5326,5328,5331,5333],{"class":236,"line":237},[234,5325,1220],{"class":247},[234,5327,2958],{"class":251},[234,5329,5330],{"class":255}," get.heroctl.com\u002Finstall.sh",[234,5332,2964],{"class":383},[234,5334,2967],{"class":247},[12,5336,5337,5338,5341,5342,5346],{},"Pra continuar nessa linha, dois posts diretos. Em ",[3337,5339,5340],{"href":4368},"Multi-tenant SaaS — isolamento real ou só namespace?"," tratamos do problema vizinho — separar clientes dentro do mesmo cluster sem quebrar o orçamento. Em ",[3337,5343,5345],{"href":5344},"\u002Fblog\u002Fk3s-vs-heroctl-quando-cada-um-faz-sentido","K3s vs HeroCtl — quando cada um faz sentido"," comparamos a alternativa mais comum quando o time já decidiu que o colosso ortodoxo é exagero.",[12,5348,5349],{},"A escolha por malha de serviço é, no fundo, uma escolha de quando absorver complexidade. A pergunta certa não é \"preciso de Istio?\" — é \"qual é o menor sistema que ainda resolve o meu problema atual?\". Pra grande parte das startups brasileiras, a resposta é mais simples do que a indústria americana sugere.",[3351,5351,4376],{},{"title":229,"searchDepth":244,"depth":244,"links":5353},[5354,5355,5356,5357,5358,5359,5360,5361,5362,5363,5364,5365,5366,5367,5368,5369],{"id":4421,"depth":244,"text":4422},{"id":4431,"depth":244,"text":4432},{"id":4531,"depth":244,"text":4532},{"id":4582,"depth":244,"text":4583},{"id":4626,"depth":244,"text":4627},{"id":4741,"depth":244,"text":4742},{"id":4775,"depth":244,"text":4776},{"id":4825,"depth":244,"text":4826},{"id":5037,"depth":244,"text":5038},{"id":5073,"depth":244,"text":5074},{"id":5112,"depth":244,"text":5113},{"id":5148,"depth":244,"text":5149},{"id":5178,"depth":244,"text":5179},{"id":5208,"depth":244,"text":5209},{"id":4243,"depth":244,"text":4244},{"id":3309,"depth":244,"text":3310},"2026-05-29","Service mesh resolve problemas reais (mTLS, observabilidade entre serviços, traffic shaping). Mas adiciona 30-50% overhead de RAM\u002FCPU e complexidade. Quando vale e quando é overkill.",{},{"title":4413,"description":5371},{"loc":4275},"blog\u002Fservice-mesh-quando-vale-pra-saas-pequeno-medio",[5377,5378,5379,3379,4409],"service-mesh","istio","linkerd","m8RjibPP4k692WT8tLFOC71w3Bgt3Gh-Pv2e5s4vS-M",{"id":5382,"title":5383,"author":7,"body":5384,"category":6383,"cover":3380,"date":6384,"description":6385,"draft":3383,"extension":3384,"lastReviewed":3380,"meta":6386,"navigation":411,"path":6387,"readingTime":6388,"seo":6389,"sitemap":6390,"stem":6391,"tags":6392,"__hash__":6398},"blog_pt\u002Fblog\u002Fcomo-sair-da-aws-sem-reescrever-toda-stack.md","Como sair da AWS sem reescrever toda a stack: guia prático 2026",{"type":9,"value":5385,"toc":6345},[5386,5389,5393,5396,5399,5405,5408,5412,5415,5418,5421,5425,5428,5502,5505,5509,5512,5715,5718,5722,5725,5728,5732,5739,5742,5745,5751,5755,5758,5761,5765,5768,5775,5778,5782,5785,5788,5792,5795,5798,5802,5805,5809,5812,5815,5819,5822,5825,5828,5832,5835,5845,5848,5852,5855,5858,5862,5865,5871,5877,5880,5884,5887,5893,5899,5909,5915,5921,5927,5933,5939,5943,5946,5978,5982,5985,5990,6027,6032,6063,6066,6069,6073,6076,6079,6096,6099,6102,6106,6109,6115,6121,6127,6133,6137,6140,6154,6157,6161,6164,6167,6192,6195,6207,6210,6212,6216,6220,6223,6227,6230,6234,6237,6241,6247,6251,6270,6274,6277,6281,6284,6288,6291,6295,6298,6300,6304,6307,6310,6326,6329,6340,6343],[12,5387,5388],{},"A maioria dos times brasileiros que pensa em sair da AWS adia indefinidamente porque acredita estar diante de um projeto de \"reescrever toda a stack\". Não é. É um projeto de mapeamento, não de reescrita. E o mapeamento cabe numa planilha de doze linhas.",[19,5390,5392],{"id":5391},"tldr-o-que-voce-vai-ler-em-tres-minutos","TL;DR — o que você vai ler em três minutos",[12,5394,5395],{},"Stack típica de SaaS brasileiro usa cerca de doze serviços AWS, e cada um deles tem alternativa portável que custa entre três e sete vezes menos. EC2 vira VPS em qualquer provedor (Hetzner, DigitalOcean, Magalu Cloud). RDS vira Postgres em VPS dedicado, Neon ou Supabase. ElastiCache vira Valkey auto-hospedado. S3 vira Cloudflare R2 ou Backblaze B2 — ambos com API S3-compatível, então o código nem muda. SQS vira fila baseada em Redis ou RabbitMQ. Lambda vira endpoint no app server tradicional ou Cloudflare Workers. ALB vira o roteador integrado do orquestrador. CloudFront vira Cloudflare grátis. IAM vira injeção de secrets no orquestrador.",[12,5397,5398],{},"Cronograma realista pra startup com cinco a dez aplicações: seis a oito semanas, oitenta a cento e sessenta horas de desenvolvimento. Economia típica: três a sete vezes na conta de infra, com retorno em menos de um mês de salário sênior.",[12,5400,5401,5404],{},[27,5402,5403],{},"Não migre se"," o seu compliance exige AWS nominalmente, se o time é único e foca em produto, ou se a stack usa lock-in profundo (DynamoDB com features específicas, Aurora Serverless v2, IAM cross-account complexo).",[12,5406,5407],{},"━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━",[19,5409,5411],{"id":5410},"por-que-tantos-times-brasileiros-adiam-a-saida-da-aws","Por que tantos times brasileiros adiam a saída da AWS?",[12,5413,5414],{},"A resposta honesta é confusão entre dois projetos diferentes. \"Sair da AWS\" virou sinônimo mental de \"reescrever a aplicação\". Não é a mesma coisa.",[12,5416,5417],{},"Reescrever a aplicação é trocar tecnologia central — banco relacional por NoSQL, framework síncrono por reativo, monolito por microsserviços. Isso sim leva trimestres. Sair da AWS é trocar a infra que sustenta a aplicação que você já tem. O código de domínio fica idêntico. Mudam endpoints de banco, credenciais, alguns SDKs e a forma de declarar deploy.",[12,5419,5420],{},"A confusão dura porque o time olha a console da AWS e vê duzentos serviços. Ninguém usa duzentos. A maior parte usa doze. Mapeie esses doze, encontre alternativa pra cada um, e o que resta é trabalho de execução — não de pesquisa.",[19,5422,5424],{"id":5423},"os-doze-servicos-aws-que-sua-stack-provavelmente-usa","Os doze serviços AWS que sua stack provavelmente usa",[12,5426,5427],{},"A planilha de início é essa. Tudo o que está fora dela na sua conta provavelmente é satélite — alarme do CloudWatch que ninguém olha, bucket S3 esquecido, função Lambda morta. Foque nos doze:",[67,5429,5430,5436,5442,5448,5454,5460,5466,5472,5478,5484,5490,5496],{},[70,5431,5432,5435],{},[27,5433,5434],{},"EC2"," — máquinas virtuais que rodam app server e workers",[70,5437,5438,5441],{},[27,5439,5440],{},"RDS"," — banco relacional gerenciado (Postgres ou MySQL)",[70,5443,5444,5447],{},[27,5445,5446],{},"ElastiCache"," — Redis pra cache e sessão",[70,5449,5450,5453],{},[27,5451,5452],{},"S3"," — armazenamento de objetos (uploads, backups, assets)",[70,5455,5456,5459],{},[27,5457,5458],{},"ALB \u002F NLB"," — balanceador de carga na frente das EC2",[70,5461,5462,5465],{},[27,5463,5464],{},"CloudFront"," — CDN pra assets estáticos",[70,5467,5468,5471],{},[27,5469,5470],{},"Route 53"," — DNS autoritativo",[70,5473,5474,5477],{},[27,5475,5476],{},"SES"," — email transacional",[70,5479,5480,5483],{},[27,5481,5482],{},"SQS \u002F SNS"," — fila e pub-sub",[70,5485,5486,5489],{},[27,5487,5488],{},"IAM"," — credenciais e papéis pra serviços conversarem",[70,5491,5492,5495],{},[27,5493,5494],{},"CloudWatch"," — métricas e logs",[70,5497,5498,5501],{},[27,5499,5500],{},"Lambda"," — funções serverless",[12,5503,5504],{},"Se a sua conta tem todos os doze, parabéns: você é a stack mediana. Se tem oito ou nove, melhor — menos coisa pra migrar. Se tem cinco serviços muito específicos (Aurora Global, DynamoDB com Streams, EventBridge complexo), você está num caminho diferente — leia a seção de lock-ins antes de continuar.",[19,5506,5508],{"id":5507},"mapeamento-servico-por-servico-alternativa-custo-e-complexidade","Mapeamento serviço por serviço — alternativa, custo e complexidade",[12,5510,5511],{},"A tabela abaixo é o atalho. Cada linha tem detalhe expandido depois.",[119,5513,5514,5533],{},[122,5515,5516],{},[125,5517,5518,5521,5524,5527,5530],{},[128,5519,5520],{},"Serviço AWS",[128,5522,5523],{},"Alternativa portável",[128,5525,5526],{},"Custo antes (R$\u002Fmês)",[128,5528,5529],{},"Custo depois (R$\u002Fmês)",[128,5531,5532],{},"Complexidade migração",[141,5534,5535,5551,5567,5583,5598,5613,5627,5642,5657,5673,5686,5700],{},[125,5536,5537,5540,5543,5546,5549],{},[146,5538,5539],{},"EC2 t3.medium",[146,5541,5542],{},"VPS Hetzner CPX21",[146,5544,5545],{},"150",[146,5547,5548],{},"44",[146,5550,3155],{},[125,5552,5553,5556,5559,5562,5565],{},[146,5554,5555],{},"RDS db.t4g.large",[146,5557,5558],{},"Postgres self-hosted ou Neon",[146,5560,5561],{},"700",[146,5563,5564],{},"50–250",[146,5566,3160],{},[125,5568,5569,5572,5575,5578,5581],{},[146,5570,5571],{},"ElastiCache cache.t4g.micro",[146,5573,5574],{},"Valkey self-hosted",[146,5576,5577],{},"75",[146,5579,5580],{},"30",[146,5582,3160],{},[125,5584,5585,5588,5591,5594,5596],{},[146,5586,5587],{},"S3 (1TB + egress)",[146,5589,5590],{},"Cloudflare R2",[146,5592,5593],{},"600",[146,5595,5577],{},[146,5597,3155],{},[125,5599,5600,5603,5606,5609,5611],{},[146,5601,5602],{},"ALB",[146,5604,5605],{},"Roteador integrado do orquestrador",[146,5607,5608],{},"110",[146,5610,893],{},[146,5612,3160],{},[125,5614,5615,5617,5620,5623,5625],{},[146,5616,5464],{},[146,5618,5619],{},"Cloudflare grátis",[146,5621,5622],{},"400",[146,5624,893],{},[146,5626,3155],{},[125,5628,5629,5631,5634,5637,5639],{},[146,5630,5470],{},[146,5632,5633],{},"Cloudflare DNS",[146,5635,5636],{},"25",[146,5638,893],{},[146,5640,5641],{},"Trivial",[125,5643,5644,5646,5649,5652,5655],{},[146,5645,5476],{},[146,5647,5648],{},"Resend ou Postmark",[146,5650,5651],{},"50",[146,5653,5654],{},"75–100",[146,5656,5641],{},[125,5658,5659,5661,5664,5667,5670],{},[146,5660,5482],{},[146,5662,5663],{},"Redis Streams ou RabbitMQ",[146,5665,5666],{},"80",[146,5668,5669],{},"0 (mesma VPS)",[146,5671,5672],{},"Média–alta",[125,5674,5675,5677,5680,5682,5684],{},[146,5676,5488],{},[146,5678,5679],{},"Secrets do orquestrador",[146,5681,893],{},[146,5683,893],{},[146,5685,3160],{},[125,5687,5688,5690,5693,5696,5698],{},[146,5689,5494],{},[146,5691,5692],{},"Prometheus + Loki",[146,5694,5695],{},"250",[146,5697,5669],{},[146,5699,3160],{},[125,5701,5702,5704,5707,5709,5712],{},[146,5703,5500],{},[146,5705,5706],{},"App server ou Cloudflare Workers",[146,5708,669],{},[146,5710,5711],{},"0–60",[146,5713,5714],{},"Variável",[12,5716,5717],{},"Câmbio considerado: cinco reais por dólar. Custos de antes assumem stack de SaaS pequeno-médio com cinco a dez aplicações ativas.",[368,5719,5721],{"id":5720},"ec2-vira-vps-em-qualquer-provedor","EC2 vira VPS em qualquer provedor",[12,5723,5724],{},"A migração mais óbvia. EC2 t3.medium custa cerca de trinta dólares mensais — cento e cinquenta reais. Hetzner CPX21 com a mesma classe de CPU e mais RAM custa sete euros e noventa e nove — quarenta e quatro reais. DigitalOcean fica no meio. Magalu Cloud é competitivo pra quem prioriza fatura em real e dado em território nacional.",[12,5726,5727],{},"O caminho técnico é provisionar a VPS, rodar o seu Ansible existente (ou um script de bootstrap simples), copiar o snapshot da EC2 ou subir a imagem do zero. Pra cada servidor, conte de duas a quatro horas. Não é a parte demorada da migração.",[368,5729,5731],{"id":5730},"rds-vira-postgres-self-hosted-ou-neonsupabase","RDS vira Postgres self-hosted ou Neon\u002FSupabase",[12,5733,5734,5735,5738],{},"Aqui há três caminhos honestos. O primeiro é Postgres rodando numa VPS dedicada, com backup automatizado via ",[231,5736,5737],{},"pg_dump"," em cron e replicação física pra um secundário em outra região. Custa o preço da VPS — cinquenta a cem reais mensais — pra substituir um RDS de setecentos.",[12,5740,5741],{},"O segundo é Neon. Postgres serverless com branching, ramp-up automático, plano gratuito generoso, planos pagos a partir de cinco dólares. Útil pra quem quer abandonar AWS sem assumir operação direta de banco.",[12,5743,5744],{},"O terceiro é Supabase, que entrega Postgres com APIs adicionais (auth, realtime, storage) e tier gratuito permanente. Faz sentido pra startups que toleram acoplamento ao Supabase em troca de simplicidade.",[12,5746,5747,5748,5750],{},"A migração em si é ",[231,5749,5737],{}," seguido de restore no destino, com janela de manutenção curta — ou replicação lógica com cutover quase sem downtime se o seu Postgres for versão 13 ou superior. Quatro a oito horas dependendo do tamanho da base.",[368,5752,5754],{"id":5753},"elasticache-vira-valkey-self-hosted","ElastiCache vira Valkey self-hosted",[12,5756,5757],{},"O Redis virou Valkey depois da mudança de licença em 2024 — fork mantido pela Linux Foundation. Roda em qualquer VPS com dois cliques. Trinta reais mensais substituem o ElastiCache de setenta e cinco.",[12,5759,5760],{},"A migração tem duas etapas. Primeiro, levantar o cluster Valkey com Sentinel pra failover automático. Segundo, popular o cache — script que lê da AWS e grava no destino, ou simplesmente deixar a aplicação preencher organicamente após o cutover (cache cold start de poucos minutos). Três a seis horas de trabalho.",[368,5762,5764],{"id":5763},"s3-vira-cloudflare-r2-ou-backblaze-b2","S3 vira Cloudflare R2 (ou Backblaze B2)",[12,5766,5767],{},"Esse é o ganho mais imediato. Cloudflare R2 cobra zero pelo egresso — a fatia mais cara do S3 quando você serve assets pra usuários. Quinze centavos de dólar por GB armazenado, contra vinte e três centavos do S3 padrão. Backblaze B2 é uma alternativa quase idêntica, com integração ainda mais barata pra workloads de backup pesado.",[12,5769,5770,5771,5774],{},"A migração técnica é trivial: ",[231,5772,5773],{},"rclone copy s3:meu-bucket r2:meu-bucket"," em paralelo. Um terabyte transfere em torno de doze horas dependendo da banda. O código da aplicação muda exatamente uma linha — o endpoint do cliente S3. Toda biblioteca AWS SDK aceita configuração de endpoint custom; R2 e B2 implementam o protocolo S3 idêntico.",[12,5776,5777],{},"Volume típico de SaaS médio (cinquenta GB de uploads de usuário): R$75 mensais em R2 contra R$600 em S3 com egresso ativo. A economia paga uma semana de trabalho de migração no primeiro mês.",[368,5779,5781],{"id":5780},"alb-vira-roteador-integrado-do-orquestrador","ALB vira roteador integrado do orquestrador",[12,5783,5784],{},"Se você está usando ALB, é porque tem várias EC2 atrás dele. A alternativa é o roteador embutido no orquestrador escolhido — HeroCtl, Caddy, ou o roteador embutido em outras stacks self-hosted. O orquestrador descobre os contêineres rodando, abre porta, terminam TLS via Let's Encrypt automático, distribui tráfego.",[12,5786,5787],{},"A migração troca a definição de target group AWS por uma definição de ingress no manifesto do orquestrador. Quatro a oito horas pra entender as regras certas. Cento e dez reais mensais economizados por balanceador, e o orquestrador aceita quantos hosts você quiser sem cobrança adicional.",[368,5789,5791],{"id":5790},"cloudfront-vira-cloudflare-gratis","CloudFront vira Cloudflare grátis",[12,5793,5794],{},"Esse merece uma menção em destaque. CloudFront cobra por GB transferido — quem serve vídeo ou downloads pesados sangra. Cloudflare oferece CDN global gratuita no plano free, com cache configurável, mitigação básica de DDoS e WAF rudimentar. Pra a maior parte dos casos de SaaS, é mais que suficiente.",[12,5796,5797],{},"A migração é trocar os nameservers do domínio pra Cloudflare e configurar regras de cache. Duas a quatro horas. A economia pode ser massiva — quatrocentos reais mensais pra quem tem volume médio de tráfego, milhares pra quem tem volume alto.",[368,5799,5801],{"id":5800},"route-53-vira-cloudflare-dns","Route 53 vira Cloudflare DNS",[12,5803,5804],{},"DNS no Cloudflare é grátis e mais rápido que Route 53 na maioria das medições públicas. Migração é exportar a zone file, importar no Cloudflare, validar registros, mudar nameservers no registrar. Trinta minutos. Vinte e cinco reais mensais que voltam pro caixa.",[368,5806,5808],{"id":5807},"ses-vira-resend-postmark-ou-mailgun","SES vira Resend, Postmark ou Mailgun",[12,5810,5811],{},"A AWS é barata pra envio em volume, mas a entregabilidade do SES exige aquecimento de IP e configuração de reputação que tira tempo. Resend cobra vinte dólares por cinquenta mil emails mensais e tem entregabilidade superior fora da caixa. Postmark cobra quinze por dez mil. Mailgun cobre o caso de quem manda muito volume não-transacional.",[12,5813,5814],{},"A migração é trocar credenciais SMTP no app — uma hora de trabalho.",[368,5816,5818],{"id":5817},"sqs-e-sns-viram-redis-streams-ou-rabbitmq","SQS e SNS viram Redis Streams ou RabbitMQ",[12,5820,5821],{},"A migração mais delicada. SQS é um serviço que faz uma coisa e faz bem; substituir exige escolher tecnologia de fila e refatorar produtor e consumidor.",[12,5823,5824],{},"O caminho mais curto é Redis Streams, principalmente se você já está rodando Valkey pra cache. Bibliotecas como Sidekiq (Ruby), BullMQ (Node), RQ (Python) e Asynq (Go) consomem Redis nativamente. RabbitMQ é mais robusto pra cenários de roteamento complexo. NATS é alternativa moderna pra pub-sub.",[12,5826,5827],{},"Pra cada fila, conte um a três dias dependendo da complexidade. Filas simples de jobs background são triviais. Filas com fan-out, dead letter queues e visibility timeout customizado exigem mais cuidado. Oitenta reais mensais economizados, e a fila roda na mesma VPS que o cache — zero adicional na infra.",[368,5829,5831],{"id":5830},"iam-vira-secrets-do-orquestrador","IAM vira secrets do orquestrador",[12,5833,5834],{},"Aqui está a migração não-óbvia que pega muito time desprevenido. Na AWS, a aplicação acessa S3 e RDS sem credenciais explícitas no código — a EC2 herda um IAM role e o SDK busca tokens automaticamente. Fora da AWS, isso desaparece.",[12,5836,5837,5838,5840,5841,5844],{},"A solução é injeção de secrets pelo orquestrador. HeroCtl, k3s e similares aceitam secrets como recursos de primeira classe — você declara ",[231,5839,453],{}," ou ",[231,5842,5843],{},"S3_ACCESS_KEY"," no manifesto do job e o orquestrador injeta como variável de ambiente no contêiner. Pra cenários mais sofisticados, HashiCorp Vault auto-hospedado faz rotação automática.",[12,5846,5847],{},"A migração é refatorar cada papel IAM em um conjunto de credenciais explícitas, criadas no provedor de destino (Cloudflare API token, Postgres user específico, etc), e declaradas como secrets. Quatro a oito horas pra uma stack média.",[368,5849,5851],{"id":5850},"cloudwatch-vira-prometheus-loki","CloudWatch vira Prometheus + Loki",[12,5853,5854],{},"Métricas viram Prometheus + Grafana. Logs viram Loki + Grafana. Tudo roda em containers na mesma cluster. Duzentos e cinquenta reais mensais de CloudWatch viram zero adicional.",[12,5856,5857],{},"A configuração inicial leva cerca de quatro horas pra ficar produtiva: Prometheus com service discovery apontando pros agentes do orquestrador, Loki recebendo via Promtail ou diretamente do runtime de contêiner, Grafana com dashboards básicos. Há posts dedicados a essa migração no blog.",[368,5859,5861],{"id":5860},"lambda-a-parte-mais-dificil","Lambda — a parte mais difícil",[12,5863,5864],{},"Lambda é o serviço com a maior variância de complexidade na migração. Depende totalmente de como você está usando.",[12,5866,5867,5870],{},[27,5868,5869],{},"Lambda HTTP simples"," (API Gateway → Lambda → resposta) é trivial. Vira endpoint no seu app server. O código da função muda pouco — handler do framework no lugar do handler do Lambda. Uma a duas horas por função.",[12,5872,5873,5876],{},[27,5874,5875],{},"Lambda event-driven"," (S3 dispara Lambda, SQS dispara Lambda, EventBridge agenda Lambda) é a parte cara. Pra eventos de S3, R2 oferece eventos via Cloudflare Workers — você reescreve a Lambda como Worker e mantém o padrão. Pra SQS, vira consumer no app server. Pra EventBridge agendado, vira cron no orquestrador.",[12,5878,5879],{},"Cenário pior: Lambda complexa com EventBridge, Step Functions e dead letter queues encadeados. Aqui é redesign. Reserve uma semana ou duas e desenhe um modelo de eventos mais simples — geralmente o sistema fica melhor.",[19,5881,5883],{"id":5882},"cronograma-realista-de-seis-a-oito-semanas","Cronograma realista de seis a oito semanas",[12,5885,5886],{},"A ordem importa. Começar pelo banco é tentação e armadilha — banco é o último a migrar, não o primeiro.",[12,5888,5889,5892],{},[27,5890,5891],{},"Semana 1 — Inventário e decisão."," Lista os doze serviços, anota custo atual, identifica integrações entre eles. Escolhe alternativa pra cada um. Documento de uma página com a tabela de mapeamento. Sem código ainda.",[12,5894,5895,5898],{},[27,5896,5897],{},"Semana 2 — Provisão do destino em paralelo."," Levanta as VPS, instala o orquestrador (HeroCtl ou similar), configura DNS de teste apontando pra um subdomínio. Sobe Postgres, Valkey, Cloudflare R2. Tudo vazio. Smoke test: um \"hello world\" rodando.",[12,5900,5901,5904,5905,5908],{},[27,5902,5903],{},"Semana 3 — Migração de storage."," S3 pra R2 com ",[231,5906,5907],{},"rclone",". Costuma ser lenta (volume) mas baixíssimo risco. Aplicação ainda lê de S3, mas você valida que R2 está sincronizado. No fim da semana, dual-write — aplicação escreve nos dois.",[12,5910,5911,5914],{},[27,5912,5913],{},"Semana 4 — Migração do banco."," Réplica lógica de Postgres do RDS pro destino. Cutover numa janela de manutenção curta — costuma ser minutos, não horas, com replicação lógica funcionando. Aplicação aponta pro novo banco. RDS fica como hot standby por uma semana.",[12,5916,5917,5920],{},[27,5918,5919],{},"Semana 5 — Migração de aplicações web."," Apps que rodam em EC2 viram jobs no orquestrador. Roteador integrado faz o papel do ALB. DNS aponta pro orquestrador (ou pra Cloudflare na frente dele). Cutover gradual usando weighted DNS.",[12,5922,5923,5926],{},[27,5924,5925],{},"Semana 6 — Filas e jobs assíncronos."," SQS sai, Redis Streams ou RabbitMQ entra. Workers rodam no orquestrador. Período de dual-consume pra garantir que nenhuma mensagem cai.",[12,5928,5929,5932],{},[27,5930,5931],{},"Semana 7 — Lambdas e workloads event-driven."," A semana mais variável. Lambdas HTTP migram rapidamente. Lambdas event-driven exigem o redesign discutido acima. Se você tem mais de dez Lambdas complexas, considere estender pra duas semanas.",[12,5934,5935,5938],{},[27,5936,5937],{},"Semana 8 — Cutover final, monitoramento intensivo, decommission."," Cloudflare na frente substitui CloudFront. Route 53 vira Cloudflare DNS. CloudWatch vai pra Prometheus + Loki. Última coisa: desliga as EC2 antigas e fecha a conta AWS — ou deixa um saldo mínimo se você ainda mantém algum serviço residual.",[19,5940,5942],{"id":5941},"os-cinco-lock-ins-que-mais-doem-na-migracao","Os cinco lock-ins que mais doem na migração",[12,5944,5945],{},"Honestidade é importante: nem tudo migra fácil. Cinco coisas exigem trabalho extra e às vezes mudam a viabilidade do projeto:",[67,5947,5948,5954,5960,5966,5972],{},[70,5949,5950,5953],{},[27,5951,5952],{},"DynamoDB com features específicas."," GSI, Streams, scan limits, TTL. Não há equivalente direto. O caminho realista é redesenhar pra Postgres com JSONB, ou pra um NoSQL self-hosted (FoundationDB, ScyllaDB) — re-arquitetura, não migração.",[70,5955,5956,5959],{},[27,5957,5958],{},"Aurora-only features."," Aurora Serverless v2 com auto-scaling de connections, Aurora Global Database, Aurora I\u002FO optimized. Postgres self-hosted faz quase tudo, mas não tem o auto-scaling instantâneo. Pra workloads spiky, considere Neon (que oferece padrão similar).",[70,5961,5962,5965],{},[27,5963,5964],{},"IAM cross-service complexo."," Times que usam IAM roles cross-account, Service Control Policies e organização hierárquica de contas têm controle de acesso embutido na arquitetura. Migrar exige reimplementar a hierarquia em outro lugar — Vault, Cloudflare Access, ou injeção de secrets do orquestrador. Conte dias, não horas.",[70,5967,5968,5971],{},[27,5969,5970],{},"Lambda + EventBridge complexo."," Pipelines de eventos com vários hops, retries, dead letter queues. Não migra como está. Redesigne em torno de filas (RabbitMQ, NATS) e workers persistentes. Geralmente o sistema fica mais simples — mas leva tempo.",[70,5973,5974,5977],{},[27,5975,5976],{},"S3 events disparando Lambda."," Padrão muito comum, e R2 com Cloudflare Workers cobre a maioria dos casos. Pra workloads que precisam de garantia exatamente-uma-vez ou ordering forte, troque pra padrão de fila — produtor escreve evento na fila quando arquivo é confirmado, worker consome.",[19,5979,5981],{"id":5980},"a-conta-de-economia-sem-otimismo","A conta de economia, sem otimismo",[12,5983,5984],{},"Cenário típico de SaaS brasileiro com cinco aplicações:",[12,5986,5987],{},[27,5988,5989],{},"Antes na AWS:",[2735,5991,5992,5995,5998,6001,6004,6007,6010,6013,6016,6019,6022],{},[70,5993,5994],{},"Cinco EC2 t3.medium: R$750",[70,5996,5997],{},"RDS db.t4g.large Multi-AZ: R$1.400",[70,5999,6000],{},"ElastiCache cache.t4g.micro: R$75",[70,6002,6003],{},"S3 com 100GB e egresso médio: R$300",[70,6005,6006],{},"ALB: R$110",[70,6008,6009],{},"CloudFront com volume médio: R$400",[70,6011,6012],{},"Route 53 + SES: R$75",[70,6014,6015],{},"CloudWatch logs\u002Fmétricas: R$250",[70,6017,6018],{},"Lambda com volume médio: R$200",[70,6020,6021],{},"NAT Gateway: R$200",[70,6023,6024],{},[27,6025,6026],{},"Total: R$3.760\u002Fmês = R$45.120\u002Fano",[12,6028,6029],{},[27,6030,6031],{},"Depois auto-hospedado:",[2735,6033,6034,6037,6040,6043,6046,6049,6052,6055,6058],{},[70,6035,6036],{},"Quatro VPS Hetzner CPX21 com orquestrador: R$176",[70,6038,6039],{},"Postgres self-hosted (incluído nas VPS): R$0",[70,6041,6042],{},"Valkey (incluído): R$0",[70,6044,6045],{},"Cloudflare R2 50GB com egresso ilimitado: R$75",[70,6047,6048],{},"Cloudflare CDN + DNS: R$0",[70,6050,6051],{},"Resend pra email: R$100",[70,6053,6054],{},"Prometheus + Loki (incluído): R$0",[70,6056,6057],{},"Workers de fila (incluídos): R$0",[70,6059,6060],{},[27,6061,6062],{},"Total: R$351\u002Fmês = R$4.212\u002Fano",[12,6064,6065],{},"Economia: R$3.409\u002Fmês, R$40.908\u002Fano. Aproximadamente um mês de salário de engenheiro sênior.",[12,6067,6068],{},"A migração consome oitenta a cento e sessenta horas. Em horário de dev sênior interno, são entre dezesseis e trinta e dois mil reais. Retorno em cinco a dez meses, com economia perpétua depois.",[19,6070,6072],{"id":6071},"a-migracao-mais-nao-obvia-secrets-e-credenciais","A migração mais não-óbvia: secrets e credenciais",[12,6074,6075],{},"Vale repetir, porque é o que mais surpreende time experiente em AWS. Na AWS você acessa S3 sem credentials no código — IAM role da EC2 resolve. Acessa RDS via IAM authentication. Acessa parameter store via IAM. O time perde a noção de que essa \"magia\" existe.",[12,6077,6078],{},"Fora da AWS, toda credencial é explícita. Aplicação precisa de:",[2735,6080,6081,6084,6087,6090,6093],{},[70,6082,6083],{},"Access key e secret pra R2 (criada no painel Cloudflare)",[70,6085,6086],{},"Connection string com user e senha pro Postgres",[70,6088,6089],{},"URL do Valkey com senha",[70,6091,6092],{},"API key pra Resend",[70,6094,6095],{},"Token pra Cloudflare API se você automatiza DNS",[12,6097,6098],{},"A solução do orquestrador é declarar tudo isso como secrets injetados no contêiner como variáveis de ambiente. O secret é criptografado em repouso no orquestrador e nunca aparece nos logs. Pra rotação automática e auditoria sofisticada, Vault auto-hospedado entra na jogada — mas a maioria dos times não precisa.",[12,6100,6101],{},"Plano: faça uma planilha com todas as credenciais que cada app precisa, crie cada uma no provedor de destino, declare como secret no orquestrador, injeta no contêiner. Quatro a oito horas pra uma stack média.",[19,6103,6105],{"id":6104},"quando-nao-migrar-perfis-honestos","Quando NÃO migrar (perfis honestos)",[12,6107,6108],{},"Quatro situações em que sair da AWS é decisão errada:",[12,6110,6111,6114],{},[27,6112,6113],{},"Compliance que lista AWS nominalmente."," FedRAMP, ITAR, certos contratos de governo americano e algumas certificações financeiras exigem que a infra rode sobre componentes pré-aprovados — e a maioria das listas inclui AWS, GCP, Azure, e poucos provedores adicionais. Se o seu cliente é uma agência federal americana, AWS resolve uma fatia do compliance que custaria meses replicar em outro lugar.",[12,6116,6117,6120],{},[27,6118,6119],{},"Time único focado em produto."," Se você é o único dev e está construindo o produto, oito semanas redirecionadas pra migração matam roadmap. Faça quando tiver o segundo dev, ou quando os custos AWS passarem a representar fatia significativa do MRR. Antes disso, AWS é caro mas comprável.",[12,6122,6123,6126],{},[27,6124,6125],{},"Custos AWS abaixo de 2% do MRR."," Conta de mil reais mensais pra startup que fatura cem mil. A economia é real mas o esforço não vale o foco. Migre quando a fatura passar de cinco a dez por cento do MRR — aí o ganho cobre a oportunidade perdida.",[12,6128,6129,6132],{},[27,6130,6131],{},"Lock-in profundo em DynamoDB ou Aurora Serverless v2."," Já tratado acima. Se metade da sua arquitetura é DynamoDB com Streams, você não migra — re-arquiteta. Esse é projeto diferente, com escopo diferente, decisão diferente.",[19,6134,6136],{"id":6135},"estrategia-hibrida-alternativa-pra-quem-nao-quer-migrar-tudo","Estratégia híbrida — alternativa pra quem não quer migrar tudo",[12,6138,6139],{},"Times com cinquenta ou mais aplicações em AWS raramente migram em bloco. A estratégia híbrida funciona melhor:",[2735,6141,6142,6145,6148,6151],{},[70,6143,6144],{},"Mantém em AWS o que é caro de mover (Aurora com features específicas, Lambda crítica, DynamoDB)",[70,6146,6147],{},"Move o que é barato de mover e caro de manter (S3 → R2, CloudFront → Cloudflare, EC2 não-críticas → VPS)",[70,6149,6150],{},"Estabelece VPN ou conexão privada entre as duas pontas",[70,6152,6153],{},"Economia parcial mas zero risco de migração radical",[12,6155,6156],{},"Resultado típico: corte de quarenta a sessenta por cento da fatura AWS, sem mexer nas peças críticas. Pra empresa que paga cinquenta mil mensais, isso é vinte a trinta mil de volta — e o restante migra organicamente nos doze meses seguintes, conforme times reescrevem componentes por outras razões.",[19,6158,6160],{"id":6159},"heroctl-como-destino-o-que-muda-na-pratica","HeroCtl como destino — o que muda na prática",[12,6162,6163],{},"HeroCtl é orquestrador de contêineres que roda em qualquer servidor Linux com Docker. Quatro VPS rodando HeroCtl entregam experiência operacional próxima do que você teria com ECS gerenciado — sem cobrança gerenciada, sem lock-in.",[12,6165,6166],{},"O que substitui:",[2735,6168,6169,6174,6180,6186],{},[70,6170,6171,6173],{},[27,6172,5602],{}," vira o roteador integrado do HeroCtl, com TLS Let's Encrypt automático",[70,6175,6176,6179],{},[27,6177,6178],{},"CloudWatch parcial"," vira métricas embutidas e logs centralizados nativos",[70,6181,6182,6185],{},[27,6183,6184],{},"RDS automated backups"," vira backup gerenciado no Business Edition",[70,6187,6188,6191],{},[27,6189,6190],{},"IAM roles em apps"," vira injeção de secrets no manifesto de job",[12,6193,6194],{},"O que continua igual: Docker rodando seu app exatamente como roda em ECS. Variáveis de ambiente, healthchecks, rolling deploys, multi-replicas. A aplicação não percebe a diferença.",[12,6196,6197,6198,6200,6201,6203,6204,6206],{},"Há três planos. ",[27,6199,4351],{}," é gratuito permanente, sem limite de servidores ou jobs — roda toda a stack descrita acima incluindo alta disponibilidade real, roteador, certificados, métricas e logs. ",[27,6202,4355],{}," adiciona SSO, RBAC granular, auditoria detalhada, backup gerenciado e suporte com SLA — útil pra quem já tem requisitos formais de plataforma. ",[27,6205,4359],{}," adiciona escrow de código-fonte, suporte 24×7 e desenvolvimento dedicado. Os preços de Business e Enterprise estão publicados na página de planos, sem \"fale com vendas\" obrigatório.",[12,6208,6209],{},"O cluster público de demonstração roda em quatro servidores e a eleição de coordenador acontece em cerca de sete segundos quando o nó atual cai — número medido, não estimado.",[12,6211,5407],{},[19,6213,6215],{"id":6214},"perguntas-que-a-gente-recebe-sobre-saida-da-aws","Perguntas que a gente recebe sobre saída da AWS",[368,6217,6219],{"id":6218},"quanto-tempo-realmente-leva-migrar-uma-stack-media","Quanto tempo realmente leva migrar uma stack média?",[12,6221,6222],{},"Pra startup com cinco a dez aplicações, sem lock-ins profundos: seis a oito semanas com um dev sênior dedicando meio tempo, ou três a quatro semanas com dedicação total. Stacks maiores ou com Lambdas event-driven complexas: três a quatro meses. Stacks com DynamoDB ou Aurora Serverless v2 críticos: vire projeto de re-arquitetura, prazo de seis meses ou mais.",[368,6224,6226],{"id":6225},"dynamodb-tem-alternativa-boa","DynamoDB tem alternativa boa?",[12,6228,6229],{},"Não há substituto idêntico. As opções honestas são: Postgres com JSONB pra a maioria dos casos (resolve oitenta por cento dos usos de DynamoDB com performance excelente), ScyllaDB ou Cassandra self-hosted pra workloads que realmente precisam de NoSQL distribuído, FoundationDB pra quem precisa de transações distribuídas. Nenhum desses é \"mude a connection string e pronto\" — exigem mudança no modelo de dados.",[368,6231,6233],{"id":6232},"posso-manter-aws-pro-banco-e-mover-compute","Posso manter AWS pro banco e mover compute?",[12,6235,6236],{},"Sim, e é a estratégia híbrida mais comum. Aurora ou RDS continua na AWS, EC2 viram VPS Hetzner ou DigitalOcean, S3 vira R2. Você abre VPN entre as duas pontas e o app continua acessando RDS via endpoint privado. Economia tipicamente de cinquenta a setenta por cento da fatura AWS.",[368,6238,6240],{"id":6239},"s3-r2-quanto-custa-transferir-1tb","S3 → R2: quanto custa transferir 1TB?",[12,6242,6243,6244,6246],{},"R2 cobra zero de ingresso. AWS cobra a saída de S3 — aproximadamente nove centavos de dólar por GB nos primeiros 10 TB. Um terabyte custa cerca de noventa dólares pra sair da AWS, R$450. Tempo de transferência: doze a vinte e quatro horas com ",[231,6245,5907],{}," paralelizado, dependendo da banda. Após a migração, R$75 mensais armazenando 50GB com egresso ilimitado, contra R$600 pelo mesmo no S3 com tráfego ativo.",[368,6248,6250],{"id":6249},"lambda-como-migrar-event-driven","Lambda — como migrar event-driven?",[12,6252,6253,6254,6257,6258,6261,6262,6265,6266,6269],{},"Depende do disparador. ",[27,6255,6256],{},"S3 disparando Lambda"," vira R2 com Cloudflare Workers (mesmo padrão, sem mudança radical). ",[27,6259,6260],{},"SQS disparando Lambda"," vira worker persistente no app server, consumindo da fila — geralmente código mais simples que a Lambda original. ",[27,6263,6264],{},"EventBridge agendado"," vira cron no orquestrador. ",[27,6267,6268],{},"EventBridge com regras complexas e Step Functions encadeados"," exige redesign — desenhe o fluxo em torno de uma fila central com workers consumidores, fica mais auditável.",[368,6271,6273],{"id":6272},"rds-multi-az-postgres-self-hosted-e-confiavel","RDS Multi-AZ → Postgres self-hosted é confiável?",[12,6275,6276],{},"Postgres com replicação física streaming e failover via Patroni atinge confiabilidade próxima do RDS Multi-AZ — desde que o time saiba operar. Se ninguém na equipe domina Postgres em produção, o caminho mais seguro é Neon ou Supabase, que entregam Postgres gerenciado com tier gratuito. Pra times com SRE ou DBA, self-hosted é viável e economiza substancial. Pra times sem essa competência, a economia não compensa o risco — pague pelo gerenciado.",[368,6278,6280],{"id":6279},"email-ses-quem-e-mais-barato","Email SES → quem é mais barato?",[12,6282,6283],{},"Depende do volume. Até 10 mil emails mensais, Postmark a US$15 entrega muito mais (entregabilidade superior, dashboard melhor, suporte responsivo). Entre 50 mil e 100 mil mensais, Resend a US$20 é o melhor custo-benefício. Acima de 500 mil mensais, Mailgun ou Amazon SES competem em preço — e SES talvez faça sentido manter mesmo após migrar o resto. Email é dos poucos serviços AWS que pode ser racional manter.",[368,6285,6287],{"id":6286},"dns-tudo-cloudflare-ou-misturar","DNS — tudo Cloudflare ou misturar?",[12,6289,6290],{},"Cloudflare resolve DNS, CDN, DDoS, WAF e workers no plano grátis. Pra a maioria das stacks, concentrar tudo lá simplifica operação e corta custo. A exceção é compliance que exige separação geográfica de provedor — alguns frameworks de governança pedem que DNS e CDN sejam de fornecedores distintos. Nesse caso, Cloudflare DNS + Bunny CDN (ou Fastly) cumpre a separação.",[368,6292,6294],{"id":6293},"compliance-lgpd-muda-algo","Compliance LGPD muda algo?",[12,6296,6297],{},"LGPD não exige hospedagem em território brasileiro. Exige que você saiba onde os dados estão e que tenha contrato adequado com o operador. Hetzner (Alemanha), DigitalOcean (várias regiões), Cloudflare R2 (multi-região) e Magalu Cloud (Brasil) são todos compatíveis com LGPD desde que o contrato esteja em ordem. Pra quem prefere dado em território nacional por preferência de cliente, Magalu Cloud é a alternativa direta.",[12,6299,5407],{},[19,6301,6303],{"id":6302},"proximo-passo-concreto","Próximo passo concreto",[12,6305,6306],{},"Se você chegou até aqui, o próximo passo é a planilha. Lista os doze serviços, marca quais sua stack usa, anota custo atual de cada um, escolhe alternativa. Em uma tarde você sabe se a migração vale o esforço.",[12,6308,6309],{},"Quando estiver pronto pra provisionar o destino:",[224,6311,6312],{"className":226,"code":5319,"language":228,"meta":229,"style":229},[231,6313,6314],{"__ignoreMap":229},[234,6315,6316,6318,6320,6322,6324],{"class":236,"line":237},[234,6317,1220],{"class":247},[234,6319,2958],{"class":251},[234,6321,5330],{"class":255},[234,6323,2964],{"class":383},[234,6325,2967],{"class":247},[12,6327,6328],{},"Roda em qualquer servidor Linux com Docker. Os primeiros três viram quórum pro plano de controle replicado. Você submete jobs via CLI, API ou painel web embutido. O cluster decide onde rodar, faz health check, gerencia rolling deploys, emite certificados Let's Encrypt automaticamente.",[12,6330,6331,6332,2403,6336,101],{},"Pra contexto adicional sobre custos e arquitetura, leia também ",[3337,6333,6335],{"href":6334},"\u002Fblog\u002Faws-ecs-vs-kubernetes-vs-auto-hospedado","AWS ECS vs Kubernetes vs auto-hospedado",[3337,6337,6339],{"href":6338},"\u002Fblog\u002Fquanto-custa-hospedar-saas-brasileiro-2026","Quanto custa hospedar SaaS brasileiro em 2026",[12,6341,6342],{},"A migração é mais aborrecida do que difícil. O difícil é decidir começar.",[3351,6344,4376],{},{"title":229,"searchDepth":244,"depth":244,"links":6346},[6347,6348,6349,6350,6364,6365,6366,6367,6368,6369,6370,6371,6382],{"id":5391,"depth":244,"text":5392},{"id":5410,"depth":244,"text":5411},{"id":5423,"depth":244,"text":5424},{"id":5507,"depth":244,"text":5508,"children":6351},[6352,6353,6354,6355,6356,6357,6358,6359,6360,6361,6362,6363],{"id":5720,"depth":271,"text":5721},{"id":5730,"depth":271,"text":5731},{"id":5753,"depth":271,"text":5754},{"id":5763,"depth":271,"text":5764},{"id":5780,"depth":271,"text":5781},{"id":5790,"depth":271,"text":5791},{"id":5800,"depth":271,"text":5801},{"id":5807,"depth":271,"text":5808},{"id":5817,"depth":271,"text":5818},{"id":5830,"depth":271,"text":5831},{"id":5850,"depth":271,"text":5851},{"id":5860,"depth":271,"text":5861},{"id":5882,"depth":244,"text":5883},{"id":5941,"depth":244,"text":5942},{"id":5980,"depth":244,"text":5981},{"id":6071,"depth":244,"text":6072},{"id":6104,"depth":244,"text":6105},{"id":6135,"depth":244,"text":6136},{"id":6159,"depth":244,"text":6160},{"id":6214,"depth":244,"text":6215,"children":6372},[6373,6374,6375,6376,6377,6378,6379,6380,6381],{"id":6218,"depth":271,"text":6219},{"id":6225,"depth":271,"text":6226},{"id":6232,"depth":271,"text":6233},{"id":6239,"depth":271,"text":6240},{"id":6249,"depth":271,"text":6250},{"id":6272,"depth":271,"text":6273},{"id":6279,"depth":271,"text":6280},{"id":6286,"depth":271,"text":6287},{"id":6293,"depth":271,"text":6294},{"id":6302,"depth":244,"text":6303},"caso-de-uso","2026-05-26","Migrar de AWS pra cloud mais barato (Hetzner\u002FDO) ou auto-hospedado parece projeto de 1 ano. Na prática, dá pra fazer em 6-8 semanas se você mapear os 12 serviços AWS-only que sua stack usa de verdade.",{},"\u002Fblog\u002Fcomo-sair-da-aws-sem-reescrever-toda-stack","16 min",{"title":5383,"description":6385},{"loc":6387},"blog\u002Fcomo-sair-da-aws-sem-reescrever-toda-stack",[6393,6394,6395,6396,6397],"aws","migracao","custo","saida","guia","kqR2CUbhazjyN_A9HwRFTWxS_-3H7sNRPr0KAS0KlYw",{"id":6400,"title":6401,"author":7,"body":6402,"category":3379,"cover":3380,"date":7504,"description":7505,"draft":3383,"extension":3384,"lastReviewed":3380,"meta":7506,"navigation":411,"path":7507,"readingTime":4401,"seo":7508,"sitemap":7509,"stem":7510,"tags":7511,"__hash__":7515},"blog_pt\u002Fblog\u002Fredis-em-producao-gerenciado-vs-self-hosted-valkey.md","Redis (e Valkey) em produção: gerenciado vs auto-hospedado em 2026",{"type":9,"value":6403,"toc":7476},[6404,6418,6420,6440,6444,6447,6450,6456,6463,6467,6470,6476,6482,6488,6491,6497,6502,6507,6510,6516,6521,6526,6529,6535,6540,6550,6554,6557,6601,6605,6608,6612,6615,6647,6650,6654,6657,6671,6678,6682,6696,6699,6703,6736,6739,6743,6746,6760,6767,6771,6774,6855,6858,6862,6865,6871,6877,6884,6887,6891,6894,6926,6929,6933,6940,6943,6946,7242,7246,7249,7275,7279,7282,7308,7312,7315,7336,7345,7348,7351,7355,7380,7394,7400,7409,7415,7421,7427,7433,7435,7438,7444,7447,7463,7474],[12,6405,6406,6407,6410,6411,2403,6414,6417],{},"A pergunta \"Redis gerenciado ou auto-hospedado?\" virou outra pergunta no fim de março de 2024. Foi quando a empresa por trás do Redis trocou a licença de Apache 2.0 \u002F BSD para uma combinação de RSAL com SSPL — um par de licenças \"source available\" desenhadas pra impedir que provedores de nuvem oferecessem Redis como serviço sem licenciamento comercial. A reação foi rápida: a Linux Foundation lançou o ",[27,6408,6409],{},"Valkey"," como fork direto da última versão BSD, com AWS, Google e Oracle bancando o desenvolvimento. Em paralelo, projetos que já existiam — ",[27,6412,6413],{},"KeyDB",[27,6415,6416],{},"Dragonfly"," — passaram a aparecer com mais frequência em benchmarks de empresas que estavam reavaliando a stack.",[19,6419,22],{"id":21},[12,6421,6422,6423,6426,6427,6429,6430,6432,6433,6435,6436,6439],{},"Em 2026, \"Redis em produção\" virou uma categoria com quatro implementações disputando o mesmo protocolo: ",[27,6424,6425],{},"Redis OSS"," (BSD pré-2024 ou RSAL pós), ",[27,6428,6409],{}," (BSD, drop-in pelo fork), ",[27,6431,6413],{}," (multi-thread, fork antigo) e ",[27,6434,6416],{}," (BSL, reescrita do zero em C++). Auto-hospedar qualquer um dos quatro custa entre R$30 e R$130 por mês em VPS Hetzner. O caminho gerenciado custa de R$75 (ElastiCache micro) até R$1.000\u002Fmês (instância de 13 GB), mais Upstash com cobrança serverless variando US$0–100\u002Fmês. Pra startup brasileira com MRR abaixo de R$200k, ",[27,6437,6438],{},"Valkey auto-hospedado"," num cluster próprio economiza entre R$300 e R$1.500 por mês comparado ao gerenciado, elimina exposição à licença RSAL e mantém compatibilidade total com clientes Redis. Trocar a stack depois de adotar a versão comercial é dor real — começar com a versão amigável a OSS é a aposta com menor custo de saída. Este post compara os quatro produtos, os três caminhos gerenciados (ElastiCache, Upstash, Redis Cloud) e a configuração mínima pra rodar Valkey em produção sem perder noites de sono.",[19,6441,6443],{"id":6442},"a-historia-curta-da-mudanca-de-licenca","A história curta da mudança de licença",[12,6445,6446],{},"Antes de março de 2024, \"Redis\" era o cache OSS dominante: BSD, ecossistema gigante, presente em qualquer stack que tivesse cabido a palavra \"Rails\" ou \"Node\" no currículo. O fornecedor comercial — Redis Inc, antiga Redis Labs — vivia bem do produto gerenciado e dos módulos pagos (Search, JSON, TimeSeries).",[12,6448,6449],{},"Aí veio o anúncio: a versão 7.4 em diante sairia sob RSAL + SSPL, não mais BSD. Em termos práticos, a mudança visou diretamente AWS, Google e Azure. A leitura interna de quem produz software open source foi outra: \"se aconteceu com Redis, pode acontecer com qualquer projeto VC-funded\". Foi o terceiro caso recente — depois de Elastic em 2021 e MongoDB em 2018 — em que um projeto que parecia consolidado mudou as regras.",[12,6451,6452,6453,6455],{},"A Linux Foundation foi rápida. Cinco dias após o anúncio, o ",[27,6454,6409],{}," foi formado como fork da última versão BSD (7.2.4), com governança independente e backers de peso: AWS, Google Cloud, Oracle, Ericsson, Snap. Em pouco mais de um ano, a AWS já tinha migrado o motor padrão do ElastiCache pra Valkey. O Google Memorystore seguiu. Em 2026, Valkey deixou de ser \"fork experimental\" pra virar referência crescente — com versões 7.x e 8.x já incorporando otimizações próprias que nem foram ofertadas ao Redis OSS.",[12,6457,6458,6459,6462],{},"A lição operacional pra quem está escolhendo cache hoje: ",[27,6460,6461],{},"o mainstream se moveu",". Não há mais a inércia de \"ninguém foi demitido por escolher Redis\" — a pergunta na entrevista de arquitetura virou \"por que Redis e não Valkey?\". E a resposta honesta, na maioria dos casos, é \"costume\".",[19,6464,6466],{"id":6465},"quais-sao-os-quatro-produtos-disputando-esse-mercado","Quais são os quatro produtos disputando esse mercado?",[368,6468,6425],{"id":6469},"redis-oss",[12,6471,6472,6475],{},[27,6473,6474],{},"O original."," Versões anteriores a 7.4 ainda estão sob BSD e seguem usáveis indefinidamente — ninguém revoga licença retroativa. Versões 7.4 em diante saem sob RSAL\u002FSSPL.",[12,6477,6478,6481],{},[27,6479,6480],{},"Pros",": comunidade ainda enorme, batter-tested em produção há mais de uma década, ecossistema mais rico (módulos, integrações, livros, talks). Quase todo client library testou primeiro contra Redis OSS.",[12,6483,6484,6487],{},[27,6485,6486],{},"Cons",": a RSAL impede oferecer-as-a-service sem licenciamento comercial. Pra quem opera Redis pra uso interno, isso é irrelevante — a restrição é sobre revenda. O risco real é estratégico: se o fornecedor mudou a licença uma vez, pode mudar de novo. Adotar Redis OSS em 2026 significa apostar que a próxima feature crítica vai descer pra ramo aberto, e não ficar no produto comercial.",[368,6489,6409],{"id":6490},"valkey",[12,6492,6493,6496],{},[27,6494,6495],{},"O fork da Linux Foundation."," Pegou o código da 7.2.4 BSD e seguiu desenvolvendo. Drop-in replacement no nível de protocolo: nenhum cliente precisa mudar uma linha de código pra trocar Redis por Valkey.",[12,6498,6499,6501],{},[27,6500,6480],{},": BSD permanente garantido por governança neutra (não é uma empresa, é fundação). Backers grandes alinham incentivos pra manter o projeto saudável. Paridade técnica com Redis 7.x e velocidade de desenvolvimento crescente.",[12,6503,6504,6506],{},[27,6505,6486],{},": a marca ainda está sendo construída — alguns plugins de terceiros e SDKs muito específicos ainda só listam \"Redis\" no README. Em 2026 isso é cada vez mais cosmético, mas pode aparecer em integrações antigas que precisam de pequena adaptação.",[368,6508,6413],{"id":6509},"keydb",[12,6511,6512,6515],{},[27,6513,6514],{},"O fork multi-thread."," Existe desde 2019, foi adquirido pela Snap em 2022, hoje vive como projeto Snap-Telemetry. A diferença arquitetural é fundamental: Redis OSS e Valkey são single-thread por design (uma thread principal processa todos os comandos). KeyDB roda multi-thread por padrão.",[12,6517,6518,6520],{},[27,6519,6480],{},": em CPUs com 4+ núcleos, KeyDB entrega 2 a 3 vezes mais throughput que Redis single-thread no mesmo hardware. API é compatível, então o cliente não muda. Pra workloads CPU-bound com volume alto, é a escolha óbvia.",[12,6522,6523,6525],{},[27,6524,6486],{},": comunidade menor, ritmo de adoção de novas features Redis costuma ficar trimestres atrás. Algumas features novas do Redis (Functions, certas extensões) demoram a aparecer no KeyDB.",[368,6527,6416],{"id":6528},"dragonfly",[12,6530,6531,6534],{},[27,6532,6533],{},"A reescrita."," Não é fork — é implementação nova em C++ moderno, com hash table desenhada pra cache (não a estrutura genérica do Redis), usando io_uring no Linux pra I\u002FO assíncrono. Compatibilidade no nível do protocolo, não no nível do código.",[12,6536,6537,6539],{},[27,6538,6480],{},": claims de 25× throughput em benchmarks específicos (pipelines pesadas em hardware moderno). Memory efficiency real — 2 a 3 vezes mais dados no mesmo RAM que Redis. Sem GIL implícito de single-thread; escala vertical em uma máquina com 32+ cores.",[12,6541,6542,6544,6545,6549],{},[27,6543,6486],{},": licença BSL (Business Source License) — fica fechada por 4 anos antes de virar Apache 2.0. É exatamente o mesmo padrão de licença que pegou outros projetos da indústria de orquestração de surpresa, e que tratamos no nosso post sobre ",[3337,6546,6548],{"href":6547},"\u002Fblog\u002Fpor-que-criamos-o-heroctl","por que criamos o HeroCtl",". Alguns commands ainda incompatíveis com Redis em casos de borda (scripts Lua complexos, certas operações de cluster).",[19,6551,6553],{"id":6552},"qual-escolher-pra-novo-projeto-em-2026","Qual escolher pra novo projeto em 2026?",[12,6555,6556],{},"A árvore de decisão curta:",[2735,6558,6559,6568,6576,6584,6593],{},[70,6560,6561,6564,6565,6567],{},[27,6562,6563],{},"Default sensato",": ",[27,6566,6409],{},". BSD permanente, paridade Redis, cliente não precisa mudar, futuro garantido por backers grandes. Não há razão técnica pra preferir Redis OSS pra projeto novo em 2026.",[70,6569,6570,6564,6573,6575],{},[27,6571,6572],{},"Performance crítica",[27,6574,6416],{},", se a aplicação sustenta acima de 100 mil operações por segundo e o time aceita o risco de licença BSL.",[70,6577,6578,6564,6581,6583],{},[27,6579,6580],{},"Multi-thread sem reescrita",[27,6582,6413],{},", se o gargalo é CPU em hardware grande e o time prefere não migrar pra Dragonfly.",[70,6585,6586,6564,6589,6592],{},[27,6587,6588],{},"Simplicidade extrema (1 VPS, baixo volume)",[27,6590,6591],{},"Redis OSS 7.2.4 BSD"," ainda funciona perfeitamente. Cristalizou como versão estável; vai rodar em qualquer Debian\u002FAlpine pelos próximos cinco anos sem reclamar.",[70,6594,6595,6564,6598,6600],{},[27,6596,6597],{},"Migrando de Redis Labs gerenciado",[27,6599,6409],{}," é drop-in. Zero código mudando. A migração é apenas operacional — replicação, swap de DNS, rollback se necessário.",[19,6602,6604],{"id":6603},"gerenciado-vs-auto-hospedado-a-conta-sem-floreio","Gerenciado vs auto-hospedado: a conta sem floreio",[12,6606,6607],{},"Os números abaixo são preço de tabela em maio de 2026, câmbio R$5\u002FUSD.",[368,6609,6611],{"id":6610},"aws-elasticache","AWS ElastiCache",[12,6613,6614],{},"Cresce em degraus por instância:",[2735,6616,6617,6626,6632,6641],{},[70,6618,6619,6622,6623],{},[231,6620,6621],{},"cache.t4g.micro"," (1 GB): cerca de US$15\u002Fmês = ",[27,6624,6625],{},"R$75\u002Fmês",[70,6627,6628,6631],{},[231,6629,6630],{},"cache.t4g.small"," (2 GB): US$30\u002Fmês = R$150\u002Fmês",[70,6633,6634,6637,6638],{},[231,6635,6636],{},"cache.r6g.large"," (13 GB): cerca de US$200\u002Fmês = ",[27,6639,6640],{},"R$1.000\u002Fmês",[70,6642,6643,6646],{},[231,6644,6645],{},"cache.r6g.xlarge"," (26 GB): cerca de US$400\u002Fmês = R$2.000\u002Fmês",[12,6648,6649],{},"Multi-AZ dobra o preço (réplica em outra zona). Backup automático é incluso. Multi-AZ failover real é o argumento principal — você paga pra não ter que pensar nisso.",[368,6651,6653],{"id":6652},"upstash","Upstash",[12,6655,6656],{},"Cobrança serverless por comando:",[2735,6658,6659,6662,6665,6668],{},[70,6660,6661],{},"Free tier: 256 MB, 500k commands\u002Fdia",[70,6663,6664],{},"Pay-as-you-go: US$0,2 por 100k commands",[70,6666,6667],{},"Pra startup com volume médio (10M commands\u002Fdia): cerca de US$60\u002Fmês = R$300\u002Fmês",[70,6669,6670],{},"Pra app com pico baixo: pode ficar entre US$0 e US$10\u002Fmês",[12,6672,6673,6674,6677],{},"A vantagem operacional é única: ",[27,6675,6676],{},"zero capacidade pré-alocada",". Se o app dorme, a conta dorme. Pra Vercel\u002FCloudflare Workers, é o complemento natural. Pra carga sustentada e previsível, fica mais caro que ElastiCache.",[368,6679,6681],{"id":6680},"redis-cloud-oferta-direta-da-redis-inc","Redis Cloud (oferta direta da Redis Inc)",[2735,6683,6684,6687,6693],{},[70,6685,6686],{},"Plano Essentials 30MB: free",[70,6688,6689,6690],{},"Plano Pro 5GB single-region: cerca de US$50\u002Fmês = ",[27,6691,6692],{},"R$250\u002Fmês",[70,6694,6695],{},"Plano Pro 10GB multi-AZ: cerca de US$120\u002Fmês = R$600\u002Fmês",[12,6697,6698],{},"Inclui módulos comerciais (Search, JSON, TimeSeries) que não existem no Valkey nem no Redis OSS. Se você usa esses módulos, não há alternativa direta — é Redis Cloud ou compra licença comercial e auto-hospeda.",[368,6700,6702],{"id":6701},"auto-hospedado-em-hetzner","Auto-hospedado em Hetzner",[2735,6704,6705,6715,6721,6730],{},[70,6706,6707,6710,6711,6714],{},[27,6708,6709],{},"CPX21"," (3 vCPU, 4 GB RAM, 80 GB SSD): €7,99 = ",[27,6712,6713],{},"R$44\u002Fmês",". Cabe Valkey de 2 GB com folga.",[70,6716,6717,6720],{},[27,6718,6719],{},"CPX31"," (4 vCPU, 8 GB RAM, 160 GB SSD): €13,99 = R$78\u002Fmês.",[70,6722,6723,6726,6727,101],{},[27,6724,6725],{},"Cluster de 3 CPX21 pra Valkey + Sentinel HA",": 3 × €7,99 = €24\u002Fmês = ",[27,6728,6729],{},"R$130\u002Fmês",[70,6731,6732,6735],{},[27,6733,6734],{},"Cluster de 3 CPX31 pra dados sérios",": €42\u002Fmês = R$230\u002Fmês.",[12,6737,6738],{},"Pra DigitalOcean, Linode, Vultr, multiplique por aproximadamente 1,5×. Pra AWS EC2, multiplique por 2×. Mas em qualquer caso fica mais barato que o gerenciado equivalente.",[368,6740,6742],{"id":6741},"diferenca-pratica","Diferença prática",[12,6744,6745],{},"Pra workload de cache de 8 GB com replicação:",[2735,6747,6748,6751,6754,6757],{},[70,6749,6750],{},"ElastiCache Multi-AZ: ~R$1.000\u002Fmês",[70,6752,6753],{},"Redis Cloud Pro Multi-AZ: ~R$600\u002Fmês",[70,6755,6756],{},"Valkey self-hosted em 3× Hetzner CPX31: R$230\u002Fmês",[70,6758,6759],{},"Valkey single-node em 1× Hetzner CPX31 + backup S3: R$80\u002Fmês",[12,6761,6762,6763,6766],{},"Quem escolhe o caminho gerenciado paga ",[27,6764,6765],{},"3 a 10 vezes mais"," pelo mesmo throughput. A diferença é o que você compra com isso: SLA contratual, multi-AZ failover automático, ausência de pager às 3 da manhã. Pra time pequeno, isso pode valer o preço. Pra time que já opera servidores Linux em produção, geralmente não vale.",[19,6768,6770],{"id":6769},"stack-minima-de-valkey-production-grade","Stack mínima de Valkey production-grade",[12,6772,6773],{},"Configuração que aguenta produção real sem teatro:",[2735,6775,6776,6782,6791,6806,6812,6818,6824,6830],{},[70,6777,6778,6781],{},[27,6779,6780],{},"Container ou systemd service em VPS dedicado."," Não compartilha máquina com a aplicação — cache e app concorrem por RAM, e quando dá errado dá errado pros dois ao mesmo tempo.",[70,6783,6784,6790],{},[27,6785,6786,6789],{},[231,6787,6788],{},"maxmemory"," configurado"," entre 50 e 70% do RAM disponível. Sobrar memória pro sistema e pros buffers de rede é mais importante que ter os últimos megabytes pra cache.",[70,6792,6793,6564,6798,6801,6802,6805],{},[27,6794,6795],{},[231,6796,6797],{},"maxmemory-policy",[231,6799,6800],{},"allkeys-lru"," se modo cache puro (jogar fora chaves antigas quando encher). ",[231,6803,6804],{},"noeviction"," se modo storage (queue, sessões) — aí prefira erro de write a perder dados silenciosamente.",[70,6807,6808,6811],{},[27,6809,6810],{},"AOF persistence"," se a carga é fila de jobs (Sidekiq, BullMQ, Resque). Sem AOF, um restart perde qualquer job que estava enfileirado mas não processado. RDB é insuficiente nesse cenário porque snapshot é periódico.",[70,6813,6814,6817],{},[27,6815,6816],{},"RDB suficiente"," se a carga é cache puro (Rails cache, Django cache). Se reiniciar perdendo cache só significa \"request lento por alguns segundos enquanto reaquece\", AOF é overhead desnecessário.",[70,6819,6820,6823],{},[27,6821,6822],{},"Replicação async pra standby"," num segundo nó. Failover manual com swap de DNS interno é aceitável pra muito caso. Failover automático custa Sentinel ou Cluster.",[70,6825,6826,6829],{},[27,6827,6828],{},"Backup AOF + RDB pra S3"," ou compatível, diariamente. Restic ou rclone resolvem bem.",[70,6831,6832,6835,6836,6839,6840,571,6843,571,6846,571,6849,571,6852,101],{},[27,6833,6834],{},"Monitoring"," com ",[231,6837,6838],{},"redis_exporter"," exportando pra Prometheus + alertas no Grafana ou similar. Métricas críticas: ",[231,6841,6842],{},"connected_clients",[231,6844,6845],{},"used_memory",[231,6847,6848],{},"evicted_keys",[231,6850,6851],{},"keyspace_hits\u002Fmisses",[231,6853,6854],{},"latency_percentiles",[12,6856,6857],{},"Esse setup roda confortável em CPX21 (R$44\u002Fmês) servindo 50k+ ops\u002Fs sustentadas pra app brasileira média.",[19,6859,6861],{"id":6860},"sentinel-ou-cluster","Sentinel ou Cluster?",[12,6863,6864],{},"Pergunta que confunde muito time vindo de Redis pela primeira vez.",[12,6866,6867,6870],{},[27,6868,6869],{},"Sentinel",": 1 master + N réplicas + 3+ processos sentinel monitorando. Failover automático quando o master cai — um sentinel detecta, os sentinels votam, uma réplica vira master, clientes recebem novo endpoint via discovery. Tudo num único shard — todo o dataset cabe num nó.",[12,6872,6873,6876],{},[27,6874,6875],{},"Cluster",": dataset particionado em 16384 slots distribuídos em 3+ masters. Cada master tem suas próprias réplicas. Multi-shard, escala horizontal de capacidade — você pode ter 100 GB total com nenhum nó individual segurando mais de 20 GB.",[12,6878,6879,6880,6883],{},"A regra prática: ",[27,6881,6882],{},"Sentinel basta até dataset de ~100 GB",". Acima disso, Cluster é necessário. Pra maioria das startups brasileiras, Sentinel é a escolha certa por simplicidade — Cluster adiciona complexidade real (chave precisa de hashtag pra operações multi-key, scripts Lua ficam restritos a um slot, alguns clientes têm bugs em modo cluster).",[12,6885,6886],{},"Não use Cluster por status. Use Sentinel até a métrica forçar.",[19,6888,6890],{"id":6889},"padroes-de-sidekiq-bullmq-e-companhia","Padrões de Sidekiq, BullMQ e companhia",[12,6892,6893],{},"Use real, não diagrama de marketing:",[2735,6895,6896,6902,6908,6914,6920],{},[70,6897,6898,6901],{},[27,6899,6900],{},"Sidekiq Ruby",": Redis precisa de AOF. Sem AOF, qualquer crash perde os jobs enfileirados que ainda não foram retirados. Sidekiq Pro adiciona \"reliable fetch\" que melhora — mas o backstop ainda é AOF.",[70,6903,6904,6907],{},[27,6905,6906],{},"BullMQ Node",": similar. AOF essential pra durability. BullMQ usa estruturas de dados que dependem de atomicidade transacional do Redis — restart sem AOF pode deixar fila num estado inconsistente.",[70,6909,6910,6913],{},[27,6911,6912],{},"Resque Ruby",": o pai de todos. AOF necessário pelas mesmas razões.",[70,6915,6916,6919],{},[27,6917,6918],{},"Cache puro (Rails.cache, Django cache, Laravel cache)",": pode rodar sem AOF, RDB suficiente. Perder cache num restart é aceitável.",[70,6921,6922,6925],{},[27,6923,6924],{},"Pub\u002Fsub puro",": nem precisa de persistência. Pub\u002Fsub é fire-and-forget por design.",[12,6927,6928],{},"Misturar uso de cache e queue no mesmo Redis funciona — basta configurar AOF (a carga \"pior caso\" determina). Mas pra workload sério, separar em duas instâncias (uma pra cache sem AOF, outra pra queue com AOF) é mais limpo. Operacionalmente baratíssimo se já há orquestrador rodando.",[19,6930,6932],{"id":6931},"elasticache-sao-paulo-e-confiavel","ElastiCache São Paulo é confiável?",[12,6934,6935,6936,6939],{},"Sim — 99.99% uptime SLA contratual, multi-AZ na região São Paulo (",[231,6937,6938],{},"sa-east-1","), backup automático, failover testado. Latência da app brasileira pra ElastiCache São Paulo fica em 1-3ms, indistinguível de Redis local pra maioria dos workloads.",[12,6941,6942],{},"O ponto fraco não é confiabilidade técnica, é custo e lock-in. AWS Brazil cobra cerca de 30% mais caro que regiões norte-americanas pelo mesmo recurso. E migrar de ElastiCache pra outro provedor depois envolve dump\u002Frestore + cutover coordenado — não é apocalipse, mas é trabalho de fim de semana.",[19,6944,6945],{"id":3836},"Tabela comparativa: 12 critérios",[119,6947,6948,6969],{},[122,6949,6950],{},[125,6951,6952,6954,6956,6958,6960,6962,6964,6966],{},[128,6953,2983],{},[128,6955,6425],{},[128,6957,6409],{},[128,6959,6413],{},[128,6961,6416],{},[128,6963,5446],{},[128,6965,6653],{},[128,6967,6968],{},"Self-hosted Valkey",[141,6970,6971,6996,7020,7042,7067,7088,7110,7131,7154,7178,7199,7220],{},[125,6972,6973,6976,6979,6982,6984,6987,6990,6993],{},[146,6974,6975],{},"Licença",[146,6977,6978],{},"RSAL\u002FSSPL (7.4+)",[146,6980,6981],{},"BSD",[146,6983,6981],{},[146,6985,6986],{},"BSL → Apache 4 anos",[146,6988,6989],{},"Comercial AWS",[146,6991,6992],{},"Comercial Upstash",[146,6994,6995],{},"BSD permanente",[125,6997,6998,7001,7004,7006,7009,7011,7014,7017],{},[146,6999,7000],{},"Threading",[146,7002,7003],{},"Single",[146,7005,7003],{},[146,7007,7008],{},"Multi",[146,7010,7008],{},[146,7012,7013],{},"Single (engine 7)",[146,7015,7016],{},"Serverless",[146,7018,7019],{},"Configurável",[125,7021,7022,7025,7028,7030,7032,7035,7037,7040],{},[146,7023,7024],{},"Compat. cliente Redis",[146,7026,7027],{},"100%",[146,7029,7027],{},[146,7031,7027],{},[146,7033,7034],{},"95%+",[146,7036,7027],{},[146,7038,7039],{},"100% (subset comandos)",[146,7041,7027],{},[125,7043,7044,7047,7050,7052,7055,7058,7061,7064],{},[146,7045,7046],{},"Throughput baseline",[146,7048,7049],{},"100k ops\u002Fs",[146,7051,7049],{},[146,7053,7054],{},"250k ops\u002Fs",[146,7056,7057],{},"1M+ ops\u002Fs",[146,7059,7060],{},"depende inst.",[146,7062,7063],{},"depende plano",[146,7065,7066],{},"100-250k ops\u002Fs",[125,7068,7069,7072,7074,7076,7078,7080,7083,7086],{},[146,7070,7071],{},"Persistência AOF",[146,7073,3065],{},[146,7075,3065],{},[146,7077,3065],{},[146,7079,3065],{},[146,7081,7082],{},"Sim (snapshot)",[146,7084,7085],{},"Gerenciada",[146,7087,3065],{},[125,7089,7090,7093,7095,7097,7099,7101,7104,7107],{},[146,7091,7092],{},"Replicação",[146,7094,3065],{},[146,7096,3065],{},[146,7098,3065],{},[146,7100,3065],{},[146,7102,7103],{},"Multi-AZ",[146,7105,7106],{},"Multi-region",[146,7108,7109],{},"Sim (manual config)",[125,7111,7112,7115,7118,7120,7122,7124,7127,7129],{},[146,7113,7114],{},"Failover automático",[146,7116,7117],{},"Sentinel\u002FCluster",[146,7119,7117],{},[146,7121,7117],{},[146,7123,6875],{},[146,7125,7126],{},"Built-in",[146,7128,7126],{},[146,7130,7117],{},[125,7132,7133,7136,7139,7141,7143,7145,7148,7151],{},[146,7134,7135],{},"Custo 8GB\u002Fmês (R$)",[146,7137,7138],{},"80 (VPS)",[146,7140,7138],{},[146,7142,7138],{},[146,7144,7138],{},[146,7146,7147],{},"1000 (Multi-AZ)",[146,7149,7150],{},"300-500",[146,7152,7153],{},"80-230",[125,7155,7156,7159,7162,7165,7167,7170,7173,7176],{},[146,7157,7158],{},"Lock-in",[146,7160,7161],{},"Médio (licença)",[146,7163,7164],{},"Baixo",[146,7166,7164],{},[146,7168,7169],{},"Médio (BSL)",[146,7171,7172],{},"Alto (AWS)",[146,7174,7175],{},"Alto (Upstash API)",[146,7177,7164],{},[125,7179,7180,7183,7186,7188,7190,7192,7195,7197],{},[146,7181,7182],{},"Módulos premium",[146,7184,7185],{},"Pagos",[146,7187,3056],{},[146,7189,3056],{},[146,7191,3056],{},[146,7193,7194],{},"Add-on $$",[146,7196,3062],{},[146,7198,3056],{},[125,7200,7201,7204,7207,7209,7211,7213,7216,7218],{},[146,7202,7203],{},"Operacional",[146,7205,7206],{},"Você",[146,7208,7206],{},[146,7210,7206],{},[146,7212,7206],{},[146,7214,7215],{},"AWS",[146,7217,6653],{},[146,7219,7206],{},[125,7221,7222,7225,7228,7231,7233,7235,7238,7240],{},[146,7223,7224],{},"Suporte SLA",[146,7226,7227],{},"Pago",[146,7229,7230],{},"Comunidade",[146,7232,7230],{},[146,7234,7227],{},[146,7236,7237],{},"Incluso",[146,7239,7237],{},[146,7241,7206],{},[19,7243,7245],{"id":7244},"quando-ainda-gerenciado-faz-sentido","Quando ainda gerenciado faz sentido",[12,7247,7248],{},"A honestidade é mecanismo de defesa de qualquer recomendação técnica. Há quatro perfis em que pagar pelo gerenciado é a escolha certa:",[2735,7250,7251,7257,7263,7269],{},[70,7252,7253,7256],{},[27,7254,7255],{},"Time sem capacidade operacional pra Redis cluster."," Se ninguém na empresa sabe debugar um master que não responde mais, ou interpretar latência de fork RDB, ou cuidar de backup AOF — pagar AWS pra fazer isso é racional. Não é desculpa, é divisão de trabalho.",[70,7258,7259,7262],{},[27,7260,7261],{},"Compliance que exige fornecedor SOC2\u002FISO certificado."," Auditoria que pede \"fornecedor certificado X\" não aceita \"rodamos Valkey num VPS Hetzner\". O caminho é ElastiCache, Redis Cloud ou similar com certificações no contrato.",[70,7264,7265,7268],{},[27,7266,7267],{},"Volume que precisa escalar instantâneo."," Aplicação que vai de 100 req\u002Fs pra 100k req\u002Fs em 5 minutos por causa de campanha viral — o caminho serverless do Upstash é onde brilha. Auto-hospedado precisa de capacidade reservada antes; serverless cresce na hora.",[70,7270,7271,7274],{},[27,7272,7273],{},"Aplicação totalmente serverless."," Se a app roda em Vercel ou Cloudflare Workers e o Redis também precisa ser serverless por modelo de cobrança, Upstash é praticamente a única opção sã. Conectar funções edge a um Redis em VPS implica cold start ruim.",[19,7276,7278],{"id":7277},"quando-auto-hospedar-e-obvio","Quando auto-hospedar é óbvio",[12,7280,7281],{},"E quatro perfis em que pagar gerenciado é desperdício:",[2735,7283,7284,7290,7296,7302],{},[70,7285,7286,7289],{},[27,7287,7288],{},"Startup com R$10k–R$200k MRR otimizando custo."," A diferença entre R$80\u002Fmês e R$1.000\u002Fmês de cache é 1% do custo total dum SaaS pequeno; também é 11 horas de salário pessoa-hora de dev. Vale a pena fazer a conta.",[70,7291,7292,7295],{},[27,7293,7294],{},"Workload predicível."," Se o volume de cache cresce 10% ao mês, não há vantagem em escalar serverless. Capacidade reservada em VPS é mais barata e mais previsível.",[70,7297,7298,7301],{},[27,7299,7300],{},"Time tem 1+ pessoa confortável com Linux\u002FDocker."," Se já tem alguém que opera Postgres, nginx, Docker — Redis\u002FValkey é mais fácil que qualquer um deles. Curva de aprendizado é dias, não semanas.",[70,7303,7304,7307],{},[27,7305,7306],{},"Já existe cluster próprio."," Se a empresa roda orquestrador (HeroCtl, Coolify, plataforma similar) com nós sobrando, Valkey vira só mais um job. Custo marginal próximo de zero — você já paga pelos nós.",[19,7309,7311],{"id":7310},"heroctl-como-infraestrutura-pra-valkey","HeroCtl como infraestrutura pra Valkey",[12,7313,7314],{},"Pra quem opera HeroCtl, rodar Valkey em produção é exercício de configuração curta. Um arquivo de ~30 linhas descreve job com:",[2735,7316,7317,7320,7323,7326,7329],{},[70,7318,7319],{},"Container Valkey 8.x oficial",[70,7321,7322],{},"Volume nomeado replicado entre nós (dados sobrevivem a kill -9 de servidor)",[70,7324,7325],{},"Recursos reservados (RAM e CPU) com limites duros",[70,7327,7328],{},"Health check no ping Valkey",[70,7330,7331,7332,7335],{},"Roteamento interno entre serviços (a app fala com ",[231,7333,7334],{},"valkey.servico.local"," sem expor porta pra internet)",[12,7337,7338,7339,7341,7342,7344],{},"Backup automatizado AOF + RDB pra S3-compatible está disponível no plano ",[27,7340,4355],{}," — sem montar restic externo, sem cron manual no host. Métricas Valkey saem pelo ",[231,7343,6838],{}," rodando como sidecar e aparecem no Prometheus interno (já incluído como job do próprio cluster, sem stack externa).",[12,7346,7347],{},"Failover Sentinel é integrado ao plano de controle do orquestrador: se o nó do master Valkey cai, o cluster detecta em torno de 7 segundos e a réplica é promovida. A configuração da app é atualizada via descoberta de serviço — nenhum redeploy manual.",[12,7349,7350],{},"Pra startup com 4 servidores rodando o orquestrador, esse setup substitui ElastiCache Multi-AZ inteiro a custo marginal zero (os servidores já estão lá). A diferença mensal real é o salário-equivalente de uma pessoa, dependendo do tamanho da operação.",[19,7352,7354],{"id":7353},"perguntas-que-recebemos","Perguntas que recebemos",[12,7356,7357,7360,7361,571,7364,571,7367,571,7370,571,7373,571,7376,7379],{},[27,7358,7359],{},"Valkey é compatível com client libraries Redis?","\nSim, em 100% dos casos práticos. O protocolo é idêntico — ",[231,7362,7363],{},"redis-cli",[231,7365,7366],{},"node-redis",[231,7368,7369],{},"ioredis",[231,7371,7372],{},"redis-rb",[231,7374,7375],{},"redis-py",[231,7377,7378],{},"go-redis",", todos funcionam sem mudar uma linha. A trocar é apenas o endpoint. Em 2026, várias bibliotecas já anunciam suporte explícito ao Valkey no README, mas isso é cosmético — o protocolo é o mesmo.",[12,7381,7382,7385,7386,7389,7390,7393],{},[27,7383,7384],{},"Posso migrar de Redis Labs gerenciado pra Valkey self-hosted sem downtime?","\nSim, com replicação. Configura Valkey como réplica do Redis Labs (",[231,7387,7388],{},"REPLICAOF host port","), espera sincronizar (alguns minutos a horas dependendo do dataset), promove Valkey a master (",[231,7391,7392],{},"REPLICAOF NO ONE","), faz cutover de DNS interno, decomissiona Redis Labs depois de período de observação. Janela de erro real é de segundos durante o swap.",[12,7395,7396,7399],{},[27,7397,7398],{},"Dragonfly vale o risco de BSL?","\nDepende do horizonte da empresa. BSL converte pra Apache 2.0 após 4 anos pelo modelo padrão — então código de hoje será aberto até 2030. O risco é a empresa por trás (DragonflyDB Inc) seguir o caminho da Redis Inc e tornar a conversão menos amigável. Pra workloads que exigem performance que Valkey não entrega (acima de 500k ops\u002Fs sustentado), Dragonfly pode ser a escolha certa apesar do risco. Pra resto, Valkey é mais conservador.",[12,7401,7402,7405,7406,7408],{},[27,7403,7404],{},"Quanto de RAM consome um Redis com 1 GB de dados úteis?","\nConta pratica: dataset de 1 GB ocupa entre 1,3 e 2 GB reais de RAM (overhead de estrutura, fragmentação, buffers de cliente, replication backlog). Configurar ",[231,7407,6788],{}," em 60% do RAM disponível é regra segura — instância de 4 GB cabe ~2,5 GB de dados úteis com folga.",[12,7410,7411,7414],{},[27,7412,7413],{},"Sidekiq precisa AOF mesmo? Os docs do Sidekiq dizem que dá pra rodar sem.","\nOs docs falam que tecnicamente roda. Em produção, sem AOF, qualquer restart inesperado perde jobs enfileirados que estavam no buffer. Pra fila de \"envio de e-mail bem-vindo\", você descobre quando cliente reclama. Pra fila de \"cobrança recorrente\", descobre quando contador reclama. AOF é barato (incremento de 5-10% de I\u002FO), o custo de não ter é grande.",[12,7416,7417,7420],{},[27,7418,7419],{},"Cluster vs Sentinel pra app processando 50k jobs\u002Fdia?","\nSentinel. 50k jobs\u002Fdia é 0,6 ops\u002Fs média — cabem em 100 MB de RAM Redis. Cluster é overkill por ordem de magnitude. Sentinel resolve failover automático com 1 master + 1 réplica + 3 sentinels (3 processos sentinel em VPSs separados, podem coabitar com outras coisas).",[12,7422,7423,7426],{},[27,7424,7425],{},"ElastiCache São Paulo tem latência boa pra app rodando em São Paulo?","\nSim, 1-3ms p99 dentro da mesma AZ. O problema não é latência — é custo e lock-in. Latência só vira tema se a app está em outro provedor (Hetzner FSN, DigitalOcean NYC) tentando falar com ElastiCache São Paulo — aí sobe pra 130-200ms e o argumento desaparece.",[12,7428,7429,7432],{},[27,7430,7431],{},"Como fazer backup de Valkey self-hosted que sobreviva a desastre?","\nTrês camadas. Primeira: AOF persistente em disco local (sobrevive a restart). Segunda: snapshot RDB diário copiado pra storage S3-compatible (Wasabi, Backblaze B2, Cloudflare R2 — todos mais baratos que S3 da AWS pra esse caso). Terceira: snapshot semanal copiado pra outro provedor de storage (segunda região, segundo fornecedor). Restic ou rclone fazem o trabalho. Custo total de armazenagem pra backup de Valkey de 4 GB: cerca de US$1\u002Fmês.",[19,7434,3310],{"id":3309},[12,7436,7437],{},"Em 2026, \"Redis em produção\" virou pergunta com mais nuance do que tinha em 2023. A licença do produto original mudou, o fork Linux Foundation maturou, alternativas multi-thread estão de pé, a oferta serverless tem caso de uso real. Escolher entre os quatro implementações e os três caminhos gerenciados é exercício honesto — não há resposta única.",[12,7439,7440,7441,7443],{},"A nossa recomendação default pra startup brasileira em 2026: ",[27,7442,6438],{}," num cluster próprio, modo Sentinel, AOF ligado se há queue, monitoring com Prometheus. Custo na faixa de R$80–R$230\u002Fmês, contra R$600–R$2.000\u002Fmês das alternativas gerenciadas equivalentes. Compatibilidade total com qualquer biblioteca Redis. Sem exposição à licença RSAL. Migração reversível se virar um problema.",[12,7445,7446],{},"Pra colocar essa stack de pé:",[224,7448,7449],{"className":226,"code":2949,"language":228,"meta":229,"style":229},[231,7450,7451],{"__ignoreMap":229},[234,7452,7453,7455,7457,7459,7461],{"class":236,"line":237},[234,7454,1220],{"class":247},[234,7456,2958],{"class":251},[234,7458,2961],{"class":255},[234,7460,2964],{"class":383},[234,7462,2967],{"class":247},[12,7464,7465,7466,7470,7471,7473],{},"E ler em paralelo: ",[3337,7467,7469],{"href":7468},"\u002Fblog\u002Fpostgres-em-producao-gerenciado-vs-self-hosted","Postgres em produção: gerenciado vs auto-hospedado"," (mesma análise pro banco de dados) e ",[3337,7472,6339],{"href":6338}," (a conta consolidada de toda a stack).",[3351,7475,4376],{},{"title":229,"searchDepth":244,"depth":244,"links":7477},[7478,7479,7480,7486,7487,7494,7495,7496,7497,7498,7499,7500,7501,7502,7503],{"id":21,"depth":244,"text":22},{"id":6442,"depth":244,"text":6443},{"id":6465,"depth":244,"text":6466,"children":7481},[7482,7483,7484,7485],{"id":6469,"depth":271,"text":6425},{"id":6490,"depth":271,"text":6409},{"id":6509,"depth":271,"text":6413},{"id":6528,"depth":271,"text":6416},{"id":6552,"depth":244,"text":6553},{"id":6603,"depth":244,"text":6604,"children":7488},[7489,7490,7491,7492,7493],{"id":6610,"depth":271,"text":6611},{"id":6652,"depth":271,"text":6653},{"id":6680,"depth":271,"text":6681},{"id":6701,"depth":271,"text":6702},{"id":6741,"depth":271,"text":6742},{"id":6769,"depth":244,"text":6770},{"id":6860,"depth":244,"text":6861},{"id":6889,"depth":244,"text":6890},{"id":6931,"depth":244,"text":6932},{"id":3836,"depth":244,"text":6945},{"id":7244,"depth":244,"text":7245},{"id":7277,"depth":244,"text":7278},{"id":7310,"depth":244,"text":7311},{"id":7353,"depth":244,"text":7354},{"id":3309,"depth":244,"text":3310},"2026-05-20","Redis mudou licença em 2024, Valkey nasceu como fork OSS, Dragonfly bate benchmarks. Em 2026, escolher cache não é mais escolher Redis — é escolher entre 4 produtos. Análise honesta com custos.",{},"\u002Fblog\u002Fredis-em-producao-gerenciado-vs-self-hosted-valkey",{"title":6401,"description":7505},{"loc":7507},"blog\u002Fredis-em-producao-gerenciado-vs-self-hosted-valkey",[7512,6490,7513,7514,3379],"redis","cache","self-hosted","ez2Cr-Q_mpvXUsLHY2ePuetIE1kwbfa3rSyoZcJ0VWY",{"id":7517,"title":7518,"author":7,"body":7519,"category":8764,"cover":3380,"date":8765,"description":8766,"draft":3383,"extension":3384,"lastReviewed":3380,"meta":8767,"navigation":411,"path":8768,"readingTime":8769,"seo":8770,"sitemap":8771,"stem":8772,"tags":8773,"__hash__":8778},"blog_pt\u002Fblog\u002Fgithub-actions-vs-gitlab-ci-vs-drone-self-hosted.md","GitHub Actions vs GitLab CI vs Drone: qual CI\u002FCD escolher pra startup brasileira",{"type":9,"value":7520,"toc":8727},[7521,7528,7531,7535,7550,7556,7562,7568,7571,7574,7578,7581,7584,7608,7611,7615,7622,7626,7658,7662,7665,7710,7713,7716,7719,7723,7726,7729,7749,7752,7756,7759,7763,7799,7803,7806,7811,7860,7863,7869,7883,7886,7890,7893,7897,7940,7944,7970,7974,7977,7984,7988,7991,8111,8118,8121,8125,8128,8189,8192,8194,8198,8378,8381,8385,8388,8392,8398,8402,8408,8411,8415,8421,8424,8428,8434,8438,8444,8448,8451,8454,8480,8490,8493,8497,8501,8504,8520,8524,8527,8538,8541,8545,8548,8551,8555,8558,8576,8579,8581,8586,8589,8594,8597,8602,8605,8610,8613,8618,8621,8626,8629,8634,8641,8646,8649,8654,8657,8659,8663,8666,8698,8701,8706,8709,8720],[12,7522,7523,7524,7527],{},"A escolha de CI\u002FCD em 2026 não é mais sobre \"qual ferramenta tem mais features\". Todas as três sérias — GitHub Actions, GitLab CI, Drone (e seu fork Woodpecker) — fazem o básico bem. A escolha real é sobre ",[27,7525,7526],{},"onde a sua dor vai aparecer primeiro",": na fatura no fim do mês, na complexidade do workflow quando o monorepo crescer, ou na hora de subir um runner que ninguém entende quando o dev sênior sai de férias.",[12,7529,7530],{},"Este post é uma comparação honesta pra tech leads brasileiros decidindo CI\u002FCD em 2026. Sem ranking artificial, sem coluna em que uma ferramenta é \"campeã\" em tudo. Tradeoffs explícitos, números em reais, e uma recomendação por perfil no final.",[19,7532,7534],{"id":7533},"tldr-200-palavras","TL;DR (200 palavras)",[12,7536,7537,7538,571,7541,571,7544,2403,7547,101],{},"A decisão de CI\u002FCD em 2026 segue quatro forças: ",[27,7539,7540],{},"onde o código está hospedado",[27,7542,7543],{},"custo de minutos",[27,7545,7546],{},"complexidade de workflow",[27,7548,7549],{},"disposição pra operar self-hosted",[12,7551,7552,7555],{},[27,7553,7554],{},"GitHub Actions"," ganhou mindshare absoluto pra projetos no GitHub. É grátis até 2000 minutos\u002Fmês em repos públicos; depois custa US$0,008\u002Fmin em runner Linux — entre US$5 e US$30\u002Fmês pra startup típica (R$25 a R$150). Marketplace tem 10 mil ações prontas. O calcanhar é o pricing de minutos quando o volume cresce.",[12,7557,7558,7561],{},[27,7559,7560],{},"GitLab CI"," é mais completo: grafo de dependências entre jobs nativo, parent-child pipelines, monorepo handling melhor, registro de imagens incluído, scanning de segurança embutido. Self-hosted (Community Edition) é gratuito mas exige 4 a 8 GB de RAM e operação ativa. SaaS Premium é US$29\u002Fusuário\u002Fmês — caro pra time grande.",[12,7563,7564,7567],{},[27,7565,7566],{},"Drone\u002FWoodpecker"," auto-hospedado é a opção pra reduzir custo a zero variável. Um servidor de R$30 a R$80\u002Fmês roda CI pra cinco a dez projetos. Custa em ops: você opera os runners.",[12,7569,7570],{},"Pra startup BR pequena no GitHub, comece no plano gratuito do Actions. Quando passar de US$30\u002Fmês, considere Woodpecker self-hosted. Pra empresa que valoriza CI + issue tracker + registro num produto só, GitLab self-hosted.",[12,7572,7573],{},"━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━",[19,7575,7577],{"id":7576},"por-que-essa-decisao-importa-mais-do-que-parece","Por que essa decisão importa mais do que parece?",[12,7579,7580],{},"CI\u002FCD é a infraestrutura mais usada de qualquer time de produto: cada commit toca o sistema, cada PR depende dele, cada deploy passa por ele. Uma escolha errada não te quebra no primeiro mês — te quebra no terceiro ano, quando migrar custa quatro semanas de duas pessoas e você paga isso enquanto o roadmap fica parado.",[12,7582,7583],{},"Os três sintomas que indicam que a escolha foi errada:",[67,7585,7586,7592,7602],{},[70,7587,7588,7591],{},[27,7589,7590],{},"A fatura cresce mais rápido do que o time."," Se o custo de CI dobra a cada seis meses sem que o volume de deploys justifique, o pricing model não é o seu.",[70,7593,7594,7597,7598,7601],{},[27,7595,7596],{},"Os workflows viram cópias-cola."," Se cada novo projeto começa com ",[231,7599,7600],{},"cp -r .github\u002Fworkflows\u002F",", a ferramenta não tem composição decente.",[70,7603,7604,7607],{},[27,7605,7606],{},"Falhas no CI levam mais de uma hora pra debugar."," Se reproduzir o erro local exige rodar uma imagem Docker que ninguém sabe montar, o build não é portável.",[12,7609,7610],{},"Os três competidores principais resolvem esses sintomas de formas diferentes. Vamos por partes.",[19,7612,7614],{"id":7613},"github-actions-o-padrao-de-fato-vale-o-preco","GitHub Actions: o padrão de fato — vale o preço?",[12,7616,7617,7618,7621],{},"Se o seu código está no GitHub, Actions tem uma vantagem estrutural que não dá pra ignorar: zero atrito de integração. Você cria ",[231,7619,7620],{},".github\u002Fworkflows\u002Fci.yml",", faz push, e está rodando. Sem cadastro separado, sem token cruzado, sem webhook pra configurar.",[368,7623,7625],{"id":7624},"o-que-actions-faz-bem","O que Actions faz bem",[2735,7627,7628,7634,7640,7646,7652],{},[70,7629,7630,7633],{},[27,7631,7632],{},"Marketplace gigante."," Mais de dez mil ações prontas para tarefas comuns: setup de Node, Python, Go; deploy pra AWS, GCP, Azure; assinatura de imagens; scanning de segurança. A maioria é mantida pelo próprio fornecedor da tecnologia (HashiCorp publica a sua, AWS publica a sua, etc).",[70,7635,7636,7639],{},[27,7637,7638],{},"Matrix builds."," Rodar a mesma suite contra cinco versões de Node ou três sistemas operacionais é uma chave em três linhas.",[70,7641,7642,7645],{},[27,7643,7644],{},"Reusable workflows."," Desde 2021 dá pra extrair workflows compartilhados entre repos da mesma organização — soluciona o problema de \"cópia-cola entre projetos\" pra times médios.",[70,7647,7648,7651],{},[27,7649,7650],{},"Deployment protection rules."," Approvals manuais, janelas de horário, restrição por branch — tudo configurável sem plugin.",[70,7653,7654,7657],{},[27,7655,7656],{},"Self-hosted runners."," Você pode rodar o agente em sua própria infra e usar a UI do Actions só como orquestrador. Resolve o problema de minutos pra times com volume alto.",[368,7659,7661],{"id":7660},"o-que-actions-cobra-caro","O que Actions cobra caro",[12,7663,7664],{},"O modelo de cobrança é por minuto, e os números importam:",[119,7666,7667,7676],{},[122,7668,7669],{},[125,7670,7671,7674],{},[128,7672,7673],{},"Tipo de runner",[128,7675,136],{},[141,7677,7678,7686,7694,7702],{},[125,7679,7680,7683],{},[146,7681,7682],{},"Linux 2 vCPU (padrão)",[146,7684,7685],{},"US$0,008\u002Fmin (R$0,04)",[125,7687,7688,7691],{},[146,7689,7690],{},"Windows 2 vCPU",[146,7692,7693],{},"US$0,016\u002Fmin (R$0,08)",[125,7695,7696,7699],{},[146,7697,7698],{},"macOS (necessário pra builds iOS)",[146,7700,7701],{},"US$0,08\u002Fmin (R$0,40)",[125,7703,7704,7707],{},[146,7705,7706],{},"Larger Linux (4 vCPU+)",[146,7708,7709],{},"US$0,016\u002Fmin e acima",[12,7711,7712],{},"Pra uma startup no GitHub com cinco devs e workflow razoável (build + teste + lint em cada PR), o consumo típico é 800 a 2500 minutos\u002Fmês em Linux. Isso dá US$6 a US$20\u002Fmês — ou seja, entre R$30 e R$100. Cabe na linha de \"ferramentas de dev\" sem dor.",[12,7714,7715],{},"Quando dói: workflows pesados (E2E com Playwright, builds Rust, testes que sobem Postgres + Redis em cada job) facilmente passam de 10 mil minutos\u002Fmês. A US$0,008\u002Fmin isso vira US$80\u002Fmês — R$400. Multiplique por 12 e você está pagando R$5 mil\u002Fano em CI.",[12,7717,7718],{},"Builds macOS são o pior caso: US$0,40\u002Fmin é dez vezes mais que Linux. Times que mantém apps iOS gastam três a quatro vezes mais em CI do que em infra de produção.",[368,7720,7722],{"id":7721},"self-hosted-runners-do-actions-resolvem","Self-hosted runners do Actions resolvem?",[12,7724,7725],{},"Parcialmente. Você roda o binário do runner em uma máquina sua, registra no repo ou na organização, e os jobs vão pra lá em vez do pool gerenciado. Custo de minuto vai pra zero — você paga só a máquina.",[12,7727,7728],{},"Mas três pegadinhas:",[67,7730,7731,7737,7743],{},[70,7732,7733,7736],{},[27,7734,7735],{},"Manutenção do runner."," A versão atualiza com frequência; runners desatualizados começam a falhar silenciosamente. Sem automação, vira tarefa de operação manual.",[70,7738,7739,7742],{},[27,7740,7741],{},"Scaling manual."," Se o time tem cinco devs abrindo 20 PRs simultâneos, um runner serializa tudo. Você precisa de N runners — e provisionar\u002Fdesprovisionar conforme demanda exige tooling adicional.",[70,7744,7745,7748],{},[27,7746,7747],{},"Segurança em repos públicos."," Self-hosted runners em repo público são uma porta aberta pra qualquer fork malicioso rodar código arbitrário na sua máquina. Sempre restrito a repos privados ou organização confiável.",[12,7750,7751],{},"A solução madura é Actions Runner Controller (ARC): um operador que sobe runners on-demand num cluster Kubernetes ou similar. Resolve scaling, mas adiciona uma camada inteira de infraestrutura — não é trivial.",[19,7753,7755],{"id":7754},"gitlab-ci-o-competidor-pesado-ainda-faz-sentido","GitLab CI: o competidor \"pesado\" ainda faz sentido?",[12,7757,7758],{},"GitLab CI é mais antigo do que Actions, mais completo em features, e menos popular fora dos times que já estão na plataforma GitLab. A pergunta correta não é \"GitLab CI é melhor que Actions?\", é \"vale a pena migrar pra GitLab pra usar GitLab CI?\"",[368,7760,7762],{"id":7761},"o-que-gitlab-ci-faz-melhor","O que GitLab CI faz melhor",[2735,7764,7765,7775,7781,7787,7793],{},[70,7766,7767,7770,7771,7774],{},[27,7768,7769],{},"Grafo de dependências (DAG)."," Nativo, sem tooling externo. Você declara ",[231,7772,7773],{},"needs: [job_a, job_b]"," e os jobs rodam em paralelo respeitando dependências. Pra workflows com 30+ jobs (monorepo grande, várias linguagens, deploy multi-ambiente), isso é a diferença entre 8 minutos e 25 minutos por pipeline.",[70,7776,7777,7780],{},[27,7778,7779],{},"Parent-child pipelines."," Pipeline grande pode disparar pipelines filhos com lógica condicional — útil pra monorepo onde só serviços alterados precisam buildar.",[70,7782,7783,7786],{},[27,7784,7785],{},"Registro de imagens incluído."," Cada projeto vem com um registro de container privado nativo. Sem configurar segredos pra Amazon ECR, Docker Hub ou similar.",[70,7788,7789,7792],{},[27,7790,7791],{},"Pages, security scanning, code quality, dependency scanning"," — tudo embutido na plataforma. Em Actions cada um é uma ação separada do marketplace.",[70,7794,7795,7798],{},[27,7796,7797],{},"Merge request integration profundo."," Pipelines aparecem dentro do MR com diff de cobertura, comparação de bundle size, comparação de tempo de build. Em Actions os checks aparecem como links — em GitLab são dados estruturados.",[368,7800,7802],{"id":7801},"onde-gitlab-ci-cobra-caro","Onde GitLab CI cobra caro",[12,7804,7805],{},"Duas dimensões.",[12,7807,7808],{},[27,7809,7810],{},"Pricing SaaS:",[119,7812,7813,7825],{},[122,7814,7815],{},[125,7816,7817,7820,7822],{},[128,7818,7819],{},"Plano",[128,7821,136],{},[128,7823,7824],{},"Limite mensal de minutos",[141,7826,7827,7838,7849],{},[125,7828,7829,7832,7835],{},[146,7830,7831],{},"Free",[146,7833,7834],{},"US$0\u002Fusuário",[146,7836,7837],{},"400 minutos",[125,7839,7840,7843,7846],{},[146,7841,7842],{},"Premium",[146,7844,7845],{},"US$29\u002Fusuário\u002Fmês (R$145)",[146,7847,7848],{},"10.000 minutos",[125,7850,7851,7854,7857],{},[146,7852,7853],{},"Ultimate",[146,7855,7856],{},"US$99\u002Fusuário\u002Fmês (R$495)",[146,7858,7859],{},"50.000 minutos",[12,7861,7862],{},"Pra time de cinco devs no Premium, são US$145\u002Fmês — R$725. Esse é só o ticket de entrada; minutos extras custam à parte. Pra time de 20, US$580\u002Fmês = R$2.900 só em assinatura.",[12,7864,7865,7868],{},[27,7866,7867],{},"Self-hosted Community Edition"," é gratuito e remove esse custo de licença — mas:",[2735,7870,7871,7874,7877,7880],{},[70,7872,7873],{},"Mínimo realista: 4 vCPU, 8 GB RAM (16 GB se vai usar registro + pages + scanning).",[70,7875,7876],{},"VPS adequado no Brasil: R$120 a R$250\u002Fmês.",[70,7878,7879],{},"Ops: 2 a 4 horas\u002Fmês em atualização, backup, monitoração.",[70,7881,7882],{},"Atualizações mensais. GitLab tem cadência rígida; ficar três versões atrás abre brechas de segurança documentadas.",[12,7884,7885],{},"Em produção real, self-hosted GitLab dá menos trabalho do que Kubernetes mas mais do que Actions SaaS. É um servidor real que você opera.",[19,7887,7889],{"id":7888},"drone-ci-e-woodpecker-a-alternativa-minimalista","Drone CI e Woodpecker: a alternativa minimalista",[12,7891,7892],{},"Drone CI nasceu em 2014 como o \"CI nativo de container\": cada step do pipeline é um container, sem mágica. Em 2020 a empresa por trás (Drone Inc.) foi adquirida pela Harness, e o produto ganhou uma versão Cloud comercial. O fork comunitário Woodpecker continua 100% open-source, com API compatível com Drone.",[368,7894,7896],{"id":7895},"o-que-dronewoodpecker-fazem-bem","O que Drone\u002FWoodpecker fazem bem",[2735,7898,7899,7908,7922,7928,7934],{},[70,7900,7901,7904,7905,7907],{},[27,7902,7903],{},"YAML simples."," Cada step declara uma imagem e um comando. Sem DSL, sem actions reutilizáveis com semântica própria. O que você executa localmente com ",[231,7906,2406],{}," é o que executa no CI.",[70,7909,7910,7913,7914,7917,7918,7921],{},[27,7911,7912],{},"Container-native."," Não há \"executor\" Java, não há agente Python rodando steps. Cada step é um container isolado. Reproduzir o erro localmente é literal: copia o ",[231,7915,7916],{},"image:"," e o ",[231,7919,7920],{},"commands:"," do YAML e roda no terminal.",[70,7923,7924,7927],{},[27,7925,7926],{},"Self-hosted desde o dia um."," Não há \"Drone Cloud grátis\" pulling features pra versão paga. O servidor + os runners são o produto inteiro.",[70,7929,7930,7933],{},[27,7931,7932],{},"Plugins via container."," Cada plugin (deploy SSH, Slack, Docker push, AWS) é uma imagem publicada. Versionado igual a qualquer outra dependência.",[70,7935,7936,7939],{},[27,7937,7938],{},"Suporta múltiplos hosts de código."," GitHub, GitLab, Bitbucket, Gitea, Forgejo — tudo no mesmo servidor de Drone.",[368,7941,7943],{"id":7942},"onde-dronewoodpecker-cobram","Onde Drone\u002FWoodpecker cobram",[2735,7945,7946,7952,7958,7964],{},[70,7947,7948,7951],{},[27,7949,7950],{},"Comunidade menor."," Quando você bate em um bug obscuro, o Stack Overflow tem cinco respostas, não cinquenta. Github issues são sua principal fonte.",[70,7953,7954,7957],{},[27,7955,7956],{},"Operação não trivial em escala."," Um servidor + um runner é fácil. Cinco runners autoescalando atrás de uma fila é tooling que você monta — auto-scaling não é built-in.",[70,7959,7960,7963],{},[27,7961,7962],{},"Drone Cloud é pago."," Se você quer SaaS, vai pra Harness; o tier grátis é limitado. Por isso a recomendação é sempre self-hosted.",[70,7965,7966,7969],{},[27,7967,7968],{},"Documentação modesta."," Cobre o caminho feliz; casos de borda você descobre lendo código.",[368,7971,7973],{"id":7972},"por-que-woodpecker-em-vez-de-drone-em-2026","Por que Woodpecker em vez de Drone em 2026",[12,7975,7976],{},"Drone vanilla ainda funciona, mas a Harness tem priorizado a versão cloud comercial. Woodpecker é o fork comunitário do Drone original — 100% open-source, sem versão paga puxando features, releases mensais ativas, comunidade engajada. API e YAML compatíveis com Drone, então migração é trivial: troca a URL do servidor.",[12,7978,7979,7980,7983],{},"Pra qualquer time pequeno auto-hospedando em 2026, ",[27,7981,7982],{},"Woodpecker é a escolha melhor que Drone vanilla",". Mesma arquitetura, sem o overhead de uma empresa controlando o roadmap.",[19,7985,7987],{"id":7986},"qual-mais-barato-em-2026","Qual mais barato em 2026?",[12,7989,7990],{},"Custo total mensal real, considerando time de cinco devs com volume médio (300 builds\u002Fmês, builds de 8 minutos médios em Linux):",[119,7992,7993,8009],{},[122,7994,7995],{},[125,7996,7997,8000,8003,8006],{},[128,7998,7999],{},"Opção",[128,8001,8002],{},"Custo fixo",[128,8004,8005],{},"Custo variável",[128,8007,8008],{},"Total estimado\u002Fmês",[141,8010,8011,8026,8039,8053,8067,8081,8095],{},[125,8012,8013,8016,8019,8022],{},[146,8014,8015],{},"Woodpecker self-hosted (VPS R$80)",[146,8017,8018],{},"R$80",[146,8020,8021],{},"R$0",[146,8023,8024],{},[27,8025,8018],{},[125,8027,8028,8031,8033,8035],{},[146,8029,8030],{},"Actions repos públicos (open-source)",[146,8032,8021],{},[146,8034,8021],{},[146,8036,8037],{},[27,8038,8021],{},[125,8040,8041,8044,8046,8049],{},[146,8042,8043],{},"Actions repos privados (free tier 2000 min)",[146,8045,8021],{},[146,8047,8048],{},"R$0 a R$50",[146,8050,8051],{},[27,8052,8048],{},[125,8054,8055,8058,8060,8063],{},[146,8056,8057],{},"Actions Linux pago (volume médio)",[146,8059,8021],{},[146,8061,8062],{},"R$50 a R$150",[146,8064,8065],{},[27,8066,8062],{},[125,8068,8069,8072,8075,8077],{},[146,8070,8071],{},"GitLab CI self-hosted (VPS R$200)",[146,8073,8074],{},"R$200",[146,8076,8021],{},[146,8078,8079],{},[27,8080,8074],{},[125,8082,8083,8086,8088,8091],{},[146,8084,8085],{},"Actions com builds macOS pesados",[146,8087,8021],{},[146,8089,8090],{},"R$300 a R$1.500",[146,8092,8093],{},[27,8094,8090],{},[125,8096,8097,8100,8103,8106],{},[146,8098,8099],{},"GitLab CI SaaS Premium (5 devs)",[146,8101,8102],{},"R$725",[146,8104,8105],{},"R$0 a R$200",[146,8107,8108],{},[27,8109,8110],{},"R$725 a R$925",[12,8112,8113,8114,8117],{},"Vencedor absoluto em custo: ",[27,8115,8116],{},"Woodpecker self-hosted"," pra time disposto a operar uma VPS. Custa o mesmo que um almoço por mês e roda CI pra dez projetos sem sentir.",[12,8119,8120],{},"Se ops não está disponível, Actions plano gratuito é a próxima opção. Ele cabe num time pequeno com workflows leves; quando passa de US$30\u002Fmês variável, vale a pena pelo menos avaliar runners self-hosted.",[19,8122,8124],{"id":8123},"qual-tem-melhor-experiencia-de-desenvolvedor","Qual tem melhor experiência de desenvolvedor?",[12,8126,8127],{},"DX em CI\u002FCD se mede em três dimensões: tempo do \"yml em branco\" até o \"primeiro build passando\", capacidade de debug quando dá errado, e capacidade de evoluir o workflow quando ele cresce.",[119,8129,8130,8140],{},[122,8131,8132],{},[125,8133,8134,8137],{},[128,8135,8136],{},"Dimensão",[128,8138,8139],{},"Vencedor",[141,8141,8142,8150,8158,8166,8174,8182],{},[125,8143,8144,8147],{},[146,8145,8146],{},"Templates prontos \u002F acessibilidade",[146,8148,8149],{},"GitHub Actions (marketplace + onboarding)",[125,8151,8152,8155],{},[146,8153,8154],{},"Workflows complexos \u002F DAG \u002F monorepo",[146,8156,8157],{},"GitLab CI (parent-child + needs nativo)",[125,8159,8160,8163],{},[146,8161,8162],{},"Reprodução local \u002F simplicidade conceitual",[146,8164,8165],{},"Drone\u002FWoodpecker (cada step = container)",[125,8167,8168,8171],{},[146,8169,8170],{},"Debug de falha intermitente",[146,8172,8173],{},"Drone\u002FWoodpecker (re-rodar step isolado é trivial)",[125,8175,8176,8179],{},[146,8177,8178],{},"Composição entre projetos",[146,8180,8181],{},"GitHub Actions (reusable workflows + composite actions)",[125,8183,8184,8187],{},[146,8185,8186],{},"Time-to-first-pipeline (zero pra hello world)",[146,8188,7554],{},[12,8190,8191],{},"Não há vencedor absoluto. Pra time que valoriza começar rápido, Actions. Pra time que tem workflow complexo desde o dia um (monorepo, várias linguagens), GitLab CI. Pra time que quer entender exatamente o que está acontecendo, Drone\u002FWoodpecker.",[12,8193,7573],{},[19,8195,8197],{"id":8196},"tabela-comparativa-12-criterios-honestos","Tabela comparativa: 12 critérios honestos",[119,8199,8200,8212],{},[122,8201,8202],{},[125,8203,8204,8206,8208,8210],{},[128,8205,2983],{},[128,8207,7554],{},[128,8209,7560],{},[128,8211,7566],{},[141,8213,8214,8227,8241,8255,8269,8283,8297,8311,8325,8338,8350,8364],{},[125,8215,8216,8219,8222,8225],{},[146,8217,8218],{},"Custo mensal startup BR (5 devs, volume médio)",[146,8220,8221],{},"R$0 a R$150",[146,8223,8224],{},"R$80 a R$925",[146,8226,8018],{},[125,8228,8229,8232,8235,8238],{},[146,8230,8231],{},"Free tier real (2026)",[146,8233,8234],{},"2000 min\u002Fmês privados, ilimitado público",[146,8236,8237],{},"400 min\u002Fmês SaaS",[146,8239,8240],{},"Ilimitado self-hosted",[125,8242,8243,8246,8249,8252],{},[146,8244,8245],{},"Self-hosted disponível",[146,8247,8248],{},"Sim (runners), SaaS UI",[146,8250,8251],{},"Sim (CE completa)",[146,8253,8254],{},"Sim (é a única forma sensata)",[125,8256,8257,8260,8263,8266],{},[146,8258,8259],{},"Complexidade de workflow grande",[146,8261,8262],{},"Boa (reusable workflows)",[146,8264,8265],{},"Excelente (DAG + parent-child)",[146,8267,8268],{},"Modesta (linear + matrix)",[125,8270,8271,8274,8277,8280],{},[146,8272,8273],{},"Suporte a monorepo",[146,8275,8276],{},"Médio (paths filter)",[146,8278,8279],{},"Excelente (rules + parent-child)",[146,8281,8282],{},"Médio (when filter)",[125,8284,8285,8288,8291,8294],{},[146,8286,8287],{},"Registro de containers integrado",[146,8289,8290],{},"Não (precisa GHCR à parte)",[146,8292,8293],{},"Sim, nativo",[146,8295,8296],{},"Não (use registro externo)",[125,8298,8299,8302,8305,8308],{},[146,8300,8301],{},"Gestão de segredos",[146,8303,8304],{},"Repo + org + environment",[146,8306,8307],{},"Project + group + instance",[146,8309,8310],{},"Server + repo",[125,8312,8313,8316,8319,8322],{},[146,8314,8315],{},"Jobs paralelos out-of-box",[146,8317,8318],{},"Sim (matrix)",[146,8320,8321],{},"Sim (parallel + DAG)",[146,8323,8324],{},"Sim (depends_on)",[125,8326,8327,8330,8332,8335],{},[146,8328,8329],{},"Comunidade BR \u002F material em português",[146,8331,4916],{},[146,8333,8334],{},"Médio",[146,8336,8337],{},"Pequeno",[125,8339,8340,8342,8345,8347],{},[146,8341,4896],{},[146,8343,8344],{},"Parcial (oficial em inglês)",[146,8346,3140],{},[146,8348,8349],{},"Praticamente zero",[125,8351,8352,8355,8358,8361],{},[146,8353,8354],{},"Integração com GitHub\u002FGitLab\u002FGitea",[146,8356,8357],{},"Só GitHub",[146,8359,8360],{},"Só GitLab (mirror externo é workaround)",[146,8362,8363],{},"Todos os três + Bitbucket",[125,8365,8366,8369,8372,8375],{},[146,8367,8368],{},"Faixa ideal de uso",[146,8370,8371],{},"1 a 50 devs no GitHub",[146,8373,8374],{},"5 a 500 devs em uma plataforma só",[146,8376,8377],{},"1 a 30 devs com ops disponível",[12,8379,8380],{},"Nenhum competidor tem coluna sem ressalva. A ferramenta certa depende do perfil do time.",[19,8382,8384],{"id":8383},"decisao-por-perfil-de-time","Decisão por perfil de time",[12,8386,8387],{},"Quatro recomendações concretas, sem \"depende\".",[368,8389,8391],{"id":8390},"indie-hacker-ou-repo-publico-no-github","Indie hacker ou repo público no GitHub",[12,8393,8394,8397],{},[27,8395,8396],{},"Use GitHub Actions plano gratuito."," Repos públicos têm minutos ilimitados. Você não tem motivo pra procurar alternativa. Se daqui a um ano o projeto crescer, você reavalia.",[368,8399,8401],{"id":8400},"startup-early-no-github-repos-privados-r10k-a-r50k-mrr","Startup early no GitHub, repos privados, R$10k a R$50k MRR",[12,8403,8404,8407],{},[27,8405,8406],{},"Continue no Actions plano gratuito."," O free tier de 2000 minutos cabe em um time de dois a três devs com workflows razoáveis. Quando começar a passar disso, primeiro reduza desperdício (paths filter pra não rodar tudo em todo PR, cache de dependências decente) antes de migrar.",[12,8409,8410],{},"Se passar consistentemente de US$30\u002Fmês variável, considere migrar pra runners self-hosted ou Woodpecker em paralelo.",[368,8412,8414],{"id":8413},"startup-com-r50k-a-r200k-mrr-no-github-volume-ci-alto","Startup com R$50k a R$200k MRR no GitHub, volume CI alto",[12,8416,8417,8420],{},[27,8418,8419],{},"Híbrido."," Use Actions pra workflows leves (lint, testes unitários) e self-hosted runners (via ARC) ou Woodpecker pra workflows pesados (E2E, builds longos, deploys). Você paga por minuto onde compensa e zero onde dói.",[12,8422,8423],{},"Pra times com builds macOS regulares, considere uma máquina Mac mini dedicada como self-hosted runner. Investimento de R$10 mil paga em três meses se você gasta US$200\u002Fmês em macOS Actions hoje.",[368,8425,8427],{"id":8426},"empresa-br-no-gitlab-self-hosted","Empresa BR no GitLab self-hosted",[12,8429,8430,8433],{},[27,8431,8432],{},"Use GitLab CI nativo."," Você já está pagando o custo de operar GitLab; CI vem junto sem custo adicional. Migrar pra outra ferramenta significaria operar dois sistemas em paralelo — não vale.",[368,8435,8437],{"id":8436},"time-pequeno-controlando-custo-agressivamente","Time pequeno controlando custo agressivamente",[12,8439,8440,8443],{},[27,8441,8442],{},"Woodpecker self-hosted em VPS R$80."," Roda CI pra dez projetos sem suar. Custa em ops 1 a 2 horas\u002Fmês. Se o time tem alguém com afinidade por ferramentas Unix, é a opção mais econômica e mais previsível em conta — você sabe exatamente o custo todo mês.",[19,8445,8447],{"id":8446},"onde-heroctl-entra-como-infraestrutura-pra-runners","Onde HeroCtl entra como infraestrutura pra runners",[12,8449,8450],{},"Self-hosted CI\u002FCD é exatamente o tipo de carga de trabalho que o HeroCtl orquestra bem: serviços longos (servidor de CI, banco que mantém histórico de builds), serviços que escalam horizontalmente (runners que sobem e descem com a fila), serviços com necessidade de persistência (cache de artefatos).",[12,8452,8453],{},"Em vez de operar Docker Compose num servidor único — single point of failure — você descreve o setup como uma configuração de jobs:",[2735,8455,8456,8462,8468,8474],{},[70,8457,8458,8461],{},[27,8459,8460],{},"Servidor de Drone\u002FWoodpecker como job longo",", com replica única e volume persistente pro banco de histórico.",[70,8463,8464,8467],{},[27,8465,8466],{},"N runners como job replicável",", escalando horizontalmente. O orquestrador distribui os runners entre nós; se um servidor morre, os runners migram pros outros.",[70,8469,8470,8473],{},[27,8471,8472],{},"Backup integrado"," pro estado do CI (banco do servidor + cache de artefatos), sem montar tooling externo.",[70,8475,8476,8479],{},[27,8477,8478],{},"Métricas e logs integrados"," — você vê uso de CPU, memória, tempo de build sem subir um stack de observabilidade separado.",[12,8481,8482,8483,2630,8486,8489],{},"A diferença prática: em vez de operar um stack de CI em paralelo ao seu cluster de produção, ele vira parte do mesmo cluster, com as mesmas garantias de alta disponibilidade. Se um servidor cai, os runners migram. Se você quer dobrar capacidade pra uma sprint pesada, é mudar ",[231,8484,8485],{},"replicas: 4",[231,8487,8488],{},"replicas: 8"," no arquivo de configuração.",[12,8491,8492],{},"Pra quem está na fronteira \"começo simples mas vou crescer\", isso resolve a transição sem precisar trocar de ferramenta no meio do caminho.",[19,8494,8496],{"id":8495},"os-4-erros-caros-em-cicd-self-hosted-e-como-evita-los","Os 4 erros caros em CI\u002FCD self-hosted (e como evitá-los)",[368,8498,8500],{"id":8499},"erro-1-cache-stale-silencioso","Erro 1: cache stale silencioso",[12,8502,8503],{},"O sintoma: build passa local, falha no CI por causa de uma dependência que existe na máquina do dev mas não na imagem fresca. Pior caso: passa no CI também porque cache anterior contém a dependência, mas falha em produção quando a imagem é construída sem cache.",[12,8505,8506,8507,571,8510,571,8513,571,8516,8519],{},"A correção: cache decente assume que pode ser invalidado a qualquer momento. Sempre que mudar arquivos de manifesto de dependências (",[231,8508,8509],{},"package.json",[231,8511,8512],{},"go.mod",[231,8514,8515],{},"requirements.txt",[231,8517,8518],{},"Cargo.toml","), incluí-los na chave de cache. Periodicamente (semanal), forçar build sem cache pra detectar drift.",[368,8521,8523],{"id":8522},"erro-2-secret-commitado-por-acidente","Erro 2: secret commitado por acidente",[12,8525,8526],{},"O sintoma: alguém colou um token na configuração de CI \"só pra testar\", commitou, esqueceu. O repo é público; em 12 horas o token está em uso por quem não devia.",[12,8528,8529,8530,8533,8534,8537],{},"A correção: dois mecanismos em camadas. ",[27,8531,8532],{},"Pre-commit hook"," que escaneia padrões de chaves comuns (AWS, Stripe, GitHub PAT). ",[27,8535,8536],{},"Rotação automática"," de tokens críticos (90 dias máximo). Se um token vazar, a janela de exposição é finita.",[12,8539,8540],{},"Em GitLab CI, use variables com flag \"masked\" e \"protected\". Em Actions, use environment-scoped secrets com approval rules. Em Drone\u002FWoodpecker, segredos são escopados por repo e nunca aparecem em logs por padrão.",[368,8542,8544],{"id":8543},"erro-3-runner-rodando-no-mesmo-servidor-de-producao","Erro 3: runner rodando no mesmo servidor de produção",[12,8546,8547],{},"O sintoma: build pesado consome CPU\u002FRAM, produção fica lenta, latência sobe, alarme dispara, on-call acorda. Caso real comum em times pequenos que tentam economizar máquina.",[12,8549,8550],{},"A correção: runners em servidor separado de produção, sempre. Se o orçamento aperta, runner em VPS de R$30\u002Fmês ainda é mais barato do que um incidente de produção em horário comercial.",[368,8552,8554],{"id":8553},"erro-4-workflow-que-nao-roda-fora-do-ci","Erro 4: workflow que não roda fora do CI",[12,8556,8557],{},"O sintoma: o build do CI é um script de 200 linhas inline no YAML, com 15 variáveis de ambiente que o sistema injeta. Quando algo dá errado, ninguém consegue reproduzir local sem fazer engenharia reversa do YAML.",[12,8559,8560,8561,571,8564,8567,8568,8571,8572,8575],{},"A correção: o CI deve chamar comandos que existem como ",[231,8562,8563],{},"Makefile",[231,8565,8566],{},"script\u002Fbuild",", ou ",[231,8569,8570],{},"package.json scripts",". O YAML do CI orquestra; a lógica vive em scripts versionados que rodam em qualquer terminal. Se você não consegue rodar ",[231,8573,8574],{},"make ci"," localmente e ver o mesmo resultado, o seu CI não é portável.",[12,8577,8578],{},"Drone\u002FWoodpecker força essa disciplina por design (cada step é um container). Actions e GitLab CI permitem o anti-padrão; cabe ao time evitar.",[19,8580,4244],{"id":4243},[12,8582,8583],{},[27,8584,8585],{},"GitHub Actions é mais rápido que Drone?",[12,8587,8588],{},"Em build cru, depende do runner: o pool gerenciado do Actions usa máquinas de 2 vCPU; um runner self-hosted em uma máquina de 4 vCPU é mais rápido. Em tempo total de pipeline (incluindo fila), Actions ganha quando há volume — eles têm capacidade ociosa enorme. Self-hosted (qualquer ferramenta) tem fila proporcional ao número de runners que você provisiona.",[12,8590,8591],{},[27,8592,8593],{},"Posso usar GitLab CI com repo no GitHub?",[12,8595,8596],{},"Tecnicamente sim, via \"pull mirror\" (GitLab espelha o GitHub e roda CI nele). Na prática é frágil: webhooks atrasam, status checks não voltam pro GitHub do jeito que o time espera, MRs ficam confusos. Não vale a pena. Se você está no GitHub, use Actions ou Drone\u002FWoodpecker (que aceitam GitHub como fonte nativa).",[12,8598,8599],{},[27,8600,8601],{},"Self-hosted runners do GitHub Actions valem a pena?",[12,8603,8604],{},"Pra repos privados com volume alto (mais de 5000 minutos\u002Fmês), sim. Você economiza minutos pagos em troca de operar máquinas. Pra repos públicos, não — risco de segurança (forks maliciosos rodando código na sua máquina) supera benefício. ARC (Actions Runner Controller) ajuda em escala, mas adiciona uma camada de Kubernetes; só faz sentido pra times que já operam K8s.",[12,8606,8607],{},[27,8608,8609],{},"Woodpecker é estável o suficiente em 2026?",[12,8611,8612],{},"Sim. Releases mensais, base de código sólida (forkado de Drone, que tinha cinco anos de produção), comunidade ativa. Em produção em centenas de empresas pequenas e médias. Não é a aposta segura \"ninguém é demitido por escolher\" — essa é Actions ou GitLab — mas em três anos de fork não houve incidente comunitário grave. Pra time pequeno self-hosted, é a escolha sensata.",[12,8614,8615],{},[27,8616,8617],{},"ArgoCD e FluxCD entram nessa decisão?",[12,8619,8620],{},"Não diretamente. ArgoCD\u002FFluxCD são ferramentas de GitOps pra Kubernetes, não CI. Eles assistem um repo Git e aplicam mudanças em cluster. CI continua sendo Actions\u002FGitLab\u002FDrone gerando imagens; ArgoCD\u002FFlux aplicam o deploy. Se você não está em Kubernetes, ArgoCD\u002FFlux não são pra você. Times em outros orquestradores fazem deploy direto do CI ou via APIs do orquestrador.",[12,8622,8623],{},[27,8624,8625],{},"Quantos runners simultâneos pra time de 5 devs?",[12,8627,8628],{},"Regra prática: um runner por dois desenvolvedores ativos, mais um runner extra pra builds longos não bloquear PRs rápidos. Time de cinco devs: três runners é confortável. Em horários de pico (release day), suba pra cinco temporariamente. Cada runner consome 1 a 2 GB de RAM em workload típica; um servidor de 8 GB roda quatro runners sem dor.",[12,8630,8631],{},[27,8632,8633],{},"Cache de dependências — qual ferramenta lida melhor?",[12,8635,8636,8637,8640],{},"GitLab CI tem cache nativo por chave\u002Fpath, integrado ao registro próprio. GitHub Actions tem ",[231,8638,8639],{},"actions\u002Fcache"," (gratuito, 10 GB por repo). Drone\u002FWoodpecker dependem de plugin de cache externo (S3, MinIO local) — mais setup mas mais flexível. Em volume moderado, todos resolvem; em volume alto (monorepo grande), GitLab tem vantagem por integração com o registro.",[12,8642,8643],{},[27,8644,8645],{},"Migrar de GitHub Actions pra Drone — quanto trabalho?",[12,8647,8648],{},"Pra workflows simples (build + teste + push), 1 a 2 dias. Pra workflows que dependem de muitas ações do marketplace, 1 a 2 semanas (precisa reescrever cada ação como container). A maior dor é segredos e ambientes — exporte e reimporte com cuidado. Recomendação: faça migração projeto a projeto, não tudo de uma vez.",[12,8650,8651],{},[27,8652,8653],{},"Posso rodar runners de Actions e Drone\u002FWoodpecker no mesmo servidor?",[12,8655,8656],{},"Tecnicamente sim, ambos são containers. Na prática, isolamento melhora: runners em servidores separados evitam que um build pesado afete o outro. Se o orçamento é apertado, dois servidores de R$40\u002Fmês são melhores que um de R$80\u002Fmês com tudo junto.",[12,8658,7573],{},[19,8660,8662],{"id":8661},"em-resumo","Em resumo",[12,8664,8665],{},"CI\u002FCD em 2026 não tem ferramenta vencedora. Tem perfis de uso e tradeoffs honestos:",[2735,8667,8668,8674,8680,8686,8692],{},[70,8669,8670,8673],{},[27,8671,8672],{},"Você está no GitHub e o volume é leve a médio?"," Actions, plano gratuito. Não procure problema onde não tem.",[70,8675,8676,8679],{},[27,8677,8678],{},"Você está no GitLab self-hosted?"," GitLab CI nativo. Já está pago.",[70,8681,8682,8685],{},[27,8683,8684],{},"Você quer custo previsível e tem 1-2h\u002Fmês de ops disponível?"," Woodpecker self-hosted em VPS R$80. A escolha mais econômica.",[70,8687,8688,8691],{},[27,8689,8690],{},"Você tem monorepo grande com workflow complexo?"," GitLab CI (DAG nativo) ou Actions com reusable workflows.",[70,8693,8694,8697],{},[27,8695,8696],{},"Você tem volume alto e dor de pricing de minutos?"," Híbrido: Actions pra workflows leves, runners self-hosted pra pesados.",[12,8699,8700],{},"Se você está pensando em rodar a ferramenta de CI como parte do mesmo cluster que serve produção — com alta disponibilidade real, métricas integradas e backup sem montar stack à parte — instale o HeroCtl em um servidor:",[224,8702,8704],{"className":8703,"code":2949,"language":2530},[2528],[231,8705,2949],{"__ignoreMap":229},[12,8707,8708],{},"A partir daí, descrever um servidor de Woodpecker com três runners auto-escaláveis é um arquivo de configuração de cinquenta linhas. O cluster cuida do resto: distribui os runners pelos nós, mantém o servidor disponível mesmo com perda de máquina, faz backup do estado, expõe métricas no painel embutido.",[12,8710,8711,8712,8714,8715,8719],{},"Pra quem quer mais contexto, vale ler também ",[3337,8713,3345],{"href":3344}," — discute quando faz sentido sair de docker-compose pra um plano de controle replicado, com os mesmos critérios honestos deste post. E pra times pensando em simplificar a stack de orquestração inteira, ",[3337,8716,8718],{"href":8717},"\u002Fblog\u002Fmigrar-de-kubernetes-pra-stack-mais-simples-case","Migrar de Kubernetes pra uma stack mais simples — case real"," tem números de uma migração real, com ganhos e dores.",[12,8721,8722,8723,8726],{},"A escolha de CI\u002FCD é uma das decisões mais duradouras do time. Vale alguns dias de comparação honesta antes de copiar o ",[231,8724,8725],{},".github\u002Fworkflows\u002F"," do projeto anterior — porque três anos depois, migrar custa caro.",{"title":229,"searchDepth":244,"depth":244,"links":8728},[8729,8730,8731,8736,8740,8745,8746,8747,8748,8755,8756,8762,8763],{"id":7533,"depth":244,"text":7534},{"id":7576,"depth":244,"text":7577},{"id":7613,"depth":244,"text":7614,"children":8732},[8733,8734,8735],{"id":7624,"depth":271,"text":7625},{"id":7660,"depth":271,"text":7661},{"id":7721,"depth":271,"text":7722},{"id":7754,"depth":244,"text":7755,"children":8737},[8738,8739],{"id":7761,"depth":271,"text":7762},{"id":7801,"depth":271,"text":7802},{"id":7888,"depth":244,"text":7889,"children":8741},[8742,8743,8744],{"id":7895,"depth":271,"text":7896},{"id":7942,"depth":271,"text":7943},{"id":7972,"depth":271,"text":7973},{"id":7986,"depth":244,"text":7987},{"id":8123,"depth":244,"text":8124},{"id":8196,"depth":244,"text":8197},{"id":8383,"depth":244,"text":8384,"children":8749},[8750,8751,8752,8753,8754],{"id":8390,"depth":271,"text":8391},{"id":8400,"depth":271,"text":8401},{"id":8413,"depth":271,"text":8414},{"id":8426,"depth":271,"text":8427},{"id":8436,"depth":271,"text":8437},{"id":8446,"depth":244,"text":8447},{"id":8495,"depth":244,"text":8496,"children":8757},[8758,8759,8760,8761],{"id":8499,"depth":271,"text":8500},{"id":8522,"depth":271,"text":8523},{"id":8543,"depth":271,"text":8544},{"id":8553,"depth":271,"text":8554},{"id":4243,"depth":244,"text":4244},{"id":8661,"depth":244,"text":8662},"comparativo","2026-05-15","GitHub Actions venceu mindshare mas tem custos de minutos. GitLab CI é mais completo mas pesa mais. Drone (e Woodpecker) auto-hospedado roda em VPS pequeno. Comparação prática.",{},"\u002Fblog\u002Fgithub-actions-vs-gitlab-ci-vs-drone-self-hosted","14 min",{"title":7518,"description":8766},{"loc":8768},"blog\u002Fgithub-actions-vs-gitlab-ci-vs-drone-self-hosted",[8774,8775,8776,8777,8764],"github-actions","gitlab-ci","drone","ci-cd","6HE70abQMrpxYtjVIHfg4cJABlHozxJVxg5Q13QBw0M",{"id":8780,"title":8781,"author":7,"body":8782,"category":3379,"cover":3380,"date":11779,"description":11780,"draft":3383,"extension":3384,"lastReviewed":3380,"meta":11781,"navigation":411,"path":11782,"readingTime":6388,"seo":11783,"sitemap":11784,"stem":11785,"tags":11786,"__hash__":11791},"blog_pt\u002Fblog\u002Fmonitoring-stack-completa-prometheus-grafana-loki-passo-a-passo.md","Monitoring stack completa em 2026: Prometheus + Grafana + Loki passo a passo",{"type":9,"value":8783,"toc":11759},[8784,8797,8800,8802,8809,8820,8823,8826,8830,8833,8871,8886,8890,8893,8926,8929,8933,8939,8942,8945,8972,8986,8990,8995,9002,9008,9015,9363,9382,9385,9423,9446,9450,9455,9461,9741,9751,9770,9774,9780,9783,9862,9882,9888,9926,9936,9940,9944,9950,10204,10207,10210,10397,10407,10414,10418,10423,10432,10438,10547,10554,10561,10581,10588,10592,10596,10599,10609,10947,10954,11172,11183,11197,11201,11205,11211,11234,11241,11245,11250,11253,11256,11289,11292,11324,11333,11344,11348,11351,11354,11380,11383,11387,11437,11440,11443,11447,11578,11581,11585,11588,11598,11608,11620,11626,11628,11634,11640,11646,11652,11661,11675,11681,11687,11691,11694,11722,11734,11737,11753,11756],[12,8785,8786,8787,571,8790,571,8793,8796],{},"A primeira vez que o seu site cair às três da manhã, você vai descobrir uma coisa desconfortável: não tem como saber o que aconteceu. Não tem gráfico de CPU, não tem log do contêiner que morreu, não tem alerta que avisou antes. Você vai abrir um terminal, conectar nos servidores um por um, rodar ",[231,8788,8789],{},"top",[231,8791,8792],{},"df",[231,8794,8795],{},"journalctl",", e tentar reconstituir uma cena de crime que já esfriou.",[12,8798,8799],{},"Esse post é o atalho pra você não passar por isso. Em quatro horas, com R$80 a R$120 por mês de hardware, dá pra montar a stack de observabilidade open-source que substitui Datadog, New Relic e CloudWatch em 95% dos casos pra startup. As ferramentas são as mesmas que rodam dentro de empresas com dezenas de milhares de servidores — e cabem confortavelmente num VPS pequeno pro time que está começando.",[19,8801,22],{"id":21},[12,8803,8804,8805,8808],{},"A stack de monitoring open-source padrão em 2026 — ",[27,8806,8807],{},"Prometheus + Grafana + Loki + Alertmanager"," — cabe em um único VPS de 4 GB de RAM e cobre métricas, logs centralizados, dashboards e alertas. Esse tutorial mostra setup passo a passo pra um cluster de 4 a 5 servidores em aproximadamente quatro horas, usando docker-compose ou job specs do orquestrador.",[12,8810,8811,8812,8815,8816,8819],{},"Pra startup brasileira, isso significa ",[27,8813,8814],{},"R$80 a R$120 por mês de hardware"," contra ",[27,8817,8818],{},"R$1.000 a R$2.000 por mês"," de SaaS de observabilidade equivalente. O custo de tempo é honesto: quatro horas de setup inicial mais duas a quatro horas por mês de manutenção contínua.",[12,8821,8822],{},"Resultado entregável ao final do tutorial: dashboards de CPU, RAM, disco, rede e métricas HTTP; logs pesquisáveis com retenção de 30 dias; alertas roteados pra Slack, Discord ou e-mail. Pré-requisitos: 1 VPS Linux com 4 GB de RAM e 50 GB de SSD, Docker instalado, e um domínio com DNS controlado por você.",[12,8824,8825],{},"A escolha entre rodar essa stack num VPS dedicado fora do cluster de produção ou como job dentro do próprio orquestrador é uma decisão arquitetural — cobrimos as duas opções no passo 8 e em \"Como rodar isso dentro do HeroCtl\".",[19,8827,8829],{"id":8828},"o-que-cada-componente-faz-em-uma-frase","O que cada componente faz, em uma frase",[12,8831,8832],{},"Antes de instalar qualquer coisa, vale entender o papel de cada peça. A stack tem seis componentes; a confusão geralmente vem de pensar que algum deles é \"o sistema de monitoring\". Não é. Cada um faz uma coisa.",[2735,8834,8835,8841,8847,8853,8859,8865],{},[70,8836,8837,8840],{},[27,8838,8839],{},"Prometheus"," é um banco de dados de séries temporais (TSDB) que coleta métricas via HTTP scrape — ele puxa os números, ninguém empurra. Retém 15 dias por padrão.",[70,8842,8843,8846],{},[27,8844,8845],{},"Grafana"," é a camada de visualização. Conecta em Prometheus, em Loki, em Postgres, em quase qualquer fonte estruturada, e desenha gráficos.",[70,8848,8849,8852],{},[27,8850,8851],{},"Loki"," é a peça de logs. Sintaxe similar ao Prometheus, indexa apenas labels (não o conteúdo dos logs), e por causa disso fica cerca de dez vezes mais barato que ELK pra rodar.",[70,8854,8855,8858],{},[27,8856,8857],{},"Promtail"," (ou o Grafana Agent, que está substituindo o Promtail em 2026) é o coletor que lê os arquivos de log de cada servidor e envia pro Loki.",[70,8860,8861,8864],{},[27,8862,8863],{},"node_exporter"," roda em cada nó monitorado e expõe um endpoint HTTP com CPU, RAM, disco e rede em formato Prometheus.",[70,8866,8867,8870],{},[27,8868,8869],{},"Alertmanager"," recebe regras de alerta do Prometheus e cuida do roteamento — Slack, e-mail, PagerDuty, webhook arbitrário.",[12,8872,8873,8874,571,8877,571,8880,571,8883,101],{},"Quem desenha a primeira stack costuma confundir Prometheus com \"monitoring\" e Grafana com \"dashboards bonitos\". A separação real é: ",[27,8875,8876],{},"Prometheus guarda números",[27,8878,8879],{},"Loki guarda texto",[27,8881,8882],{},"Grafana mostra ambos",[27,8884,8885],{},"Alertmanager grita quando algum número fica errado",[19,8887,8889],{"id":8888},"qual-e-a-arquitetura-recomendada","Qual é a arquitetura recomendada?",[12,8891,8892],{},"Pra um cluster de 3 a 5 servidores rodando aplicações de produção, a topologia que tem dado certo na prática é separar o servidor de observabilidade do resto. Um nó dedicado, fora do cluster que ele monitora, com dois objetivos: não morrer junto quando o cluster morrer, e não competir por CPU\u002FRAM com a aplicação real.",[2735,8894,8895,8901,8907,8917],{},[70,8896,8897,8900],{},[27,8898,8899],{},"1 servidor \"observability\" dedicado",", 4 GB de RAM, 50 GB de SSD. Roda Prometheus, Grafana, Loki, Alertmanager.",[70,8902,8903,8906],{},[27,8904,8905],{},"Cada servidor monitorado"," roda apenas dois processos leves: node_exporter (métricas de sistema) e Promtail (envio de logs).",[70,8908,8909,8912,8913,8916],{},[27,8910,8911],{},"As suas aplicações"," expõem um endpoint ",[231,8914,8915],{},"\u002Fmetrics"," em formato Prometheus. Se você usa um framework popular, existe um cliente pronto. Se não, é uma biblioteca de poucas dezenas de linhas.",[70,8918,8919,8921,8922,8925],{},[27,8920,8845],{}," fica acessível via subdomínio (",[231,8923,8924],{},"monitor.seudominio.com",") com TLS automático e autenticação básica em frente.",[12,8927,8928],{},"Essa separação tem um custo: você paga por mais um VPS. Em troca, quando o cluster principal cair, você ainda consegue olhar os gráficos pra entender o que aconteceu. Pra startup, esse trade-off compensa quase sempre — o pior cenário em monitoring é descobrir que a única coisa que parou junto com o site foi o sistema que ia te avisar que o site parou.",[19,8930,8932],{"id":8931},"passo-1-como-provisionar-o-vps-de-observabilidade","Passo 1 — Como provisionar o VPS de observabilidade?",[12,8934,8935,8936,101],{},"Tempo estimado: ",[27,8937,8938],{},"10 minutos",[12,8940,8941],{},"Qualquer provedor barato serve. Os dois com melhor custo-benefício pro caso brasileiro hoje são a Hetzner (CPX21 a 7,99 EUR por mês com 3 vCPUs e 4 GB de RAM, datacenter na Alemanha) e a DigitalOcean (Basic Droplet de US$24 por mês com a mesma configuração, datacenters mais próximos do Brasil). Pra workload de monitoring, latência de scrape em datacenter europeu não causa problema — Prometheus puxa a cada 15 segundos por padrão, então 200ms de RTT entre Hetzner e seus servidores não atrapalha.",[12,8943,8944],{},"Provisionando:",[67,8946,8947,8950,8953,8959,8966],{},[70,8948,8949],{},"Crie o VPS com Ubuntu 24.04 LTS ou Debian 12.",[70,8951,8952],{},"Adicione a sua chave SSH pública na criação. Desabilite login por senha.",[70,8954,8955,8956,101],{},"Instale Docker e o plugin de compose: ",[231,8957,8958],{},"curl -fsSL https:\u002F\u002Fget.docker.com | sh && apt install docker-compose-plugin",[70,8960,8961,8962,8965],{},"Configure o firewall: porta 22 (SSH) aberta, porta 443 (HTTPS) aberta, todas as outras fechadas. As portas internas (3000, 9090, 3100, 9093) só ficam acessíveis pelo ",[231,8963,8964],{},"localhost"," do próprio VPS — o reverse proxy expõe Grafana via 443.",[70,8967,8968,8969,8971],{},"Aponte o DNS: crie um registro A ",[231,8970,8924],{}," pra o IP do VPS.",[12,8973,341,8974,8977,8978,8981,8982,8985],{},[231,8975,8976],{},"docker --version"," retorna 26.x ou superior; ",[231,8979,8980],{},"dig monitor.seudominio.com"," retorna o IP correto; ",[231,8983,8984],{},"ssh root@monitor.seudominio.com"," conecta sem pedir senha.",[19,8987,8989],{"id":8988},"passo-2-como-subir-a-stack-via-docker-compose","Passo 2 — Como subir a stack via docker-compose?",[12,8991,8935,8992,101],{},[27,8993,8994],{},"45 minutos",[12,8996,8997,8998,9001],{},"Crie o diretório de trabalho em ",[231,8999,9000],{},"\u002Fopt\u002Fobservability\u002F"," com a seguinte estrutura:",[224,9003,9006],{"className":9004,"code":9005,"language":2530},[2528],"\u002Fopt\u002Fobservability\u002F\n├── docker-compose.yml\n├── prometheus\u002F\n│   ├── prometheus.yml\n│   └── alerts.yml\n├── alertmanager\u002F\n│   └── alertmanager.yml\n├── loki\u002F\n│   └── loki-config.yml\n└── grafana\u002F\n    └── provisioning\u002F\n        └── datasources\u002F\n            └── datasources.yml\n",[231,9007,9005],{"__ignoreMap":229},[12,9009,9010,9011,9014],{},"O ",[231,9012,9013],{},"docker-compose.yml"," abreviado mas funcional:",[224,9016,9020],{"className":9017,"code":9018,"language":9019,"meta":229,"style":229},"language-yaml shiki shiki-themes github-dark-default","services:\n  prometheus:\n    image: prom\u002Fprometheus:v2.55.0\n    volumes:\n      - .\u002Fprometheus:\u002Fetc\u002Fprometheus\n      - prometheus-data:\u002Fprometheus\n    command:\n      - '--config.file=\u002Fetc\u002Fprometheus\u002Fprometheus.yml'\n      - '--storage.tsdb.retention.time=30d'\n      - '--web.enable-lifecycle'  # permite reload via HTTP POST\n    ports:\n      - '127.0.0.1:9090:9090'\n    restart: unless-stopped\n\n  grafana:\n    image: grafana\u002Fgrafana:11.3.0\n    volumes:\n      - grafana-data:\u002Fvar\u002Flib\u002Fgrafana\n      - .\u002Fgrafana\u002Fprovisioning:\u002Fetc\u002Fgrafana\u002Fprovisioning\n    environment:\n      - GF_SECURITY_ADMIN_PASSWORD=${GRAFANA_PASSWORD}\n      - GF_USERS_ALLOW_SIGN_UP=false\n    ports:\n      - '127.0.0.1:3000:3000'\n    restart: unless-stopped\n\n  loki:\n    image: grafana\u002Floki:3.2.0\n    volumes:\n      - .\u002Floki\u002Floki-config.yml:\u002Fetc\u002Floki\u002Fconfig.yml\n      - loki-data:\u002Floki\n    command: -config.file=\u002Fetc\u002Floki\u002Fconfig.yml\n    ports:\n      - '127.0.0.1:3100:3100'\n    restart: unless-stopped\n\n  alertmanager:\n    image: prom\u002Falertmanager:v0.27.0\n    volumes:\n      - .\u002Falertmanager:\u002Fetc\u002Falertmanager\n    ports:\n      - '127.0.0.1:9093:9093'\n    restart: unless-stopped\n\nvolumes:\n  prometheus-data:\n  grafana-data:\n  loki-data:\n","yaml",[231,9021,9022,9031,9038,9048,9055,9063,9070,9077,9084,9091,9101,9108,9115,9125,9129,9136,9145,9151,9158,9165,9172,9179,9186,9192,9199,9207,9211,9218,9227,9233,9240,9247,9256,9262,9269,9277,9281,9288,9297,9303,9310,9316,9323,9331,9335,9342,9349,9356],{"__ignoreMap":229},[234,9023,9024,9028],{"class":236,"line":237},[234,9025,9027],{"class":9026},"sPWt5","services",[234,9029,9030],{"class":387},":\n",[234,9032,9033,9036],{"class":236,"line":244},[234,9034,9035],{"class":9026},"  prometheus",[234,9037,9030],{"class":387},[234,9039,9040,9043,9045],{"class":236,"line":271},[234,9041,9042],{"class":9026},"    image",[234,9044,6564],{"class":387},[234,9046,9047],{"class":255},"prom\u002Fprometheus:v2.55.0\n",[234,9049,9050,9053],{"class":236,"line":415},[234,9051,9052],{"class":9026},"    volumes",[234,9054,9030],{"class":387},[234,9056,9057,9060],{"class":236,"line":434},[234,9058,9059],{"class":387},"      - ",[234,9061,9062],{"class":255},".\u002Fprometheus:\u002Fetc\u002Fprometheus\n",[234,9064,9065,9067],{"class":236,"line":459},[234,9066,9059],{"class":387},[234,9068,9069],{"class":255},"prometheus-data:\u002Fprometheus\n",[234,9071,9072,9075],{"class":236,"line":464},[234,9073,9074],{"class":9026},"    command",[234,9076,9030],{"class":387},[234,9078,9079,9081],{"class":236,"line":479},[234,9080,9059],{"class":387},[234,9082,9083],{"class":255},"'--config.file=\u002Fetc\u002Fprometheus\u002Fprometheus.yml'\n",[234,9085,9086,9088],{"class":236,"line":484},[234,9087,9059],{"class":387},[234,9089,9090],{"class":255},"'--storage.tsdb.retention.time=30d'\n",[234,9092,9093,9095,9098],{"class":236,"line":490},[234,9094,9059],{"class":387},[234,9096,9097],{"class":255},"'--web.enable-lifecycle'",[234,9099,9100],{"class":240},"  # permite reload via HTTP POST\n",[234,9102,9103,9106],{"class":236,"line":508},[234,9104,9105],{"class":9026},"    ports",[234,9107,9030],{"class":387},[234,9109,9110,9112],{"class":236,"line":529},[234,9111,9059],{"class":387},[234,9113,9114],{"class":255},"'127.0.0.1:9090:9090'\n",[234,9116,9117,9120,9122],{"class":236,"line":535},[234,9118,9119],{"class":9026},"    restart",[234,9121,6564],{"class":387},[234,9123,9124],{"class":255},"unless-stopped\n",[234,9126,9127],{"class":236,"line":546},[234,9128,412],{"emptyLinePlaceholder":411},[234,9130,9131,9134],{"class":236,"line":552},[234,9132,9133],{"class":9026},"  grafana",[234,9135,9030],{"class":387},[234,9137,9138,9140,9142],{"class":236,"line":557},[234,9139,9042],{"class":9026},[234,9141,6564],{"class":387},[234,9143,9144],{"class":255},"grafana\u002Fgrafana:11.3.0\n",[234,9146,9147,9149],{"class":236,"line":594},[234,9148,9052],{"class":9026},[234,9150,9030],{"class":387},[234,9152,9153,9155],{"class":236,"line":635},[234,9154,9059],{"class":387},[234,9156,9157],{"class":255},"grafana-data:\u002Fvar\u002Flib\u002Fgrafana\n",[234,9159,9160,9162],{"class":236,"line":643},[234,9161,9059],{"class":387},[234,9163,9164],{"class":255},".\u002Fgrafana\u002Fprovisioning:\u002Fetc\u002Fgrafana\u002Fprovisioning\n",[234,9166,9167,9170],{"class":236,"line":659},[234,9168,9169],{"class":9026},"    environment",[234,9171,9030],{"class":387},[234,9173,9174,9176],{"class":236,"line":683},[234,9175,9059],{"class":387},[234,9177,9178],{"class":255},"GF_SECURITY_ADMIN_PASSWORD=${GRAFANA_PASSWORD}\n",[234,9180,9181,9183],{"class":236,"line":695},[234,9182,9059],{"class":387},[234,9184,9185],{"class":255},"GF_USERS_ALLOW_SIGN_UP=false\n",[234,9187,9188,9190],{"class":236,"line":717},[234,9189,9105],{"class":9026},[234,9191,9030],{"class":387},[234,9193,9194,9196],{"class":236,"line":723},[234,9195,9059],{"class":387},[234,9197,9198],{"class":255},"'127.0.0.1:3000:3000'\n",[234,9200,9201,9203,9205],{"class":236,"line":729},[234,9202,9119],{"class":9026},[234,9204,6564],{"class":387},[234,9206,9124],{"class":255},[234,9208,9209],{"class":236,"line":734},[234,9210,412],{"emptyLinePlaceholder":411},[234,9212,9213,9216],{"class":236,"line":771},[234,9214,9215],{"class":9026},"  loki",[234,9217,9030],{"class":387},[234,9219,9220,9222,9224],{"class":236,"line":776},[234,9221,9042],{"class":9026},[234,9223,6564],{"class":387},[234,9225,9226],{"class":255},"grafana\u002Floki:3.2.0\n",[234,9228,9229,9231],{"class":236,"line":815},[234,9230,9052],{"class":9026},[234,9232,9030],{"class":387},[234,9234,9235,9237],{"class":236,"line":820},[234,9236,9059],{"class":387},[234,9238,9239],{"class":255},".\u002Floki\u002Floki-config.yml:\u002Fetc\u002Floki\u002Fconfig.yml\n",[234,9241,9242,9244],{"class":236,"line":826},[234,9243,9059],{"class":387},[234,9245,9246],{"class":255},"loki-data:\u002Floki\n",[234,9248,9249,9251,9253],{"class":236,"line":846},[234,9250,9074],{"class":9026},[234,9252,6564],{"class":387},[234,9254,9255],{"class":255},"-config.file=\u002Fetc\u002Floki\u002Fconfig.yml\n",[234,9257,9258,9260],{"class":236,"line":859},[234,9259,9105],{"class":9026},[234,9261,9030],{"class":387},[234,9263,9264,9266],{"class":236,"line":872},[234,9265,9059],{"class":387},[234,9267,9268],{"class":255},"'127.0.0.1:3100:3100'\n",[234,9270,9271,9273,9275],{"class":236,"line":898},[234,9272,9119],{"class":9026},[234,9274,6564],{"class":387},[234,9276,9124],{"class":255},[234,9278,9279],{"class":236,"line":913},[234,9280,412],{"emptyLinePlaceholder":411},[234,9282,9283,9286],{"class":236,"line":1886},[234,9284,9285],{"class":9026},"  alertmanager",[234,9287,9030],{"class":387},[234,9289,9290,9292,9294],{"class":236,"line":1901},[234,9291,9042],{"class":9026},[234,9293,6564],{"class":387},[234,9295,9296],{"class":255},"prom\u002Falertmanager:v0.27.0\n",[234,9298,9299,9301],{"class":236,"line":1920},[234,9300,9052],{"class":9026},[234,9302,9030],{"class":387},[234,9304,9305,9307],{"class":236,"line":1944},[234,9306,9059],{"class":387},[234,9308,9309],{"class":255},".\u002Falertmanager:\u002Fetc\u002Falertmanager\n",[234,9311,9312,9314],{"class":236,"line":1962},[234,9313,9105],{"class":9026},[234,9315,9030],{"class":387},[234,9317,9318,9320],{"class":236,"line":1978},[234,9319,9059],{"class":387},[234,9321,9322],{"class":255},"'127.0.0.1:9093:9093'\n",[234,9324,9325,9327,9329],{"class":236,"line":1984},[234,9326,9119],{"class":9026},[234,9328,6564],{"class":387},[234,9330,9124],{"class":255},[234,9332,9333],{"class":236,"line":1992},[234,9334,412],{"emptyLinePlaceholder":411},[234,9336,9337,9340],{"class":236,"line":2004},[234,9338,9339],{"class":9026},"volumes",[234,9341,9030],{"class":387},[234,9343,9344,9347],{"class":236,"line":2014},[234,9345,9346],{"class":9026},"  prometheus-data",[234,9348,9030],{"class":387},[234,9350,9351,9354],{"class":236,"line":2020},[234,9352,9353],{"class":9026},"  grafana-data",[234,9355,9030],{"class":387},[234,9357,9358,9361],{"class":236,"line":2029},[234,9359,9360],{"class":9026},"  loki-data",[234,9362,9030],{"class":387},[12,9364,9365,9366,9369,9370,9373,9374,9377,9378,9381],{},"Três pontos importantes nesse arquivo. Primeiro, todas as portas estão amarradas a ",[231,9367,9368],{},"127.0.0.1"," — nenhum dos serviços é acessível diretamente da internet. Segundo, os volumes são nomeados (não bind mounts), então sobrevivem a ",[231,9371,9372],{},"docker-compose down",". Terceiro, a senha do Grafana vem de variável de ambiente: crie um ",[231,9375,9376],{},".env"," ao lado do compose com ",[231,9379,9380],{},"GRAFANA_PASSWORD=algo_longo_aleatorio"," e nunca comite isso.",[12,9383,9384],{},"Suba a stack:",[224,9386,9388],{"className":226,"code":9387,"language":228,"meta":229,"style":229},"cd \u002Fopt\u002Fobservability\ndocker compose up -d\ndocker compose ps  # todos devem estar \"Up\" \u002F healthy\n",[231,9389,9390,9398,9411],{"__ignoreMap":229},[234,9391,9392,9395],{"class":236,"line":237},[234,9393,9394],{"class":251},"cd",[234,9396,9397],{"class":255}," \u002Fopt\u002Fobservability\n",[234,9399,9400,9402,9405,9408],{"class":236,"line":244},[234,9401,1118],{"class":247},[234,9403,9404],{"class":255}," compose",[234,9406,9407],{"class":255}," up",[234,9409,9410],{"class":251}," -d\n",[234,9412,9413,9415,9417,9420],{"class":236,"line":271},[234,9414,1118],{"class":247},[234,9416,9404],{"class":255},[234,9418,9419],{"class":255}," ps",[234,9421,9422],{"class":240},"  # todos devem estar \"Up\" \u002F healthy\n",[12,9424,9425,9426,9429,9430,1895,9433,9429,9436,1895,9439,9442,9443,101],{},"Validação rápida: ",[231,9427,9428],{},"curl localhost:9090\u002F-\u002Fready"," retorna ",[231,9431,9432],{},"Prometheus Server is Ready",[231,9434,9435],{},"curl localhost:3100\u002Fready",[231,9437,9438],{},"ready",[231,9440,9441],{},"curl localhost:3000\u002Fapi\u002Fhealth"," retorna JSON com ",[231,9444,9445],{},"\"database\": \"ok\"",[19,9447,9449],{"id":9448},"passo-3-como-configurar-os-scrapes-do-prometheus","Passo 3 — Como configurar os scrapes do Prometheus?",[12,9451,8935,9452,101],{},[27,9453,9454],{},"30 minutos",[12,9456,9010,9457,9460],{},[231,9458,9459],{},"prometheus\u002Fprometheus.yml"," é onde você diz pro Prometheus quais endpoints raspar. Pra um cluster de 4 servidores, fica assim:",[224,9462,9464],{"className":9017,"code":9463,"language":9019,"meta":229,"style":229},"global:\n  scrape_interval: 15s\n  evaluation_interval: 15s\n\nalerting:\n  alertmanagers:\n    - static_configs:\n        - targets: ['alertmanager:9093']\n\nrule_files:\n  - 'alerts.yml'\n\nscrape_configs:\n  - job_name: 'prometheus'\n    static_configs:\n      - targets: ['localhost:9090']\n\n  - job_name: 'node'\n    static_configs:\n      - targets:\n          - 'server-1.seudominio.internal:9100'\n          - 'server-2.seudominio.internal:9100'\n          - 'server-3.seudominio.internal:9100'\n          - 'worker-1.seudominio.internal:9100'\n        labels:\n          environment: 'production'\n\n  - job_name: 'apps'\n    static_configs:\n      - targets:\n          - 'api.seudominio.internal:8080'\n          - 'worker.seudominio.internal:8080'\n        labels:\n          environment: 'production'\n    metrics_path: '\u002Fmetrics'\n",[231,9465,9466,9473,9483,9492,9496,9503,9510,9520,9537,9541,9548,9556,9560,9567,9579,9586,9599,9603,9614,9620,9628,9636,9643,9650,9657,9664,9674,9678,9689,9695,9703,9710,9717,9723,9731],{"__ignoreMap":229},[234,9467,9468,9471],{"class":236,"line":237},[234,9469,9470],{"class":9026},"global",[234,9472,9030],{"class":387},[234,9474,9475,9478,9480],{"class":236,"line":244},[234,9476,9477],{"class":9026},"  scrape_interval",[234,9479,6564],{"class":387},[234,9481,9482],{"class":255},"15s\n",[234,9484,9485,9488,9490],{"class":236,"line":271},[234,9486,9487],{"class":9026},"  evaluation_interval",[234,9489,6564],{"class":387},[234,9491,9482],{"class":255},[234,9493,9494],{"class":236,"line":415},[234,9495,412],{"emptyLinePlaceholder":411},[234,9497,9498,9501],{"class":236,"line":434},[234,9499,9500],{"class":9026},"alerting",[234,9502,9030],{"class":387},[234,9504,9505,9508],{"class":236,"line":459},[234,9506,9507],{"class":9026},"  alertmanagers",[234,9509,9030],{"class":387},[234,9511,9512,9515,9518],{"class":236,"line":464},[234,9513,9514],{"class":387},"    - ",[234,9516,9517],{"class":9026},"static_configs",[234,9519,9030],{"class":387},[234,9521,9522,9525,9528,9531,9534],{"class":236,"line":479},[234,9523,9524],{"class":387},"        - ",[234,9526,9527],{"class":9026},"targets",[234,9529,9530],{"class":387},": [",[234,9532,9533],{"class":255},"'alertmanager:9093'",[234,9535,9536],{"class":387},"]\n",[234,9538,9539],{"class":236,"line":484},[234,9540,412],{"emptyLinePlaceholder":411},[234,9542,9543,9546],{"class":236,"line":490},[234,9544,9545],{"class":9026},"rule_files",[234,9547,9030],{"class":387},[234,9549,9550,9553],{"class":236,"line":508},[234,9551,9552],{"class":387},"  - ",[234,9554,9555],{"class":255},"'alerts.yml'\n",[234,9557,9558],{"class":236,"line":529},[234,9559,412],{"emptyLinePlaceholder":411},[234,9561,9562,9565],{"class":236,"line":535},[234,9563,9564],{"class":9026},"scrape_configs",[234,9566,9030],{"class":387},[234,9568,9569,9571,9574,9576],{"class":236,"line":546},[234,9570,9552],{"class":387},[234,9572,9573],{"class":9026},"job_name",[234,9575,6564],{"class":387},[234,9577,9578],{"class":255},"'prometheus'\n",[234,9580,9581,9584],{"class":236,"line":552},[234,9582,9583],{"class":9026},"    static_configs",[234,9585,9030],{"class":387},[234,9587,9588,9590,9592,9594,9597],{"class":236,"line":557},[234,9589,9059],{"class":387},[234,9591,9527],{"class":9026},[234,9593,9530],{"class":387},[234,9595,9596],{"class":255},"'localhost:9090'",[234,9598,9536],{"class":387},[234,9600,9601],{"class":236,"line":594},[234,9602,412],{"emptyLinePlaceholder":411},[234,9604,9605,9607,9609,9611],{"class":236,"line":635},[234,9606,9552],{"class":387},[234,9608,9573],{"class":9026},[234,9610,6564],{"class":387},[234,9612,9613],{"class":255},"'node'\n",[234,9615,9616,9618],{"class":236,"line":643},[234,9617,9583],{"class":9026},[234,9619,9030],{"class":387},[234,9621,9622,9624,9626],{"class":236,"line":659},[234,9623,9059],{"class":387},[234,9625,9527],{"class":9026},[234,9627,9030],{"class":387},[234,9629,9630,9633],{"class":236,"line":683},[234,9631,9632],{"class":387},"          - ",[234,9634,9635],{"class":255},"'server-1.seudominio.internal:9100'\n",[234,9637,9638,9640],{"class":236,"line":695},[234,9639,9632],{"class":387},[234,9641,9642],{"class":255},"'server-2.seudominio.internal:9100'\n",[234,9644,9645,9647],{"class":236,"line":717},[234,9646,9632],{"class":387},[234,9648,9649],{"class":255},"'server-3.seudominio.internal:9100'\n",[234,9651,9652,9654],{"class":236,"line":723},[234,9653,9632],{"class":387},[234,9655,9656],{"class":255},"'worker-1.seudominio.internal:9100'\n",[234,9658,9659,9662],{"class":236,"line":729},[234,9660,9661],{"class":9026},"        labels",[234,9663,9030],{"class":387},[234,9665,9666,9669,9671],{"class":236,"line":734},[234,9667,9668],{"class":9026},"          environment",[234,9670,6564],{"class":387},[234,9672,9673],{"class":255},"'production'\n",[234,9675,9676],{"class":236,"line":771},[234,9677,412],{"emptyLinePlaceholder":411},[234,9679,9680,9682,9684,9686],{"class":236,"line":776},[234,9681,9552],{"class":387},[234,9683,9573],{"class":9026},[234,9685,6564],{"class":387},[234,9687,9688],{"class":255},"'apps'\n",[234,9690,9691,9693],{"class":236,"line":815},[234,9692,9583],{"class":9026},[234,9694,9030],{"class":387},[234,9696,9697,9699,9701],{"class":236,"line":820},[234,9698,9059],{"class":387},[234,9700,9527],{"class":9026},[234,9702,9030],{"class":387},[234,9704,9705,9707],{"class":236,"line":826},[234,9706,9632],{"class":387},[234,9708,9709],{"class":255},"'api.seudominio.internal:8080'\n",[234,9711,9712,9714],{"class":236,"line":846},[234,9713,9632],{"class":387},[234,9715,9716],{"class":255},"'worker.seudominio.internal:8080'\n",[234,9718,9719,9721],{"class":236,"line":859},[234,9720,9661],{"class":9026},[234,9722,9030],{"class":387},[234,9724,9725,9727,9729],{"class":236,"line":872},[234,9726,9668],{"class":9026},[234,9728,6564],{"class":387},[234,9730,9673],{"class":255},[234,9732,9733,9736,9738],{"class":236,"line":898},[234,9734,9735],{"class":9026},"    metrics_path",[234,9737,6564],{"class":387},[234,9739,9740],{"class":255},"'\u002Fmetrics'\n",[12,9742,9743,9744,9746,9747,9750],{},"Pra clusters maiores ou que mudam de composição com frequência, troque o ",[231,9745,9517],{}," por ",[231,9748,9749],{},"file_sd_configs"," apontando pra um JSON que você gera automaticamente. Pra 4 servidores estáticos, o arquivo acima resolve.",[12,9752,9753,9754,9757,9758,9761,9762,9765,9766,9769],{},"Reload: ",[231,9755,9756],{},"curl -X POST localhost:9090\u002F-\u002Freload",". Confira em ",[231,9759,9760],{},"localhost:9090\u002Ftargets"," se todos os jobs estão ",[231,9763,9764],{},"UP",". Os que estiverem ",[231,9767,9768],{},"DOWN"," ainda não foram instrumentados — esse é o passo 4.",[19,9771,9773],{"id":9772},"passo-4-como-instalar-o-node_exporter-em-cada-servidor","Passo 4 — Como instalar o node_exporter em cada servidor?",[12,9775,8935,9776,9779],{},[27,9777,9778],{},"15 minutos"," para 4 servidores.",[12,9781,9782],{},"Em cada servidor monitorado, rode o node_exporter. Há duas formas: binário direto via systemd, ou contêiner Docker. Em 2026 o consenso é container — facilita atualização e isolamento. Em cada nó:",[224,9784,9786],{"className":226,"code":9785,"language":228,"meta":229,"style":229},"docker run -d \\\n  --name node-exporter \\\n  --restart unless-stopped \\\n  --net=\"host\" \\\n  --pid=\"host\" \\\n  -v \"\u002F:\u002Fhost:ro,rslave\" \\\n  prom\u002Fnode-exporter:v1.8.2 \\\n  --path.rootfs=\u002Fhost\n",[231,9787,9788,9801,9811,9821,9831,9840,9850,9857],{"__ignoreMap":229},[234,9789,9790,9792,9795,9798],{"class":236,"line":237},[234,9791,1118],{"class":247},[234,9793,9794],{"class":255}," run",[234,9796,9797],{"class":251}," -d",[234,9799,9800],{"class":383}," \\\n",[234,9802,9803,9806,9809],{"class":236,"line":244},[234,9804,9805],{"class":251},"  --name",[234,9807,9808],{"class":255}," node-exporter",[234,9810,9800],{"class":383},[234,9812,9813,9816,9819],{"class":236,"line":271},[234,9814,9815],{"class":251},"  --restart",[234,9817,9818],{"class":255}," unless-stopped",[234,9820,9800],{"class":383},[234,9822,9823,9826,9829],{"class":236,"line":415},[234,9824,9825],{"class":251},"  --net=",[234,9827,9828],{"class":255},"\"host\"",[234,9830,9800],{"class":383},[234,9832,9833,9836,9838],{"class":236,"line":434},[234,9834,9835],{"class":251},"  --pid=",[234,9837,9828],{"class":255},[234,9839,9800],{"class":383},[234,9841,9842,9845,9848],{"class":236,"line":459},[234,9843,9844],{"class":251},"  -v",[234,9846,9847],{"class":255}," \"\u002F:\u002Fhost:ro,rslave\"",[234,9849,9800],{"class":383},[234,9851,9852,9855],{"class":236,"line":464},[234,9853,9854],{"class":255},"  prom\u002Fnode-exporter:v1.8.2",[234,9856,9800],{"class":383},[234,9858,9859],{"class":236,"line":479},[234,9860,9861],{"class":251},"  --path.rootfs=\u002Fhost\n",[12,9863,9010,9864,9867,9868,9871,9872,571,9875,2403,9878,9881],{},[231,9865,9866],{},"--net=host"," é necessário pra ele enxergar as interfaces de rede reais. O bind mount em ",[231,9869,9870],{},"\u002Fhost"," permite ler ",[231,9873,9874],{},"\u002Fproc",[231,9876,9877],{},"\u002Fsys",[231,9879,9880],{},"\u002Fetc\u002Fpasswd"," do host (read-only) sem rodar o contêiner com privilégios de raiz.",[12,9883,9884,9885,1272],{},"Firewall: abra a porta 9100 apenas pra o IP do servidor de observabilidade. No Ubuntu com ",[231,9886,9887],{},"ufw",[224,9889,9891],{"className":226,"code":9890,"language":228,"meta":229,"style":229},"ufw allow from \u003CIP_DO_OBSERVABILITY> to any port 9100\n",[231,9892,9893],{"__ignoreMap":229},[234,9894,9895,9897,9900,9903,9906,9909,9912,9914,9917,9920,9923],{"class":236,"line":237},[234,9896,9887],{"class":247},[234,9898,9899],{"class":255}," allow",[234,9901,9902],{"class":255}," from",[234,9904,9905],{"class":383}," \u003C",[234,9907,9908],{"class":255},"IP_DO_OBSERVABILIT",[234,9910,9911],{"class":387},"Y",[234,9913,1935],{"class":383},[234,9915,9916],{"class":255}," to",[234,9918,9919],{"class":255}," any",[234,9921,9922],{"class":255}," port",[234,9924,9925],{"class":251}," 9100\n",[12,9927,9928,9929,9932,9933,101],{},"Validação: do servidor de observability, ",[231,9930,9931],{},"curl http:\u002F\u002Fserver-1.seudominio.internal:9100\u002Fmetrics"," deve retornar centenas de linhas começando com ",[231,9934,9935],{},"# HELP node_cpu_seconds_total...",[19,9937,9939],{"id":9938},"passo-5-como-configurar-loki-promtail","Passo 5 — Como configurar Loki + Promtail?",[12,9941,8935,9942,101],{},[27,9943,9454],{},[12,9945,9946,9947,1272],{},"O Loki já está rodando no compose do passo 2. Falta o ",[231,9948,9949],{},"loki-config.yml",[224,9951,9953],{"className":9017,"code":9952,"language":9019,"meta":229,"style":229},"auth_enabled: false\n\nserver:\n  http_listen_port: 3100\n\ncommon:\n  path_prefix: \u002Floki\n  storage:\n    filesystem:\n      chunks_directory: \u002Floki\u002Fchunks\n      rules_directory: \u002Floki\u002Frules\n  replication_factor: 1\n  ring:\n    kvstore:\n      store: inmemory\n\nschema_config:\n  configs:\n    - from: 2024-01-01\n      store: tsdb\n      object_store: filesystem\n      schema: v13\n      index:\n        prefix: index_\n        period: 24h\n\nlimits_config:\n  retention_period: 720h  # 30 dias\n  reject_old_samples: true\n  reject_old_samples_max_age: 168h\n",[231,9954,9955,9965,9969,9976,9986,9990,9997,10007,10014,10021,10031,10041,10051,10058,10065,10075,10079,10086,10093,10104,10113,10123,10133,10140,10150,10160,10164,10171,10184,10194],{"__ignoreMap":229},[234,9956,9957,9960,9962],{"class":236,"line":237},[234,9958,9959],{"class":9026},"auth_enabled",[234,9961,6564],{"class":387},[234,9963,9964],{"class":251},"false\n",[234,9966,9967],{"class":236,"line":244},[234,9968,412],{"emptyLinePlaceholder":411},[234,9970,9971,9974],{"class":236,"line":271},[234,9972,9973],{"class":9026},"server",[234,9975,9030],{"class":387},[234,9977,9978,9981,9983],{"class":236,"line":415},[234,9979,9980],{"class":9026},"  http_listen_port",[234,9982,6564],{"class":387},[234,9984,9985],{"class":251},"3100\n",[234,9987,9988],{"class":236,"line":434},[234,9989,412],{"emptyLinePlaceholder":411},[234,9991,9992,9995],{"class":236,"line":459},[234,9993,9994],{"class":9026},"common",[234,9996,9030],{"class":387},[234,9998,9999,10002,10004],{"class":236,"line":464},[234,10000,10001],{"class":9026},"  path_prefix",[234,10003,6564],{"class":387},[234,10005,10006],{"class":255},"\u002Floki\n",[234,10008,10009,10012],{"class":236,"line":479},[234,10010,10011],{"class":9026},"  storage",[234,10013,9030],{"class":387},[234,10015,10016,10019],{"class":236,"line":484},[234,10017,10018],{"class":9026},"    filesystem",[234,10020,9030],{"class":387},[234,10022,10023,10026,10028],{"class":236,"line":490},[234,10024,10025],{"class":9026},"      chunks_directory",[234,10027,6564],{"class":387},[234,10029,10030],{"class":255},"\u002Floki\u002Fchunks\n",[234,10032,10033,10036,10038],{"class":236,"line":508},[234,10034,10035],{"class":9026},"      rules_directory",[234,10037,6564],{"class":387},[234,10039,10040],{"class":255},"\u002Floki\u002Frules\n",[234,10042,10043,10046,10048],{"class":236,"line":529},[234,10044,10045],{"class":9026},"  replication_factor",[234,10047,6564],{"class":387},[234,10049,10050],{"class":251},"1\n",[234,10052,10053,10056],{"class":236,"line":535},[234,10054,10055],{"class":9026},"  ring",[234,10057,9030],{"class":387},[234,10059,10060,10063],{"class":236,"line":546},[234,10061,10062],{"class":9026},"    kvstore",[234,10064,9030],{"class":387},[234,10066,10067,10070,10072],{"class":236,"line":552},[234,10068,10069],{"class":9026},"      store",[234,10071,6564],{"class":387},[234,10073,10074],{"class":255},"inmemory\n",[234,10076,10077],{"class":236,"line":557},[234,10078,412],{"emptyLinePlaceholder":411},[234,10080,10081,10084],{"class":236,"line":594},[234,10082,10083],{"class":9026},"schema_config",[234,10085,9030],{"class":387},[234,10087,10088,10091],{"class":236,"line":635},[234,10089,10090],{"class":9026},"  configs",[234,10092,9030],{"class":387},[234,10094,10095,10097,10099,10101],{"class":236,"line":643},[234,10096,9514],{"class":387},[234,10098,391],{"class":9026},[234,10100,6564],{"class":387},[234,10102,10103],{"class":251},"2024-01-01\n",[234,10105,10106,10108,10110],{"class":236,"line":659},[234,10107,10069],{"class":9026},[234,10109,6564],{"class":387},[234,10111,10112],{"class":255},"tsdb\n",[234,10114,10115,10118,10120],{"class":236,"line":683},[234,10116,10117],{"class":9026},"      object_store",[234,10119,6564],{"class":387},[234,10121,10122],{"class":255},"filesystem\n",[234,10124,10125,10128,10130],{"class":236,"line":695},[234,10126,10127],{"class":9026},"      schema",[234,10129,6564],{"class":387},[234,10131,10132],{"class":255},"v13\n",[234,10134,10135,10138],{"class":236,"line":717},[234,10136,10137],{"class":9026},"      index",[234,10139,9030],{"class":387},[234,10141,10142,10145,10147],{"class":236,"line":723},[234,10143,10144],{"class":9026},"        prefix",[234,10146,6564],{"class":387},[234,10148,10149],{"class":255},"index_\n",[234,10151,10152,10155,10157],{"class":236,"line":729},[234,10153,10154],{"class":9026},"        period",[234,10156,6564],{"class":387},[234,10158,10159],{"class":255},"24h\n",[234,10161,10162],{"class":236,"line":734},[234,10163,412],{"emptyLinePlaceholder":411},[234,10165,10166,10169],{"class":236,"line":771},[234,10167,10168],{"class":9026},"limits_config",[234,10170,9030],{"class":387},[234,10172,10173,10176,10178,10181],{"class":236,"line":776},[234,10174,10175],{"class":9026},"  retention_period",[234,10177,6564],{"class":387},[234,10179,10180],{"class":255},"720h",[234,10182,10183],{"class":240},"  # 30 dias\n",[234,10185,10186,10189,10191],{"class":236,"line":815},[234,10187,10188],{"class":9026},"  reject_old_samples",[234,10190,6564],{"class":387},[234,10192,10193],{"class":251},"true\n",[234,10195,10196,10199,10201],{"class":236,"line":820},[234,10197,10198],{"class":9026},"  reject_old_samples_max_age",[234,10200,6564],{"class":387},[234,10202,10203],{"class":255},"168h\n",[12,10205,10206],{},"Storage em filesystem é o suficiente pra começar. Quando você passar de 50 GB de logs por dia ou quiser retenção de 90+ dias, migra pra S3 (ou compatível). Não migre antes — complica a operação sem ganho real.",[12,10208,10209],{},"Em cada servidor monitorado, instale o Promtail (ou Grafana Agent) também via container:",[224,10211,10213],{"className":9017,"code":10212,"language":9019,"meta":229,"style":229},"# \u002Fopt\u002Fpromtail\u002Fpromtail-config.yml em cada servidor\nserver:\n  http_listen_port: 9080\n\nclients:\n  - url: http:\u002F\u002Fmonitor.seudominio.com:3100\u002Floki\u002Fapi\u002Fv1\u002Fpush\n\nscrape_configs:\n  - job_name: system\n    static_configs:\n      - targets: [localhost]\n        labels:\n          job: varlogs\n          host: ${HOSTNAME}\n          __path__: \u002Fvar\u002Flog\u002F*.log\n\n  - job_name: docker\n    docker_sd_configs:\n      - host: unix:\u002F\u002F\u002Fvar\u002Frun\u002Fdocker.sock\n    relabel_configs:\n      - source_labels: ['__meta_docker_container_name']\n        target_label: 'container'\n",[231,10214,10215,10220,10226,10235,10239,10246,10258,10262,10268,10279,10285,10297,10303,10313,10323,10333,10337,10348,10355,10366,10373,10387],{"__ignoreMap":229},[234,10216,10217],{"class":236,"line":237},[234,10218,10219],{"class":240},"# \u002Fopt\u002Fpromtail\u002Fpromtail-config.yml em cada servidor\n",[234,10221,10222,10224],{"class":236,"line":244},[234,10223,9973],{"class":9026},[234,10225,9030],{"class":387},[234,10227,10228,10230,10232],{"class":236,"line":271},[234,10229,9980],{"class":9026},[234,10231,6564],{"class":387},[234,10233,10234],{"class":251},"9080\n",[234,10236,10237],{"class":236,"line":415},[234,10238,412],{"emptyLinePlaceholder":411},[234,10240,10241,10244],{"class":236,"line":434},[234,10242,10243],{"class":9026},"clients",[234,10245,9030],{"class":387},[234,10247,10248,10250,10253,10255],{"class":236,"line":459},[234,10249,9552],{"class":387},[234,10251,10252],{"class":9026},"url",[234,10254,6564],{"class":387},[234,10256,10257],{"class":255},"http:\u002F\u002Fmonitor.seudominio.com:3100\u002Floki\u002Fapi\u002Fv1\u002Fpush\n",[234,10259,10260],{"class":236,"line":464},[234,10261,412],{"emptyLinePlaceholder":411},[234,10263,10264,10266],{"class":236,"line":479},[234,10265,9564],{"class":9026},[234,10267,9030],{"class":387},[234,10269,10270,10272,10274,10276],{"class":236,"line":484},[234,10271,9552],{"class":387},[234,10273,9573],{"class":9026},[234,10275,6564],{"class":387},[234,10277,10278],{"class":255},"system\n",[234,10280,10281,10283],{"class":236,"line":490},[234,10282,9583],{"class":9026},[234,10284,9030],{"class":387},[234,10286,10287,10289,10291,10293,10295],{"class":236,"line":508},[234,10288,9059],{"class":387},[234,10290,9527],{"class":9026},[234,10292,9530],{"class":387},[234,10294,8964],{"class":255},[234,10296,9536],{"class":387},[234,10298,10299,10301],{"class":236,"line":529},[234,10300,9661],{"class":9026},[234,10302,9030],{"class":387},[234,10304,10305,10308,10310],{"class":236,"line":535},[234,10306,10307],{"class":9026},"          job",[234,10309,6564],{"class":387},[234,10311,10312],{"class":255},"varlogs\n",[234,10314,10315,10318,10320],{"class":236,"line":546},[234,10316,10317],{"class":9026},"          host",[234,10319,6564],{"class":387},[234,10321,10322],{"class":255},"${HOSTNAME}\n",[234,10324,10325,10328,10330],{"class":236,"line":552},[234,10326,10327],{"class":9026},"          __path__",[234,10329,6564],{"class":387},[234,10331,10332],{"class":255},"\u002Fvar\u002Flog\u002F*.log\n",[234,10334,10335],{"class":236,"line":557},[234,10336,412],{"emptyLinePlaceholder":411},[234,10338,10339,10341,10343,10345],{"class":236,"line":594},[234,10340,9552],{"class":387},[234,10342,9573],{"class":9026},[234,10344,6564],{"class":387},[234,10346,10347],{"class":255},"docker\n",[234,10349,10350,10353],{"class":236,"line":635},[234,10351,10352],{"class":9026},"    docker_sd_configs",[234,10354,9030],{"class":387},[234,10356,10357,10359,10361,10363],{"class":236,"line":643},[234,10358,9059],{"class":387},[234,10360,1650],{"class":9026},[234,10362,6564],{"class":387},[234,10364,10365],{"class":255},"unix:\u002F\u002F\u002Fvar\u002Frun\u002Fdocker.sock\n",[234,10367,10368,10371],{"class":236,"line":659},[234,10369,10370],{"class":9026},"    relabel_configs",[234,10372,9030],{"class":387},[234,10374,10375,10377,10380,10382,10385],{"class":236,"line":683},[234,10376,9059],{"class":387},[234,10378,10379],{"class":9026},"source_labels",[234,10381,9530],{"class":387},[234,10383,10384],{"class":255},"'__meta_docker_container_name'",[234,10386,9536],{"class":387},[234,10388,10389,10392,10394],{"class":236,"line":695},[234,10390,10391],{"class":9026},"        target_label",[234,10393,6564],{"class":387},[234,10395,10396],{"class":255},"'container'\n",[12,10398,10399,10400,10403,10404,10406],{},"Importante: o endpoint ",[231,10401,10402],{},"http:\u002F\u002Fmonitor.seudominio.com:3100\u002Floki\u002Fapi\u002Fv1\u002Fpush"," precisa estar acessível dos servidores. Se você seguiu o passo 2 e amarrou Loki em ",[231,10405,9368],{},", você tem duas opções: expor a 3100 via reverse proxy com autenticação básica, ou abrir um túnel SSH\u002FWireGuard entre os servidores. A segunda opção é mais segura e o que recomendamos.",[12,10408,10409,10410,10413],{},"Validação: no Grafana, vá em Explore, selecione a fonte de dados Loki, rode ",[231,10411,10412],{},"{job=\"varlogs\"}"," e veja os logs aparecendo em tempo real.",[19,10415,10417],{"id":10416},"passo-6-como-importar-os-dashboards-do-grafana","Passo 6 — Como importar os dashboards do Grafana?",[12,10419,8935,10420,101],{},[27,10421,10422],{},"20 minutos",[12,10424,10425,10426,10429,10430,101],{},"Acesse ",[231,10427,10428],{},"https:\u002F\u002Fmonitor.seudominio.com"," (depois de configurar o reverse proxy do passo 8 — pode pular pra lá agora se quiser). Login admin com a senha do ",[231,10431,9376],{},[12,10433,10434,10435,1272],{},"Adicione as duas fontes de dados via provisioning automático. Em ",[231,10436,10437],{},"grafana\u002Fprovisioning\u002Fdatasources\u002Fdatasources.yml",[224,10439,10441],{"className":9017,"code":10440,"language":9019,"meta":229,"style":229},"apiVersion: 1\ndatasources:\n  - name: Prometheus\n    type: prometheus\n    access: proxy\n    url: http:\u002F\u002Fprometheus:9090\n    isDefault: true\n  - name: Loki\n    type: loki\n    access: proxy\n    url: http:\u002F\u002Floki:3100\n",[231,10442,10443,10452,10459,10471,10481,10491,10501,10510,10521,10530,10538],{"__ignoreMap":229},[234,10444,10445,10448,10450],{"class":236,"line":237},[234,10446,10447],{"class":9026},"apiVersion",[234,10449,6564],{"class":387},[234,10451,10050],{"class":251},[234,10453,10454,10457],{"class":236,"line":244},[234,10455,10456],{"class":9026},"datasources",[234,10458,9030],{"class":387},[234,10460,10461,10463,10466,10468],{"class":236,"line":271},[234,10462,9552],{"class":387},[234,10464,10465],{"class":9026},"name",[234,10467,6564],{"class":387},[234,10469,10470],{"class":255},"Prometheus\n",[234,10472,10473,10476,10478],{"class":236,"line":415},[234,10474,10475],{"class":9026},"    type",[234,10477,6564],{"class":387},[234,10479,10480],{"class":255},"prometheus\n",[234,10482,10483,10486,10488],{"class":236,"line":434},[234,10484,10485],{"class":9026},"    access",[234,10487,6564],{"class":387},[234,10489,10490],{"class":255},"proxy\n",[234,10492,10493,10496,10498],{"class":236,"line":459},[234,10494,10495],{"class":9026},"    url",[234,10497,6564],{"class":387},[234,10499,10500],{"class":255},"http:\u002F\u002Fprometheus:9090\n",[234,10502,10503,10506,10508],{"class":236,"line":464},[234,10504,10505],{"class":9026},"    isDefault",[234,10507,6564],{"class":387},[234,10509,10193],{"class":251},[234,10511,10512,10514,10516,10518],{"class":236,"line":479},[234,10513,9552],{"class":387},[234,10515,10465],{"class":9026},[234,10517,6564],{"class":387},[234,10519,10520],{"class":255},"Loki\n",[234,10522,10523,10525,10527],{"class":236,"line":484},[234,10524,10475],{"class":9026},[234,10526,6564],{"class":387},[234,10528,10529],{"class":255},"loki\n",[234,10531,10532,10534,10536],{"class":236,"line":490},[234,10533,10485],{"class":9026},[234,10535,6564],{"class":387},[234,10537,10490],{"class":255},[234,10539,10540,10542,10544],{"class":236,"line":508},[234,10541,10495],{"class":9026},[234,10543,6564],{"class":387},[234,10545,10546],{"class":255},"http:\u002F\u002Floki:3100\n",[12,10548,10549,10550,10553],{},"Reinicie o Grafana com ",[231,10551,10552],{},"docker compose restart grafana"," e as fontes aparecem automaticamente.",[12,10555,10556,10557,10560],{},"Importe os dashboards prontos. Em ",[27,10558,10559],{},"Dashboards → New → Import",", cole o ID do dashboard:",[2735,10562,10563,10569,10575],{},[70,10564,10565,10568],{},[27,10566,10567],{},"1860"," — Node Exporter Full. CPU, RAM, disco, rede, sistema de arquivos. É o dashboard mais usado da comunidade Prometheus, com razão.",[70,10570,10571,10574],{},[27,10572,10573],{},"13639"," — Logs \u002F App. Visualização básica de logs do Loki com filtros por job, container, host.",[70,10576,10577,10580],{},[27,10578,10579],{},"15172"," — Cluster overview. Visão consolidada por servidor, útil pra cluster pequeno.",[12,10582,10583,10584,10587],{},"Customize cada um pra usar ",[231,10585,10586],{},"environment=\"production\""," no filtro padrão. Depois de duas semanas usando, você vai querer criar dashboards próprios pra workloads específicos — não tem atalho aí, é tempo de cadeira.",[19,10589,10591],{"id":10590},"passo-7-como-configurar-alertas-basicos","Passo 7 — Como configurar alertas básicos?",[12,10593,8935,10594,101],{},[27,10595,8994],{},[12,10597,10598],{},"Alertas são onde 80% dos times tropeçam: ou colocam pouquíssimos e descobrem incidentes pelos clientes, ou colocam dezenas e desensibilizam o time.",[12,10600,10601,10602,10605,10606,1272],{},"Comece com ",[27,10603,10604],{},"seis alertas essenciais",". Em ",[231,10607,10608],{},"prometheus\u002Falerts.yml",[224,10610,10612],{"className":9017,"code":10611,"language":9019,"meta":229,"style":229},"groups:\n  - name: essentials\n    interval: 30s\n    rules:\n      - alert: ServerDown\n        expr: up{job=\"node\"} == 0\n        for: 2m\n        labels:\n          severity: critical\n        annotations:\n          summary: \"Servidor {{ $labels.instance }} está fora do ar\"\n\n      - alert: HighCPU\n        expr: 100 - (avg by(instance) (rate(node_cpu_seconds_total{mode=\"idle\"}[5m])) * 100) > 80\n        for: 10m\n        labels:\n          severity: warning\n\n      - alert: DiskAlmostFull\n        expr: (node_filesystem_avail_bytes{mountpoint=\"\u002F\"} \u002F node_filesystem_size_bytes{mountpoint=\"\u002F\"}) * 100 \u003C 15\n        for: 5m\n        labels:\n          severity: critical\n\n      - alert: HighMemory\n        expr: (1 - (node_memory_MemAvailable_bytes \u002F node_memory_MemTotal_bytes)) * 100 > 90\n        for: 10m\n        labels:\n          severity: warning\n\n      - alert: HighHTTPErrorRate\n        expr: sum(rate(http_requests_total{status=~\"5..\"}[5m])) \u002F sum(rate(http_requests_total[5m])) > 0.05\n        for: 5m\n        labels:\n          severity: critical\n\n      - alert: HighLatency\n        expr: histogram_quantile(0.99, sum(rate(http_request_duration_seconds_bucket[5m])) by (le)) > 2\n        for: 10m\n        labels:\n          severity: warning\n",[231,10613,10614,10621,10632,10642,10649,10661,10671,10681,10687,10697,10704,10714,10718,10729,10738,10747,10753,10762,10766,10777,10786,10795,10801,10809,10813,10824,10833,10841,10847,10855,10859,10870,10879,10887,10893,10901,10905,10916,10925,10933,10939],{"__ignoreMap":229},[234,10615,10616,10619],{"class":236,"line":237},[234,10617,10618],{"class":9026},"groups",[234,10620,9030],{"class":387},[234,10622,10623,10625,10627,10629],{"class":236,"line":244},[234,10624,9552],{"class":387},[234,10626,10465],{"class":9026},[234,10628,6564],{"class":387},[234,10630,10631],{"class":255},"essentials\n",[234,10633,10634,10637,10639],{"class":236,"line":271},[234,10635,10636],{"class":9026},"    interval",[234,10638,6564],{"class":387},[234,10640,10641],{"class":255},"30s\n",[234,10643,10644,10647],{"class":236,"line":415},[234,10645,10646],{"class":9026},"    rules",[234,10648,9030],{"class":387},[234,10650,10651,10653,10656,10658],{"class":236,"line":434},[234,10652,9059],{"class":387},[234,10654,10655],{"class":9026},"alert",[234,10657,6564],{"class":387},[234,10659,10660],{"class":255},"ServerDown\n",[234,10662,10663,10666,10668],{"class":236,"line":459},[234,10664,10665],{"class":9026},"        expr",[234,10667,6564],{"class":387},[234,10669,10670],{"class":255},"up{job=\"node\"} == 0\n",[234,10672,10673,10676,10678],{"class":236,"line":464},[234,10674,10675],{"class":9026},"        for",[234,10677,6564],{"class":387},[234,10679,10680],{"class":255},"2m\n",[234,10682,10683,10685],{"class":236,"line":479},[234,10684,9661],{"class":9026},[234,10686,9030],{"class":387},[234,10688,10689,10692,10694],{"class":236,"line":484},[234,10690,10691],{"class":9026},"          severity",[234,10693,6564],{"class":387},[234,10695,10696],{"class":255},"critical\n",[234,10698,10699,10702],{"class":236,"line":490},[234,10700,10701],{"class":9026},"        annotations",[234,10703,9030],{"class":387},[234,10705,10706,10709,10711],{"class":236,"line":508},[234,10707,10708],{"class":9026},"          summary",[234,10710,6564],{"class":387},[234,10712,10713],{"class":255},"\"Servidor {{ $labels.instance }} está fora do ar\"\n",[234,10715,10716],{"class":236,"line":529},[234,10717,412],{"emptyLinePlaceholder":411},[234,10719,10720,10722,10724,10726],{"class":236,"line":535},[234,10721,9059],{"class":387},[234,10723,10655],{"class":9026},[234,10725,6564],{"class":387},[234,10727,10728],{"class":255},"HighCPU\n",[234,10730,10731,10733,10735],{"class":236,"line":546},[234,10732,10665],{"class":9026},[234,10734,6564],{"class":387},[234,10736,10737],{"class":255},"100 - (avg by(instance) (rate(node_cpu_seconds_total{mode=\"idle\"}[5m])) * 100) > 80\n",[234,10739,10740,10742,10744],{"class":236,"line":552},[234,10741,10675],{"class":9026},[234,10743,6564],{"class":387},[234,10745,10746],{"class":255},"10m\n",[234,10748,10749,10751],{"class":236,"line":557},[234,10750,9661],{"class":9026},[234,10752,9030],{"class":387},[234,10754,10755,10757,10759],{"class":236,"line":594},[234,10756,10691],{"class":9026},[234,10758,6564],{"class":387},[234,10760,10761],{"class":255},"warning\n",[234,10763,10764],{"class":236,"line":635},[234,10765,412],{"emptyLinePlaceholder":411},[234,10767,10768,10770,10772,10774],{"class":236,"line":643},[234,10769,9059],{"class":387},[234,10771,10655],{"class":9026},[234,10773,6564],{"class":387},[234,10775,10776],{"class":255},"DiskAlmostFull\n",[234,10778,10779,10781,10783],{"class":236,"line":659},[234,10780,10665],{"class":9026},[234,10782,6564],{"class":387},[234,10784,10785],{"class":255},"(node_filesystem_avail_bytes{mountpoint=\"\u002F\"} \u002F node_filesystem_size_bytes{mountpoint=\"\u002F\"}) * 100 \u003C 15\n",[234,10787,10788,10790,10792],{"class":236,"line":683},[234,10789,10675],{"class":9026},[234,10791,6564],{"class":387},[234,10793,10794],{"class":255},"5m\n",[234,10796,10797,10799],{"class":236,"line":695},[234,10798,9661],{"class":9026},[234,10800,9030],{"class":387},[234,10802,10803,10805,10807],{"class":236,"line":717},[234,10804,10691],{"class":9026},[234,10806,6564],{"class":387},[234,10808,10696],{"class":255},[234,10810,10811],{"class":236,"line":723},[234,10812,412],{"emptyLinePlaceholder":411},[234,10814,10815,10817,10819,10821],{"class":236,"line":729},[234,10816,9059],{"class":387},[234,10818,10655],{"class":9026},[234,10820,6564],{"class":387},[234,10822,10823],{"class":255},"HighMemory\n",[234,10825,10826,10828,10830],{"class":236,"line":734},[234,10827,10665],{"class":9026},[234,10829,6564],{"class":387},[234,10831,10832],{"class":255},"(1 - (node_memory_MemAvailable_bytes \u002F node_memory_MemTotal_bytes)) * 100 > 90\n",[234,10834,10835,10837,10839],{"class":236,"line":771},[234,10836,10675],{"class":9026},[234,10838,6564],{"class":387},[234,10840,10746],{"class":255},[234,10842,10843,10845],{"class":236,"line":776},[234,10844,9661],{"class":9026},[234,10846,9030],{"class":387},[234,10848,10849,10851,10853],{"class":236,"line":815},[234,10850,10691],{"class":9026},[234,10852,6564],{"class":387},[234,10854,10761],{"class":255},[234,10856,10857],{"class":236,"line":820},[234,10858,412],{"emptyLinePlaceholder":411},[234,10860,10861,10863,10865,10867],{"class":236,"line":826},[234,10862,9059],{"class":387},[234,10864,10655],{"class":9026},[234,10866,6564],{"class":387},[234,10868,10869],{"class":255},"HighHTTPErrorRate\n",[234,10871,10872,10874,10876],{"class":236,"line":846},[234,10873,10665],{"class":9026},[234,10875,6564],{"class":387},[234,10877,10878],{"class":255},"sum(rate(http_requests_total{status=~\"5..\"}[5m])) \u002F sum(rate(http_requests_total[5m])) > 0.05\n",[234,10880,10881,10883,10885],{"class":236,"line":859},[234,10882,10675],{"class":9026},[234,10884,6564],{"class":387},[234,10886,10794],{"class":255},[234,10888,10889,10891],{"class":236,"line":872},[234,10890,9661],{"class":9026},[234,10892,9030],{"class":387},[234,10894,10895,10897,10899],{"class":236,"line":898},[234,10896,10691],{"class":9026},[234,10898,6564],{"class":387},[234,10900,10696],{"class":255},[234,10902,10903],{"class":236,"line":913},[234,10904,412],{"emptyLinePlaceholder":411},[234,10906,10907,10909,10911,10913],{"class":236,"line":1886},[234,10908,9059],{"class":387},[234,10910,10655],{"class":9026},[234,10912,6564],{"class":387},[234,10914,10915],{"class":255},"HighLatency\n",[234,10917,10918,10920,10922],{"class":236,"line":1901},[234,10919,10665],{"class":9026},[234,10921,6564],{"class":387},[234,10923,10924],{"class":255},"histogram_quantile(0.99, sum(rate(http_request_duration_seconds_bucket[5m])) by (le)) > 2\n",[234,10926,10927,10929,10931],{"class":236,"line":1920},[234,10928,10675],{"class":9026},[234,10930,6564],{"class":387},[234,10932,10746],{"class":255},[234,10934,10935,10937],{"class":236,"line":1944},[234,10936,9661],{"class":9026},[234,10938,9030],{"class":387},[234,10940,10941,10943,10945],{"class":236,"line":1962},[234,10942,10691],{"class":9026},[234,10944,6564],{"class":387},[234,10946,10761],{"class":255},[12,10948,10949,10950,10953],{},"E o ",[231,10951,10952],{},"alertmanager\u002Falertmanager.yml"," apontando pra um webhook do Slack ou Discord:",[224,10955,10957],{"className":9017,"code":10956,"language":9019,"meta":229,"style":229},"route:\n  group_by: ['alertname', 'severity']\n  group_wait: 30s\n  group_interval: 5m\n  repeat_interval: 4h\n  receiver: 'slack-default'\n  routes:\n    - match:\n        severity: critical\n      receiver: 'slack-critical'\n      repeat_interval: 1h\n\nreceivers:\n  - name: 'slack-default'\n    slack_configs:\n      - api_url: 'https:\u002F\u002Fhooks.slack.com\u002Fservices\u002FSEU\u002FWEBHOOK\u002FAQUI'\n        channel: '#alerts'\n        send_resolved: true\n\n  - name: 'slack-critical'\n    slack_configs:\n      - api_url: 'https:\u002F\u002Fhooks.slack.com\u002Fservices\u002FSEU\u002FWEBHOOK\u002FAQUI'\n        channel: '#alerts-critical'\n        send_resolved: true\n",[231,10958,10959,10966,10983,10992,11001,11011,11021,11028,11037,11046,11056,11066,11070,11077,11087,11094,11106,11116,11125,11129,11139,11145,11155,11164],{"__ignoreMap":229},[234,10960,10961,10964],{"class":236,"line":237},[234,10962,10963],{"class":9026},"route",[234,10965,9030],{"class":387},[234,10967,10968,10971,10973,10976,10978,10981],{"class":236,"line":244},[234,10969,10970],{"class":9026},"  group_by",[234,10972,9530],{"class":387},[234,10974,10975],{"class":255},"'alertname'",[234,10977,571],{"class":387},[234,10979,10980],{"class":255},"'severity'",[234,10982,9536],{"class":387},[234,10984,10985,10988,10990],{"class":236,"line":271},[234,10986,10987],{"class":9026},"  group_wait",[234,10989,6564],{"class":387},[234,10991,10641],{"class":255},[234,10993,10994,10997,10999],{"class":236,"line":415},[234,10995,10996],{"class":9026},"  group_interval",[234,10998,6564],{"class":387},[234,11000,10794],{"class":255},[234,11002,11003,11006,11008],{"class":236,"line":434},[234,11004,11005],{"class":9026},"  repeat_interval",[234,11007,6564],{"class":387},[234,11009,11010],{"class":255},"4h\n",[234,11012,11013,11016,11018],{"class":236,"line":459},[234,11014,11015],{"class":9026},"  receiver",[234,11017,6564],{"class":387},[234,11019,11020],{"class":255},"'slack-default'\n",[234,11022,11023,11026],{"class":236,"line":464},[234,11024,11025],{"class":9026},"  routes",[234,11027,9030],{"class":387},[234,11029,11030,11032,11035],{"class":236,"line":479},[234,11031,9514],{"class":387},[234,11033,11034],{"class":9026},"match",[234,11036,9030],{"class":387},[234,11038,11039,11042,11044],{"class":236,"line":484},[234,11040,11041],{"class":9026},"        severity",[234,11043,6564],{"class":387},[234,11045,10696],{"class":255},[234,11047,11048,11051,11053],{"class":236,"line":490},[234,11049,11050],{"class":9026},"      receiver",[234,11052,6564],{"class":387},[234,11054,11055],{"class":255},"'slack-critical'\n",[234,11057,11058,11061,11063],{"class":236,"line":508},[234,11059,11060],{"class":9026},"      repeat_interval",[234,11062,6564],{"class":387},[234,11064,11065],{"class":255},"1h\n",[234,11067,11068],{"class":236,"line":529},[234,11069,412],{"emptyLinePlaceholder":411},[234,11071,11072,11075],{"class":236,"line":535},[234,11073,11074],{"class":9026},"receivers",[234,11076,9030],{"class":387},[234,11078,11079,11081,11083,11085],{"class":236,"line":546},[234,11080,9552],{"class":387},[234,11082,10465],{"class":9026},[234,11084,6564],{"class":387},[234,11086,11020],{"class":255},[234,11088,11089,11092],{"class":236,"line":552},[234,11090,11091],{"class":9026},"    slack_configs",[234,11093,9030],{"class":387},[234,11095,11096,11098,11101,11103],{"class":236,"line":557},[234,11097,9059],{"class":387},[234,11099,11100],{"class":9026},"api_url",[234,11102,6564],{"class":387},[234,11104,11105],{"class":255},"'https:\u002F\u002Fhooks.slack.com\u002Fservices\u002FSEU\u002FWEBHOOK\u002FAQUI'\n",[234,11107,11108,11111,11113],{"class":236,"line":594},[234,11109,11110],{"class":9026},"        channel",[234,11112,6564],{"class":387},[234,11114,11115],{"class":255},"'#alerts'\n",[234,11117,11118,11121,11123],{"class":236,"line":635},[234,11119,11120],{"class":9026},"        send_resolved",[234,11122,6564],{"class":387},[234,11124,10193],{"class":251},[234,11126,11127],{"class":236,"line":643},[234,11128,412],{"emptyLinePlaceholder":411},[234,11130,11131,11133,11135,11137],{"class":236,"line":659},[234,11132,9552],{"class":387},[234,11134,10465],{"class":9026},[234,11136,6564],{"class":387},[234,11138,11055],{"class":255},[234,11140,11141,11143],{"class":236,"line":683},[234,11142,11091],{"class":9026},[234,11144,9030],{"class":387},[234,11146,11147,11149,11151,11153],{"class":236,"line":695},[234,11148,9059],{"class":387},[234,11150,11100],{"class":9026},[234,11152,6564],{"class":387},[234,11154,11105],{"class":255},[234,11156,11157,11159,11161],{"class":236,"line":717},[234,11158,11110],{"class":9026},[234,11160,6564],{"class":387},[234,11162,11163],{"class":255},"'#alerts-critical'\n",[234,11165,11166,11168,11170],{"class":236,"line":723},[234,11167,11120],{"class":9026},[234,11169,6564],{"class":387},[234,11171,10193],{"class":251},[12,11173,11174,11175,11178,11179,11182],{},"Dois detalhes que economizam noite de sono. O ",[231,11176,11177],{},"for: 10m"," em CPU evita que picos curtos virem alertas — o servidor pode chegar a 95% por 30 segundos e isso ser normal. O ",[231,11180,11181],{},"repeat_interval: 4h"," pra warnings garante que um warning resolvido em uma hora não vire 60 mensagens — o Alertmanager agrupa.",[12,11184,11185,11186,11188,11189,11192,11193,11196],{},"Recarregue o Prometheus (",[231,11187,9756],{},") e teste forçando um alerta: ",[231,11190,11191],{},"stress --cpu 4 --timeout 700s"," em algum servidor deve disparar ",[231,11194,11195],{},"HighCPU"," em 10 minutos.",[19,11198,11200],{"id":11199},"passo-8-como-colocar-reverse-proxy-e-tls-na-frente","Passo 8 — Como colocar reverse proxy e TLS na frente?",[12,11202,8935,11203,101],{},[27,11204,10422],{},[12,11206,11207,11208,11210],{},"Pra acessar Grafana via ",[231,11209,10428],{}," com certificado válido, você precisa de algo na frente da porta 3000. Duas opções:",[67,11212,11213,11222],{},[70,11214,11215,11217,11218,11221],{},[27,11216,5605],{}," — se você já tem o cluster HeroCtl rodando, basta declarar o Grafana como job com ",[231,11219,11220],{},"ingress: { host: monitor.seudominio.com, tls: true }",". Certificado Let's Encrypt automático, sem ferramenta adicional.",[70,11223,11224,11227,11228],{},[27,11225,11226],{},"Caddy standalone"," no próprio VPS de observabilidade — também emite Let's Encrypt automaticamente. Caddyfile mínimo:",[224,11229,11232],{"className":11230,"code":11231,"language":2530},[2528],"monitor.seudominio.com {\n  reverse_proxy localhost:3000\n  basicauth \u002Flogin {\n    admin \u003Chash_bcrypt>\n  }\n}\n",[231,11233,11231],{"__ignoreMap":229},[12,11235,11236,11237,11240],{},"Pra defesa em profundidade, mantenha autenticação básica do Caddy\u002Froteador na frente do login do Grafana — duas barreiras, não uma. A segunda é especialmente importante porque o login default do Grafana é ",[231,11238,11239],{},"admin\u002Fadmin"," e a primeira coisa que bots fazem em um Grafana exposto é tentar essa combinação.",[19,11242,11244],{"id":11243},"passo-9-como-instrumentar-metricas-de-aplicacao","Passo 9 — Como instrumentar métricas de aplicação?",[12,11246,8935,11247,101],{},[27,11248,11249],{},"varia conforme número de aplicações",[12,11251,11252],{},"Métricas de sistema são metade da história. A outra metade é o que sua aplicação está fazendo — quantas requisições por segundo, qual a latência p99, quantos erros, qual o tamanho da fila de jobs em background.",[12,11254,11255],{},"Cada linguagem popular tem cliente Prometheus oficial:",[2735,11257,11258,11266,11274,11281],{},[70,11259,11260,6564,11263],{},[27,11261,11262],{},"Node.js",[231,11264,11265],{},"prom-client",[70,11267,11268,6564,11271],{},[27,11269,11270],{},"Python",[231,11272,11273],{},"prometheus-client",[70,11275,11276,6564,11279],{},[27,11277,11278],{},"Ruby",[231,11280,11273],{},[70,11282,11283,6564,11286],{},[27,11284,11285],{},"Go",[231,11287,11288],{},"github.com\u002Fprometheus\u002Fclient_golang",[12,11290,11291],{},"O padrão mínimo são três métricas por endpoint HTTP:",[2735,11293,11294,11308,11314],{},[70,11295,11296,11299,11300,571,11303,571,11306,101],{},[231,11297,11298],{},"http_requests_total"," — counter, com labels ",[231,11301,11302],{},"method",[231,11304,11305],{},"path",[231,11307,614],{},[70,11309,11310,11313],{},[231,11311,11312],{},"http_request_duration_seconds"," — histogram, mesmo set de labels.",[70,11315,11316,11319,11320,11323],{},[231,11317,11318],{},"app_errors_total"," — counter, com label ",[231,11321,11322],{},"kind"," (\"validation\", \"db\", \"external_api\", etc).",[12,11325,11326,11327,11329,11330,11332],{},"Exponha tudo isso em ",[231,11328,8915],{},". Adicione o endpoint no ",[231,11331,9564],{}," do Prometheus. Em horas você tem dashboards por endpoint, alertas por taxa de erro, e a capacidade de responder \"o que estava acontecendo às 3:14 de ontem\" com um gráfico em vez de um chute.",[12,11334,11335,11336,11339,11340,11343],{},"Cuidado com ",[27,11337,11338],{},"cardinalidade",". Cada combinação única de labels vira uma série temporal separada. Se você botar ",[231,11341,11342],{},"user_id"," como label, com 100k usuários você cria 100k séries — e o Prometheus vai consumir 8+ GB de RAM só pra indexar isso. Regra prática: labels têm valores em conjuntos pequenos (status code: 5 valores; método: 5 valores; path: dezenas). Identificadores únicos vão em logs, não em métricas.",[19,11345,11347],{"id":11346},"como-rodar-isso-dentro-do-heroctl-em-vez-de-vps-dedicado","Como rodar isso dentro do HeroCtl em vez de VPS dedicado?",[12,11349,11350],{},"Pra clusters que já rodam o orquestrador, faz sentido considerar a stack como mais um job. Trade-off: você economiza um VPS, mas perde isolamento (se o cluster morrer, o monitoring morre junto).",[12,11352,11353],{},"A topologia fica assim:",[2735,11355,11356,11362,11368,11374],{},[70,11357,11358,11361],{},[27,11359,11360],{},"1 job spec único"," com 4 tasks: prometheus, grafana, loki, alertmanager.",[70,11363,11364,11367],{},[27,11365,11366],{},"Volumes replicados"," no cluster — os dados sobrevivem a falha de um nó.",[70,11369,11370,11373],{},[27,11371,11372],{},"Roteador integrado"," faz o TLS automático via subdomínio. Não precisa de Caddy adicional.",[70,11375,11376,11379],{},[27,11377,11378],{},"Métricas do próprio cluster"," já são expostas em formato Prometheus na API administrativa, então o scrape é direto.",[12,11381,11382],{},"Pra produção crítica, recomendamos a separação física (VPS dedicado fora do cluster). Pra projeto pessoal, MVP, ou time pequeno onde \"tudo cair junto\" é aceitável, rodar dentro é mais barato e operacionalmente mais simples. O job spec inteiro fica em torno de 80 linhas de manifesto.",[19,11384,11386],{"id":11385},"quanto-custa-essa-stack-por-mes-no-brasil","Quanto custa essa stack por mês no Brasil?",[119,11388,11389,11399],{},[122,11390,11391],{},[125,11392,11393,11396],{},[128,11394,11395],{},"Item",[128,11397,11398],{},"Custo mensal (BRL)",[141,11400,11401,11409,11417,11425],{},[125,11402,11403,11406],{},[146,11404,11405],{},"VPS observability dedicado (4 GB RAM)",[146,11407,11408],{},"R$40 a R$80",[125,11410,11411,11414],{},[146,11412,11413],{},"Object storage pra retenção longa de logs (opcional)",[146,11415,11416],{},"R$30",[125,11418,11419,11422],{},[146,11420,11421],{},"Tempo de manutenção (2 a 4h × valor da hora)",[146,11423,11424],{},"R$200 a R$400",[125,11426,11427,11432],{},[146,11428,11429],{},[27,11430,11431],{},"Total operacional",[146,11433,11434],{},[27,11435,11436],{},"R$300 a R$500",[12,11438,11439],{},"Pra comparação, uma assinatura de Datadog ou New Relic com cobertura equivalente (5 hosts, retenção de logs de 30 dias, alertas, dashboards) sai em torno de R$1.500 a R$2.000 por mês — sem contar o overage automático que aparece no fim do mês quando alguém esquece um log verboso ligado.",[12,11441,11442],{},"A diferença não é pequena: em um ano, a stack open-source self-hosted economiza entre R$12.000 e R$18.000. Pra startup em estágio inicial, isso é meio engenheiro júnior.",[19,11444,11446],{"id":11445},"tabela-de-portas-recursos-e-caracteristicas-por-componente","Tabela de portas, recursos e características por componente",[119,11448,11449,11469],{},[122,11450,11451],{},[125,11452,11453,11455,11458,11460,11463,11466],{},[128,11454,130],{},[128,11456,11457],{},"Porta",[128,11459,3873],{},[128,11461,11462],{},"Disco",[128,11464,11465],{},"Retenção default",[128,11467,11468],{},"Formato dos dados",[141,11470,11471,11490,11508,11526,11545,11561],{},[125,11472,11473,11475,11478,11481,11484,11487],{},[146,11474,8839],{},[146,11476,11477],{},"9090",[146,11479,11480],{},"512 MB",[146,11482,11483],{},"10 GB",[146,11485,11486],{},"15 dias",[146,11488,11489],{},"TSDB binário",[125,11491,11492,11494,11497,11500,11503,11505],{},[146,11493,8845],{},[146,11495,11496],{},"3000",[146,11498,11499],{},"256 MB",[146,11501,11502],{},"1 GB",[146,11504,3056],{},[146,11506,11507],{},"SQLite ou Postgres",[125,11509,11510,11512,11515,11517,11520,11523],{},[146,11511,8851],{},[146,11513,11514],{},"3100",[146,11516,11480],{},[146,11518,11519],{},"30 GB",[146,11521,11522],{},"30 dias (configurável)",[146,11524,11525],{},"chunks comprimidos",[125,11527,11528,11531,11534,11537,11540,11542],{},[146,11529,11530],{},"Promtail \u002F Agent",[146,11532,11533],{},"9080",[146,11535,11536],{},"128 MB",[146,11538,11539],{},"mínimo",[146,11541,3056],{},[146,11543,11544],{},"passa por valor",[125,11546,11547,11549,11552,11554,11556,11558],{},[146,11548,8869],{},[146,11550,11551],{},"9093",[146,11553,11536],{},[146,11555,11502],{},[146,11557,3056],{},[146,11559,11560],{},"log de notificações",[125,11562,11563,11565,11568,11571,11573,11575],{},[146,11564,8863],{},[146,11566,11567],{},"9100",[146,11569,11570],{},"64 MB",[146,11572,11539],{},[146,11574,3056],{},[146,11576,11577],{},"endpoint de scrape",[12,11579,11580],{},"Essas são as mínimas viáveis pra cluster pequeno. Em produção com 30 servidores e tráfego real, multiplique RAM por 3 e disco por 5.",[19,11582,11584],{"id":11583},"os-quatro-erros-que-matam-stack-de-monitoring-nova","Os quatro erros que matam stack de monitoring nova",[12,11586,11587],{},"Times montando observabilidade pela primeira vez tropeçam quase sempre nos mesmos quatro erros. Saber sobre eles antes economiza meses.",[12,11589,11590,11593,11594,11597],{},[27,11591,11592],{},"Não monitorar o monitoring."," O Prometheus parou de scrape na quinta-feira; ninguém viu. Na quarta-feira da semana seguinte um servidor caiu de verdade e descobriram que não tinha alerta porque o Prometheus estava morto há 6 dias. Solução: configure um cron externo simples (até um Pingdom gratuito serve) que bate em ",[231,11595,11596],{},"https:\u002F\u002Fmonitor.seudominio.com\u002Fapi\u002Fhealth"," a cada 5 minutos e te avisa quando o próprio Grafana cair.",[12,11599,11600,11603,11604,11607],{},[27,11601,11602],{},"Sem estratégia de retenção."," Disco enche em três meses, Prometheus para de gravar, alguém deleta tudo no desespero, perde 90 dias de histórico. Configure ",[231,11605,11606],{},"--storage.tsdb.retention.time=30d"," desde o dia um e estabeleça um job de housekeeping.",[12,11609,11610,11613,11614,571,11616,11619],{},[27,11611,11612],{},"Cardinalidade alta em labels."," Já cobrimos no passo 9, mas vale repetir: cada ",[231,11615,11342],{},[231,11617,11618],{},"request_id"," ou UUID que vira label é um número que multiplica explosivamente o consumo de RAM do Prometheus. Identificadores únicos vão pra Loki, não pro Prometheus.",[12,11621,11622,11625],{},[27,11623,11624],{},"Alertas barulhentos."," O time recebe 200 alertas por dia. Em duas semanas, ninguém olha mais. Quando o site cair de verdade, o alerta vai estar no meio de outros 199. Solução: comece com seis alertas (os do passo 7), audite a cada duas semanas, e exclua tudo que disparou mas não exigiu ação humana. Alerta sem ação é ruído.",[19,11627,3226],{"id":3225},[12,11629,11630,11633],{},[27,11631,11632],{},"Posso rodar tudo num VPS de 2 GB?","\nTecnicamente sim, pra cluster de até 3 servidores e poucas aplicações. Na prática você vai bater no teto de RAM em 2 a 3 meses, especialmente se importar dashboards densos no Grafana. Pague os 50 reais a mais e vá direto pro VPS de 4 GB — o tempo que você economiza não brigando com OOM kills paga sozinho.",[12,11635,11636,11639],{},[27,11637,11638],{},"Quanto de disco pra 30 dias de logs?","\nDepende totalmente do volume de logs da sua aplicação. Regra grosseira pra startup pequena: cluster de 4 servidores com aplicações web normais gera 1 a 5 GB de logs por dia depois de compressão do Loki. Trinta dias dá entre 30 e 150 GB. Comece com 50 GB de SSD, monitore o crescimento por duas semanas, expanda se necessário. Se você for muito mais que isso, é hora de ir pra object storage.",[12,11641,11642,11645],{},[27,11643,11644],{},"Grafana Cloud vs self-hosted, qual escolher?","\nGrafana Cloud free tier é generoso (10k séries, 50 GB de logs, retenção de 14 dias) e elimina o trabalho de manter o servidor. Pra projeto solo ou time muito pequeno, faz sentido. A partir do momento que você passa do free tier, os preços escalam rápido — a partir de US$50\u002Fmês — e você perde o controle sobre os dados. Self-hosted custa hardware + tempo, Cloud custa dinheiro + lock-in. Pra empresa que pretende crescer e tem um dev DevOps no time, self-hosted ganha.",[12,11647,11648,11651],{},[27,11649,11650],{},"Promtail ou Grafana Agent?","\nEm 2026, o Grafana Agent (rebatizado pra Grafana Alloy) está substituindo o Promtail oficialmente. Pra setup novo, vá direto de Alloy. Pra setup que já roda Promtail há tempo, não tem urgência em migrar — o Promtail vai continuar funcionando por anos.",[12,11653,11654,11657,11658,11660],{},[27,11655,11656],{},"OpenTelemetry encaixa onde nessa stack?","\nOTel é o padrão de instrumentação de aplicação que está consolidando. Em vez de usar ",[231,11659,11265],{}," direto, você usa o SDK do OTel e ele exporta pra Prometheus, Loki e Tempo simultaneamente. A vantagem grande é portabilidade — se você quiser trocar Prometheus por outra coisa daqui a 3 anos, sua aplicação não muda uma linha. Pra startup começando hoje, recomendamos OTel desde o dia um.",[12,11662,11663,11666,11667,11670,11671,11674],{},[27,11664,11665],{},"Como faço backup do Prometheus?","\nPrometheus tem snapshot via API: ",[231,11668,11669],{},"curl -X POST localhost:9090\u002Fapi\u002Fv1\u002Fadmin\u002Ftsdb\u002Fsnapshot"," cria um snapshot no diretório de dados. Faça isso uma vez por dia via cron, faça ",[231,11672,11673],{},"tar.gz"," e envie pra object storage. Em caso de desastre, o que você perde é métricas — e métricas, diferente de logs, são tipicamente recuperáveis em horas (volta a coletar e os dashboards voltam). Logs perdidos são perdidos pra sempre, então invista mais em backup de Loki.",[12,11676,11677,11680],{},[27,11678,11679],{},"Tempo (traces distribuídos) vale instalar agora?","\nNão. Traces ficam úteis a partir do momento que você tem 5+ serviços conversando entre si e debugar latência envolve seguir uma requisição por vários hops. Pra arquitetura monolítica ou poucos serviços, traces dão trabalho desproporcional ao valor. Adicione quando a complexidade pedir.",[12,11682,11683,11686],{},[27,11684,11685],{},"Loki indexa full-text como ELK?","\nNão, e essa é a feature, não bug. Loki indexa apenas labels (job, host, container, severity) e o conteúdo do log fica comprimido sem índice. Pra buscar texto, você filtra por labels primeiro e depois faz grep nos chunks resultantes. Isso é o que torna o Loki dez vezes mais barato que ELK em RAM e CPU. Em troca, queries de texto livre em todo o histórico são mais lentas. Pra 90% dos casos de debugging, filtrar por job + host + janela de tempo já reduz pra dezenas de MB onde o grep voa.",[19,11688,11690],{"id":11689},"proximos-passos","Próximos passos",[12,11692,11693],{},"Subiu a stack, tem dashboard, tem alerta, tem log pesquisável? Boa. As próximas três coisas que valem o investimento são, em ordem:",[67,11695,11696,11702,11716],{},[70,11697,11698,11701],{},[27,11699,11700],{},"Custom dashboards por aplicação"," — métricas de negócio (assinaturas criadas\u002Fhora, jobs processados, fila de e-mails) em vez de só infraestrutura.",[70,11703,11704,11707,11708,11711,11712,11715],{},[27,11705,11706],{},"Runbooks linkados nos alertas"," — toda regra em ",[231,11709,11710],{},"alerts.yml"," deve ter ",[231,11713,11714],{},"annotations.runbook_url"," apontando pra uma página explicando o que fazer. Quando o alerta dispara às 3 da manhã, o sono não pensa.",[70,11717,11718,11721],{},[27,11719,11720],{},"Revisão mensal de alertas"," — 30 minutos uma vez por mês auditando o que disparou no mês anterior, deletando o que virou ruído, ajustando thresholds.",[12,11723,11724,11725,11729,11730,101],{},"Pra quem quer ir além e entender por que escolhemos essa stack em vez de SaaS gerenciado, leia ",[3337,11726,11728],{"href":11727},"\u002Fblog\u002Fobservabilidade-sem-datadog-stack-startup","Observabilidade sem Datadog: a stack da startup brasileira",". E pra fechar o ciclo de operação — porque não adianta saber que o banco caiu se você não consegue restaurar — vale ler ",[3337,11731,11733],{"href":11732},"\u002Fblog\u002Fbackup-banco-em-cluster-estrategias-3-da-manha","Backup de banco em cluster: estratégias pras 3 da manhã",[12,11735,11736],{},"Se você quer pular essa montagem toda e rodar a stack como job dentro de um orquestrador que já cuida de TLS, rolling deploy e replicação de volume:",[224,11738,11739],{"className":226,"code":5319,"language":228,"meta":229,"style":229},[231,11740,11741],{"__ignoreMap":229},[234,11742,11743,11745,11747,11749,11751],{"class":236,"line":237},[234,11744,1220],{"class":247},[234,11746,2958],{"class":251},[234,11748,5330],{"class":255},[234,11750,2964],{"class":383},[234,11752,2967],{"class":247},[12,11754,11755],{},"Quatro horas viram quarenta minutos. O resto é o mesmo trabalho de pensar quais alertas importam — e nessa parte ninguém te livra.",[3351,11757,11758],{},"html pre.shiki code .sFSAA, html code.shiki .sFSAA{--shiki-default:#79C0FF}html pre.shiki code .s9uIt, html code.shiki .s9uIt{--shiki-default:#A5D6FF}html pre.shiki code .sQhOw, html code.shiki .sQhOw{--shiki-default:#FFA657}html pre.shiki code .sH3jZ, html code.shiki .sH3jZ{--shiki-default:#8B949E}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .suJrU, html code.shiki .suJrU{--shiki-default:#FF7B72}html pre.shiki code .sZEs4, html code.shiki .sZEs4{--shiki-default:#E6EDF3}html pre.shiki code .sPWt5, html code.shiki .sPWt5{--shiki-default:#7EE787}",{"title":229,"searchDepth":244,"depth":244,"links":11760},[11761,11762,11763,11764,11765,11766,11767,11768,11769,11770,11771,11772,11773,11774,11775,11776,11777,11778],{"id":21,"depth":244,"text":22},{"id":8828,"depth":244,"text":8829},{"id":8888,"depth":244,"text":8889},{"id":8931,"depth":244,"text":8932},{"id":8988,"depth":244,"text":8989},{"id":9448,"depth":244,"text":9449},{"id":9772,"depth":244,"text":9773},{"id":9938,"depth":244,"text":9939},{"id":10416,"depth":244,"text":10417},{"id":10590,"depth":244,"text":10591},{"id":11199,"depth":244,"text":11200},{"id":11243,"depth":244,"text":11244},{"id":11346,"depth":244,"text":11347},{"id":11385,"depth":244,"text":11386},{"id":11445,"depth":244,"text":11446},{"id":11583,"depth":244,"text":11584},{"id":3225,"depth":244,"text":3226},{"id":11689,"depth":244,"text":11690},"2026-05-12","Tutorial honesto pra subir métricas, logs e dashboards pro seu cluster — em 4 horas, sem Datadog. Stack open-source que cabe em 1 VPS de R$80\u002Fmês.",{},"\u002Fblog\u002Fmonitoring-stack-completa-prometheus-grafana-loki-passo-a-passo",{"title":8781,"description":11780},{"loc":11782},"blog\u002Fmonitoring-stack-completa-prometheus-grafana-loki-passo-a-passo",[11787,11788,11789,11790,3393,3379],"prometheus","grafana","loki","monitoring","oC9lCwAyyAdpz2EHoBKkH49q8NBMUQp9-nioO314jWo",{"id":11793,"title":11794,"author":7,"body":11795,"category":3379,"cover":3380,"date":12744,"description":12745,"draft":3383,"extension":3384,"lastReviewed":3380,"meta":12746,"navigation":411,"path":12747,"readingTime":4401,"seo":12748,"sitemap":12749,"stem":12750,"tags":12751,"__hash__":12756},"blog_pt\u002Fblog\u002Fcloudflare-na-frente-cluster-auto-hospedado-vale-pena.md","Cloudflare na frente do cluster auto-hospedado: vale a pena em 2026?",{"type":9,"value":11796,"toc":12722},[11797,11800,11804,11807,11810,11813,11817,11820,11876,11879,11883,11886,12026,12029,12033,12036,12042,12048,12055,12058,12062,12065,12091,12098,12101,12121,12125,12128,12166,12169,12173,12176,12249,12268,12272,12275,12281,12287,12293,12299,12303,12306,12326,12329,12333,12536,12539,12543,12546,12566,12570,12573,12577,12583,12587,12590,12594,12597,12633,12636,12640,12643,12647,12650,12654,12661,12665,12668,12672,12675,12678,12694,12697,12700,12717,12720],[12,11798,11799],{},"A pergunta volta toda semana num grupo de DevOps brasileiro: \"subi meu cluster com três servidores na DigitalOcean, vale botar Cloudflare na frente?\". A resposta curta é \"quase sempre sim\" — mas o \"quase\" carrega trade-offs que ninguém menciona até a primeira vez que algo quebra em produção e você passa duas horas debugando uma regra de cache que mascarou um 500 do app. Este post é a versão longa, com critérios mensuráveis, da decisão que você precisa tomar antes de mover o nameserver.",[19,11801,11803],{"id":11802},"tldr-o-resumo-de-200-palavras","TL;DR — o resumo de 200 palavras",[12,11805,11806],{},"Cloudflare grátis virou padrão de fato pra qualquer site brasileiro com tráfego: protege contra DDoS sem limite contratual, emite certificado SSL automático, cacha assets em mais de 300 cidades, esconde o IP de origem do servidor e ainda entrega DNS com sub-10ms. Pra cluster auto-hospedado — seja HeroCtl, Coolify, k3s ou Docker Swarm — pôr Cloudflare na frente é decisão fácil em cerca de 90% dos casos.",[12,11808,11809],{},"Os 10% restantes têm trade-offs concretos: latência adicional de 10 a 30ms em rotas dinâmicas, TLS termina em Cloudflare por padrão (não é mais ponta-a-ponta até o seu servidor), regras de cache podem mascarar bugs sutis no app, e o lock-in cresce conforme você adota Workers, R2 e Pages.",[12,11811,11812],{},"Vale a pena quando: você quer DDoS protection sem pagar; cache global pra reduzir custo de banda; esconder o IP do servidor de scanners. Não vale quando: compliance financeiro\u002Fsaúde exige TLS verdadeiramente ponta-a-ponta; você precisa de p99 abaixo de 50ms em rotas dinâmicas; o cluster já tem CDN edge interna em múltiplos data centers. Cluster com roteador integrado já cobre cerca de 60% do que Cloudflare oferece — combinar os dois é o caminho mais comum.",[19,11814,11816],{"id":11815},"o-que-cloudflare-oferece-gratis-em-2026","O que Cloudflare oferece grátis em 2026?",[12,11818,11819],{},"A oferta gratuita aumentou de tamanho ano a ano. Hoje, o plano grátis cobre o que era plano pago de 2019:",[2735,11821,11822,11828,11834,11840,11846,11852,11858,11864,11870],{},[70,11823,11824,11827],{},[27,11825,11826],{},"DDoS protection sem limite contratual"," — Layer 3, 4 e 7. Cloudflare absorve ataques de centenas de Gbps sem cobrar excedente.",[70,11829,11830,11833],{},[27,11831,11832],{},"Certificado SSL\u002FTLS automático"," — emitido em minutos pelo próprio Cloudflare, renovado automaticamente. Wildcard requer plano Advanced Certificate Manager (US$ 10\u002Fmês).",[70,11835,11836,11839],{},[27,11837,11838],{},"CDN global"," — mais de 300 cidades em mais de 120 países. Inclui São Paulo, Rio, Fortaleza, Curitiba e Porto Alegre.",[70,11841,11842,11845],{},[27,11843,11844],{},"DNS authoritative"," — sub-10ms global médio, anycast, com APIs para automação.",[70,11847,11848,11851],{},[27,11849,11850],{},"Bot protection básica"," — bloqueio de bots conhecidos e desafios JavaScript em tráfego suspeito.",[70,11853,11854,11857],{},[27,11855,11856],{},"Cache de assets estáticos"," — extensões reconhecidas (CSS, JS, imagens, fontes) cacheadas por padrão.",[70,11859,11860,11863],{},[27,11861,11862],{},"Page Rules"," — três regras grátis para forçar HTTPS, cache extra, redirects.",[70,11865,11866,11869],{},[27,11867,11868],{},"Always Online"," — quando a origem cai, Cloudflare serve a última versão cacheada.",[70,11871,11872,11875],{},[27,11873,11874],{},"Web Analytics"," — métricas de RUM (visitas, países, navegadores), sem cookies.",[12,11877,11878],{},"A linha de corte é generosa o suficiente pra que um site de 10 mil visitantes\u002Fdia rode 100% no grátis sem nenhum problema operacional.",[19,11880,11882],{"id":11881},"e-o-que-cloudflare-cobra-extra","E o que Cloudflare cobra extra?",[12,11884,11885],{},"Quatro planos: Free, Pro (US$ 25\u002Fmês por domínio), Business (US$ 250\u002Fmês por domínio) e Enterprise (sob consulta, em geral acima de US$ 5 mil\u002Fmês).",[119,11887,11888,11905],{},[122,11889,11890],{},[125,11891,11892,11895,11897,11900,11903],{},[128,11893,11894],{},"Recurso",[128,11896,7831],{},[128,11898,11899],{},"Pro US$ 25",[128,11901,11902],{},"Business US$ 250",[128,11904,4359],{},[141,11906,11907,11923,11937,11950,11964,11979,11992,12009],{},[125,11908,11909,11912,11914,11917,11920],{},[146,11910,11911],{},"WAF managed rulesets",[146,11913,3059],{},[146,11915,11916],{},"Sim (OWASP básico)",[146,11918,11919],{},"Sim (avançado)",[146,11921,11922],{},"Custom",[125,11924,11925,11928,11930,11933,11935],{},[146,11926,11927],{},"Image Resizing",[146,11929,3059],{},[146,11931,11932],{},"Sim (US$ 5\u002FM)",[146,11934,3065],{},[146,11936,3065],{},[125,11938,11939,11942,11944,11946,11948],{},[146,11940,11941],{},"Polish (otimização de imagem)",[146,11943,3059],{},[146,11945,3065],{},[146,11947,3065],{},[146,11949,3065],{},[125,11951,11952,11955,11957,11960,11962],{},[146,11953,11954],{},"Argo Smart Routing",[146,11956,3059],{},[146,11958,11959],{},"US$ 5\u002Fmês add-on",[146,11961,3065],{},[146,11963,3065],{},[125,11965,11966,11969,11971,11974,11976],{},[146,11967,11968],{},"Page Rules incluídas",[146,11970,2699],{},[146,11972,11973],{},"20",[146,11975,5651],{},[146,11977,11978],{},"125+",[125,11980,11981,11984,11986,11988,11990],{},[146,11982,11983],{},"Cache Reserve",[146,11985,3059],{},[146,11987,3059],{},[146,11989,3065],{},[146,11991,3065],{},[125,11993,11994,11997,12000,12003,12006],{},[146,11995,11996],{},"Customer Support SLA",[146,11998,11999],{},"Best-effort",[146,12001,12002],{},"24h",[146,12004,12005],{},"Chat 24\u002F7",[146,12007,12008],{},"Engenheiro dedicado",[125,12010,12011,12014,12017,12020,12023],{},[146,12012,12013],{},"Análise de logs",[146,12015,12016],{},"Última hora",[146,12018,12019],{},"Últimas 24h",[146,12021,12022],{},"Últimos 7 dias",[146,12024,12025],{},"30 dias",[12,12027,12028],{},"Workers e R2 têm tier gratuito independente do plano: 100 mil requisições\u002Fdia para Workers, 10 GB de armazenamento e 1 milhão de operações Class A\u002Fmês para R2. Para um site marketing modesto, dá pra rodar storage de imagens no R2 sem nunca chegar à fatura.",[19,12030,12032],{"id":12031},"cloudflare-adiciona-latencia","Cloudflare adiciona latência?",[12,12034,12035],{},"A pergunta honesta. Resposta também honesta: depende da rota.",[12,12037,12038,12041],{},[27,12039,12040],{},"Para rotas com cache"," (HTML estático, assets, imagens otimizadas), Cloudflare reduz latência. O usuário em Recife pega o conteúdo do POP de Fortaleza ou São Paulo em 15 a 40ms, em vez de fazer round-trip até seu servidor em New Jersey ou Frankfurt. Economia típica: 150 a 250ms por request.",[12,12043,12044,12047],{},[27,12045,12046],{},"Para rotas dinâmicas"," (API, dashboard logado, checkout), o tráfego passa pelo proxy do Cloudflare antes de chegar ao seu servidor. Isso adiciona entre 10 e 30ms em condições normais. O número exato depende de qual POP o usuário está conectado e onde está o servidor de origem.",[12,12049,12050,12051,12054],{},"Mensuramos no cluster público em produção: a média de tempo de resposta do ",[231,12052,12053],{},"manage.heroctl.com\u002Fv1\u002Fnodes"," é de 38ms sem proxy Cloudflare e 51ms com proxy ativado, requisitando do mesmo notebook em São Paulo. Um delta de 13ms — perceptível em benchmark, invisível para humano.",[12,12056,12057],{},"A latência só é dealbreaker em três cenários reais: jogos online, leilão financeiro de alta frequência, e cargas WebSocket de baixa latência (trading, colaboração ao vivo). Pro resto, os 13ms somem no tempo de render do navegador.",[19,12059,12061],{"id":12060},"cloudflare-quebra-tls-ponta-a-ponta","Cloudflare quebra TLS ponta-a-ponta?",[12,12063,12064],{},"Por padrão, sim. Veja os modos:",[2735,12066,12067,12073,12079,12085],{},[70,12068,12069,12072],{},[27,12070,12071],{},"Flexible"," (NUNCA use isso) — TLS só entre cliente e Cloudflare. Conexão Cloudflare → servidor é HTTP puro. Vulnerável a interceptação na perna interna.",[70,12074,12075,12078],{},[27,12076,12077],{},"Full"," — TLS entre cliente e Cloudflare, e separadamente entre Cloudflare e servidor. Mas Cloudflare aceita certificado inválido\u002Fauto-assinado no servidor. Risco de man-in-the-middle entre Cloudflare e a origem.",[70,12080,12081,12084],{},[27,12082,12083],{},"Full (strict)"," — TLS em ambas as pernas, e Cloudflare exige certificado válido na origem. Esta é a configuração mínima razoável.",[70,12086,12087,12090],{},[27,12088,12089],{},"Strict (SSL-Only Origin Pull)"," — Cloudflare verifica que o certificado da origem foi emitido por uma CA pública e válida pro hostname. Mais seguro que Full strict.",[12,12092,12093,12094,12097],{},"Em todos esses modos, ",[27,12095,12096],{},"Cloudflare descriptografa o tráfego no meio do caminho",". Eles veem corpo de request, headers, cookies — tudo. Para a maioria dos casos isso é aceitável (o contrato com Cloudflare é claro), mas em compliance estrito (saúde, financeiro, governo) pode quebrar requisito de auditoria.",[12,12099,12100],{},"A saída real para ponta-a-ponta:",[2735,12102,12103,12109,12115],{},[70,12104,12105,12108],{},[27,12106,12107],{},"Authenticated Origin Pulls"," — Cloudflare apresenta um certificado cliente quando conecta na sua origem; o servidor só aceita conexões dessa cadeia. Continua descriptografando no meio, mas pelo menos só Cloudflare consegue chegar na sua origem.",[70,12110,12111,12114],{},[27,12112,12113],{},"Cloudflare Tunnel + cliente mTLS na ponta"," — para apps internas, Tunnel substitui IP público e exige certificado de cliente.",[70,12116,12117,12120],{},[27,12118,12119],{},"Gray cloud (DNS only)"," — desativa o proxy. Você perde DDoS protection, cache, WAF — mas ganha conexão direta cliente-servidor com TLS verdadeiramente ponta-a-ponta. É uma opção válida quando compliance manda.",[19,12122,12124],{"id":12123},"vou-ficar-lock-in-com-cloudflare","Vou ficar lock-in com Cloudflare?",[12,12126,12127],{},"Depende exclusivamente de quais features você adota. Vamos por camada:",[2735,12129,12130,12136,12142,12148,12154,12160],{},[70,12131,12132,12135],{},[27,12133,12134],{},"DNS"," — trivialmente reversível. Mover nameserver leva 24 a 48h de propagação e nada quebra. Lock-in zero.",[70,12137,12138,12141],{},[27,12139,12140],{},"Proxy + cache + WAF"," — reversível em horas. Você desativa o orange cloud, ajusta DNS para apontar direto pro servidor, reconfigura WAF na sua origem (se houver). Lock-in baixo.",[70,12143,12144,12147],{},[27,12145,12146],{},"Workers"," — lock-in real. A API de Workers é proprietária; reescrever pra Lambda@Edge ou Fastly Compute@Edge custa de dias a semanas dependendo do código. Não é o pior caso, mas conte com retrabalho.",[70,12149,12150,12153],{},[27,12151,12152],{},"R2 Object Storage"," — API compatível com S3, então código continua funcionando. Mas R2 não cobra egress (S3 cobra US$ 0,09\u002FGB), então mover pra outro provedor encarece a conta. Lock-in econômico, não técnico.",[70,12155,12156,12159],{},[27,12157,12158],{},"Pages"," — lock-in moderado. Build process é custom; rewrite pra Vercel\u002FNetlify\u002Fstatic host genérico leva uma tarde, mas exige.",[70,12161,12162,12165],{},[27,12163,12164],{},"Zero Trust"," — lock-in alto. Políticas, identidade, túneis: rewrite completo pra Tailscale\u002FTwingate\u002Fequivalente.",[12,12167,12168],{},"A recomendação operacional é: use o core Cloudflare (DNS + proxy + WAF + Page Rules) sem hesitar — você pode reverter num dia. Adote Workers\u002FR2\u002FPages só com consciência clara de que está aceitando lock-in proporcional ao valor que aquela feature entrega.",[19,12170,12172],{"id":12171},"configuracao-minima-recomendada-para-cluster-auto-hospedado","Configuração mínima recomendada para cluster auto-hospedado",[12,12174,12175],{},"Sequência prática, sem segredo:",[67,12177,12178,12184,12193,12203,12209,12215,12221,12231,12237,12243],{},[70,12179,12180,12183],{},[27,12181,12182],{},"Crie conta no Cloudflare"," e adicione o domínio. O site vai escanear seus DNS records atuais e copiar para a nova zona.",[70,12185,12186,12189,12190,101],{},[27,12187,12188],{},"Mude os nameservers"," no registrar (Hostinger, Registro.br, GoDaddy, onde quer que esteja). Espera de 4 a 48 horas pela propagação. Verifique com ",[231,12191,12192],{},"dig NS heroctl.com +short",[70,12194,12195,12198,12199,12202],{},[27,12196,12197],{},"DNS records do cluster",": crie um registro A para o domínio raiz apontando pro IP do servidor que recebe tráfego, e um registro A wildcard ",[231,12200,12201],{},"*"," apontando pro mesmo IP. Marque ambos com proxy ativado (orange cloud).",[70,12204,12205,12208],{},[27,12206,12207],{},"SSL\u002FTLS mode",": configure Full (strict). Isso exige que o cluster tenha um certificado válido. O roteador integrado do HeroCtl emite Let's Encrypt automaticamente — funciona out-of-the-box.",[70,12210,12211,12214],{},[27,12212,12213],{},"Always Use HTTPS",": ON. Redireciona qualquer HTTP para HTTPS na borda.",[70,12216,12217,12220],{},[27,12218,12219],{},"HSTS",": 6 meses, include subdomains, no preload por enquanto. Preload é decisão definitiva — não dá pra desfazer rápido se algo quebrar.",[70,12222,12223,12226,12227,12230],{},[27,12224,12225],{},"Page Rule de cache"," para assets estáticos: ",[231,12228,12229],{},"*heroctl.com\u002Fstatic\u002F*"," → Cache Level: Cache Everything, Edge Cache TTL: 1 mês.",[70,12232,12233,12236],{},[27,12234,12235],{},"WAF managed ruleset"," (Pro+): ative o Cloudflare Managed Ruleset e o OWASP Core Rule Set em modo Block para regras de score alto.",[70,12238,12239,12242],{},[27,12240,12241],{},"Security Level",": Medium. Low deixa passar bot demais; High desafia gente legítima.",[70,12244,12245,12248],{},[27,12246,12247],{},"Bot Fight Mode",": ON no plano grátis. Controla scrapers básicos sem pedir CAPTCHA pro humano.",[12,12250,12251,12252,12255,12256,12259,12260,12263,12264,12267],{},"Depois de aplicar tudo isso, rode ",[231,12253,12254],{},"curl -I https:\u002F\u002Fseudominio.com"," e confirme: header ",[231,12257,12258],{},"cf-ray"," presente, header ",[231,12261,12262],{},"server: cloudflare",", header ",[231,12265,12266],{},"strict-transport-security"," com max-age longo.",[19,12269,12271],{"id":12270},"quando-nao-vale-cloudflare","Quando NÃO vale Cloudflare?",[12,12273,12274],{},"Quatro cenários onde a recomendação muda. Importam mais que parecem.",[12,12276,12277,12280],{},[27,12278,12279],{},"Cluster com CDN\u002Fedge interna robusta."," Se você já roda em quatro ou cinco regiões geograficamente espalhadas, com balanceamento DNS por proximidade e cache local em cada região, a CDN do Cloudflare adiciona latência sem ganho. Vale rodar gray cloud (só DNS) e manter o resto direto.",[12,12282,12283,12286],{},[27,12284,12285],{},"Compliance financeiro ou de saúde com mTLS ponta-a-ponta obrigatório."," A LGPD por si só não exige isso; mas auditorias específicas (PCI-DSS Level 1 com requisitos custom, certificações HIPAA estritas, frameworks bancários) podem exigir que tráfego cifrado nunca seja descriptografado em terceiro. Como Cloudflare descriptografa no meio do caminho, não passa.",[12,12288,12289,12292],{},[27,12290,12291],{},"Apps puramente internas (intranet\u002FSaaS B2B fechado)."," Cloudflare Free não cobre Zero Trust avançado. Pra app que serve exclusivamente funcionários, Tailscale ou WireGuard nativo entregam mais com menos.",[12,12294,12295,12298],{},[27,12296,12297],{},"Sites pequenos sem tráfego e sem inimigo público."," Blog pessoal de 200 visitas\u002Fmês, sem formulário de pagamento, sem dados sensíveis. DNS direto na Hostinger\u002FRegistro.br + Let's Encrypt do roteador integrado serve perfeitamente. Adicionar Cloudflare é cerimônia desnecessária.",[19,12300,12302],{"id":12301},"como-cloudflare-interage-com-cluster-de-alta-disponibilidade","Como Cloudflare interage com cluster de alta disponibilidade?",[12,12304,12305],{},"Aqui o desenho importa. Cluster com três ou mais nós serve tráfego em todos eles — não tem nó \"principal\" único. A configuração pragmática é:",[2735,12307,12308,12314,12320],{},[70,12309,12310,12313],{},[27,12311,12312],{},"DNS round-robin com saúde",": registre A records pro IP de todos os nós que rodam o roteador. Cloudflare faz health check (Pro+) e remove nó quebrado da rotação automaticamente.",[70,12315,12316,12319],{},[27,12317,12318],{},"Failover de Cloudflare",": ~30 segundos pra detectar nó morto e tirar da rotação (configurável até 5 segundos no Enterprise).",[70,12321,12322,12325],{},[27,12323,12324],{},"Failover interno do cluster",": o roteador integrado do HeroCtl reroteia tráfego entre nós saudáveis em cerca de 5 segundos. Eleição de novo coordenador acontece em ~7 segundos quando o nó-líder cai.",[12,12327,12328],{},"Combinado, downtime real percebido pelo usuário fica abaixo de 40 segundos no pior caso (Cloudflare detecta + cluster reage). Sem Cloudflare, fica em ~7 segundos (cluster sozinho). Com Cloudflare e configuração de monitoramento agressiva (Pro+), volta pra ~10 segundos. A escolha é clara: se você não precisa de DDoS protection, o cluster sozinho já é mais rápido. Se precisa, Cloudflare adiciona 30s de detecção em troca de proteção contra ataque.",[19,12330,12332],{"id":12331},"tabela-comparativa-12-criterios-de-decisao","Tabela comparativa: 12 critérios de decisão",[119,12334,12335,12353],{},[122,12336,12337],{},[125,12338,12339,12341,12344,12347,12350],{},[128,12340,2983],{},[128,12342,12343],{},"Sem Cloudflare",[128,12345,12346],{},"CF Free",[128,12348,12349],{},"CF Pro US$ 25",[128,12351,12352],{},"CF Business US$ 250",[141,12354,12355,12371,12388,12405,12421,12434,12449,12464,12479,12491,12503,12519],{},[125,12356,12357,12360,12363,12366,12368],{},[146,12358,12359],{},"DDoS Layer 3\u002F4",[146,12361,12362],{},"Você se vira",[146,12364,12365],{},"Ilimitado",[146,12367,12365],{},[146,12369,12370],{},"Ilimitado + SLA",[125,12372,12373,12376,12379,12382,12385],{},[146,12374,12375],{},"DDoS Layer 7",[146,12377,12378],{},"Não tem",[146,12380,12381],{},"Básico",[146,12383,12384],{},"Avançado",[146,12386,12387],{},"Avançado + Custom Rules",[125,12389,12390,12393,12396,12399,12402],{},[146,12391,12392],{},"Latência adicional em rotas dinâmicas",[146,12394,12395],{},"0ms",[146,12397,12398],{},"+13 a 30ms",[146,12400,12401],{},"+10 a 25ms (Argo opcional)",[146,12403,12404],{},"+5 a 15ms (Argo incluído)",[125,12406,12407,12410,12413,12416,12418],{},[146,12408,12409],{},"Cache global de estáticos",[146,12411,12412],{},"Você monta",[146,12414,12415],{},"300+ cidades",[146,12417,12415],{},[146,12419,12420],{},"300+ cidades + Reserve",[125,12422,12423,12426,12428,12430,12432],{},[146,12424,12425],{},"Esconde IP do servidor",[146,12427,3059],{},[146,12429,3065],{},[146,12431,3065],{},[146,12433,3065],{},[125,12435,12436,12439,12441,12444,12446],{},[146,12437,12438],{},"TLS ponta-a-ponta verdadeiro",[146,12440,3065],{},[146,12442,12443],{},"Não (descriptografa)",[146,12445,3059],{},[146,12447,12448],{},"Não (mas Origin Pulls)",[125,12450,12451,12454,12456,12458,12461],{},[146,12452,12453],{},"WAF managed",[146,12455,12378],{},[146,12457,3059],{},[146,12459,12460],{},"OWASP básico",[146,12462,12463],{},"OWASP avançado",[125,12465,12466,12469,12471,12473,12476],{},[146,12467,12468],{},"Bot protection",[146,12470,12412],{},[146,12472,12247],{},[146,12474,12475],{},"Super Bot Fight",[146,12477,12478],{},"Bot Management ML",[125,12480,12481,12483,12485,12487,12489],{},[146,12482,11862],{},[146,12484,3056],{},[146,12486,2699],{},[146,12488,11973],{},[146,12490,5651],{},[125,12492,12493,12495,12497,12499,12501],{},[146,12494,11868],{},[146,12496,3059],{},[146,12498,3065],{},[146,12500,3065],{},[146,12502,3065],{},[125,12504,12505,12508,12511,12513,12516],{},[146,12506,12507],{},"Custo mensal por domínio",[146,12509,12510],{},"US$ 0",[146,12512,12510],{},[146,12514,12515],{},"US$ 25",[146,12517,12518],{},"US$ 250",[125,12520,12521,12524,12527,12530,12533],{},[146,12522,12523],{},"Lock-in proporcional",[146,12525,12526],{},"Zero",[146,12528,12529],{},"Baixo (DNS+proxy)",[146,12531,12532],{},"Baixo a médio",[146,12534,12535],{},"Médio (Workers\u002FR2 começam a entrar)",[12,12537,12538],{},"A linha que decide pra maioria é \"DDoS Layer 7 + esconde IP\". Esses dois sozinhos justificam o plano grátis. As linhas pagas só fazem sentido com tráfego volumoso ou requisito formal de WAF.",[19,12540,12542],{"id":12541},"cloudflare-gratis-tem-limite-de-trafego","Cloudflare grátis tem limite de tráfego?",[12,12544,12545],{},"Não há limite contratual de banda no plano grátis para tráfego web normal através do proxy. Mas existem três limites práticos que valem mencionar:",[2735,12547,12548,12554,12560],{},[70,12549,12550,12553],{},[27,12551,12552],{},"Section 2.8 dos Terms of Service",": o plano grátis é para sites cujo conteúdo principal é HTML, e Cloudflare reserva o direito de pedir upgrade se você usa o serviço primariamente para servir vídeo ou arquivos grandes. Na prática, raramente acionam — mas se você vira um host de vídeos pirateados de 50TB\u002Fmês, espera receber e-mail.",[70,12555,12556,12559],{},[27,12557,12558],{},"Workers grátis",": 100 mil requisições\u002Fdia. Acima disso, Workers Paid (US$ 5\u002Fmês) com 10M requisições incluídas.",[70,12561,12562,12565],{},[27,12563,12564],{},"R2 grátis",": 10GB de armazenamento, 1M Class A operations\u002Fmês, 10M Class B operations\u002Fmês. Acima, US$ 0,015\u002FGB-mês.",[19,12567,12569],{"id":12568},"posso-usar-cloudflare-dns-sem-o-proxy","Posso usar Cloudflare DNS sem o proxy?",[12,12571,12572],{},"Sim — modo \"DNS only\" (gray cloud). Você usa o DNS do Cloudflare (rápido, free, anycast global) mas tráfego vai direto pro seu servidor sem passar pelo proxy. Perde DDoS, cache, WAF, IP hiding — mantém só a infraestrutura DNS. Útil quando: compliance proíbe descriptografia em terceiro; você só quer DNS rápido sem mexer no path do tráfego; você está testando antes de ativar o proxy.",[19,12574,12576],{"id":12575},"waf-gratis-bloqueia-sql-injection","WAF grátis bloqueia SQL injection?",[12,12578,12579,12580,12582],{},"Cloudflare Free tem ",[27,12581,12247],{}," e regras automáticas de mitigação para padrões óbvios, mas não tem o Managed Ruleset OWASP completo. Para bloqueio confiável de SQL injection, XSS, RCE patterns conhecidos, você precisa do plano Pro ou superior. Alternativa: rodar ModSecurity ou WAF próprio na sua origem — funciona, mas adiciona CPU e configuração.",[19,12584,12586],{"id":12585},"cloudflare-tem-datacenter-no-brasil","Cloudflare tem datacenter no Brasil?",[12,12588,12589],{},"Sim. Em 2026 são cinco POPs brasileiros: São Paulo (dois POPs), Rio de Janeiro, Fortaleza, Curitiba e Porto Alegre. Latência típica de qualquer cidade do Sudeste para um POP fica abaixo de 20ms. O POP de Fortaleza atende muito bem o Nordeste por causa dos cabos submarinos que aterrissam ali (EllaLink, Monet, GlobeNet). Para o Norte, ainda é caminho mais longo — Manaus chega a Fortaleza em 80 a 120ms.",[19,12591,12593],{"id":12592},"como-migrar-nameservers-da-hostinger-pra-cloudflare","Como migrar nameservers da Hostinger pra Cloudflare?",[12,12595,12596],{},"Quatro passos. Demora menos de uma hora ativa, mais até 48h de propagação:",[67,12598,12599,12605,12617,12623],{},[70,12600,12601,12604],{},[27,12602,12603],{},"Cloudflare",": adicione o domínio. O wizard escaneia seus DNS atuais e cria os records correspondentes na nova zona. Confira que copiou tudo — MX, TXT (SPF\u002FDKIM\u002FDMARC), CNAME, A. Erros de cópia aqui causam e-mail derrubado por uma semana.",[70,12606,12607,12609,12610,2403,12613,12616],{},[27,12608,12603],{},": ele te dá dois nameservers (algo como ",[231,12611,12612],{},"kim.ns.cloudflare.com",[231,12614,12615],{},"walt.ns.cloudflare.com","). Anote.",[70,12618,12619,12622],{},[27,12620,12621],{},"Hostinger",": painel → Domínios → seu domínio → Nameservers → \"Use custom nameservers\" → cole os dois do Cloudflare. Salve.",[70,12624,12625,12628,12629,12632],{},[27,12626,12627],{},"Aguarde propagação",". Verifique com ",[231,12630,12631],{},"dig NS seudominio.com +short",". Quando aparecerem os nameservers do Cloudflare, o domínio está sob gestão deles. Records DNS continuam sendo editados no painel do Cloudflare daí pra frente.",[12,12634,12635],{},"Importante: enquanto a propagação acontece, parte dos usuários ainda resolve via Hostinger. Não desligue a zona velha até confirmar que 100% dos resolvers já trocaram (24 a 48 horas é seguro).",[19,12637,12639],{"id":12638},"tls-termina-onde-e2e-quebra","TLS termina onde? E2E quebra?",[12,12641,12642],{},"Em modo proxy (orange cloud), TLS termina em Cloudflare. Eles re-estabelecem outra conexão TLS pro seu servidor (em modo Full strict). Tecnicamente: descriptografa, processa, recriptografa. Para ponta-a-ponta verdadeiro: gray cloud (DNS only) ou Cloudflare Tunnel com configuração custom. Para a maioria das aplicações, \"TLS verdadeiramente ponta-a-ponta\" é menos importante do que parece — o ataque que isso protege (interceptação no meio da rede) requer atacante já dentro da rede do Cloudflare, cenário pouco realista.",[19,12644,12646],{"id":12645},"cloudflare-workers-vs-serverless-do-meu-cloud-quando-vale","Cloudflare Workers vs serverless do meu cloud — quando vale?",[12,12648,12649],{},"Workers são bons para: edge computing onde latência \u003C50ms importa (geo-routing, A\u002FB testing, rewrite de header); transformação leve de request\u002Fresponse; auth na borda (validar JWT antes de chegar na origem). Não são bons para: workload com mais de 30 segundos de runtime; integração heavy com bancos relacionais (latência de cold start de DB driver mata); código que precisa de bibliotecas que dependem de filesystem ou processo. Lambda da AWS continua melhor pra workload de runtime longo; Workers ganham na borda. Use ambos, não substitua um pelo outro.",[19,12651,12653],{"id":12652},"posso-usar-cloudflare-r2-com-cluster-auto-hospedado","Posso usar Cloudflare R2 com cluster auto-hospedado?",[12,12655,12656,12657,12660],{},"Sim — R2 é S3-compatível na API. Seu app usa ",[231,12658,12659],{},"aws-sdk"," configurado com endpoint de R2 e credenciais R2; código continua igual. Vantagem econômica: zero egress fee. Você pode servir downloads pesados (instaladores, vídeos de produto, backups) direto do R2 sem pagar por banda saindo. Desvantagem: durabilidade documentada é 99.999999999% (11 noves), mesma do S3, mas histórico operacional do R2 é mais curto. Para hot path crítico, alguns times preferem manter S3 e usar R2 só para cold storage e static delivery.",[19,12662,12664],{"id":12663},"origem-caiu-always-online-resolve","Origem caiu — Always Online resolve?",[12,12666,12667],{},"Em parte. Always Online serve a última versão cacheada de páginas HTML quando o servidor está fora. Mas: só funciona pra rotas que estavam sendo cacheadas; só serve a versão estática (sem dados dinâmicos atualizados); só dura enquanto Cloudflare mantém o snapshot (geralmente alguns dias). É uma rede de segurança boa pra blog estático e marketing. Não substitui alta disponibilidade real do cluster — pra app dinâmico, o que resolve é o cluster ter três nós e eleição automática quando um cai.",[19,12669,12671],{"id":12670},"fechando-combinando-cloudflare-com-cluster-auto-hospedado","Fechando — combinando Cloudflare com cluster auto-hospedado",[12,12673,12674],{},"A combinação que recomendamos para 90% dos casos é: cluster auto-hospedado com três ou mais nós (alta disponibilidade real) + Cloudflare Free na borda (DDoS, cache, IP hiding). O cluster cuida de roteamento interno, certificados automáticos, failover entre nós em segundos. Cloudflare cuida de proteção pública, cache global e ofuscação de IP. As duas camadas se complementam — não competem.",[12,12676,12677],{},"Para começar do zero com essa combinação:",[224,12679,12680],{"className":226,"code":5319,"language":228,"meta":229,"style":229},[231,12681,12682],{"__ignoreMap":229},[234,12683,12684,12686,12688,12690,12692],{"class":236,"line":237},[234,12685,1220],{"class":247},[234,12687,2958],{"class":251},[234,12689,5330],{"class":255},[234,12691,2964],{"class":383},[234,12693,2967],{"class":247},[12,12695,12696],{},"Você fica com cluster funcional em três nós, certificado Let's Encrypt automático no domínio que escolher, painel web pra submeter jobs, alta disponibilidade real. Depois, adiciona Cloudflare Free na frente do domínio e configura conforme a seção \"Configuração mínima\" deste post. Total de tempo: uma tarde.",[12,12698,12699],{},"Mais leitura nesta linha:",[2735,12701,12702,12711],{},[70,12703,12704,12706,12707,12710],{},[3337,12705,3345],{"href":3344}," — como sair do ",[231,12708,12709],{},"docker compose up"," e chegar em alta disponibilidade real, com os passos intermediários.",[70,12712,12713,12716],{},[3337,12714,12715],{"href":11727},"Observabilidade sem Datadog: stack para startup"," — métricas, logs e tracing sem pagar US$ 2.000\u002Fmês de SaaS de observabilidade.",[12,12718,12719],{},"Cloudflare é uma das poucas ferramentas onde o tier grátis é tão bom que recusar é teimosia. Mas como toda escolha de infra, a parte difícil é entender exatamente onde a fronteira está — e, principalmente, onde ela passa por dentro do tráfego cifrado da sua aplicação.",[3351,12721,4376],{},{"title":229,"searchDepth":244,"depth":244,"links":12723},[12724,12725,12726,12727,12728,12729,12730,12731,12732,12733,12734,12735,12736,12737,12738,12739,12740,12741,12742,12743],{"id":11802,"depth":244,"text":11803},{"id":11815,"depth":244,"text":11816},{"id":11881,"depth":244,"text":11882},{"id":12031,"depth":244,"text":12032},{"id":12060,"depth":244,"text":12061},{"id":12123,"depth":244,"text":12124},{"id":12171,"depth":244,"text":12172},{"id":12270,"depth":244,"text":12271},{"id":12301,"depth":244,"text":12302},{"id":12331,"depth":244,"text":12332},{"id":12541,"depth":244,"text":12542},{"id":12568,"depth":244,"text":12569},{"id":12575,"depth":244,"text":12576},{"id":12585,"depth":244,"text":12586},{"id":12592,"depth":244,"text":12593},{"id":12638,"depth":244,"text":12639},{"id":12645,"depth":244,"text":12646},{"id":12652,"depth":244,"text":12653},{"id":12663,"depth":244,"text":12664},{"id":12670,"depth":244,"text":12671},"2026-05-08","Cloudflare grátis bloqueia DDoS, cacha estático e esconde IP do servidor. Mas adiciona latência, lock-in e features que talvez você não use. Quando vale e quando é overkill.",{},"\u002Fblog\u002Fcloudflare-na-frente-cluster-auto-hospedado-vale-pena",{"title":11794,"description":12745},{"loc":12747},"blog\u002Fcloudflare-na-frente-cluster-auto-hospedado-vale-pena",[12752,12753,12754,12755,3379],"cloudflare","cdn","ddos","performance","qGST7MJgEsJSV0MJ_ynS7WUw-HKUZmOgWdsBidS2IHE",{"id":12758,"title":12759,"author":7,"body":12760,"category":3379,"cover":3380,"date":13840,"description":13841,"draft":3383,"extension":3384,"lastReviewed":3380,"meta":13842,"navigation":411,"path":13843,"readingTime":4401,"seo":13844,"sitemap":13845,"stem":13846,"tags":13847,"__hash__":13850},"blog_pt\u002Fblog\u002Fsentry-self-hosted-vs-saas-quanto-economiza-na-pratica.md","Sentry self-hosted vs SaaS: quanto realmente economiza pra startup brasileira",{"type":9,"value":12761,"toc":13824},[12762,12765,12768,12772,12787,12798,12809,12815,12819,12822,12866,12869,12873,12876,12881,12891,12894,12899,12918,12921,12926,12945,12948,12951,12955,12962,13089,13096,13107,13111,13122,13170,13176,13180,13183,13193,13198,13212,13219,13224,13244,13249,13269,13272,13276,13279,13334,13337,13367,13374,13376,13550,13554,13557,13563,13569,13575,13581,13585,13588,13594,13600,13606,13609,13613,13616,13636,13639,13643,13646,13681,13684,13686,13696,13706,13712,13718,13727,13748,13754,13764,13768,13771,13774,13785,13788,13791,13807,13810,13822],[12,12763,12764],{},"A pergunta chega quase toda semana na caixa de entrada de quem acompanha o blog: vale a pena largar o Sentry SaaS e auto-hospedar? A resposta honesta começa com um \"depende\" — e a maior parte do conteúdo que circula sobre o assunto trata o \"depende\" como se fosse evasiva. Não é. Existem três variáveis duras que decidem a conta — volume de eventos, capacidade operacional do time e exigência de compliance — e cada uma delas tem um número que você consegue medir antes de tomar a decisão.",[12,12766,12767],{},"Esse post é a versão longa da resposta. Se você é CTO de uma startup brasileira no estágio entre cinco e cinquenta engenheiros, lendo a fatura do Sentry subir mês a mês, o que vem abaixo serve como uma calculadora explicada — não como sermão a favor ou contra self-hosted. No fim tem uma tabela com doze critérios, uma seção de FAQ pra perguntas que não couberam no corpo do texto, e três perfis bem definidos de quando cada caminho faz sentido.",[19,12769,12771],{"id":12770},"tldr-versao-de-30-segundos","TL;DR — versão de 30 segundos",[12,12773,12774,12775,12778,12779,12782,12783,12786],{},"Sentry SaaS começa em ",[27,12776,12777],{},"US$26\u002Fmês"," no plano Team — cobre 50 mil erros\u002Fmês e cinco usuários. Pra startup brasileira com tráfego sério, a conta sobe rápido pra faixa de ",[27,12780,12781],{},"US$80–200\u002Fmês"," (R$400–1.000\u002Fmês ao câmbio de R$5\u002FUSD), e em scale-up chega tranquilamente em ",[27,12784,12785],{},"US$300–500\u002Fmês"," (R$1,5k–2,5k\u002Fmês). É previsível e não pede nada do time além do cartão de crédito.",[12,12788,12789,12790,12793,12794,12797],{},"Self-hosted é \"open-source gratuito\" no marketing, mas o software roda ",[27,12791,12792],{},"dez a doze contêineres"," — PostgreSQL, Redis, Kafka, ZooKeeper, ClickHouse, Symbolicator e quatro processos Sentry distintos. Pede entre ",[27,12795,12796],{},"8 GB de RAM e 4 vCPUs"," num servidor dedicado, mais armazenamento, backup, atualizações trimestrais e o tempo do dev que cuida disso tudo.",[12,12799,12800,12801,12804,12805,12808],{},"Vale auto-hospedar quando: (a) volume passou de ",[27,12802,12803],{},"1 milhão de erros\u002Fmês"," e a fatura SaaS começou a doer, (b) o time tem capacidade operacional pra cuidar de stack complexa sem virar gargalo, ou (c) compliance exige dados em servidor próprio. ",[27,12806,12807],{},"Não vale"," pra time de uma a três pessoas focado em produto, ou volume baixo onde o SaaS é só ruído de orçamento.",[12,12810,12811,12814],{},[27,12812,12813],{},"Meio-termo interessante:"," GlitchTip — open-source MIT, compatível com o Sentry SDK existente, roda em Postgres + Redis (sem Kafka, sem ClickHouse, sem ZooKeeper). Cobre 80% do valor do Sentry com 20% do overhead operacional.",[19,12816,12818],{"id":12817},"o-que-o-sentry-saas-faz-bem","O que o Sentry SaaS faz bem",[12,12820,12821],{},"Antes de discutir custo, vale reconhecer pelo que você está pagando. O Sentry hospedado entrega uma combinação que é difícil reproduzir em casa sem investir vários trimestres do time:",[2735,12823,12824,12830,12836,12842,12848,12854,12860],{},[70,12825,12826,12829],{},[27,12827,12828],{},"Stack pré-configurada."," Você cria conta, instala o SDK na aplicação, e em quinze minutos tem erros chegando. Zero servidor, zero arquivo de configuração, zero backup pra agendar.",[70,12831,12832,12835],{},[27,12833,12834],{},"Performance Monitoring integrado."," Tracing distribuído, n+1 queries detection, slow database queries — tudo no mesmo dashboard onde você já está olhando os erros.",[70,12837,12838,12841],{},[27,12839,12840],{},"Session Replay."," Gravação anonimizada da sessão do usuário até o momento do erro. Vale ouro pra debugar cenários que não reproduzem em dev.",[70,12843,12844,12847],{},[27,12845,12846],{},"Alerting maduro."," Integração com Slack, PagerDuty, Microsoft Teams, e-mail e webhooks. Regras finas — alerta só quando taxa de erro dobra em 5 minutos, só em produção, só pra usuários autenticados.",[70,12849,12850,12853],{},[27,12851,12852],{},"Issue tracking + sync."," Linka issue pro Linear\u002FJira\u002FGitHub Issues automaticamente. Resolve do lado do tracker, fecha do lado do Sentry.",[70,12855,12856,12859],{},[27,12857,12858],{},"Continuous Profiling."," Profile em produção sem overhead perceptível, descobrindo gargalos de CPU sem precisar reproduzir localmente. Disponível só na versão SaaS — self-hosted ainda não suporta.",[70,12861,12862,12865],{},[27,12863,12864],{},"Suporte técnico."," Dependendo do plano, time humano respondendo em até quatro horas úteis.",[12,12867,12868],{},"Esse pacote inteiro custa US$26\u002Fmês no plano de entrada. Pra um time de três pessoas começando uma SaaS, é literalmente o melhor uso de R$130\u002Fmês que existe na prateleira.",[19,12870,12872],{"id":12871},"a-conta-saas-linha-por-linha","A conta SaaS, linha por linha",[12,12874,12875],{},"A pegadinha do Sentry SaaS não é o preço de entrada — é a curva. Vamos detalhar pra startup brasileira em três estágios diferentes:",[12,12877,12878],{},[27,12879,12880],{},"Estágio 1 — primeiro produto, R$10–30k MRR.",[2735,12882,12883,12886],{},[70,12884,12885],{},"Plano Team: US$26\u002Fmês (50 mil erros\u002Fmês, 5 usuários)",[70,12887,12888,12889],{},"Total: ",[27,12890,6729],{},[12,12892,12893],{},"Essa é a faixa em que ninguém deveria estar pensando em self-hosted. R$130\u002Fmês é quase ruído de orçamento — gastar quatro horas do CTO instalando infraestrutura de monitoração custa mais do que dois anos de assinatura.",[12,12895,12896],{},[27,12897,12898],{},"Estágio 2 — produto crescendo, R$50–100k MRR.",[2735,12900,12901,12904,12907,12910,12913],{},[70,12902,12903],{},"Plano Business: US$80\u002Fmês (300 mil erros\u002Fmês incluídos)",[70,12905,12906],{},"Performance events extras: US$15–30\u002Fmês",[70,12908,12909],{},"Session Replay: US$25–50\u002Fmês",[70,12911,12912],{},"Usuários adicionais (10 devs): US$50\u002Fmês",[70,12914,12888,12915],{},[27,12916,12917],{},"US$170–210\u002Fmês = R$850–1.050\u002Fmês",[12,12919,12920],{},"Aqui a fatura começa a aparecer no relatório financeiro mensal. Não dói ainda, mas você nota.",[12,12922,12923],{},[27,12924,12925],{},"Estágio 3 — scale-up, R$200k+ MRR, 20+ engenheiros.",[2735,12927,12928,12931,12934,12937,12940],{},[70,12929,12930],{},"Plano Business com ajustes: US$200–300\u002Fmês base",[70,12932,12933],{},"Performance events: US$50–100\u002Fmês",[70,12935,12936],{},"Session Replay: US$100\u002Fmês",[70,12938,12939],{},"Usuários: US$100\u002Fmês",[70,12941,12888,12942],{},[27,12943,12944],{},"US$450–600\u002Fmês = R$2.250–3.000\u002Fmês",[12,12946,12947],{},"Nesse estágio, R$30 mil\u002Fano em error tracking começa a competir com salário parcial de engenheiro. É o ponto em que a conversa \"vale auto-hospedar?\" deixa de ser teórica e vira reunião marcada.",[12,12949,12950],{},"A dor real do plano Business não é o preço base — é a multiplicação por add-ons. Performance, Replay, Profiling, Cron Monitoring, Code Coverage — cada um vem com sua própria contagem de eventos e sua própria conta. É previsível, mas não é barato.",[19,12952,12954],{"id":12953},"sentry-self-hosted-o-que-e-exatamente","Sentry self-hosted — o que é exatamente",[12,12956,12957,12958,12961],{},"A pasta oficial ",[231,12959,12960],{},"getsentry\u002Fself-hosted"," instala uma stack que tem a forma seguinte, em produção:",[119,12963,12964,12976],{},[122,12965,12966],{},[125,12967,12968,12971,12973],{},[128,12969,12970],{},"Serviço",[128,12972,139],{},[128,12974,12975],{},"RAM típica",[141,12977,12978,12988,12999,13009,13019,13029,13038,13048,13058,13069,13079],{},[125,12979,12980,12983,12986],{},[146,12981,12982],{},"sentry-web",[146,12984,12985],{},"Frontend Django + API",[146,12987,11480],{},[125,12989,12990,12993,12996],{},[146,12991,12992],{},"sentry-worker",[146,12994,12995],{},"Processamento assíncrono (Celery)",[146,12997,12998],{},"768 MB",[125,13000,13001,13004,13007],{},[146,13002,13003],{},"sentry-cron",[146,13005,13006],{},"Tarefas agendadas",[146,13008,11499],{},[125,13010,13011,13014,13017],{},[146,13012,13013],{},"relay",[146,13015,13016],{},"Ingestão de eventos",[146,13018,11480],{},[125,13020,13021,13024,13027],{},[146,13022,13023],{},"postgres",[146,13025,13026],{},"Metadados, projetos, usuários",[146,13028,11502],{},[125,13030,13031,13033,13036],{},[146,13032,7512],{},[146,13034,13035],{},"Cache + filas Celery",[146,13037,11480],{},[125,13039,13040,13043,13046],{},[146,13041,13042],{},"kafka",[146,13044,13045],{},"Stream de eventos brutos",[146,13047,11502],{},[125,13049,13050,13053,13056],{},[146,13051,13052],{},"zookeeper",[146,13054,13055],{},"Coordenação do Kafka",[146,13057,11499],{},[125,13059,13060,13063,13066],{},[146,13061,13062],{},"clickhouse",[146,13064,13065],{},"Armazenamento analítico de eventos",[146,13067,13068],{},"1,5 GB",[125,13070,13071,13074,13077],{},[146,13072,13073],{},"symbolicator",[146,13075,13076],{},"Resolução de stack traces nativos",[146,13078,11480],{},[125,13080,13081,13084,13087],{},[146,13082,13083],{},"snuba-api \u002F snuba-consumer \u002F snuba-replacer",[146,13085,13086],{},"Camada entre Sentry e ClickHouse",[146,13088,11502],{},[12,13090,13091,13092,13095],{},"Soma: cerca de ",[27,13093,13094],{},"8 GB de RAM em uso firme"," num cluster pequeno, 12 contêineres, e isso é o piso. Em volume maior, o Kafka e o ClickHouse ficam com fome bem rápido.",[12,13097,13098,13099,13102,13103,13106],{},"A pegadinha menos discutida é a licença: desde 2019, o Sentry licencia o produto auto-hospedado sob ",[27,13100,13101],{},"BSL 1.1"," (Business Source License). É open-source na forma — você lê o código, modifica, contribui — mas tem uma cláusula que ",[27,13104,13105],{},"proíbe oferecer Sentry como serviço comercial pra terceiros",". Pra empresa que usa internamente, é irrelevante. Pra agência que pensava em incluir error tracking no pacote vendido pro cliente, é proibitivo.",[19,13108,13110],{"id":13109},"setup-em-cluster-passos-altos","Setup em cluster — passos altos",[12,13112,13113,13114,13117,13118,13121],{},"A documentação oficial assume que você vai rodar ",[231,13115,13116],{},".\u002Finstall.sh"," num servidor Ubuntu, e em seguida o ",[231,13119,13120],{},"docker-compose up -d"," administra a stack. Pra quem opera cluster moderno, o caminho é levemente diferente:",[67,13123,13124,13134,13144,13154,13164],{},[70,13125,13126,13129,13130,13133],{},[27,13127,13128],{},"Definir job spec com 12 contêineres."," O HeroCtl aceita arquivo de configuração de até alguns milhares de linhas, e a tradução do compose oficial pra job spec é mecânica. Reserva um turno de trabalho pra fazer isso direito — incluindo ",[231,13131,13132],{},"depends_on",", health checks, e ordens de boot (ZooKeeper antes de Kafka, Postgres antes de sentry-web, e por aí vai).",[70,13135,13136,13139,13140,13143],{},[27,13137,13138],{},"Volumes persistentes pra Postgres, ClickHouse e Kafka."," Os três têm dados que você não pode perder. ClickHouse é o que mais cresce — eventos brutos viram linhas analíticas e o disco enche. Reserve ",[27,13141,13142],{},"50 GB de SSD inicial",", ajuste pra 200 GB depois de seis meses se o volume justificar.",[70,13145,13146,13149,13150,13153],{},[27,13147,13148],{},"Backup, e backup de cada um separadamente."," O erro mais comum em self-hosted é fazer backup só do Postgres, esquecendo que ",[27,13151,13152],{},"os eventos vivem no ClickHouse",". Postgres tem metadados (projeto, usuário, configuração de alerta); ClickHouse tem o histórico de erros. Backup só do Postgres recupera a interface vazia.",[70,13155,13156,13159,13160,13163],{},[27,13157,13158],{},"TLS automático no domínio interno."," O painel precisa estar acessível pelos devs com certificado válido — sem ",[231,13161,13162],{},"-k"," no curl, sem aviso amarelo no Chrome. O cluster do HeroCtl resolve isso automaticamente com Let's Encrypt; em outros stacks você adiciona um operador ou configura manualmente.",[70,13165,13166,13169],{},[27,13167,13168],{},"Atualizações trimestrais."," O Sentry libera versão major a cada três meses, e a auto-hospedada exige migração de schema do Postgres + reindex parcial do ClickHouse. Reserve uma janela de manutenção a cada release — em geral entre 15 minutos e duas horas, dependendo do volume acumulado.",[12,13171,13172,13175],{},[27,13173,13174],{},"Tempo total de instalação:"," 4 a 8 horas pra dev competente que conhece o produto, 2 a 3 dias pra alguém aprendendo do zero. Isso é o setup limpo. Adicione 50% pra debugar o caso real (DNS interno errado, volume não montado, Kafka travado por ZooKeeper que demorou pra subir).",[19,13177,13179],{"id":13178},"glitchtip-o-sentry-lite-que-muita-gente-esquece","GlitchTip — o \"Sentry-lite\" que muita gente esquece",[12,13181,13182],{},"GlitchTip é a alternativa que aparece pouco em comparativos e merece destaque. É open-source MIT (não BSL) — você usa pra qualquer fim, inclusive comercial, sem cláusula. Foi desenhado especificamente pra cobrir o caso 80\u002F20 do Sentry.",[12,13184,13185,13188,13189,13192],{},[27,13186,13187],{},"Como funciona o \"compatible com Sentry SDK\":"," o SDK do Sentry envia eventos pra um endpoint HTTP padrão. O GlitchTip implementa esse mesmo endpoint. Você troca a URL no ",[231,13190,13191],{},"Sentry.init({ dsn: ... })"," da sua aplicação pra apontar pro GlitchTip e nada mais muda — nem código, nem dependência, nem build. A migração reversa também é direta.",[12,13194,13195],{},[27,13196,13197],{},"Stack do GlitchTip:",[2735,13199,13200,13203,13206,13209],{},[70,13201,13202],{},"PostgreSQL",[70,13204,13205],{},"Redis (filas)",[70,13207,13208],{},"Django web",[70,13210,13211],{},"Celery worker",[12,13213,13214,13215,13218],{},"São 4 contêineres contra 12 do Sentry. Recursos: ",[27,13216,13217],{},"2 GB de RAM, 1 vCPU",". Roda confortável num droplet de US$12\u002Fmês. Aceita os mesmos SDKs (JavaScript, Python, Go, Ruby, PHP, Java, .NET, mobile) sem mudança.",[12,13220,13221],{},[27,13222,13223],{},"O que GlitchTip não tem:",[2735,13225,13226,13229,13232,13235,13238,13241],{},[70,13227,13228],{},"Session Replay",[70,13230,13231],{},"Continuous Profiling",[70,13233,13234],{},"Performance Monitoring no nível de detalhe do Sentry (tem versão simplificada)",[70,13236,13237],{},"Tracing distribuído com waterfall completo",[70,13239,13240],{},"Code Coverage",[70,13242,13243],{},"Cron monitoring sofisticado",[12,13245,13246],{},[27,13247,13248],{},"O que GlitchTip tem:",[2735,13250,13251,13254,13257,13260,13263,13266],{},[70,13252,13253],{},"Error tracking completo, com agrupamento, frequência, primeiro\u002Fúltimo visto",[70,13255,13256],{},"Stack traces de qualquer linguagem suportada pelos SDKs Sentry",[70,13258,13259],{},"Uptime monitoring básico",[70,13261,13262],{},"Alerting via webhook, e-mail e integrações populares",[70,13264,13265],{},"Issue tracking minimal — atribuir, resolver, ignorar",[70,13267,13268],{},"Multi-projeto, multi-time, RBAC simples",[12,13270,13271],{},"Pra startup pequena ou média que não usa Replay nem Profiling avançado, GlitchTip cobre o que importa com uma fração da operação. É o caso mais subestimado da prateleira.",[19,13273,13275],{"id":13274},"a-conta-self-hosted-sendo-honesto","A conta self-hosted, sendo honesto",[12,13277,13278],{},"Se a sua premissa pra auto-hospedar é \"vai sair de graça\", você vai se decepcionar. Custos reais de auto-hospedar Sentry em provedor barato:",[119,13280,13281,13289],{},[122,13282,13283],{},[125,13284,13285,13287],{},[128,13286,11395],{},[128,13288,11398],{},[141,13290,13291,13299,13306,13314,13322],{},[125,13292,13293,13296],{},[146,13294,13295],{},"Servidor dedicado 8 GB \u002F 4 vCPU (Hetzner CPX31, €13,49)",[146,13297,13298],{},"R$74",[125,13300,13301,13304],{},[146,13302,13303],{},"Backup storage S3-compatible (50 GB)",[146,13305,11416],{},[125,13307,13308,13311],{},[146,13309,13310],{},"Tempo de manutenção (2–4h\u002Fmês × R$100\u002Fh valor de hora)",[146,13312,13313],{},"R$200–400",[125,13315,13316,13319],{},[146,13317,13318],{},"Atualizações trimestrais amortizadas (4h × R$100\u002Fh ÷ 3 meses)",[146,13320,13321],{},"R$130",[125,13323,13324,13329],{},[146,13325,13326],{},[27,13327,13328],{},"Total honesto",[146,13330,13331],{},[27,13332,13333],{},"R$430–630\u002Fmês",[12,13335,13336],{},"Compare:",[2735,13338,13339,13348,13358],{},[70,13340,13341,2578,13344,13347],{},[27,13342,13343],{},"Versus SaaS Team (R$130\u002Fmês):",[27,13345,13346],{},"prejuízo de R$300–500\u002Fmês."," Self-hosted nesse estágio é hobby, não economia.",[70,13349,13350,13353,13354,13357],{},[27,13351,13352],{},"Versus SaaS Business em uso médio (R$850\u002Fmês):"," economia de ",[27,13355,13356],{},"R$220–420\u002Fmês."," Começa a fazer sentido.",[70,13359,13360,13353,13363,13366],{},[27,13361,13362],{},"Versus SaaS scale-up (R$2.500\u002Fmês):",[27,13364,13365],{},"R$1.870–2.070\u002Fmês."," Aí vale o esforço.",[12,13368,13369,13370,13373],{},"Pra GlitchTip, a conta é diferente — o servidor pode ser metade do tamanho (2 GB \u002F 1 vCPU, R$30\u002Fmês) e a manutenção cai pra cerca de 1h\u002Fmês. Total honesto: ",[27,13371,13372],{},"R$150–200\u002Fmês",". Aí o ponto de equilíbrio com o SaaS Team chega.",[19,13375,3837],{"id":3836},[119,13377,13378,13393],{},[122,13379,13380],{},[125,13381,13382,13384,13387,13390],{},[128,13383,2983],{},[128,13385,13386],{},"Sentry SaaS",[128,13388,13389],{},"Sentry self-hosted",[128,13391,13392],{},"GlitchTip self-hosted",[141,13394,13395,13409,13423,13437,13449,13462,13474,13485,13495,13509,13522,13536],{},[125,13396,13397,13400,13403,13406],{},[146,13398,13399],{},"Custo mensal mínimo (BRL)",[146,13401,13402],{},"R$130 (Team)",[146,13404,13405],{},"R$430 honesto",[146,13407,13408],{},"R$150 honesto",[125,13410,13411,13414,13417,13420],{},[146,13412,13413],{},"Custo a 100k errors\u002Fmês",[146,13415,13416],{},"R$130–250",[146,13418,13419],{},"R$430–500",[146,13421,13422],{},"R$150–200",[125,13424,13425,13428,13431,13434],{},[146,13426,13427],{},"Custo a 1M errors\u002Fmês",[146,13429,13430],{},"R$1.500–2.500",[146,13432,13433],{},"R$500–700",[146,13435,13436],{},"R$250–350",[125,13438,13439,13441,13443,13446],{},[146,13440,3008],{},[146,13442,9778],{},[146,13444,13445],{},"4–8 horas (1ª vez 2–3 dias)",[146,13447,13448],{},"1–2 horas",[125,13450,13451,13454,13456,13459],{},[146,13452,13453],{},"Recursos mínimos cluster",[146,13455,12526],{},[146,13457,13458],{},"8 GB RAM \u002F 4 vCPU \u002F 50 GB SSD",[146,13460,13461],{},"2 GB RAM \u002F 1 vCPU \u002F 20 GB SSD",[125,13463,13464,13467,13470,13472],{},[146,13465,13466],{},"Performance Monitoring",[146,13468,13469],{},"Completo",[146,13471,13469],{},[146,13473,12381],{},[125,13475,13476,13478,13480,13483],{},[146,13477,13228],{},[146,13479,3065],{},[146,13481,13482],{},"Não (apenas SaaS)",[146,13484,3059],{},[125,13486,13487,13489,13491,13493],{},[146,13488,13231],{},[146,13490,3065],{},[146,13492,3059],{},[146,13494,3059],{},[125,13496,13497,13500,13503,13506],{},[146,13498,13499],{},"Alerting integrations",[146,13501,13502],{},"Slack, PagerDuty, Teams, Linear, Jira, e-mail, webhook",[146,13504,13505],{},"Mesmo conjunto",[146,13507,13508],{},"Slack, e-mail, webhook",[125,13510,13511,13514,13517,13520],{},[146,13512,13513],{},"Compliance \u002F data residency",[146,13515,13516],{},"Datacenters US\u002FEU (transferência internacional)",[146,13518,13519],{},"Servidor seu",[146,13521,13519],{},[125,13523,13524,13527,13530,13533],{},[146,13525,13526],{},"Comunidade \u002F SDKs",[146,13528,13529],{},"Toda a indústria",[146,13531,13532],{},"Mesmos SDKs Sentry",[146,13534,13535],{},"SDKs Sentry compatíveis",[125,13537,13538,13541,13544,13547],{},[146,13539,13540],{},"Faixa ideal",[146,13542,13543],{},"\u003C500k events\u002Fmês ou time pequeno",[146,13545,13546],{},">1M events\u002Fmês com 1 dev pra cuidar",[146,13548,13549],{},"Startup pequena\u002Fmédia sem Replay\u002FProfiling",[19,13551,13553],{"id":13552},"quando-ficar-no-saas","Quando ficar no SaaS",[12,13555,13556],{},"Quatro perfis em que pagar a Sentry todo mês é a decisão certa:",[12,13558,13559,13562],{},[27,13560,13561],{},"Volume abaixo de 100 mil erros\u002Fmês."," O plano Team a US$26\u002Fmês cobre, sem add-ons. Self-hosted desse tamanho é projeto de hobby — você gasta mais tempo configurando do que economiza.",[12,13564,13565,13568],{},[27,13566,13567],{},"Time de 1 a 3 devs sem capacidade operacional."," Cada hora gasta operando Sentry é hora não gasta no produto. Se você ainda não contratou o primeiro engenheiro de plataforma, pague o SaaS e siga em frente. A linha \"primeiro contratar SRE pra rodar Sentry\" não é estratégia, é distração.",[12,13570,13571,13574],{},[27,13572,13573],{},"Você usa Session Replay e Profiling."," São features SaaS-only — auto-hospedar ainda não é opção. Se a sua workflow de debug depende dessas duas, a discussão termina.",[12,13576,13577,13580],{},[27,13578,13579],{},"Compliance exige só LGPD, sem residência de dados local."," O Sentry tem opção de datacenter na União Europeia, em conformidade com GDPR e por extensão LGPD. Se o seu jurídico aceita transferência internacional de dados anonimizados, a conformidade não força auto-hospedar.",[19,13582,13584],{"id":13583},"quando-auto-hospedar-sentry-faz-sentido","Quando auto-hospedar Sentry faz sentido",[12,13586,13587],{},"Três condições — você precisa de pelo menos duas pra justificar o esforço:",[12,13589,13590,13593],{},[27,13591,13592],{},"Volume passou de 1 milhão de erros\u002Fmês."," Aí a fatura SaaS começa a competir com salário, e a economia paga o tempo do dev cuidando da infraestrutura.",[12,13595,13596,13599],{},[27,13597,13598],{},"Compliance exige dados em servidor controlado."," Setores regulados (saúde, financeiro, governo, educação infantil) frequentemente têm cláusula de residência de dados que torna SaaS inviável. Self-hosted é o caminho.",[12,13601,13602,13605],{},[27,13603,13604],{},"Time tem 1+ dev com tempo recorrente pra cuidar."," \"Tempo recorrente\" = pelo menos 4 horas por mês alocadas explicitamente, com pessoa nomeada e backup. Se for \"ah, qualquer um cuida\", em três meses ninguém cuida e o sistema vira ponto cego.",[12,13607,13608],{},"Bônus: você não precisa de Session Replay nem Profiling. Esses dois ficam no SaaS, então auto-hospedar significa abrir mão deles. Pra muitas equipes B2B com aplicações server-side, essa abertura de mão é trivial. Pra equipes B2C com app mobile\u002FSPA complexo, pode ser deal-breaker.",[19,13610,13612],{"id":13611},"quando-glitchtip-e-a-melhor-escolha-das-tres","Quando GlitchTip é a melhor escolha das três",[12,13614,13615],{},"O perfil ideal do GlitchTip é específico:",[2735,13617,13618,13621,13624,13627,13630,13633],{},[70,13619,13620],{},"Startup com R$10–50k MRR, time de 2 a 5 engenheiros.",[70,13622,13623],{},"Aplicações relativamente simples — SaaS B2B, web app, backend de mobile, API.",[70,13625,13626],{},"Não usa Session Replay (ou nunca usou, e não sente falta).",[70,13628,13629],{},"Não usa Continuous Profiling.",[70,13631,13632],{},"Quer self-hosted pelo controle e pela licença MIT, mas não quer operar 12 contêineres.",[70,13634,13635],{},"Já usa o SDK do Sentry e não quer reescrever instrumentação.",[12,13637,13638],{},"Se três desses quatro pontos batem com o seu time, GlitchTip provavelmente economiza R$500\u002Fmês versus SaaS Business sem custar o overhead operacional do Sentry self-hosted. É o caso menos discutido e o mais frequentemente útil.",[19,13640,13642],{"id":13641},"heroctl-como-camada-operacional","HeroCtl como camada operacional",[12,13644,13645],{},"Se você decidiu auto-hospedar (Sentry ou GlitchTip), o cluster onde isso roda importa quase tanto quanto a escolha do produto. Algumas observações sobre rodar error tracking sobre HeroCtl:",[2735,13647,13648,13654,13660,13666,13675],{},[70,13649,13650,13653],{},[27,13651,13652],{},"Job spec com volumes persistentes"," é nativo do produto — Postgres, ClickHouse e Kafka têm onde gravar dados sem perder nada num rolling deploy.",[70,13655,13656,13659],{},[27,13657,13658],{},"Backup gerenciado"," está disponível no plano Business, abrangendo bancos de dados rodando como jobs no cluster. Postgres + ClickHouse entram juntos no mesmo agendamento.",[70,13661,13662,13665],{},[27,13663,13664],{},"Métricas integradas"," do próprio HeroCtl mostram CPU\u002FRAM\u002FIO de cada serviço do Sentry — você não precisa montar Prometheus por fora só pra saber se o ClickHouse está saudável.",[70,13667,13668,13670,13671,13674],{},[27,13669,11372],{}," com TLS automático cuida do ",[231,13672,13673],{},"sentry.suaempresa.com.br"," sem nenhum operador de certificado adicional.",[70,13676,13677,13680],{},[27,13678,13679],{},"Plano de controle compacto"," — 200 a 400 MB por servidor, sobra muito recurso pra workload real (Sentry, no caso).",[12,13682,13683],{},"Pra cluster de 4 servidores cloud, isso significa: 8 GB de RAM disponíveis no servidor que hospeda o Sentry, métricas e backup vindo de graça do orquestrador, e zero operador externo a configurar. O ROI muda — porque parte do custo \"honesto\" de self-hosted é exatamente a infra que o cluster já oferece.",[19,13685,3226],{"id":3225},[12,13687,13688,13691,13692,13695],{},[27,13689,13690],{},"Quanto consome de RAM o Sentry self-hosted?","\nEm produção pequena, ",[27,13693,13694],{},"8 GB de RAM é o piso firme"," — abaixo disso, o Kafka começa a OOM-killar processos sob carga. Recomendado: 12 GB pra ter folga. ClickHouse e Kafka são os dois maiores consumidores; juntos somam metade da memória total.",[12,13697,13698,13701,13702,13705],{},[27,13699,13700],{},"GlitchTip é compatível com o Sentry SDK existente?","\nSim. O GlitchTip implementa o mesmo endpoint HTTP que o Sentry recebe os eventos. Trocar a URL no ",[231,13703,13704],{},"Sentry.init({ dsn: 'https:\u002F\u002F...' })"," apontando pro seu GlitchTip basta — o SDK não nota diferença. A migração reversa também é trivial. Os SDKs cobertos incluem JavaScript, Python, Go, Ruby, PHP, Java, .NET, iOS, Android e React Native.",[12,13707,13708,13711],{},[27,13709,13710],{},"Posso migrar de SaaS pra self-hosted sem perder histórico de erros?","\nTecnicamente sim, mas com ressalvas. O Sentry SaaS oferece exportação de eventos via API, e o self-hosted aceita ingestão. Na prática, a maioria das equipes simplesmente não migra histórico — começam zerados no novo, e mantêm SaaS read-only por uns 90 dias pra consultar incidentes antigos quando necessário. Histórico de erros velho costuma ter valor decrescente; o que importa é o que aconteceu nas últimas 4 semanas.",[12,13713,13714,13717],{},[27,13715,13716],{},"Sentry self-hosted tem suporte oficial?","\nNão, em nenhum nível. A versão self-hosted é \"best effort\" da empresa Sentry — eles publicam a release, documentam, mas o suporte técnico só aparece nos planos pagos do SaaS. A comunidade no GitHub e no fórum oficial é ativa, e a maioria dos problemas comuns já foi resolvida lá. Pra problemas exóticos, você está sozinho — ou contrata uma consultoria especializada.",[12,13719,13720,13723,13726],{},[27,13721,13722],{},"A licença BSL — posso usar pra SaaS comercial?",[27,13724,13725],{},"Não."," A BSL 1.1 do Sentry proíbe explicitamente oferecer o Sentry como serviço comercial pra terceiros. Você pode usar internamente sem limite, em qualquer empresa de qualquer tamanho. Mas se a sua ideia era incluir \"error tracking dedicado\" no pacote do seu cliente cobrando por isso, a licença bloqueia. Pra esse caso, GlitchTip (MIT) ou outras alternativas open-source MIT são o caminho.",[12,13728,13729,13732,13733,13736,13737,13740,13741,13736,13744,13747],{},[27,13730,13731],{},"Quanto tempo leva pra fazer setup do zero?","\nSentry self-hosted: ",[27,13734,13735],{},"4 a 8 horas"," pra dev experiente, ",[27,13738,13739],{},"2 a 3 dias"," pra alguém aprendendo. GlitchTip: ",[27,13742,13743],{},"1 a 2 horas",[27,13745,13746],{},"meio dia"," pra iniciante. Esses números cobrem instalação limpa, ingestão funcionando, alerta básico configurado, TLS pronto. Não inclui migração de SDKs (que é trivial) nem ajuste fino de regras de alerta (que toma semanas em qualquer produto).",[12,13749,13750,13753],{},[27,13751,13752],{},"ClickHouse é mesmo necessário, ou SQLite serve?","\nPra Sentry self-hosted: ClickHouse é mandatório. O produto usa o banco analítico pra queries de agregação que o Postgres não dá conta sob volume real. Pra GlitchTip: o produto usa só Postgres, e isso é parte do motivo dele ser dramaticamente mais leve. SQLite não serve pra nenhum dos dois em produção.",[12,13755,13756,13759,13760,13763],{},[27,13757,13758],{},"Performance impact no app cliente?","\nO SDK do Sentry (e do GlitchTip, que usa o mesmo SDK) tem overhead ",[27,13761,13762],{},"abaixo de 1ms na maioria dos casos"," — captura erro local, envia em background sem bloquear. Em SPAs, o tamanho do bundle adiciona 30–60 KB gzipped dependendo das integrações. Pra apps server-side, o overhead é desprezível. O Performance Monitoring tem custo levemente maior (sampling de 10% costuma ser o padrão), mas sob configuração razoável fica abaixo de 5ms p99.",[19,13765,13767],{"id":13766},"fechando","Fechando",[12,13769,13770],{},"A pergunta \"Sentry SaaS vs self-hosted\" tem uma resposta diferente em cada estágio da empresa. Pra startup pequena, SaaS sempre. Pra scale-up com volume alto e time competente, self-hosted economiza dinheiro real. Pra meio do caminho, GlitchTip costuma ser a escolha mais lúcida — economia significativa, complexidade operacional manejável, licença permissiva.",[12,13772,13773],{},"A conta é mensurável, não filosófica. Antes de decidir, confira três números:",[67,13775,13776,13779,13782],{},[70,13777,13778],{},"Quantos erros\u002Fmês a sua aplicação gera hoje (qualquer dashboard de error tracking mostra).",[70,13780,13781],{},"Qual a fatura mensal Sentry projetada pra daqui 12 meses (multiplique tráfego previsto pelo plano correspondente).",[70,13783,13784],{},"Quantas horas\u002Fmês o seu time pode alocar pra operar infraestrutura sem prejuízo de produto.",[12,13786,13787],{},"Se número 1 está acima de 1 milhão, número 2 está acima de R$1.500, e número 3 está acima de 4 horas — auto-hospedar é decisão financeira sã. Caso contrário, fique no SaaS e use o tempo poupado pra entregar feature.",[12,13789,13790],{},"Pra rodar self-hosted (Sentry ou GlitchTip) num cluster que cuida de TLS, backup e métricas sem operador externo:",[224,13792,13793],{"className":226,"code":5319,"language":228,"meta":229,"style":229},[231,13794,13795],{"__ignoreMap":229},[234,13796,13797,13799,13801,13803,13805],{"class":236,"line":237},[234,13798,1220],{"class":247},[234,13800,2958],{"class":251},[234,13802,5330],{"class":255},[234,13804,2964],{"class":383},[234,13806,2967],{"class":247},[12,13808,13809],{},"Posts relacionados:",[2735,13811,13812,13817],{},[70,13813,13814],{},[3337,13815,13816],{"href":11727},"Observabilidade sem Datadog: stack honesta pra startup brasileira",[70,13818,13819],{},[3337,13820,13821],{"href":7468},"Postgres em produção: gerenciado vs self-hosted, a conta real",[3351,13823,4376],{},{"title":229,"searchDepth":244,"depth":244,"links":13825},[13826,13827,13828,13829,13830,13831,13832,13833,13834,13835,13836,13837,13838,13839],{"id":12770,"depth":244,"text":12771},{"id":12817,"depth":244,"text":12818},{"id":12871,"depth":244,"text":12872},{"id":12953,"depth":244,"text":12954},{"id":13109,"depth":244,"text":13110},{"id":13178,"depth":244,"text":13179},{"id":13274,"depth":244,"text":13275},{"id":3836,"depth":244,"text":3837},{"id":13552,"depth":244,"text":13553},{"id":13583,"depth":244,"text":13584},{"id":13611,"depth":244,"text":13612},{"id":13641,"depth":244,"text":13642},{"id":3225,"depth":244,"text":3226},{"id":13766,"depth":244,"text":13767},"2026-05-05","Sentry SaaS começa US$26\u002Fmês, escalando rápido com volume. Self-hosted é 'gratuito' — mas roda Postgres + Redis + Kafka + ClickHouse. Análise honesta de quando vale auto-hospedar.",{},"\u002Fblog\u002Fsentry-self-hosted-vs-saas-quanto-economiza-na-pratica",{"title":12759,"description":13841},{"loc":13843},"blog\u002Fsentry-self-hosted-vs-saas-quanto-economiza-na-pratica",[13848,13849,7514,6395,3379],"sentry","error-tracking","dPUh2DPENW2LPK7Cf7XFOAV83nEB2SlVrJL5fftz0_I",{"id":13852,"title":13853,"author":7,"body":13854,"category":8764,"cover":3380,"date":14936,"description":14937,"draft":3383,"extension":3384,"lastReviewed":3380,"meta":14938,"navigation":411,"path":14939,"readingTime":8769,"seo":14940,"sitemap":14941,"stem":14942,"tags":14943,"__hash__":14949},"blog_pt\u002Fblog\u002Fhetzner-vs-digitalocean-vs-magalu-cloud-startup-brasil.md","Hetzner vs DigitalOcean vs Magalu Cloud: qual VPS escolher pra startup brasileira em 2026",{"type":9,"value":13855,"toc":14891},[13856,13859,13862,13866,13869,13873,13876,13880,13883,13929,13936,13940,13943,13946,13978,13981,13985,13988,14008,14012,14044,14048,14051,14055,14058,14105,14112,14116,14119,14145,14148,14152,14190,14194,14219,14223,14226,14230,14233,14259,14262,14266,14280,14284,14310,14314,14346,14350,14515,14519,14522,14525,14528,14532,14535,14573,14576,14580,14583,14636,14639,14642,14646,14649,14652,14672,14675,14679,14683,14704,14708,14725,14729,14746,14750,14753,14756,14759,14762,14766,14769,14772,14775,14777,14780,14783,14787,14790,14794,14797,14801,14804,14808,14811,14815,14818,14822,14825,14829,14832,14835,14838,14840,14843,14846,14849,14865,14868,14871,14886,14889],[12,13857,13858],{},"A escolha de VPS pra uma startup brasileira em 2026 não é uma única pergunta — é quatro perguntas que se cruzam. Quanto custa em dólar ou euro contra uma receita que entra em real. Quanto de latência o seu produto aguenta sem ofender o usuário. Quanto de serviço gerenciado você quer pagar pra terceirizar. E quanto de maturidade o provedor tem pra te aguentar quando alguma coisa quebrar de madrugada.",[12,13860,13861],{},"Os três nomes que aparecem em quase toda mesa de discussão hoje são Hetzner, DigitalOcean e Magalu Cloud. Cada um resolve um dos lados da equação muito bem e perde nos outros dois. Não existe vencedor universal. Existe vencedor por perfil de uso. Esse post abre as contas, com números, e fecha com uma recomendação honesta por cenário.",[19,13863,13865],{"id":13864},"tldr-qual-vps-escolher-pra-startup-brasileira-em-2026","TL;DR — qual VPS escolher pra startup brasileira em 2026",[12,13867,13868],{},"Hetzner é a opção certa quando o que pesa é custo absoluto e o público tolera 200ms de latência — projetos hobby, MVPs, ferramentas de uso interno, integrações assíncronas, runners de CI, batch jobs e clusters auto-hospedados servindo público fora do Brasil. O CX11 sai por € 4,09 ao mês, cerca de R$22, e inclui 20 TB de tráfego de saída. DigitalOcean é a escolha sensata pra indie hacker brasileiro com público B2C que precisa de menos de 100ms de resposta — datacenters em Nova York e Toronto entregam 120-140ms pra São Paulo, a interface é a melhor do segmento e a comunidade em português é extensa, mas o preço é roughly 2-3× o da Hetzner. Magalu Cloud é a resposta certa quando data residency no Brasil é exigência regulatória — saúde, financeiro, governo, contratos LGPD setoriais — com latência de 5-15ms para São Paulo, faturamento em real e suporte em português, ao custo de um ecossistema ainda em maturação. Pra cluster auto-hospedado de 3-4 nós rodando dezenas de aplicações, qualquer um dos três funciona bem.",[19,13870,13872],{"id":13871},"hetzner-o-ataque-ao-bolso","Hetzner — o ataque ao bolso",[12,13874,13875],{},"A Hetzner é uma empresa alemã com mais de 25 anos de operação. O modelo dela é simples: VPS sem firula, servidores dedicados em leilão, network europeu de boa qualidade, e pricing que mata qualquer concorrente em valor absoluto. Em 2026 a tabela continua a mesma de sempre — sobe pouco com o tempo, ao contrário de quase toda nuvem americana.",[368,13877,13879],{"id":13878},"quanto-custa-um-vps-na-hetzner-em-2026","Quanto custa um VPS na Hetzner em 2026?",[12,13881,13882],{},"A linha de Cloud Servers tem dois sabores, x86 e ARM, e os planos mais relevantes são:",[2735,13884,13885,13895,13904,13912,13920],{},[70,13886,13887,13890,13891,13894],{},[27,13888,13889],{},"CX11"," (1 vCPU x86, 2 GB RAM, 20 GB SSD): € 4,09\u002Fmês — cerca de ",[27,13892,13893],{},"R$22"," ao câmbio de R$5,5\u002Feuro.",[70,13896,13897,13900,13901,101],{},[27,13898,13899],{},"CPX11"," (2 vCPU AMD, 2 GB RAM, 40 GB SSD): € 4,75\u002Fmês — ",[27,13902,13903],{},"R$26",[70,13905,13906,13908,13909,101],{},[27,13907,6709],{}," (3 vCPU AMD, 4 GB RAM, 80 GB SSD): € 7,99\u002Fmês — ",[27,13910,13911],{},"R$44",[70,13913,13914,13916,13917,101],{},[27,13915,6719],{}," (4 vCPU AMD, 8 GB RAM, 160 GB SSD): € 14,86\u002Fmês — ",[27,13918,13919],{},"R$82",[70,13921,13922,13925,13926,101],{},[27,13923,13924],{},"CAX11"," (2 vCPU ARM, 4 GB RAM, 40 GB SSD): € 3,79\u002Fmês — ",[27,13927,13928],{},"R$21",[12,13930,13931,13932,13935],{},"Cada VPS inclui ",[27,13933,13934],{},"20 TB de tráfego de saída por mês",". Isso é uma quantia que beira o absurdo quando comparada com nuvens americanas — o mesmo tráfego em AWS São Paulo custa $0,09 por gigabyte fora dos primeiros 100 GB, ou seja, 20 TB rendem cerca de $1.800 ao mês de banda só.",[368,13937,13939],{"id":13938},"hetzner-tem-datacenter-no-brasil","Hetzner tem datacenter no Brasil?",[12,13941,13942],{},"Não. Hetzner opera datacenters em Falkenstein, Nuremberg e Helsinki na Europa, Hillsboro (Oregon) e Ashburn (Virginia) nos Estados Unidos, e Singapura na Ásia. Não há presença sul-americana.",[12,13944,13945],{},"A latência típica de um servidor pra um usuário em São Paulo:",[2735,13947,13948,13954,13960,13966,13972],{},[70,13949,13950,13951],{},"Falkenstein, Alemanha: ",[27,13952,13953],{},"200-220ms",[70,13955,13956,13957],{},"Helsinki, Finlândia: ",[27,13958,13959],{},"210-240ms",[70,13961,13962,13963],{},"Ashburn, Virginia: ",[27,13964,13965],{},"140-160ms",[70,13967,13968,13969],{},"Hillsboro, Oregon: ",[27,13970,13971],{},"170-190ms",[70,13973,13974,13975],{},"Singapura: ",[27,13976,13977],{},"300-340ms",[12,13979,13980],{},"Pra contexto, 200ms é o ponto em que o usuário começa a notar lentidão em um clique de botão. Para uma SPA pesada que já carrega assets do navegador e faz três chamadas em paralelo, 200ms cumulativos de cada round-trip viram cinco a oito segundos perceptíveis. Um app B2C com público brasileiro hospedado em Falkenstein é um produto que parece \"lento\", mesmo quando o servidor responde em 5ms.",[368,13982,13984],{"id":13983},"onde-hetzner-brilha","Onde Hetzner brilha",[12,13986,13987],{},"A combinação de pricing + bandwidth incluído faz da Hetzner a escolha óbvia pra três tipos de carga:",[67,13989,13990,13996,14002],{},[70,13991,13992,13995],{},[27,13993,13994],{},"Workloads não-latency-críticas",": runners de CI, batch jobs, workers assíncronos, ETL noturno, cron tarefas. Não importa que respondam 200ms a mais.",[70,13997,13998,14001],{},[27,13999,14000],{},"Aplicações com público fora do Brasil",": SaaS B2B com clientes na Europa ou nos EUA. Falkenstein pra Berlim é 15ms, Ashburn pra Nova York é 5ms.",[70,14003,14004,14007],{},[27,14005,14006],{},"Clusters auto-hospedados de orquestrador",": rodar HeroCtl, Coolify ou similar em 3-4 nós Hetzner pra hospedar dezenas de apps internos custa o que um único droplet equivalente custaria em DigitalOcean.",[368,14009,14011],{"id":14010},"onde-hetzner-perde","Onde Hetzner perde",[2735,14013,14014,14020,14026,14032,14038],{},[70,14015,14016,14019],{},[27,14017,14018],{},"Sem datacenter brasileiro"," — fim da história pra qualquer compliance que exija data residency.",[70,14021,14022,14025],{},[27,14023,14024],{},"Suporte só em inglês e alemão"," — chat e tickets respondem rápido, mas em horário comercial europeu.",[70,14027,14028,14031],{},[27,14029,14030],{},"Faturamento em euro"," — você paga cartão de crédito internacional, com IOF de 4,38% e spread cambial do banco.",[70,14033,14034,14037],{},[27,14035,14036],{},"Marketplace de serviços limitado"," — não tem Managed Postgres do nível da DigitalOcean nem App Platform serverless. O que tem é Object Storage compatível S3, Load Balancers e Volumes. O resto, você monta.",[70,14039,14040,14043],{},[27,14041,14042],{},"Verificação de cadastro pode demorar"," — primeiros usuários relatam até 48 horas pra liberar a conta nova. Em alguns casos a Hetzner pede selfie com documento.",[19,14045,14047],{"id":14046},"digitalocean-o-all-around","DigitalOcean — o all-around",[12,14049,14050],{},"DigitalOcean é a opção que aparece na frente de quase todo indie hacker brasileiro em 2026, e por boa razão. O produto tem 14 anos, a interface é a melhor do segmento, a documentação é referência, a comunidade brasileira é enorme. O preço é mais alto que Hetzner em valor absoluto, mas vem embrulhado em UX e serviços gerenciados que poupam horas de trabalho.",[368,14052,14054],{"id":14053},"quanto-custa-um-droplet-digitalocean-em-2026","Quanto custa um Droplet DigitalOcean em 2026?",[12,14056,14057],{},"A linha Basic tem três sabores: Regular Intel, Premium Intel e Premium AMD. Ao câmbio de R$5\u002Fdólar:",[2735,14059,14060,14069,14078,14087,14096],{},[70,14061,14062,14065,14066,101],{},[27,14063,14064],{},"Basic 1 GB \u002F 1 vCPU \u002F 25 GB SSD",": $4-6\u002Fmês — ",[27,14067,14068],{},"R$20-30",[70,14070,14071,14074,14075,101],{},[27,14072,14073],{},"Basic 2 GB \u002F 1 vCPU \u002F 50 GB SSD",": $12\u002Fmês — ",[27,14076,14077],{},"R$60",[70,14079,14080,14083,14084,101],{},[27,14081,14082],{},"Basic 4 GB \u002F 2 vCPU \u002F 80 GB SSD",": $24\u002Fmês — ",[27,14085,14086],{},"R$120",[70,14088,14089,14092,14093,101],{},[27,14090,14091],{},"Basic 8 GB \u002F 4 vCPU \u002F 160 GB SSD",": $48\u002Fmês — ",[27,14094,14095],{},"R$240",[70,14097,14098,14101,14102,101],{},[27,14099,14100],{},"Basic 16 GB \u002F 8 vCPU \u002F 320 GB SSD",": $96\u002Fmês — ",[27,14103,14104],{},"R$480",[12,14106,14107,14108,14111],{},"Todos incluem ",[27,14109,14110],{},"1 TB de tráfego de saída por mês",", com excedente a $0,01\u002FGB — bem mais barato que AWS, mas longe dos 20 TB da Hetzner.",[368,14113,14115],{"id":14114},"qual-a-latencia-digitalocean-pra-sao-paulo","Qual a latência DigitalOcean pra São Paulo?",[12,14117,14118],{},"DigitalOcean opera 14 regiões. Não há presença direta na América do Sul, mas as regiões mais próximas têm latência aceitável:",[2735,14120,14121,14127,14133,14139],{},[70,14122,14123,14126],{},[27,14124,14125],{},"NYC (Nova York)",": ~120ms",[70,14128,14129,14132],{},[27,14130,14131],{},"TOR (Toronto)",": ~140ms",[70,14134,14135,14138],{},[27,14136,14137],{},"SFO (San Francisco)",": ~180ms",[70,14140,14141,14144],{},[27,14142,14143],{},"AMS (Amsterdã)",": ~210ms",[12,14146,14147],{},"NYC é a escolha óbvia pra qualquer público que tenha brasileiros como audiência principal. 120ms é a faixa em que um botão respondendo \"logo após o clique\" ainda parece imediato pra olhos não treinados.",[368,14149,14151],{"id":14150},"onde-digitalocean-brilha","Onde DigitalOcean brilha",[2735,14153,14154,14160,14166,14172,14178,14184],{},[70,14155,14156,14159],{},[27,14157,14158],{},"Interface web",": a melhor do segmento. Sobe um Droplet em 60 segundos, monta firewall em três cliques, registra um domínio, configura DNS, instala um banco gerenciado.",[70,14161,14162,14165],{},[27,14163,14164],{},"Marketplace one-click",": WordPress, Ghost, GitLab, Mattermost, MongoDB, dezenas de stacks prontas.",[70,14167,14168,14171],{},[27,14169,14170],{},"Managed Postgres \u002F MySQL \u002F Redis",": bancos gerenciados com backup automático, failover, leitura replica. A partir de $15\u002Fmês — caro, mas economiza um SRE.",[70,14173,14174,14177],{},[27,14175,14176],{},"App Platform",": serverless com deploy via Git, autoscaling, certificados Let's Encrypt automáticos. A partir de $5\u002Fmês.",[70,14179,14180,14183],{},[27,14181,14182],{},"Comunidade brasileira ativa",": tutoriais em português, fórum, Discord não-oficial, ex-funcionário falando em conferência.",[70,14185,14186,14189],{},[27,14187,14188],{},"Faturamento em dólar com cartão internacional",", mas com checkout que aceita cartão BR sem fricção (já está consolidado).",[368,14191,14193],{"id":14192},"onde-digitalocean-perde","Onde DigitalOcean perde",[2735,14195,14196,14202,14207,14213],{},[70,14197,14198,14201],{},[27,14199,14200],{},"Pricing",": 2-3× mais caro que Hetzner por vCPU equivalente.",[70,14203,14204,14206],{},[27,14205,14018],{},": o mais próximo é NYC.",[70,14208,14209,14212],{},[27,14210,14211],{},"Alguns produtos pricier que AWS",": Spaces (Object Storage compatível S3) custa $5\u002Fmês com 250 GB; o equivalente em S3 custa $1.50\u002Fmês com a mesma classe de durabilidade.",[70,14214,14215,14218],{},[27,14216,14217],{},"Networking simples",": VPC entre regiões existe mas não é o produto bem polido como em AWS.",[19,14220,14222],{"id":14221},"magalu-cloud-o-nacional","Magalu Cloud — o nacional",[12,14224,14225],{},"Magalu Cloud é o braço de infraestrutura do grupo Magazine Luiza. Lançada em 2023, ainda está em maturação, mas em 2026 já tem oferta consistente de VPS, Object Storage, Kubernetes gerenciado e suporte em português. É a aposta brasileira viável pra quem precisa de data residency.",[368,14227,14229],{"id":14228},"quanto-custa-magalu-cloud-em-2026","Quanto custa Magalu Cloud em 2026?",[12,14231,14232],{},"Os planos que importam pra startup, com estimativas de tabela 2026:",[2735,14234,14235,14241,14247,14253],{},[70,14236,14237,14240],{},[27,14238,14239],{},"vCPU 1 \u002F 1 GB RAM \u002F 25 GB SSD",": ~R$30\u002Fmês.",[70,14242,14243,14246],{},[27,14244,14245],{},"vCPU 2 \u002F 4 GB RAM \u002F 80 GB SSD",": ~R$80\u002Fmês.",[70,14248,14249,14252],{},[27,14250,14251],{},"vCPU 4 \u002F 8 GB RAM \u002F 160 GB SSD",": ~R$160\u002Fmês.",[70,14254,14255,14258],{},[27,14256,14257],{},"vCPU 8 \u002F 16 GB RAM \u002F 320 GB SSD",": ~R$320\u002Fmês.",[12,14260,14261],{},"Pricing em real, sem conversão cambial, sem IOF, com NF-e emitida.",[368,14263,14265],{"id":14264},"magalu-cloud-tem-datacenter-no-brasil","Magalu Cloud tem datacenter no Brasil?",[12,14267,14268,14269,2403,14272,14275,14276,14279],{},"Sim — esse é o ponto inteiro do produto. Operação em ",[27,14270,14271],{},"Tamboré, São Paulo",[27,14273,14274],{},"Curitiba",", Paraná. Latência de São Paulo capital pra Tamboré: ",[27,14277,14278],{},"5-15ms",". Praticamente indistinguível de loopback.",[368,14281,14283],{"id":14282},"onde-magalu-cloud-brilha","Onde Magalu Cloud brilha",[2735,14285,14286,14292,14298,14304],{},[70,14287,14288,14291],{},[27,14289,14290],{},"Data residency",": dados ficam no Brasil. Pra setores regulados (saúde com a LGPD setorial, financeiro com o Banco Central, governo) isso resolve o argumento legal de uma só vez.",[70,14293,14294,14297],{},[27,14295,14296],{},"Faturamento em real",": contas em CNPJ, NF-e emitida, conciliação contábil simples.",[70,14299,14300,14303],{},[27,14301,14302],{},"Suporte em português",": chat e ticket respondem em horário comercial brasileiro, com gente que entende o vocabulário do mercado nacional.",[70,14305,14306,14309],{},[27,14307,14308],{},"Latência imbatível pra usuário BR",": 5-15ms pra qualquer ponto do sudeste.",[368,14311,14313],{"id":14312},"onde-magalu-cloud-perde","Onde Magalu Cloud perde",[2735,14315,14316,14322,14328,14334,14340],{},[70,14317,14318,14321],{},[27,14319,14320],{},"Ecossistema em maturação",": Managed Postgres existe, mas com menos opções de configuração que DigitalOcean. Object Storage compatível S3 funciona, mas integrações de terceiros nem sempre estão prontas.",[70,14323,14324,14327],{},[27,14325,14326],{},"Comunidade pequena",": tutoriais em português começando a aparecer em 2025-2026, mas longe da base de DigitalOcean.",[70,14329,14330,14333],{},[27,14331,14332],{},"Faixa de instâncias menor",": tipos especializados de máquina (GPU, memória otimizada, computação intensiva) ainda chegam em ondas.",[70,14335,14336,14339],{},[27,14337,14338],{},"Maturidade de SLA",": os primeiros incidentes públicos foram bem comunicados, mas o histórico ainda é curto.",[70,14341,14342,14345],{},[27,14343,14344],{},"Mais caro que Hetzner",": o VPS de 4 GB RAM custa R$80 em Magalu contra R$44 em Hetzner — quase o dobro.",[19,14347,14349],{"id":14348},"lado-a-lado-12-criterios-que-importam","Lado a lado: 12 critérios que importam",[119,14351,14352,14367],{},[122,14353,14354],{},[125,14355,14356,14358,14361,14364],{},[128,14357,2983],{},[128,14359,14360],{},"Hetzner",[128,14362,14363],{},"DigitalOcean",[128,14365,14366],{},"Magalu Cloud",[141,14368,14369,14380,14394,14408,14422,14433,14445,14456,14469,14481,14491,14502],{},[125,14370,14371,14374,14376,14378],{},[146,14372,14373],{},"VPS 4 GB RAM, 2 vCPU (BRL\u002Fmês)",[146,14375,13911],{},[146,14377,14086],{},[146,14379,8018],{},[125,14381,14382,14385,14388,14391],{},[146,14383,14384],{},"Tráfego saída 1 TB incluso",[146,14386,14387],{},"Sim (20 TB)",[146,14389,14390],{},"Sim (1 TB)",[146,14392,14393],{},"Sim (variável)",[125,14395,14396,14399,14402,14405],{},[146,14397,14398],{},"Datacenter mais próximo de SP",[146,14400,14401],{},"Ashburn\u002FVA",[146,14403,14404],{},"NYC\u002FTOR",[146,14406,14407],{},"Tamboré\u002FSP",[125,14409,14410,14413,14416,14419],{},[146,14411,14412],{},"Latência média SP (ms)",[146,14414,14415],{},"150-220",[146,14417,14418],{},"120-140",[146,14420,14421],{},"5-15",[125,14423,14424,14427,14429,14431],{},[146,14425,14426],{},"Datacenter no Brasil",[146,14428,3059],{},[146,14430,3059],{},[146,14432,3065],{},[125,14434,14435,14438,14440,14443],{},[146,14436,14437],{},"Managed Postgres",[146,14439,3059],{},[146,14441,14442],{},"Sim ($15+)",[146,14444,3065],{},[125,14446,14447,14450,14452,14454],{},[146,14448,14449],{},"Object Storage S3-compatível",[146,14451,3065],{},[146,14453,3065],{},[146,14455,3065],{},[125,14457,14458,14461,14464,14467],{},[146,14459,14460],{},"Load Balancer gerenciado",[146,14462,14463],{},"Sim (€4,90)",[146,14465,14466],{},"Sim ($12)",[146,14468,3065],{},[125,14470,14471,14474,14476,14478],{},[146,14472,14473],{},"Comunidade BR\u002FPT-BR",[146,14475,4921],{},[146,14477,4916],{},[146,14479,14480],{},"Crescendo",[125,14482,14483,14485,14487,14489],{},[146,14484,14302],{},[146,14486,3059],{},[146,14488,3062],{},[146,14490,3065],{},[125,14492,14493,14496,14498,14500],{},[146,14494,14495],{},"Faturamento em real (NF-e)",[146,14497,3059],{},[146,14499,3059],{},[146,14501,3065],{},[125,14503,14504,14506,14509,14512],{},[146,14505,13540],{},[146,14507,14508],{},"Hobby, MVP, B2B global",[146,14510,14511],{},"Indie hacker, B2C BR",[146,14513,14514],{},"B2B regulado, dados sensíveis",[19,14516,14518],{"id":14517},"qual-vps-e-mais-barato-pra-startup-brasileira-em-2026","Qual VPS é mais barato pra startup brasileira em 2026?",[12,14520,14521],{},"Em pricing absoluto por vCPU e gigabyte de RAM, Hetzner ganha de longe. Um servidor de 4 GB RAM custa R$44 ao mês na Hetzner contra R$120 na DigitalOcean e R$80 na Magalu Cloud. A diferença é de 2-3× no caso da DigitalOcean e quase 2× pra Magalu.",[12,14523,14524],{},"Mas conta-de-total muda quando você inclui banda. DigitalOcean dá 1 TB de saída incluso por droplet, Hetzner dá 20 TB. Pra uma aplicação que serve assets pesados (vídeo, imagens, downloads) e ultrapassa o teto de banda, o cálculo aproxima as duas. Pra app web tradicional sem entrega massiva de mídia, Hetzner segue mais barato.",[12,14526,14527],{},"Magalu Cloud nunca vai ser o mais barato em comparação direta. Mas quando você compara contra \"DigitalOcean + IOF de 4,38% + spread cambial de 2-3% + risco de variação cambial de 10-15% no ano\", o argumento financeiro fica próximo. Se a sua receita também está em real, Magalu te tira do risco de virar uma empresa que paga R$120 hoje e R$160 no próximo trimestre porque o real desvalorizou.",[19,14529,14531],{"id":14530},"qual-tem-latencia-melhor-pra-usuario-brasileiro","Qual tem latência melhor pra usuário brasileiro?",[12,14533,14534],{},"A ordem é direta:",[67,14536,14537,14543,14549,14555,14561,14567],{},[70,14538,14539,14542],{},[27,14540,14541],{},"Magalu Cloud (Tamboré)",": 5-15ms — categoria à parte.",[70,14544,14545,14548],{},[27,14546,14547],{},"DigitalOcean (NYC)",": 120ms — aceitável pra B2C.",[70,14550,14551,14554],{},[27,14552,14553],{},"DigitalOcean (Toronto)",": 140ms — alternativa boa pra NYC.",[70,14556,14557,14560],{},[27,14558,14559],{},"Hetzner (Ashburn, US East)",": 150ms — borderline pra B2C.",[70,14562,14563,14566],{},[27,14564,14565],{},"Hetzner (Falkenstein, Alemanha)",": 200-220ms — só pra B2B async ou hobby.",[70,14568,14569,14572],{},[27,14570,14571],{},"Hetzner (Singapura)",": 300ms+ — não é uma opção pra Brasil.",[12,14574,14575],{},"A regra prática que o time usa internamente: se o produto tem botão que o usuário clica e espera resposta imediata, fique em Magalu Cloud Tamboré ou DigitalOcean NYC. Se o produto é assíncrono — webhook, processamento em background, dashboard que recarrega a cada 30 segundos — Hetzner Ashburn ou Falkenstein resolvem com folga.",[19,14577,14579],{"id":14578},"qual-escolher-pra-rodar-heroctl-coolify-ou-dokploy-em-cluster-de-4-vps","Qual escolher pra rodar HeroCtl, Coolify ou Dokploy em cluster de 4 VPS?",[12,14581,14582],{},"Cluster auto-hospedado de orquestrador é o caso onde os três provedores brilham, porque a maior parte do tráfego é leste-oeste interno (entre nós) e a latência cliente importa só pro tráfego norte-sul (que vai pro Traefik ou Caddy ingressante). Cálculo de custo absoluto por mês pra três configurações típicas:",[119,14584,14585,14597],{},[122,14586,14587],{},[125,14588,14589,14592,14594],{},[128,14590,14591],{},"Provedor",[128,14593,4103],{},[128,14595,14596],{},"Custo mensal",[141,14598,14599,14612,14624],{},[125,14600,14601,14603,14606],{},[146,14602,14360],{},[146,14604,14605],{},"4× CPX21 (3 vCPU, 4 GB)",[146,14607,14608,14609],{},"€27,96 = ",[27,14610,14611],{},"R$155",[125,14613,14614,14616,14619],{},[146,14615,14363],{},[146,14617,14618],{},"4× Basic 4 GB (2 vCPU, 4 GB)",[146,14620,14621,14622],{},"$96 = ",[27,14623,14104],{},[125,14625,14626,14628,14631],{},[146,14627,14366],{},[146,14629,14630],{},"4× vCPU 2 \u002F 4 GB",[146,14632,14633],{},[27,14634,14635],{},"R$320",[12,14637,14638],{},"A diferença entre Hetzner e DigitalOcean é R$325\u002Fmês — quase R$4.000\u002Fano. Pra um indie hacker em fase pré-MRR ou MRR baixo, isso é a diferença entre um SaaS que paga as próprias contas e um SaaS que precisa de aporte.",[12,14640,14641],{},"Pra rodar HeroCtl especificamente: o plano de controle ocupa 200-400 MB de RAM por servidor, então qualquer dos três provedores tem folga sobrando pra workload real. Três dos quatro nós rodam plano de controle replicado (servidor); o quarto roda só agente. O cluster de demonstração público usa essa topologia exata em quatro servidores cloud, totalizando 5 vCPU e 10 GB de RAM, servindo cinco sites com TLS automático e dezesseis contêineres ativos.",[19,14643,14645],{"id":14644},"quando-faz-sentido-ficar-em-provedor-brasileiro-tradicional-locaweb-kinghost-uol-host","Quando faz sentido ficar em provedor brasileiro tradicional (Locaweb, KingHost, UOL Host)?",[12,14647,14648],{},"Quase nunca, na prática. Os provedores brasileiros tradicionais — Locaweb, KingHost, UOL Host, HostGator BR — operam num modelo herdado de revenda de hospedagem compartilhada, com VPS oferecidos como produto secundário. O pricing é mais alto que Magalu Cloud, a infra é menos moderna e o ecossistema é menor.",[12,14650,14651],{},"Os três cenários onde faz sentido:",[67,14653,14654,14660,14666],{},[70,14655,14656,14659],{},[27,14657,14658],{},"Compliance que lista nominalmente um fornecedor",": alguns contratos de governo ou de grandes empresas exigem fornecedor específico cadastrado no SICAF ou em listas internas. Se o seu cliente exige Locaweb, é Locaweb.",[70,14661,14662,14665],{},[27,14663,14664],{},"NF-e como prioridade absoluta",": todos os três (Hetzner não, DigitalOcean não, Magalu sim) emitem NF-e, mas alguns contratos B2B exigem fornecedor brasileiro reconhecido publicamente.",[70,14667,14668,14671],{},[27,14669,14670],{},"Cliente exige suporte 24\u002F7 em português via telefone",": poucos provedores cloud oferecem isso. Locaweb tem.",[12,14673,14674],{},"Pra qualquer caso fora desses três, a combinação Hetzner \u002F DigitalOcean \u002F Magalu Cloud cobre melhor com infra mais moderna e pricing mais previsível.",[19,14676,14678],{"id":14677},"cenarios-praticos-tres-perfis-com-recomendacao","Cenários práticos: três perfis com recomendação",[368,14680,14682],{"id":14681},"perfil-1-hobby-project-1-vps-r0-de-receita","Perfil 1: hobby project \u002F 1 VPS \u002F R$0 de receita",[2735,14684,14685,14691,14698],{},[70,14686,14687,14690],{},[27,14688,14689],{},"Recomendação",": Hetzner CX11 ou CAX11.",[70,14692,14693,14695,14696,101],{},[27,14694,136],{},": € 4,09\u002Fmês = ",[27,14697,13893],{},[70,14699,14700,14703],{},[27,14701,14702],{},"Por quê",": o público de um hobby project geralmente não é o cliente final exigindo SLA. 200ms de latência é tolerável. R$22\u002Fmês é o limite que um projeto sem receita aguenta sem virar peso. Você instala um orquestrador leve em cima — HeroCtl Community Edition ou Coolify — e roda dezenas de apps no mesmo servidor.",[368,14705,14707],{"id":14706},"perfil-2-indie-hacker-cluster-de-4-vps-r10k-50k-mrr","Perfil 2: indie hacker \u002F cluster de 4 VPS \u002F R$10k-50k MRR",[2735,14709,14710,14715,14720],{},[70,14711,14712,14714],{},[27,14713,14689],{},": Hetzner CPX21 (4×) se público é global ou B2B; DigitalOcean Basic 4 GB (4×) se público é B2C brasileiro.",[70,14716,14717,14719],{},[27,14718,136],{},": R$155\u002Fmês (Hetzner) ou R$480\u002Fmês (DigitalOcean).",[70,14721,14722,14724],{},[27,14723,14702],{},": nessa faixa de MRR, R$325 de diferença ainda importa, mas latência percebida do usuário começa a impactar conversão. Pra B2C com público BR, a regra é DigitalOcean NYC. Pra B2B onde o usuário é dev e clica num dashboard que recarrega a cada minuto, Hetzner Falkenstein é mais que aceitável.",[368,14726,14728],{"id":14727},"perfil-3-b2b-regulado-data-residency-4-8-vps-r200k-mrr","Perfil 3: B2B regulado \u002F data residency \u002F 4-8 VPS \u002F R$200k+ MRR",[2735,14730,14731,14736,14741],{},[70,14732,14733,14735],{},[27,14734,14689],{},": Magalu Cloud como primário, DigitalOcean NYC como secundário pra DR, ou AWS São Paulo se compliance exige fornecedor com certificações específicas.",[70,14737,14738,14740],{},[27,14739,136],{},": R$320-640\u002Fmês na Magalu, com adicionais por banco gerenciado e Object Storage.",[70,14742,14743,14745],{},[27,14744,14702],{},": nessa faixa, o custo de infra é menor que o custo de qualquer auditoria reprovada. Data residency vale o premium. Magalu Cloud entrega isso com latência excelente, faturamento simples e suporte em português. DigitalOcean NYC fica como secundário pra failover regional.",[19,14747,14749],{"id":14748},"posso-usar-dois-provedores-ao-mesmo-tempo","Posso usar dois provedores ao mesmo tempo?",[12,14751,14752],{},"Sim. A pergunta importante é se vale a complexidade.",[12,14754,14755],{},"A configuração que mais aparece na prática é multi-provider em camadas: produção em um provedor, staging em outro mais barato. Por exemplo, produção em Magalu Cloud Tamboré (latência BR), staging em Hetzner Falkenstein (custo mínimo). O time de dev acessa staging via VPN pra testar features; clientes nunca veem o staging.",[12,14757,14758],{},"Outra configuração: distribuir um cluster auto-hospedado entre dois provedores pra resiliência. Três nós em Hetzner Ashburn, um nó em Hetzner Falkenstein — funciona porque a latência intra-cluster aguenta o cross-region (40ms entre datacenters Hetzner). Misturar Hetzner com DigitalOcean ou Magalu Cloud no mesmo cluster orquestrador é tecnicamente possível mas ruim na prática: latência de 150-200ms entre nós trava consenso distribuído.",[12,14760,14761],{},"A regra prática: se você não tem um motivo concreto pra múltiplos provedores, fique em um. A complexidade operacional dobra a cada provedor adicionado. DNS, faturamento, IAM, SSH keys, monitoramento, backup — tudo dobrado.",[19,14763,14765],{"id":14764},"vale-rodar-cluster-auto-hospedado-em-vps-barato","Vale rodar cluster auto-hospedado em VPS barato?",[12,14767,14768],{},"Vale, com ressalvas. A premissa do orquestrador moderno é exatamente essa: você pega 3-4 VPS commodity e o software faz o trabalho de plano de controle replicado, roteamento, certificados automáticos, rolling deploy. O custo mensal é uma fração de qualquer plataforma como serviço gerenciada equivalente.",[12,14770,14771],{},"A ressalva é que VPS barato vem com pouca CPU e pouca RAM. Hetzner CX11 tem 1 vCPU e 2 GB de RAM — o plano de controle ocupa 200-400 MB, sobra pouco pra workload real. Se a sua aplicação é Node ou Go, sobra. Se é Java com JVM gulosa, não sobra. Pra rodar 3-4 nós de cluster, prefira CPX21 ou CPX31 — 3-4 vCPU e 4-8 GB de RAM por nó dão folga pra uma dezena de contêineres por nó.",[12,14773,14774],{},"A outra ressalva é gestão. VPS barato não vem com Managed Postgres do nível da DigitalOcean. Se você precisa de banco gerenciado, ou paga DigitalOcean pra ele rodar o Postgres ($15\u002Fmês mínimo) ou roda o seu próprio Postgres como contêiner no cluster — com responsabilidade de backup, replicação e upgrade na sua mão.",[19,14776,3226],{"id":3225},[368,14778,13939],{"id":14779},"hetzner-tem-datacenter-no-brasil-1",[12,14781,14782],{},"Não. Hetzner opera datacenters na Alemanha (Falkenstein, Nuremberg), Finlândia (Helsinki), Estados Unidos (Ashburn na Virgínia, Hillsboro no Oregon) e Singapura. Não há presença sul-americana em 2026, e a empresa não anunciou planos públicos de expansão para a região.",[368,14784,14786],{"id":14785},"quanto-custa-rodar-4-vps-em-cada-um-dos-tres-provedores-em-2026","Quanto custa rodar 4 VPS em cada um dos três provedores em 2026?",[12,14788,14789],{},"Em configuração equivalente de 4 GB RAM e 2-3 vCPU por nó: Hetzner sai por aproximadamente R$155\u002Fmês total (4× CPX21 a € 7,99). DigitalOcean sai por R$480\u002Fmês (4× Basic 4 GB a $24). Magalu Cloud sai por R$320\u002Fmês (4× vCPU 2 \u002F 4 GB a R$80). A diferença entre o mais barato e o mais caro é de 3× em valor absoluto.",[368,14791,14793],{"id":14792},"posso-usar-dois-provedores-vps-ao-mesmo-tempo","Posso usar dois provedores VPS ao mesmo tempo?",[12,14795,14796],{},"Sim, e em alguns cenários faz sentido. Configurações comuns: produção num provedor + staging em outro mais barato; cluster distribuído entre regiões do mesmo provedor pra resiliência; primário num provedor + DR em outro pra failover regional. Misturar dois provedores no mesmo cluster orquestrador é tecnicamente possível mas a latência cross-provider (geralmente 100-200ms) trava consenso distribuído. A regra prática é ficar em um provedor por carga, a menos que haja razão concreta.",[368,14798,14800],{"id":14799},"magalu-cloud-e-confiavel-em-2026","Magalu Cloud é confiável em 2026?",[12,14802,14803],{},"Sim, com a ressalva de que o histórico ainda é curto. A operação iniciou em 2023, em 2026 tem três anos de produção pública. Os incidentes que aconteceram nesse período foram comunicados publicamente e resolvidos dentro de SLA típico. O ecossistema de serviços gerenciados é menor que o da DigitalOcean ou AWS, mas a oferta básica (VPS, Object Storage, Load Balancer, Kubernetes gerenciado) está estável. Pra workload que exige data residency brasileira, é a opção viável em 2026.",[368,14805,14807],{"id":14806},"digitalocean-tem-suporte-em-portugues","DigitalOcean tem suporte em português?",[12,14809,14810],{},"Limitado. A documentação oficial está em inglês com algumas seções traduzidas. O suporte por ticket aceita português, mas a primeira resposta vem geralmente em inglês. A comunidade brasileira (fóruns, Discord, tutoriais) é grande e cobre bem perguntas comuns em português. Pra suporte enterprise, há contratos pagos que incluem atendimento em português, mas só fazem sentido a partir de gasto mensal acima de US$1.000.",[368,14812,14814],{"id":14813},"qual-a-latencia-aproximada-pra-sao-paulo-em-cada-provedor","Qual a latência aproximada pra São Paulo em cada provedor?",[12,14816,14817],{},"Magalu Cloud (Tamboré e Curitiba): 5-15ms. DigitalOcean (NYC): 120ms. DigitalOcean (Toronto): 140ms. Hetzner (Ashburn, US East): 140-160ms. Hetzner (Hillsboro, US West): 170-190ms. Hetzner (Falkenstein, Alemanha): 200-220ms. Hetzner (Singapura): 300ms+. Pra B2C com público brasileiro exigindo resposta imediata, Magalu Cloud ou DigitalOcean NYC. Pra B2B assíncrono ou hobby, qualquer um serve.",[368,14819,14821],{"id":14820},"qual-provedor-aceita-pagamento-em-real-com-nf-e","Qual provedor aceita pagamento em real com NF-e?",[12,14823,14824],{},"Apenas Magalu Cloud entre os três. Hetzner fatura em euro com cartão de crédito internacional (mais IOF de 4,38% e spread cambial). DigitalOcean fatura em dólar, também com cartão internacional, com checkout que aceita cartão BR sem fricção mas sem emissão de NF-e. Pra quem precisa de NF-e por exigência fiscal ou contábil, Magalu Cloud é a única opção das três. Provedores brasileiros tradicionais (Locaweb, KingHost) também emitem NF-e mas têm pricing menos competitivo.",[368,14826,14828],{"id":14827},"hetzner-aceita-cartao-brasileiro","Hetzner aceita cartão brasileiro?",[12,14830,14831],{},"Sim, mas com fricção. Cartões de crédito brasileiros internacionais (Visa, Mastercard) são aceitos. A primeira cobrança costuma passar por verificação adicional — a Hetzner pode pedir comprovante de identidade, e em alguns casos selfie com documento. O processo de cadastro pode levar 24-48 horas até a primeira liberação de servidor. Depois disso, cobranças mensais passam normalmente. Cartões pré-pagos e cartões virtuais geralmente não são aceitos.",[368,14833,14765],{"id":14834},"vale-rodar-cluster-auto-hospedado-em-vps-barato-1",[12,14836,14837],{},"Vale, e é o caso de uso central pra orquestradores leves como HeroCtl. Quatro VPS Hetzner CPX21 totalizam 12 vCPU e 16 GB de RAM por R$155\u002Fmês — capacidade equivalente a um único servidor médio em provedores caros, pelo custo de um almoço. O plano de controle ocupa 200-400 MB de RAM por servidor, sobra de folga pra hospedar dezenas de contêineres. As ressalvas são: prefira instâncias com pelo menos 3 vCPU e 4 GB de RAM (CPX21+ ou equivalente); banco gerenciado de fora do cluster ou banco como contêiner com backup manual; e tenha um plano de monitoramento próprio — VPS barato não vem com observabilidade pronta.",[19,14839,3310],{"id":3309},[12,14841,14842],{},"Não existe vencedor universal entre Hetzner, DigitalOcean e Magalu Cloud. Existe vencedor por perfil de uso. Hetzner pra custo absoluto. DigitalOcean pra UX e latência razoável pra público brasileiro. Magalu Cloud pra data residency e faturamento em real.",[12,14844,14845],{},"A maioria dos times indie começa em Hetzner, migra parte da carga pra DigitalOcean quando o produto exige latência menor pra B2C, e considera Magalu Cloud quando aparece o primeiro contrato com cláusula de data residency. Os três coexistem na carteira de muitas startups maduras — cada um cumprindo um papel.",[12,14847,14848],{},"Pra qualquer um dos três, um cluster auto-hospedado de 3-4 nós com um orquestrador leve te dá a fundação pra rodar dezenas de aplicações sem pagar plataforma como serviço a cada uma. HeroCtl Community Edition é gratuito e instala em um comando:",[224,14850,14851],{"className":226,"code":2949,"language":228,"meta":229,"style":229},[231,14852,14853],{"__ignoreMap":229},[234,14854,14855,14857,14859,14861,14863],{"class":236,"line":237},[234,14856,1220],{"class":247},[234,14858,2958],{"class":251},[234,14860,2961],{"class":255},[234,14862,2964],{"class":383},[234,14864,2967],{"class":247},[12,14866,14867],{},"Os primeiros três servidores formam um plano de controle replicado, certificados Let's Encrypt automáticos, rolling deploy sem janela de manutenção, painel web embutido. O cluster público de demonstração roda em quatro servidores totalizando 5 vCPU e 10 GB de RAM, hospedando cinco sites em produção.",[12,14869,14870],{},"Pros próximos passos, dois posts relacionados que aprofundam tópicos adjacentes:",[2735,14872,14873,14879],{},[70,14874,14875,14878],{},[3337,14876,14877],{"href":6338},"Quanto custa hospedar um SaaS brasileiro em 2026"," — análise detalhada de TCO incluindo banda, banco, monitoramento.",[70,14880,14881,14885],{},[3337,14882,14884],{"href":14883},"\u002Fblog\u002Falternativa-kubernetes-paas-brasil","Alternativa Kubernetes \u002F PaaS pra Brasil"," — comparativo entre orquestradores leves pra times pequenos.",[12,14887,14888],{},"A escolha de provedor é importante, mas é uma decisão reversível. A escolha de orquestrador é mais difícil de reverter — começa pelo software que vai segurar a sua stack pelos próximos cinco anos, depois escolhe onde ele vai rodar.",[3351,14890,4376],{},{"title":229,"searchDepth":244,"depth":244,"links":14892},[14893,14894,14900,14906,14912,14913,14914,14915,14916,14917,14922,14923,14924,14935],{"id":13864,"depth":244,"text":13865},{"id":13871,"depth":244,"text":13872,"children":14895},[14896,14897,14898,14899],{"id":13878,"depth":271,"text":13879},{"id":13938,"depth":271,"text":13939},{"id":13983,"depth":271,"text":13984},{"id":14010,"depth":271,"text":14011},{"id":14046,"depth":244,"text":14047,"children":14901},[14902,14903,14904,14905],{"id":14053,"depth":271,"text":14054},{"id":14114,"depth":271,"text":14115},{"id":14150,"depth":271,"text":14151},{"id":14192,"depth":271,"text":14193},{"id":14221,"depth":244,"text":14222,"children":14907},[14908,14909,14910,14911],{"id":14228,"depth":271,"text":14229},{"id":14264,"depth":271,"text":14265},{"id":14282,"depth":271,"text":14283},{"id":14312,"depth":271,"text":14313},{"id":14348,"depth":244,"text":14349},{"id":14517,"depth":244,"text":14518},{"id":14530,"depth":244,"text":14531},{"id":14578,"depth":244,"text":14579},{"id":14644,"depth":244,"text":14645},{"id":14677,"depth":244,"text":14678,"children":14918},[14919,14920,14921],{"id":14681,"depth":271,"text":14682},{"id":14706,"depth":271,"text":14707},{"id":14727,"depth":271,"text":14728},{"id":14748,"depth":244,"text":14749},{"id":14764,"depth":244,"text":14765},{"id":3225,"depth":244,"text":3226,"children":14925},[14926,14927,14928,14929,14930,14931,14932,14933,14934],{"id":14779,"depth":271,"text":13939},{"id":14785,"depth":271,"text":14786},{"id":14792,"depth":271,"text":14793},{"id":14799,"depth":271,"text":14800},{"id":14806,"depth":271,"text":14807},{"id":14813,"depth":271,"text":14814},{"id":14820,"depth":271,"text":14821},{"id":14827,"depth":271,"text":14828},{"id":14834,"depth":271,"text":14765},{"id":3309,"depth":244,"text":3310},"2026-04-29","Hetzner é 3-5× mais barato mas sem datacenter no Brasil. DigitalOcean tem mais regiões mas custa mais. Magalu Cloud é nacional mas em maturação. Análise honesta com latência, custo, e quando cada um faz sentido.",{},"\u002Fblog\u002Fhetzner-vs-digitalocean-vs-magalu-cloud-startup-brasil",{"title":13853,"description":14937},{"loc":14939},"blog\u002Fhetzner-vs-digitalocean-vs-magalu-cloud-startup-brasil",[14944,14945,14946,14947,8764,14948],"hetzner","digitalocean","magalu-cloud","vps","brasil","KyslXIIf8MEtwX6e_wOTqjA58INoETjI5tcEm83b4yI",{"id":14951,"title":14952,"author":7,"body":14953,"category":6383,"cover":3380,"date":15807,"description":15808,"draft":3383,"extension":3384,"lastReviewed":3380,"meta":15809,"navigation":411,"path":6338,"readingTime":6388,"seo":15810,"sitemap":15811,"stem":15812,"tags":15813,"__hash__":15817},"blog_pt\u002Fblog\u002Fquanto-custa-hospedar-saas-brasileiro-2026.md","Quanto custa hospedar SaaS brasileiro em 2026: a planilha aberta",{"type":9,"value":14954,"toc":15791},[14955,14958,14961,14965,14968,14971,14978,14985,14988,14992,14995,14999,15002,15008,15013,15135,15138,15144,15147,15151,15154,15159,15163,15248,15255,15260,15264,15267,15272,15341,15352,15357,15360,15364,15367,15371,15418,15421,15426,15433,15436,15440,15443,15449,15455,15464,15470,15476,15482,15486,15492,15614,15617,15620,15624,15627,15633,15639,15645,15651,15655,15658,15664,15670,15676,15682,15686,15689,15696,15703,15710,15717,15724,15726,15732,15738,15744,15750,15756,15762,15768,15770,15773,15776,15781],[12,14956,14957],{},"A primeira despesa que mata margem de SaaS brasileiro não é folha de pagamento. Não é imposto. Não é aquisição de cliente. É infraestrutura paga em dólar enquanto o cliente paga em real. Esse descasamento é silencioso no primeiro ano, incômodo no segundo, e compromete a tese inteira do negócio no terceiro — quando o time descobre que cada conta nova trouxe consigo uma fatia desproporcional de provedor de nuvem.",[12,14959,14960],{},"Este post é a planilha aberta. Sem buzzword, sem \"depende do caso\", sem economias hipotéticas. Quatro cenários de SaaS brasileiro divididos por estágio de receita, com tabela de custo lado a lado, decisão honesta em cada um e a conta total no fim. Os números foram medidos em provedores reais em abril de 2026, com câmbio de referência de R$5 por dólar — número que pode oscilar, mas que serve pra calibrar a ordem de grandeza.",[19,14962,14964],{"id":14963},"a-assimetria-que-ninguem-explica-em-pitch-deck","A assimetria que ninguém explica em pitch deck",[12,14966,14967],{},"Imagine um SaaS brasileiro que acabou de bater US$10k de MRR. No câmbio atual, isso é cerca de R$50k por mês. Parece um número saudável — paga salários, paga imposto, sobra capital. O fundador olha o balanço e respira aliviado.",[12,14969,14970],{},"Agora some uma stack típica de SaaS moderno: Vercel pra front, banco gerenciado num provedor cloud, Datadog pra observabilidade, Sentry pra erro, Redis Premium pra fila e cache. Round number, US$1.500 por mês. Quinze por cento do MRR. Parece muito? Comparado com o concorrente americano, é a mesma proporção: ele também tem US$10k de MRR e gasta US$1.500. Empate técnico.",[12,14972,14973,14974,14977],{},"Só que não é empate. Olha pra folha de pagamento: um dev brasileiro pleno custa em torno de R$15k. Um americano equivalente custa US$10k, ou R$50k. O brasileiro paga, ",[27,14975,14976],{},"proporcionalmente, três vezes mais por hospedagem em relação ao seu próprio custo de mão de obra",". A planilha do americano fecha gastando 15% em infra e 50% em salários. A do brasileiro fecha gastando 15% em infra e 30% em salários — restando, depois de impostos, uma fração estreita pra crescer.",[12,14979,14980,14981,14984],{},"A conclusão é desconfortável e a maioria dos pitch decks evita: a estratégia de infraestrutura que funciona pra startup do Vale do Silício ",[27,14982,14983],{},"não funciona"," pra startup brasileira. As contas são diferentes desde o dia um. Cobrar em real, pagar em dólar, e ainda querer copiar a stack do Sequoia portfolio é uma equação que só fecha enquanto o investidor estiver subsidiando.",[12,14986,14987],{},"A boa notícia: o custo de infraestrutura é a despesa com mais alavanca de redução em todo o P&L de um SaaS pequeno ou médio. Mais até que folha — porque você não pode demitir um dev e seguir entregando o roadmap, mas pode trocar Render por VPS e continuar exatamente o mesmo produto. O que falta é ver a planilha aberta.",[19,14989,14991],{"id":14990},"os-quatro-cenarios-por-estagio-de-receita","Os quatro cenários por estágio de receita",[12,14993,14994],{},"A divisão por MRR é proposital. Cada faixa tem necessidades operacionais diferentes, exigências de uptime diferentes, e — crucialmente — um custo de oportunidade do tempo do time diferente. Tratar todos os SaaS brasileiros como se fossem o mesmo é a raiz da maioria das decisões erradas.",[368,14996,14998],{"id":14997},"cenario-a-pre-revenue-mvp-r0-a-r5k-mrr","Cenário A — Pre-revenue \u002F MVP (R$0 a R$5k MRR)",[12,15000,15001],{},"Este é o estágio em que cada centena de reais economizada vale como mil. Não tem cliente exigindo SLA, não tem auditoria, não tem time grande pra coordenar. O objetivo é ficar de pé, validar a hipótese, e fazer o primeiro real entrar.",[12,15003,15004,15007],{},[27,15005,15006],{},"Stack típica:"," Render free tier, Railway hobby, Vercel pro plan, ou um único servidor virtual em provedor barato com Coolify.",[12,15009,15010],{},[27,15011,15012],{},"Tabela detalhada (preço mensal):",[119,15014,15015,15033],{},[122,15016,15017],{},[125,15018,15019,15021,15024,15027,15030],{},[128,15020,11395],{},[128,15022,15023],{},"Render",[128,15025,15026],{},"Railway",[128,15028,15029],{},"Vercel",[128,15031,15032],{},"VPS + Coolify",[141,15034,15035,15052,15068,15082,15108],{},[125,15036,15037,15040,15043,15046,15049],{},[146,15038,15039],{},"Aplicação web",[146,15041,15042],{},"grátis (com limite)",[146,15044,15045],{},"US$5",[146,15047,15048],{},"US$20",[146,15050,15051],{},"incluído no VPS",[125,15053,15054,15057,15060,15062,15065],{},[146,15055,15056],{},"Banco Postgres",[146,15058,15059],{},"US$7",[146,15061,15045],{},[146,15063,15064],{},"KV (US$0,50\u002FM ops)",[146,15066,15067],{},"incluído",[125,15069,15070,15073,15075,15077,15080],{},[146,15071,15072],{},"Redis \u002F cache",[146,15074,15059],{},[146,15076,15045],{},[146,15078,15079],{},"KV US$5",[146,15081,15067],{},[125,15083,15084,15089,15094,15099,15104],{},[146,15085,15086],{},[27,15087,15088],{},"Total mensal USD",[146,15090,15091],{},[27,15092,15093],{},"US$14",[146,15095,15096],{},[27,15097,15098],{},"US$15",[146,15100,15101],{},[27,15102,15103],{},"US$25",[146,15105,15106],{},[27,15107,15045],{},[125,15109,15110,15115,15120,15125,15130],{},[146,15111,15112],{},[27,15113,15114],{},"Total mensal BRL",[146,15116,15117],{},[27,15118,15119],{},"R$70",[146,15121,15122],{},[27,15123,15124],{},"R$75",[146,15126,15127],{},[27,15128,15129],{},"R$125",[146,15131,15132],{},[27,15133,15134],{},"R$25–R$30",[12,15136,15137],{},"A diferença bruta — VPS rodando Coolify custando um quinto do que a opção mais barata gerenciada — é o efeito direto de cortar o intermediário. Você assume o trabalho de instalar Postgres num contêiner, configurar backup, abrir porta no firewall. Em troca, paga R$25 em vez de R$125.",[12,15139,15140,15143],{},[27,15141,15142],{},"Decisão honesta:"," o VPS com Coolify é quatro a cinco vezes mais barato. Mas custa entre duas e quatro horas por mês de manutenção (atualização de pacotes, checagem de backup, ocasional reboot). Pra um MVP brasileiro com R$0 de receita real e dois fundadores que ainda têm CLT diurno, a equação tempo-versus-dinheiro pende pra dinheiro: economizar R$100 por mês nos primeiros doze meses é R$1.200 que paga o registro de marca, três meses de domínio, ou os primeiros R$ de Google Ads quando der pra investir.",[12,15145,15146],{},"Atalho contraintuitivo: se a sua única dor é \"não quero aprender Linux\", contrate o VPS gerenciado da Locaweb ou da KingHost. É mais caro que Hetzner, mais barato que Vercel, e o suporte fala português.",[368,15148,15150],{"id":15149},"cenario-b-indie-hacker-micro-saas-r5k-a-r30k-mrr","Cenário B — Indie hacker \u002F micro-SaaS (R$5k a R$30k MRR)",[12,15152,15153],{},"Aqui já tem cliente. Tem um pouco de imprevisibilidade — pico em horário comercial, queda à noite, surto sazonal no fim do mês quando sai a fatura. Single-server começa a doer porque uma queda derruba todos os clientes ao mesmo tempo.",[12,15155,15156,15158],{},[27,15157,15006],{}," Render Pro, Railway escalado, Postgres gerenciado em algum lugar, monitoramento básico.",[12,15160,15161],{},[27,15162,15012],{},[119,15164,15165,15179],{},[122,15166,15167],{},[125,15168,15169,15171,15173,15176],{},[128,15170,14591],{},[128,15172,4103],{},[128,15174,15175],{},"USD",[128,15177,15178],{},"BRL",[141,15180,15181,15194,15207,15221,15234],{},[125,15182,15183,15185,15188,15191],{},[146,15184,15023],{},[146,15186,15187],{},"instance Pro US$25 + Postgres US$25 + Redis US$7",[146,15189,15190],{},"US$57",[146,15192,15193],{},"R$285",[125,15195,15196,15198,15201,15204],{},[146,15197,15026],{},[146,15199,15200],{},"tier de uso variável, app + banco + Redis",[146,15202,15203],{},"US$30–US$80",[146,15205,15206],{},"R$150–R$400",[125,15208,15209,15212,15215,15218],{},[146,15210,15211],{},"Vercel Team",[146,15213,15214],{},"2 seats + bandwidth + functions",[146,15216,15217],{},"US$80–US$150",[146,15219,15220],{},"R$400–R$750",[125,15222,15223,15225,15228,15231],{},[146,15224,15032],{},[146,15226,15227],{},"1 servidor 4 vCPU 8 GB",[146,15229,15230],{},"US$10",[146,15232,15233],{},"R$50",[125,15235,15236,15239,15242,15245],{},[146,15237,15238],{},"HeroCtl Community + 3 VPS Hetzner",[146,15240,15241],{},"3 nós com alta disponibilidade real",[146,15243,15244],{},"€15",[146,15246,15247],{},"R$90",[12,15249,15250,15251,15254],{},"A última linha é onde o argumento muda de natureza. Por R$90 por mês — menos que o tier mais barato do Render — você tem um cluster com ",[27,15252,15253],{},"três servidores de verdade",", com plano de controle replicado, eleição automática de coordenador em cerca de sete segundos quando um nó cai, certificado HTTPS automático e roteador integrado. O custo total da stack é menor que o jantar do time numa sexta. E o uptime real, depois de configurado, é melhor que o do single-server gerenciado, porque a queda de um nó deixa os outros dois servindo tráfego.",[12,15256,15257,15259],{},[27,15258,15142],{}," self-hosted simples num único servidor é três a cinco vezes mais barato que hospedado, mas troca disponibilidade por economia. Cluster com alta disponibilidade real (HeroCtl Community em três VPS) ainda custa metade do que o Render Pro single-server, e dá garantia operacional que o Render single-server não dá. A diferença mensal de R$200 a R$500 é, ao longo do ano, equivalente a um almoço por dia da equipe inteira. Pra um indie hacker, isso é diferença entre comprar curso novo, ir num evento ou simplesmente respirar mais fundo no fluxo de caixa.",[368,15261,15263],{"id":15262},"cenario-c-startup-early-stage-r30k-a-r200k-mrr","Cenário C — Startup early stage (R$30k a R$200k MRR)",[12,15265,15266],{},"Aqui aparecem requisitos reais de SLA. Cliente B2B começa a perguntar sobre disponibilidade, backup, retenção de log. Vai precisar de monitoramento mais sério, talvez auditoria, certamente backup gerenciado e processos de recuperação.",[12,15268,15269],{},[27,15270,15271],{},"Stack típica gerenciada:",[119,15273,15274,15286],{},[122,15275,15276],{},[125,15277,15278,15280,15283],{},[128,15279,4103],{},[128,15281,15282],{},"USD\u002Fmês",[128,15284,15285],{},"BRL\u002Fmês",[141,15287,15288,15299,15308,15319,15330],{},[125,15289,15290,15293,15296],{},[146,15291,15292],{},"AWS gerenciado (cluster small + RDS Postgres + ElastiCache + balanceador + NAT + CloudWatch + S3)",[146,15294,15295],{},"US$1.500–US$3.000",[146,15297,15298],{},"R$7.500–R$15.000",[125,15300,15301,15304,15306],{},[146,15302,15303],{},"GCP gerenciado equivalente (cluster + CloudSQL + Memorystore)",[146,15305,15295],{},[146,15307,15298],{},[125,15309,15310,15313,15316],{},[146,15311,15312],{},"Render Team plan + escalado",[146,15314,15315],{},"US$300–US$600",[146,15317,15318],{},"R$1.500–R$3.000",[125,15320,15321,15324,15327],{},[146,15322,15323],{},"Cluster auto-hospedado (HeroCtl em 4 VPS Hetzner ou DigitalOcean + storage S3-compatível)",[146,15325,15326],{},"US$60–US$120",[146,15328,15329],{},"R$300–R$600",[125,15331,15332,15335,15338],{},[146,15333,15334],{},"Híbrido (auto-hospedado + serviços críticos gerenciados como banco transacional)",[146,15336,15337],{},"US$200–US$400",[146,15339,15340],{},"R$1.000–R$2.000",[12,15342,15343,15344,15347,15348,15351],{},"A diferença entre AWS gerenciado e auto-hospedado nesse estágio é a mais significativa de toda a planilha. Estamos falando de ",[27,15345,15346],{},"R$5.000 a R$12.000 por mês de economia recorrente",". Esse delta paga, ao longo de doze meses, ",[27,15349,15350],{},"um desenvolvedor pleno por ano inteiro",", ou dois estagiários, ou — pra startup que ainda está em busca de breakeven — seis meses adicionais de pista de capital.",[12,15353,15354,15356],{},[27,15355,15142],{}," auto-hospedar nesse estágio exige que o time tenha alguém com competência operacional. Não precisa ser um especialista em larga escala dedicado em tempo integral, mas precisa ser alguém que sabe ler log, sabe restaurar backup, sabe diagnosticar latência. Geralmente é o CTO ou o primeiro dev sênior. O custo embutido aí — quatro a oito horas por mês desse profissional — é pequeno comparado com a economia. Mas existe, e ignorar ele é desonesto.",[12,15358,15359],{},"Híbrido costuma ser a resposta certa nesse estágio: aplicação roda em cluster auto-hospedado (porque é fácil), banco transacional fica gerenciado (porque restaurar Postgres com replicação síncrona às três da manhã não é trabalho de fim de semana de fundador). A conta híbrida fica em torno de R$1.500 por mês — ainda quatro vezes mais barata que AWS gerenciado completo.",[368,15361,15363],{"id":15362},"cenario-d-scale-up-r200k-mrr-time-de-plataforma-estabelecido","Cenário D — Scale-up (R$200k+ MRR, time de plataforma estabelecido)",[12,15365,15366],{},"Aqui a equação inverte. Time tem dois ou três engenheiros dedicados a infraestrutura. Compliance pode estar no mapa. Cliente exige SLA contratual com penalidade financeira. Multi-tenant com isolamento sério é pré-requisito, não diferencial.",[12,15368,15369],{},[27,15370,15006],{},[119,15372,15373,15383],{},[122,15374,15375],{},[125,15376,15377,15379,15381],{},[128,15378,4103],{},[128,15380,15282],{},[128,15382,15285],{},[141,15384,15385,15396,15407],{},[125,15386,15387,15390,15393],{},[146,15388,15389],{},"AWS gerenciado completo (multi-AZ, multi-region, observabilidade premium, suporte business)",[146,15391,15392],{},"US$5.000–US$15.000",[146,15394,15395],{},"R$25.000–R$75.000",[125,15397,15398,15401,15404],{},[146,15399,15400],{},"HeroCtl Enterprise + 8 a 12 servidores (com licença Enterprise + suporte 24×7)",[146,15402,15403],{},"servidores R$2k–R$5k + licença",[146,15405,15406],{},"R$2.000–R$5.000 + licença",[125,15408,15409,15412,15415],{},[146,15410,15411],{},"Kubernetes auto-gerenciado em provedor cloud (servidores + 2 engenheiros sêniores em folha)",[146,15413,15414],{},"US$3.000–US$10.000 servidores + R$60.000 folha",[146,15416,15417],{},"R$75.000–R$110.000 totais",[12,15419,15420],{},"Note que a comparação muda. Não é mais \"infra pura\": é \"infra + custo do time pra operar\". Kubernetes auto-gerenciado é mais barato em servidor, mas cobra dois salários sêniores em folha — é como comprar carro barato e contratar motorista em tempo integral.",[12,15422,15423,15425],{},[27,15424,15142],{}," nesse estágio, o custo de infraestrutura passa a ser desprezível comparado ao custo de time. Um time de plataforma de três pessoas custa R$50k a R$80k por mês em folha. R$20k por mês de servidor a mais ou a menos é ruído estatístico.",[12,15427,15428,15429,15432],{},"A otimização nesse estágio não é mais sobre USD por mês, é sobre ",[27,15430,15431],{},"tempo economizado pelo time",". Se o seu time de plataforma gasta dois dias por mês resolvendo problema de operador especializado de Postgres, e a alternativa gerenciada custa R$5k a mais — vale pagar. Se gasta meia hora por mês porque a stack é simples, a alternativa cara não compra nada além de luxo.",[12,15434,15435],{},"AWS gerenciado faz sentido nessa fase quando compliance pede explicitamente, quando o cliente B2B sério lista provedor cloud como pré-requisito de contrato, ou quando uma certificação específica exige stack pré-aprovada. Auto-hospedado faz sentido quando o time consegue extrair valor de customização — telemetria fina, controle de roteamento, isolamento mais agressivo do que o gerenciado oferece.",[19,15437,15439],{"id":15438},"os-custos-invisiveis-que-ninguem-calcula","Os custos invisíveis que ninguém calcula",[12,15441,15442],{},"Toda planilha de provedor cloud tem o mesmo padrão: o \"preço de prateleira\" é só o começo. Os custos que aparecem na fatura no terceiro mês — não no primeiro — são o que separa quem fez a conta direito de quem vai descobrir o problema só quando o investidor pedir o demonstrativo.",[12,15444,15445,15448],{},[27,15446,15447],{},"Banda de saída (egress)."," Provedor cloud americano tradicional cobra cerca de US$0,09 por gigabyte de saída. Em real, isso é R$0,45 por gigabyte. Um SaaS modesto com 100 GB de tráfego de saída por mês paga R$45 só por dado saindo do data center — e essa é a categoria mais frequentemente esquecida em projeção de orçamento. Hetzner inclui 20 TB por mês de banda gratuita por servidor. Em escala, a diferença vira facilmente milhares de reais por mês.",[12,15450,15451,15454],{},[27,15452,15453],{},"Logs."," O serviço de log gerenciado da AWS cobra US$0,50 por gigabyte ingerido e US$0,03 por gigabyte armazenado. Aplicação típica gera entre 1 GB e 5 GB de log por mês por instância. Em cinco instâncias com retenção de seis meses, a conta sobe pra R$50 a R$200 por mês — invisível na proposta inicial.",[12,15456,15457,15460,15461,101],{},[27,15458,15459],{},"Monitoramento como serviço."," Datadog cobra US$15 por host por mês na configuração padrão. New Relic cobra similar. Cinco hosts custam R$375 a R$500 por mês. Pra startup brasileira em estágio early, isso é meio salário de estagiário ",[27,15462,15463],{},"só em monitoramento",[12,15465,15466,15469],{},[27,15467,15468],{},"DNS."," O serviço gerenciado de DNS de provedor cloud cobra US$0,50 por zona e US$0,40 por milhão de consultas. É barato em valor absoluto, mas é a categoria que costuma ficar fora do orçamento porque parece negligível — até a hora em que cinco produtos da empresa cada um tem três zonas e você descobre US$30 por mês saindo escondido.",[12,15471,15472,15475],{},[27,15473,15474],{},"Retenção de backup."," Snapshot diário com sete dias de retenção. Snapshot semanal com quatro semanas. Snapshot mensal com doze meses. Política multiplica volume por seis ou sete. Gerenciamento errado de ciclo de vida pode dobrar o custo de armazenamento de uma hora pra outra.",[12,15477,15478,15481],{},[27,15479,15480],{},"Free tier que diminui."," Provedor cloud americano tradicional inclui 100 GB de saída gratuita por mês na conta inteira. Hetzner inclui 20 TB por servidor. A diferença em escala é dramática — e é uma das razões pelas quais hospedagem na Alemanha em provedor europeu costuma sair 30 a 50 por cento mais barata que hospedagem em São Paulo no provedor cloud tradicional, mesmo contando latência adicional.",[19,15483,15485],{"id":15484},"tabela-final-agregada-custo-total-ano-1-por-cenario","Tabela final agregada — custo total ano 1 por cenário",[12,15487,15488,15489,101],{},"A tabela abaixo amarra tudo, expressando o custo de infra como porcentagem do MRR. É a métrica que importa de verdade pro CFO: ",[27,15490,15491],{},"quanto de cada real de receita está indo embora pra pagar servidor",[119,15493,15494,15513],{},[122,15495,15496],{},[125,15497,15498,15501,15504,15507,15510],{},[128,15499,15500],{},"Cenário",[128,15502,15503],{},"Stack",[128,15505,15506],{},"Custo ano 1",[128,15508,15509],{},"MRR ano 1",[128,15511,15512],{},"% da receita",[141,15514,15515,15532,15548,15565,15581,15598],{},[125,15516,15517,15520,15523,15526,15529],{},[146,15518,15519],{},"MVP em VPS + Coolify",[146,15521,15522],{},"1 servidor barato",[146,15524,15525],{},"R$360",[146,15527,15528],{},"R$60.000",[146,15530,15531],{},"0,6% — saudável",[125,15533,15534,15537,15540,15543,15545],{},[146,15535,15536],{},"MVP em hospedado caro",[146,15538,15539],{},"Vercel pro",[146,15541,15542],{},"R$1.500",[146,15544,15528],{},[146,15546,15547],{},"2,5% — ainda OK",[125,15549,15550,15553,15556,15559,15562],{},[146,15551,15552],{},"Indie hacker em hospedado",[146,15554,15555],{},"Render Pro",[146,15557,15558],{},"R$3.500",[146,15560,15561],{},"R$240.000",[146,15563,15564],{},"1,5% — fine",[125,15566,15567,15570,15573,15576,15578],{},[146,15568,15569],{},"Indie hacker em auto-hospedado HA",[146,15571,15572],{},"HeroCtl Community + 3 VPS",[146,15574,15575],{},"R$1.000",[146,15577,15561],{},[146,15579,15580],{},"0,4% — excelente",[125,15582,15583,15586,15589,15592,15595],{},[146,15584,15585],{},"Startup em AWS gerenciado",[146,15587,15588],{},"EKS + RDS + observabilidade",[146,15590,15591],{},"R$120.000 + 2 SREs (R$720k folha)",[146,15593,15594],{},"R$2.400.000",[146,15596,15597],{},"35% — doendo",[125,15599,15600,15603,15606,15609,15611],{},[146,15601,15602],{},"Startup em auto-hospedado",[146,15604,15605],{},"HeroCtl + 4 VPS + 1 dev part-time",[146,15607,15608],{},"R$10.000 + meio dev R$70k",[146,15610,15594],{},[146,15612,15613],{},"3% — saudável",[12,15615,15616],{},"A linha que mais salta é a quinta. Trinta e cinco por cento de R$2,4 milhões de MRR em infra mais time de operação dedicado. Pra startup brasileira nesse estágio, é literalmente o ponto que define se o ano fecha lucrativo ou no vermelho.",[12,15618,15619],{},"A linha de baixo, com a mesma receita, fecha em três por cento de gasto. Trinta e dois pontos percentuais de margem operacional adicionais. Isso não é otimização: é uma decisão de arquitetura que muda a categoria de negócio em que a empresa está.",[19,15621,15623],{"id":15622},"os-falsos-atalhos","Os falsos atalhos",[12,15625,15626],{},"Nas conversas com fundadores brasileiros, quatro frases voltam com frequência. Cada uma soa razoável e cada uma é uma armadilha específica.",[12,15628,15629,15632],{},[27,15630,15631],{},"\"Vou começar com tudo gerenciado e migro depois.\""," A intenção é boa: não distrair do produto agora, otimizar depois. Mas a migração de um stack gerenciado completo pra auto-hospedado leva tipicamente quatro a seis meses de trabalho concentrado de pelo menos um sênior — porque tem que reescrever automação, refazer pipeline de deploy, validar backup, treinar o resto do time. Durante esses seis meses, o gasto continua subindo. Tipicamente, no momento da migração, a empresa já desperdiçou entre R$50.000 e R$100.000 a mais do que precisava.",[12,15634,15635,15638],{},[27,15636,15637],{},"\"O custo de oportunidade do meu time é maior que o custo de infra.\""," Verdade pra time grande, com cinco engenheiros sêniores dedicados a feature de produto. Mentira pra time de duas ou três pessoas onde o operacional real é \"um dev gasta quatro horas por mês com servidor\". Nesse cenário, o custo de oportunidade é fictício — porque o tempo gasto em servidor é tempo que de outra forma seria gasto em reunião, ou em revisão de código, ou em tarefa de produto que não é prioridade real.",[12,15640,15641,15644],{},[27,15642,15643],{},"\"Free tier é suficiente até validarmos.\""," Era verdade em 2018. Em 2026, todos os provedores diminuíram free tier ano após ano — alguns silenciosamente, outros com anúncio formal. Render free tier hibernando em quinze minutos derrubou produção de gente que descobriu da pior forma. Vercel free pra projeto pessoal vira limite de bandwidth e function execution surpreendentemente cedo. A planilha tem que ser feita assumindo tier pago desde o dia um — se sobrar, ótimo, é caixa.",[12,15646,15647,15650],{},[27,15648,15649],{},"\"Cloud brasileiro é mais caro mesmo.\""," Era verdade em 2020. Em 2026, Hetzner Alemanha sai 30 a 50 por cento mais barato que provedor cloud tradicional em São Paulo, e a latência adicional de 100 a 150 milissegundos é negligível pra a esmagadora maioria dos workloads SaaS. Magalu Cloud já compete em preço pra cargas pequenas e médias. Locaweb e KingHost, embora não sejam mais opção pra escala, ainda têm tier inicial competitivo. A premissa \"cloud brasileiro é caro\" virou folclore — vale conferir o preço atual antes de assumir.",[19,15652,15654],{"id":15653},"quando-faz-sentido-gastar-mais-em-infra","Quando faz sentido GASTAR mais em infra",[12,15656,15657],{},"Honestidade reversa: existem situações em que pagar mais é a decisão correta, e dizer o contrário seria vender ideologia em vez de solução. Quatro casos em que vale o premium.",[12,15659,15660,15663],{},[27,15661,15662],{},"Time de uma ou duas pessoas sem nenhum tempo pra cuidar de servidor."," Se você é fundador solo e o seu próprio dia é vendas + produto + atendimento, qualquer hora gasta em servidor é hora não gasta nas atividades que geram receita. Vale pagar R$2.000 a R$5.000 por mês a mais por uma stack totalmente gerenciada. Você está comprando foco, não infraestrutura.",[12,15665,15666,15669],{},[27,15667,15668],{},"Cliente B2B sério exige fornecedor cloud listado."," Algumas empresas grandes (especialmente bancos, seguradoras, governo) têm cláusula contratual exigindo que fornecedores hospedem em provedor cloud específico. Não é negociável; é pré-requisito de procurement. Não tem escolha — paga o premium e segue.",[12,15671,15672,15675],{},[27,15673,15674],{},"Compliance ou auditoria que exige stack pré-aprovada."," Frameworks específicos (alguns relacionados a saúde, pagamentos, ou contratos de governo) listam ferramentas nominalmente aprovadas. Se o auditor precisa apontar pra um certificado existente, e o seu produto auto-hospedado não está nessa lista, a resposta correta é o gerenciado tradicional. Argumentar com auditor é trabalho perdido.",[12,15677,15678,15681],{},[27,15679,15680],{},"Latência crítica e rede de borda é diferenciador real."," Se o seu produto é jogo, leilão em tempo real, ou trading, e cada milissegundo conta, a infraestrutura de borda do provedor americano tradicional ou da Cloudflare é genuinamente diferente. Vale o premium. Mas note: 99 por cento dos SaaS B2B brasileiros não estão nessa categoria, e dizer que estão é geralmente justificativa pós-fato pra uma escolha que foi feita por hábito.",[19,15683,15685],{"id":15684},"heroctl-no-orcamento-brasileiro-especificamente","HeroCtl no orçamento brasileiro especificamente",[12,15687,15688],{},"Cinco fatos relevantes pro contexto brasileiro:",[12,15690,15691,15692,15695],{},"Primeiro, o plano ",[27,15693,15694],{},"Community é gratuito permanente",", sem feature gate artificial. Não tem versão limitada com asterisco — é o produto inteiro, alta disponibilidade real, roteador, certificado automático, métrica, log centralizado. Indie hacker e startup early stage podem rodar tudo aqui pra sempre.",[12,15697,15698,15699,15702],{},"Segundo, ",[27,15700,15701],{},"roda em qualquer cloud",": Hetzner Alemanha, DigitalOcean, provedor cloud tradicional, Magalu Cloud, KingHost, VPS de provedor brasileiro pequeno. O cluster é o mesmo binário em qualquer Linux com Docker. Não tem dependência de serviço gerenciado de provedor específico — você troca de provedor sem refazer nada.",[12,15704,15705,15706,15709],{},"Terceiro, ",[27,15707,15708],{},"plano Business é cobrado em real",", sem volatilidade cambial repassada pro cliente. Variação do dólar é nosso problema, não seu. Empresa brasileira pagando empresa brasileira em real, contra contrato em real.",[12,15711,15712,15713,15716],{},"Quarto, ",[27,15714,15715],{},"preço é congelado pra contratos existentes",". O que você assina hoje continua valendo no aniversário do contrato. Mudança de tabela só vale pra novo contrato. Não tem cláusula que permita reajuste retroativo.",[12,15718,15719,15720,15723],{},"Quinto, ",[27,15721,15722],{},"suporte em português"," nos planos Business e Enterprise. Time falando o seu idioma, no seu fuso, com contexto de mercado brasileiro.",[19,15725,4244],{"id":4243},[12,15727,15728,15731],{},[27,15729,15730],{},"É mais barato hospedar fora do Brasil?"," Em 2026, sim — Hetzner Alemanha custa metade do provedor tradicional em São Paulo pra cargas equivalentes. A latência adicional de cem a cento e cinquenta milissegundos é imperceptível pra app web, API REST, dashboard, ferramenta interna. É perceptível pra streaming, jogo, voz em tempo real. Pra a esmagadora maioria de SaaS B2B brasileiro, hospedar fora é decisão financeira pura.",[12,15733,15734,15737],{},[27,15735,15736],{},"Magalu Cloud já vale em 2026?"," Pra cargas pequenas e médias, sim. O preço é competitivo, a estabilidade está aceitável, e o suporte em português ajuda. Pra cargas que exigem ecossistema profundo (cinco serviços gerenciados orquestrados), ainda existem lacunas. Vale como provedor primário pra startup brasileira que valoriza fornecedor local; vale menos pra empresa que precisa de catálogo completo de serviços.",[12,15739,15740,15743],{},[27,15741,15742],{},"Quando faz sentido pagar provedor cloud tradicional gerenciado mesmo sendo caro?"," Quando compliance lista nomes específicos. Quando cliente B2B exige no contrato. Quando o time tem um especialista de larga escala em folha por outras razões. Quando latência de borda é diferencial real do produto. Fora desses casos, é hábito mais que decisão.",[12,15745,15746,15749],{},[27,15747,15748],{},"Custo de migração compensa em quanto tempo?"," Migração típica de provedor gerenciado caro pra auto-hospedado custa entre R$30.000 e R$80.000 em tempo de engenharia (uma ou duas pessoas por dois a quatro meses). A economia mensal pós-migração paga esse investimento em três a oito meses na faixa de Cenário C. Em horizonte de doze meses, a migração paga ela mesma e ainda gera caixa positivo.",[12,15751,15752,15755],{},[27,15753,15754],{},"Free tier ainda existe em 2026?"," Existe, mas mais restrito que em 2020. Render mantém tier hibernante (não serve produção). Railway tem créditos iniciais. Vercel tem hobby plan com limite. Hetzner não tem free tier mas tem servidor a partir de €4. A regra de bolso atualizada: planeje sempre tier pago — se sobrar tier gratuito, é bônus.",[12,15757,15758,15761],{},[27,15759,15760],{},"E se eu vender pra cliente que exige provedor cloud específico na arquitetura?"," Você tem duas opções. Primeira: hospede o produto principal onde for melhor pro custo, e mantenha um deploy separado no provedor exigido pra atender a esse cliente específico. Segunda: HeroCtl roda dentro de provedor cloud tradicional também — você ganha o nome do provedor no contrato, mas sem pagar o premium do serviço de cluster gerenciado. É um meio-termo que serve auditoria sem destruir margem.",[12,15763,15764,15767],{},[27,15765,15766],{},"HeroCtl funciona em provedor brasileiro pequeno?"," Sim. O requisito é Linux com Docker. Funciona em Locaweb, KingHost, Hostinger, Magalu Cloud, qualquer VPS razoável. Os clusters de demonstração rodam em quatro servidores totalizando cinco vCPUs e dez gigabytes de RAM — qualquer provedor brasileiro entrega configuração equivalente por valor competitivo.",[19,15769,3310],{"id":3309},[12,15771,15772],{},"A planilha aberta diz uma coisa: a estratégia de infra que faz sentido pra startup brasileira é diferente da que faz sentido pra startup americana, e essa diferença vira ponto de margem que separa quem chega ao próximo round de quem queima caixa contra fornecedor.",[12,15774,15775],{},"Pra começar agora — três servidores baratos, alta disponibilidade real, certificado automático, painel web, sem custo recorrente de licença:",[224,15777,15779],{"className":15778,"code":5319,"language":2530},[2528],[231,15780,5319],{"__ignoreMap":229},[12,15782,15783,15784,2403,15787,101],{},"Leitura relacionada: ",[3337,15785,15786],{"href":14883},"Alternativa a Kubernetes e PaaS no Brasil",[3337,15788,15790],{"href":15789},"\u002Fblog\u002Fkubernetes-overkill-quando-voce-nao-precisa","Kubernetes é overkill: quando você não precisa",{"title":229,"searchDepth":244,"depth":244,"links":15792},[15793,15794,15800,15801,15802,15803,15804,15805,15806],{"id":14963,"depth":244,"text":14964},{"id":14990,"depth":244,"text":14991,"children":15795},[15796,15797,15798,15799],{"id":14997,"depth":271,"text":14998},{"id":15149,"depth":271,"text":15150},{"id":15262,"depth":271,"text":15263},{"id":15362,"depth":271,"text":15363},{"id":15438,"depth":244,"text":15439},{"id":15484,"depth":244,"text":15485},{"id":15622,"depth":244,"text":15623},{"id":15653,"depth":244,"text":15654},{"id":15684,"depth":244,"text":15685},{"id":4243,"depth":244,"text":4244},{"id":3309,"depth":244,"text":3310},"2026-04-26","Receita em real, custo em dólar. Pra startup brasileira, infra é a primeira despesa que mata margem. Comparação detalhada de cenários de hospedagem com números medidos.",{},{"title":14952,"description":15808},{"loc":6338},"blog\u002Fquanto-custa-hospedar-saas-brasileiro-2026",[6395,15814,14948,15815,15816],"saas","infraestrutura","orcamento","H-ChxxoLfmD2o755DIEjFIem6n5Xu6fuF6v_jQNHPzo",{"id":15819,"title":15820,"author":7,"body":15821,"category":3379,"cover":3380,"date":16729,"description":16730,"draft":3383,"extension":3384,"lastReviewed":3380,"meta":16731,"navigation":411,"path":3344,"readingTime":3387,"seo":16732,"sitemap":16733,"stem":16734,"tags":16735,"__hash__":16739},"blog_pt\u002Fblog\u002Fdeploy-docker-producao-do-compose-ao-cluster.md","Deploy de Docker em produção: do compose ao cluster com alta disponibilidade",{"type":9,"value":15822,"toc":16715},[15823,15832,15835,15838,15842,15845,15848,15865,15868,15885,15888,15894,15898,15908,15913,15940,15945,15948,15953,15973,15978,15981,15986,16060,16063,16067,16070,16075,16092,16097,16100,16105,16112,16117,16120,16124,16127,16131,16134,16138,16169,16173,16176,16181,16184,16187,16191,16194,16199,16202,16206,16209,16213,16230,16234,16237,16242,16245,16250,16253,16257,16260,16264,16436,16439,16443,16446,16452,16458,16464,16470,16474,16477,16486,16492,16498,16502,16505,16522,16531,16545,16550,16559,16563,16566,16592,16599,16603,16615,16621,16627,16633,16653,16659,16669,16671,16674,16677,16693,16696,16709,16712],[12,15824,15825,15826,15828,15829,15831],{},"O fluxo é familiar pra qualquer dev que cresceu nos últimos cinco anos. Você escreve um ",[231,15827,9013],{}," com três serviços, roda ",[231,15830,12709],{}," na sua máquina, funciona. Sobe num VPS de staging, funciona. Move pra produção apontando o DNS, e funciona — até a primeira sexta-feira às cinco da tarde em que para de funcionar.",[12,15833,15834],{},"O ponto exato em que \"funciona em produção\" deixa de ser verdade depende muito menos de qual ferramenta você escolheu, e muito mais de qual estágio de maturidade o seu produto atingiu. Esse post mapeia os quatro estágios pelos quais quase todo time passa, mostra os sinais práticos de que você precisa subir o degrau, e deixa explícito quando você ainda não precisa.",[12,15836,15837],{},"Não é um post anti-compose, nem um post pró-cluster. É um post sobre quando cada coisa cabe.",[19,15839,15841],{"id":15840},"por-que-o-docker-compose-foi-tao-bem-em-desenvolvimento","Por que o Docker Compose foi tão bem em desenvolvimento",[12,15843,15844],{},"Antes de falar sobre os estágios, vale entender o que o Compose foi desenhado pra ser. Ele resolve um problema muito específico e resolve bem: orquestrar múltiplos contêineres na mesma máquina, declarando dependências, redes, volumes e variáveis de ambiente num único arquivo legível.",[12,15846,15847],{},"As premissas embutidas nesse desenho são as premissas de quem está desenvolvendo:",[2735,15849,15850,15853,15856,15859,15862],{},[70,15851,15852],{},"Uma máquina só. A sua.",[70,15854,15855],{},"Um usuário só. Você.",[70,15857,15858],{},"Restart manual. Quando dá problema, você abre o terminal e digita.",[70,15860,15861],{},"Dados efêmeros. Se o banco zerar, você roda o seed de novo.",[70,15863,15864],{},"Ninguém depende disso ficar de pé. Se cair às três da manhã, o mundo continua.",[12,15866,15867],{},"Em produção, todas as cinco premissas se invertem:",[2735,15869,15870,15873,15876,15879,15882],{},[70,15871,15872],{},"N máquinas. Você não está mais sozinho.",[70,15874,15875],{},"N usuários. Eles não te conhecem.",[70,15877,15878],{},"Restart automático é exigência mínima. Ninguém vai acordar você às quatro da manhã. Idealmente, ninguém vai acordar ninguém.",[70,15880,15881],{},"Os dados importam. Perder o banco vira incidente reportável.",[70,15883,15884],{},"Alguém dorme com isso ativo. Possivelmente um cliente, possivelmente um contrato com multa.",[12,15886,15887],{},"O Docker Compose continua funcionando fora das premissas originais. Ele faz funcionar — só faz mal. Os atalhos que parecem inocentes em desenvolvimento (rede compartilhada entre serviços, volume montado direto no host, log saindo no terminal) viram pegadinhas quando o ambiente muda de \"uma máquina onde eu sei tudo o que está rodando\" pra \"três máquinas onde algo precisa estar rodando vinte e quatro horas por dia\".",[12,15889,15890,15891,15893],{},"Os quatro estágios a seguir mostram a curva natural de quem leva o mesmo ",[231,15892,9013],{}," desde o hobby até o SaaS com SLA contratual.",[19,15895,15897],{"id":15896},"estagio-1-compose-em-um-unico-vps","Estágio 1: Compose em um único VPS",[12,15899,15900,15901,15903,15904,15907],{},"O ponto de entrada mais honesto do Docker em produção. Um VPS barato, um arquivo ",[231,15902,9013],{},", e ",[231,15905,15906],{},"docker compose up -d"," resolvendo a vida.",[12,15909,15910],{},[27,15911,15912],{},"Setup mínimo viável:",[2735,15914,15915,15918,15921,15928,15934],{},[70,15916,15917],{},"1 VPS com 1–2 vCPUs e 2 GB de RAM (custa cerca de R$30 por mês em provedor brasileiro decente).",[70,15919,15920],{},"Docker e Docker Compose instalados via script oficial.",[70,15922,15923,15924,15927],{},"Todos os serviços com ",[231,15925,15926],{},"restart: always"," no compose.",[70,15929,15930,15931,622],{},"Volumes nomeados pra dados (não bind mounts apontando pra ",[231,15932,15933],{},"\u002Fopt\u002Fapp\u002Fdata",[70,15935,15936,15937,15939],{},"Um cron diário rodando ",[231,15938,5737],{}," e mandando pro S3 ou pra um Backblaze B2.",[12,15941,15942],{},[27,15943,15944],{},"Pra quem isso funciona:",[12,15946,15947],{},"Hobby projects, MVPs validando product-market fit, ferramentas internas pro time, painéis administrativos privados, blogs pessoais. Qualquer aplicação onde a frase \"se ficar fora cinco minutos, ninguém morre\" é literalmente verdadeira.",[12,15949,15950],{},[27,15951,15952],{},"Riscos que você está aceitando explicitamente:",[2735,15954,15955,15958,15961,15970],{},[70,15956,15957],{},"O VPS cai (manutenção do provedor, pico de noisy neighbor, hardware) e o seu serviço cai junto. Não tem fail-over.",[70,15959,15960],{},"O disco morre, e se você não estiver fazendo backup, perdeu os dados. Os SSDs de provedor cloud falham menos do que os do data center antigo, mas falham. Acontece.",[70,15962,15963,15964,2403,15967,15969],{},"Cada deploy tem uma janela de cerca de 30 segundos entre ",[231,15965,15966],{},"docker compose down",[231,15968,12709],{}," em que o serviço fica fora.",[70,15971,15972],{},"Você é o sysadmin. Patch de kernel, atualização de Docker, rotação de log, monitoramento de disco — tudo na sua mão.",[12,15974,15975],{},[27,15976,15977],{},"Limites práticos:",[12,15979,15980],{},"Aguenta confortavelmente 1 a 3 aplicações pequenas, tráfego na casa de 100 requisições por segundo, e tolerância de 5 a 30 minutos de downtime mensal. Se algum desses números for forçado pra cima, você está abusando do estágio.",[12,15982,15983],{},[27,15984,15985],{},"O backup que ninguém faz e devia fazer:",[224,15987,15989],{"className":226,"code":15988,"language":228,"meta":229,"style":229},"# \u002Fetc\u002Fcron.daily\u002Fdb-backup\ndocker exec postgres pg_dump -U app app \\\n  | gzip \\\n  | aws s3 cp - s3:\u002F\u002Fmeu-bucket\u002Fbackups\u002F$(date +%F).sql.gz\n",[231,15990,15991,15996,16018,16028],{"__ignoreMap":229},[234,15992,15993],{"class":236,"line":237},[234,15994,15995],{"class":240},"# \u002Fetc\u002Fcron.daily\u002Fdb-backup\n",[234,15997,15998,16000,16003,16006,16009,16012,16014,16016],{"class":236,"line":244},[234,15999,1118],{"class":247},[234,16001,16002],{"class":255}," exec",[234,16004,16005],{"class":255}," postgres",[234,16007,16008],{"class":255}," pg_dump",[234,16010,16011],{"class":251}," -U",[234,16013,421],{"class":255},[234,16015,421],{"class":255},[234,16017,9800],{"class":383},[234,16019,16020,16023,16026],{"class":236,"line":271},[234,16021,16022],{"class":383},"  |",[234,16024,16025],{"class":247}," gzip",[234,16027,9800],{"class":383},[234,16029,16030,16032,16035,16038,16041,16044,16047,16049,16051,16054,16057],{"class":236,"line":415},[234,16031,16022],{"class":383},[234,16033,16034],{"class":247}," aws",[234,16036,16037],{"class":255}," s3",[234,16039,16040],{"class":255}," cp",[234,16042,16043],{"class":255}," -",[234,16045,16046],{"class":255}," s3:\u002F\u002Fmeu-bucket\u002Fbackups\u002F",[234,16048,1708],{"class":387},[234,16050,1866],{"class":247},[234,16052,16053],{"class":255}," +%F",[234,16055,16056],{"class":387},")",[234,16058,16059],{"class":255},".sql.gz\n",[12,16061,16062],{},"Sem isso, você não está em produção. Está em \"desenvolvimento exposto na internet\". A diferença entre um e outro é exatamente este cron.",[19,16064,16066],{"id":16065},"estagio-2-compose-com-auto-update-e-roteador-na-frente","Estágio 2: Compose com auto-update e roteador na frente",[12,16068,16069],{},"A primeira evolução natural. Você ainda tem um VPS, mas agora ele tem dois andares: um roteador que termina TLS e distribui as requisições, e os contêineres da aplicação atrás dele.",[12,16071,16072],{},[27,16073,16074],{},"Setup:",[2735,16076,16077,16080,16083,16086,16089],{},[70,16078,16079],{},"1 VPS um pouco mais robusto (2–4 vCPUs, 4–8 GB), girando em torno de R$50 a R$80 por mês.",[70,16081,16082],{},"Mesma stack do estágio anterior, mais um reverse proxy (Caddy ou um Traefik standalone) terminando TLS automaticamente via Let's Encrypt.",[70,16084,16085],{},"Watchtower (ou equivalente) puxando imagens novas do registro periodicamente.",[70,16087,16088],{},"Pipeline simples no GitHub Actions ou GitLab CI que builda a imagem, manda pro registro, e deixa o Watchtower descobrir.",[70,16090,16091],{},"Backup automatizado igual ao estágio 1, agora com retenção mais longa.",[12,16093,16094],{},[27,16095,16096],{},"Pra quem funciona:",[12,16098,16099],{},"Indie hackers com 2 a 5 aplicações pequenas, primeiro cliente pago num produto SaaS lateral, agência hospedando sites para clientes sem SLA contratual, ferramentas internas que cresceram além da fase \"três pessoas usam\".",[12,16101,16102],{},[27,16103,16104],{},"O que melhorou em relação ao estágio 1:",[12,16106,16107,16108,16111],{},"Deploy ficou seamless do ponto de vista do desenvolvedor. Você dá ",[231,16109,16110],{},"git push",", o CI builda e publica, e dois minutos depois a versão nova está no ar sem você ter feito SSH em servidor nenhum. TLS automático resolve uma dor que costumava consumir uma tarde por trimestre. Múltiplas aplicações compartilham o mesmo certificado wildcard via roteador.",[12,16113,16114],{},[27,16115,16116],{},"O que ainda dói:",[12,16118,16119],{},"Watchtower puxa qualquer imagem nova sem pensar duas vezes. Não há rolling deploy — durante o swap, a aplicação fica indisponível por algo entre 10 e 30 segundos. Não há health check de verdade antes de promover a versão nova; se você publicou uma imagem quebrada, o serviço fica fora até você notar e revertir manualmente. E o ponto único de falha continua: o VPS que cai derruba tudo.",[12,16121,16122],{},[27,16123,15977],{},[12,16125,16126],{},"5 a 10 aplicações no mesmo servidor, tráfego de até 500 requisições por segundo (depende muito do tipo de carga), tolerância de 5 a 15 minutos de downtime mensal. Se você começou a perder noite de sono porque o Watchtower atualizou algo às três da manhã e quebrou, você passou do estágio.",[19,16128,16130],{"id":16129},"estagio-3-multi-server-com-docker-swarm","Estágio 3: Multi-server com Docker Swarm",[12,16132,16133],{},"Aqui a conversa muda. Você sai de \"uma máquina robusta\" pra \"três máquinas se virando juntas\". O Docker Swarm é o degrau natural pra quem já está confortável com Compose: o arquivo é praticamente o mesmo, o vocabulário é o mesmo, e o salto conceitual é menor do que pular direto pro Kubernetes.",[12,16135,16136],{},[27,16137,16074],{},[2735,16139,16140,16143,16153,16163,16166],{},[70,16141,16142],{},"3 ou mais VPS de tamanho médio. Três é o mínimo prático pra que o cluster sobreviva à perda de uma máquina.",[70,16144,16145,16148,16149,16152],{},[231,16146,16147],{},"docker swarm init"," no primeiro nó, ",[231,16150,16151],{},"docker swarm join"," nos outros dois.",[70,16154,16155,16156,16159,16160,101],{},"Stack file (",[231,16157,16158],{},"docker stack deploy -c stack.yml meuapp",") em vez de ",[231,16161,16162],{},"docker-compose up",[70,16164,16165],{},"Roteador integrado ao cluster (o Traefik tem modo Swarm nativo) escutando os eventos do daemon e rebalanceando automaticamente.",[70,16167,16168],{},"Logs e métricas centralizados? Você monta por fora. Não vem na caixa.",[12,16170,16171],{},[27,16172,16096],{},[12,16174,16175],{},"SaaS B2B com primeiro contrato exigindo \"best-effort 99%\", time já tem um dev confortável com terminal e disposto a aprender, aplicação cresceu além do que cabe num VPS único sem dor.",[12,16177,16178],{},[27,16179,16180],{},"A elefante na sala:",[12,16182,16183],{},"O Docker Swarm está em modo de manutenção desde 2019. A Docker Inc. não investe ativamente em features novas. Bugs críticos ainda são corrigidos, mas o ecossistema de plugins estagnou, e a evolução do scheduler praticamente parou. Funciona — milhares de empresas rodam Swarm em produção sem problemas hoje. Mas você está apostando numa tecnologia cuja trajetória de investimento foi cortada há mais de cinco anos.",[12,16185,16186],{},"A versão honesta disso: se você adota Swarm em 2026, está adotando com a expectativa de eventualmente migrar pra outra coisa. Não é um problema imediato — é um problema que aparece quando você precisar de algo que o Swarm nunca vai ganhar.",[12,16188,16189],{},[27,16190,15977],{},[12,16192,16193],{},"3 a 30 servidores, tráfego na casa de 5 mil requisições por segundo agregadas, tolerância de 5 a 30 segundos de failover quando uma máquina cai. Acima disso, ou você complementa com peças externas (observability stack, autoscaler manual, DNS GSLB), ou você sobe pro próximo degrau.",[12,16195,16196],{},[27,16197,16198],{},"Onde mais dói no dia a dia:",[12,16200,16201],{},"A overlay network sob carga alta tem edge cases conhecidos, principalmente em redes de provedor cloud com MTU não-padrão. Recovery após split-brain em alguns cenários precisa de intervenção manual — o cluster não se recompõe sozinho em 100% dos casos. E qualquer coisa que envolva observabilidade detalhada (métricas persistidas, logs estruturados, tracing distribuído) você monta separado, mantendo dois ou três produtos a mais.",[19,16203,16205],{"id":16204},"estagio-4-cluster-com-plano-de-controle-replicado","Estágio 4: Cluster com plano de controle replicado",[12,16207,16208],{},"O degrau onde \"produção\" começa a ter o mesmo significado que tem em empresas de plataforma maduras. Você não está mais rodando um orquestrador legado em manutenção, nem dependendo de um único servidor pra continuidade.",[12,16210,16211],{},[27,16212,16074],{},[2735,16214,16215,16218,16221,16224,16227],{},[70,16216,16217],{},"3 a 5 servidores na configuração mínima, com o plano de controle replicado entre os três primeiros. Os demais entram como agentes.",[70,16219,16220],{},"Eleição automática de coordenador. Se o atual cair, em poucos segundos outro assume e o cluster continua aceitando deploys e atendendo tráfego.",[70,16222,16223],{},"Roteador integrado, certificados automáticos, health check antes de promover versão nova, rolling deploy com janelas configuráveis.",[70,16225,16226],{},"Métricas e logs como serviços internos do próprio cluster — você não monta cinco produtos pra ter observabilidade básica.",[70,16228,16229],{},"Submissão de jobs via CLI, API ou painel web. O cluster decide em qual servidor cada réplica vai rodar.",[12,16231,16232],{},[27,16233,16096],{},[12,16235,16236],{},"SaaS com SLA contratual de 99,9%, multi-tenant com requisitos formais de isolamento, time de plataforma de 1 a 3 pessoas, contratos B2B em que uptime é parte do SOW, qualquer empresa em que \"ficar fora vinte minutos\" gera reembolso.",[12,16238,16239],{},[27,16240,16241],{},"Riscos que mudam de natureza:",[12,16243,16244],{},"A complexidade não some — ela muda de forma. Em vez de você operar três VPS na mão, você opera um cluster que resolve a maior parte dos problemas sozinho mas tem mais peças. Curva de aprendizado pra quem nunca operou cluster antes existe e é real. E é genuinamente overkill se você nunca vai além do estágio 2: três servidores rodando um app de hobby é desperdício.",[12,16246,16247],{},[27,16248,16249],{},"Números concretos pra calibrar:",[12,16251,16252],{},"Um cluster pequeno bem configurado roda confortavelmente em 4 servidores totalizando 5 vCPUs e 10 GB de RAM, com o plano de controle ocupando entre 200 e 400 MB por servidor. A eleição de coordenador, quando o atual cai, leva cerca de 7 segundos até o cluster voltar a aceitar deploys. Comparativamente, a configuração equivalente no Kubernetes começa em centenas de linhas de manifesto pra um app \"hello world\" — e o HeroCtl resolve a mesma coisa em cerca de 50.",[12,16254,16255],{},[27,16256,15977],{},[12,16258,16259],{},"3 a 500 servidores. Acima disso, o ecossistema do Kubernetes gerenciado tem ferramentas que cluster pequeno não precisa: federação multi-região, scheduler avançado pra workloads heterogêneos, biblioteca profunda de operadores especializados pra databases stateful. Não é que cluster pequeno não escale — é que acima de 500 nós você está num mercado em que outras ferramentas têm cinco anos de vantagem.",[19,16261,16263],{"id":16262},"os-quatro-estagios-lado-a-lado","Os quatro estágios lado a lado",[119,16265,16266,16284],{},[122,16267,16268],{},[125,16269,16270,16272,16275,16278,16281],{},[128,16271,2983],{},[128,16273,16274],{},"Estágio 1 (compose 1 VPS)",[128,16276,16277],{},"Estágio 2 (compose + auto-update)",[128,16279,16280],{},"Estágio 3 (Docker Swarm)",[128,16282,16283],{},"Estágio 4 (cluster replicado)",[141,16285,16286,16301,16315,16330,16344,16361,16375,16391,16404,16420],{},[125,16287,16288,16291,16293,16295,16298],{},[146,16289,16290],{},"Custo mensal mínimo (BR, 2026)",[146,16292,11416],{},[146,16294,15233],{},[146,16296,16297],{},"R$150 (3 VPS)",[146,16299,16300],{},"R$200 (4 VPS)",[125,16302,16303,16306,16308,16310,16312],{},[146,16304,16305],{},"Complexidade operacional",[146,16307,4891],{},[146,16309,3155],{},[146,16311,3160],{},[146,16313,16314],{},"Média-alta",[125,16316,16317,16320,16322,16325,16328],{},[146,16318,16319],{},"Tempo até primeiro deploy",[146,16321,9778],{},[146,16323,16324],{},"1 hora",[146,16326,16327],{},"1 dia",[146,16329,16327],{},[125,16331,16332,16335,16337,16339,16342],{},[146,16333,16334],{},"Alta disponibilidade real",[146,16336,3059],{},[146,16338,3059],{},[146,16340,16341],{},"Sim, com ressalvas",[146,16343,3065],{},[125,16345,16346,16349,16352,16355,16358],{},[146,16347,16348],{},"Escala máxima realista",[146,16350,16351],{},"1–3 apps",[146,16353,16354],{},"5–10 apps",[146,16356,16357],{},"30 servidores",[146,16359,16360],{},"500 servidores",[125,16362,16363,16366,16368,16371,16373],{},[146,16364,16365],{},"Deploys sem downtime",[146,16367,3059],{},[146,16369,16370],{},"Quase",[146,16372,3065],{},[146,16374,3065],{},[125,16376,16377,16380,16383,16386,16389],{},[146,16378,16379],{},"TLS automático",[146,16381,16382],{},"Manual ou plugin",[146,16384,16385],{},"Sim, embutido",[146,16387,16388],{},"Sim, via roteador",[146,16390,16385],{},[125,16392,16393,16396,16398,16400,16402],{},[146,16394,16395],{},"Observabilidade na caixa",[146,16397,3059],{},[146,16399,3059],{},[146,16401,3059],{},[146,16403,3065],{},[125,16405,16406,16409,16412,16414,16417],{},[146,16407,16408],{},"Time mínimo pra operar",[146,16410,16411],{},"1 dev (parcial)",[146,16413,16411],{},[146,16415,16416],{},"1 dev (dedicado)",[146,16418,16419],{},"1 dev (parcial) ou 2 (parciais)",[125,16421,16422,16424,16427,16430,16433],{},[146,16423,5015],{},[146,16425,16426],{},"Hobby, MVP",[146,16428,16429],{},"Indie hacker, primeiro cliente",[146,16431,16432],{},"SaaS B2B early-stage",[146,16434,16435],{},"SaaS com SLA, multi-tenant",[12,16437,16438],{},"A coluna que costuma surpreender é a de \"time mínimo pra operar\". O estágio 4 com ferramenta certa não exige mais gente do que o estágio 3 — exige gente que pensa diferente. O salto cognitivo é maior do que o salto operacional.",[19,16440,16442],{"id":16441},"os-sinais-de-que-e-hora-de-subir-o-degrau","Os sinais de que é hora de subir o degrau",[12,16444,16445],{},"Subir antes de precisar é desperdício; ficar abaixo do necessário é dor. Os sinais práticos de cada transição:",[12,16447,16448,16451],{},[27,16449,16450],{},"Estágio 1 → Estágio 2."," Você descobriu que precisa rodar mais de uma aplicação no mesmo VPS, deploys manuais começaram a ficar tensos (medo de derrubar produção às nove da noite de uma sexta), apareceu o primeiro cliente pago e ele tem expectativas — mesmo que não escritas — de que você não vá sumir por trinta minutos no meio do dia útil.",[12,16453,16454,16457],{},[27,16455,16456],{},"Estágio 2 → Estágio 3."," Um cliente pediu SLA pela primeira vez, mesmo que informalmente (\"quanto tempo no máximo isso pode ficar fora?\"). Ou o VPS único caiu uma vez e você aprendeu na pele que precisava de redundância. Ou o time cresceu pra três ou mais pessoas e você não quer mais ser a única que sabe fazer deploy. Ou você está pagando R$300 por mês num VPS gigante quando três VPS médios resolveriam o mesmo com fail-over.",[12,16459,16460,16463],{},[27,16461,16462],{},"Estágio 3 → Estágio 4."," Contrato B2B exige uptime medível e auditável (palavras como \"99.9%\" e \"janela de manutenção\" começaram a aparecer em proposta comercial). Compliance pediu auditoria detalhada e você precisa mostrar trilha de quem fez o quê. Ou — o sinal mais comum hoje — você está cansado dos patches do Swarm e quer uma ferramenta com roadmap claro pelos próximos cinco anos.",[12,16465,16466,16469],{},[27,16467,16468],{},"O sinal universal de \"subiu cedo demais\"."," Você está gastando mais tempo configurando infraestrutura do que escrevendo features de produto. Volta um degrau. Sério. A infra existe pra suportar o produto, não o contrário, e a maior parte das startups que morrem cedo morrem porque construíram plataforma sem cliente em vez de cliente sem plataforma.",[19,16471,16473],{"id":16472},"a-trajetoria-que-nao-funciona","A trajetória que não funciona",[12,16475,16476],{},"Três armadilhas comuns em que times caem ao tentar acelerar o salto:",[12,16478,16479,16482,16483,16485],{},[27,16480,16481],{},"Pular do compose direto pra Kubernetes."," A tentação é genuína: \"se vou ter que migrar uma vez, melhor migrar pra ferramenta líder de mercado e nunca mais\". A realidade é mais cruel. Seis meses depois você ainda está lutando com manifestos de 300 linhas, operadores especializados, operadores de operadores, e gastando metade do tempo de engenharia em problemas que sequer existiam quando você rodava ",[231,16484,12709],{},". Enquanto isso, o concorrente mais simples shipou doze features. K8s vale a pena num momento muito específico — quando você já sabe que vai escalar pra 50+ servidores, tem time pra operar, e os problemas que ele resolve são problemas que você de fato tem. Antes disso, é capital queimado.",[12,16487,16488,16491],{},[27,16489,16490],{},"Ficar no compose por orgulho."," O outro extremo. \"DevOps complicado é overkill, eu não preciso, sempre rodei tudo num VPS e nunca tive problema\". A realidade chega na primeira sexta-feira às cinco da tarde em que o disco do VPS morre, o backup do mês passado tem três semanas, e você descobre simultaneamente que (a) precisava de HA e (b) precisava de procedimento de recuperação testado. Os dois aprendizados num único final de semana são caros.",[12,16493,16494,16497],{},[27,16495,16496],{},"Comprar a stack porque está hype."," Service mesh, observability stack completa com cinco produtos, GitOps com dois repositórios e três pipelines, autoscaler com policies sofisticadas — pra uma aplicação de três contêineres servindo 200 usuários ativos. Você está construindo plataforma sem ter usuário pra plataforma. A mesma energia investida em features do produto teria gerado dez vezes mais retorno. Se você está num estágio anterior, não importa quão bonita a ferramenta do estágio seguinte seja.",[19,16499,16501],{"id":16500},"detalhes-tecnicos-que-valem-em-qualquer-estagio","Detalhes técnicos que valem em qualquer estágio",[12,16503,16504],{},"Algumas decisões valem desde o estágio 1 e seguem valendo no estágio 4. Vale gastar três parágrafos nelas porque cada uma já causou dor em produção pra muita gente.",[12,16506,16507,16510,16511,16513,16514,16517,16518,16521],{},[27,16508,16509],{},"Restart policies."," No Compose, ",[231,16512,15926],{}," é o caminho certo pra quem quer que o contêiner volte sozinho depois de qualquer falha. ",[231,16515,16516],{},"on-failure"," é mais econômico mas vai te morder quando o processo der exit 0 por engano. No Swarm, ",[231,16519,16520],{},"restart_policy.condition: any"," faz papel similar. Em qualquer estágio, pensar na política de restart é parte de pensar no design da aplicação — não é detalhe.",[12,16523,16524,16527,16528,16530],{},[27,16525,16526],{},"Health checks."," Toda aplicação que aceita HTTP precisa expor um endpoint ",[231,16529,355],{}," retornando 200 quando está saudável. Sem isso, nenhum orquestrador acima do estágio 1 consegue distinguir \"contêiner subiu\" de \"contêiner subiu e está realmente atendendo tráfego\". Timeout razoável: 5 segundos. Retry razoável: 3 vezes antes de marcar como unhealthy. Sem isso, você vai entrar em restart loops e demorar horas pra entender o que está acontecendo.",[12,16532,16533,16536,16537,16540,16541,16544],{},[27,16534,16535],{},"Volumes nomeados versus bind mounts."," Volumes nomeados (",[231,16538,16539],{},"volumes: [meudata:\u002Fvar\u002Flib\u002Fpostgresql\u002Fdata]",") sobrevivem a recriação do contêiner, são gerenciados pelo Docker, e funcionam consistentemente entre estágios. Bind mounts (",[231,16542,16543],{},".\u002Fdata:\u002Fvar\u002Flib\u002Fpostgresql\u002Fdata",") dependem do filesystem do host, têm comportamento estranho com SELinux e AppArmor, e quebram quando o contêiner muda de máquina (estágio 3 e 4). Use bind mount só pra desenvolvimento e pra arquivos de configuração read-only.",[12,16546,16547,16549],{},[27,16548,15453],{}," Stdout e stderr é o caminho certo, sempre. Aplicação que escreve log em arquivo dentro do contêiner é aplicação que vai te dar dor de cabeça. O orquestrador captura stdout, roteia pra onde precisa ir (driver syslog, agregador externo, serviço interno), e você nunca mais precisa exec dentro do contêiner pra ver o que aconteceu.",[12,16551,16552,16555,16556,16558],{},[27,16553,16554],{},"Secrets."," Variáveis de ambiente em arquivo ",[231,16557,9376],{}," são confortáveis e perigosas — vazam em log, em backup, em snapshot. Pra estágio 1 e 2, dá pra viver com elas se você for cuidadoso. Pra estágio 3 em diante, use o mecanismo nativo de secrets do orquestrador. Em ferramentas mais novas (HeroCtl incluso), o cofre é parte do cluster — você não monta um produto separado só pra guardar senha.",[19,16560,16562],{"id":16561},"custo-concreto-de-cada-estagio-brasil-2026","Custo concreto de cada estágio (Brasil, 2026)",[12,16564,16565],{},"A matemática crua, sem floreios:",[2735,16567,16568,16574,16580,16586],{},[70,16569,16570,16573],{},[27,16571,16572],{},"Estágio 1."," 1 VPS de R$30 por mês = R$360 por ano. Tempo de setup inicial: uma tarde. Tempo de operação contínua: cerca de 1 hora por mês.",[70,16575,16576,16579],{},[27,16577,16578],{},"Estágio 2."," 1 VPS de R$50 por mês = R$600 por ano. Tempo de setup: um dia. Tempo de operação: cerca de 2 horas por mês, principalmente lidando com Watchtower atualizando algo que não devia.",[70,16581,16582,16585],{},[27,16583,16584],{},"Estágio 3."," 3 VPS de R$50 = R$150 por mês = R$1.800 por ano. Tempo de setup: cerca de 3 dias até estar confortável. Tempo de operação: 4 a 8 horas por mês, dependendo de quantos jobs rodam.",[70,16587,16588,16591],{},[27,16589,16590],{},"Estágio 4 (HeroCtl Community)."," 4 VPS de R$50 = R$200 por mês = R$2.400 por ano. Tempo de setup: 1 a 2 dias até estar confortável. Tempo de operação: comparável ao estágio 3, mas sem os patches manuais e com observabilidade na caixa.",[12,16593,16594,16595,16598],{},"E pra calibrar a comparação que muita gente faz cedo demais: ",[27,16596,16597],{},"Kubernetes gerenciado pra a mesma escala"," custa entre R$700 e R$1.500 por mês de plano de controle e load balancers, então R$8,4k a R$18k por ano só de infraestrutura — sem contar os 1 a 2 SREs (R$25k a R$35k por mês cada) que esse estágio passa a exigir. A diferença entre estágio 4 e Kubernetes gerenciado, no quesito custo total, costuma ser de uma ordem de grandeza inteira.",[19,16600,16602],{"id":16601},"perguntas-que-a-gente-recebe","Perguntas que a gente recebe",[12,16604,16605,16611,16612,16614],{},[27,16606,16607,16608,16610],{},"Compose com ",[231,16609,15926],{}," não é suficiente?","\nÉ suficiente até a primeira coisa que ",[231,16613,15926],{}," não cobre: o VPS inteiro indisponível, o disco corrompido, a falha de rede do provedor, ou um deploy que sobe imagem quebrada e entra em loop sem alguém pra notar. Pra hobby project, suficiente; pra cliente pago, é o ponto de início, não o ponto de chegada.",[12,16616,16617,16620],{},[27,16618,16619],{},"Docker Swarm está realmente deprecated?","\nNão no sentido oficial — a Docker Inc. não anunciou descontinuação. Mas está em manutenção, sem features novas relevantes desde 2019, e o ecossistema de plugins parou de crescer. Funciona em produção hoje. Uma escolha defensável pra quem já está nele. Uma escolha questionável pra quem está adotando agora em 2026.",[12,16622,16623,16626],{},[27,16624,16625],{},"Quando vale subir pra Kubernetes gerenciado?","\nQuando você tem mais de 50 servidores, time de plataforma com 3+ pessoas dedicadas, e problemas específicos que o ecossistema do K8s resolve melhor (federação multi-região, autoscaling sofisticado, biblioteca profunda de operadores stateful). Antes disso, está pagando o custo sem usar o benefício.",[12,16628,16629,16632],{},[27,16630,16631],{},"Watchtower é seguro?","\nRazoavelmente, com ressalvas. Ele puxa qualquer imagem nova publicada na tag que você está apontando, sem distinguir entre \"atualização que você publicou\" e \"imagem comprometida que alguém empurrou via cadeia de suprimento\". Pra estágio 2, o trade-off vale: o ganho operacional supera o risco. Pra estágios maiores, prefira mecanismos que validam imagem antes de promover.",[12,16634,16635,16638,16639,16642,16643,571,16645,16648,16649,16652],{},[27,16636,16637],{},"Como faço backup de volume Docker no estágio 1?","\nCron diário rodando ",[231,16640,16641],{},"docker exec"," no contêiner do banco com o utilitário de dump nativo (",[231,16644,5737],{},[231,16646,16647],{},"mysqldump",", etc.), pipe pra ",[231,16650,16651],{},"gzip",", e upload pra storage objeto fora do mesmo provedor. A regra de ouro: o backup tem que viver longe do dado primário. Se o data center cair, o backup precisa estar em outro data center.",[12,16654,16655,16658],{},[27,16656,16657],{},"Posso pular do estágio 1 direto pro 4?","\nTecnicamente sim, especialmente com ferramentas que fazem o salto suave (HeroCtl é uma delas, instala em minutos e roda confortavelmente em 3 servidores). Recomendado, só se você já sabe que vai precisar do estágio 4 nos próximos seis meses. Caso contrário, o estágio 2 te ensina coisas (deploy automatizado, TLS, registry de imagens) que você vai usar de qualquer jeito mais tarde.",[12,16660,16661,16664,16665,16668],{},[27,16662,16663],{},"E se eu não souber Linux profundamente?","\nEstágio 1 e 2 são muito acessíveis com conhecimento básico. Estágio 3 começa a exigir entendimento de rede (overlay networks, MTU, iptables ocasional). Estágio 4, com a ferramenta certa, abstrai a maior parte da complexidade — mas debug de incidente ainda exige saber ler log de systemd, entender o que ",[231,16666,16667],{},"dmesg"," está dizendo, e diagnosticar disco cheio. Não há mágica que substitua os fundamentos quando algo dá errado às três da manhã.",[19,16670,13767],{"id":13766},[12,16672,16673],{},"A maturidade não é virtude moral. Não é \"melhor\" estar no estágio 4 do que no estágio 1 — é melhor estar no estágio que combina com o tamanho do problema que você está resolvendo. Hobby project no estágio 4 é desperdício de capital e atenção; SaaS com cinquenta clientes pagantes no estágio 1 é negligência operacional.",[12,16675,16676],{},"O HeroCtl existe pra tornar o estágio 4 acessível pra quem antes precisava escolher entre o desconforto do Swarm e o custo do Kubernetes. Se você sente que passou do estágio 2 e está pesando entre as opções:",[224,16678,16679],{"className":226,"code":2949,"language":228,"meta":229,"style":229},[231,16680,16681],{"__ignoreMap":229},[234,16682,16683,16685,16687,16689,16691],{"class":236,"line":237},[234,16684,1220],{"class":247},[234,16686,2958],{"class":251},[234,16688,2961],{"class":255},[234,16690,2964],{"class":383},[234,16692,2967],{"class":247},[12,16694,16695],{},"Instala em minutos, roda confortavelmente em 3 a 5 servidores, e tem plano Community gratuito permanente — sem feature gate artificial, sem limite de servidores, sem amarração contratual. Os planos Business e Enterprise existem pra empresas com requisitos formais de SSO, auditoria detalhada e suporte com SLA, e os preços estão publicados sem \"fale com vendas\" obrigatório.",[12,16697,16698,16699,16703,16704,16708],{},"Pra quem está comparando ferramentas no mesmo nicho, dois posts complementares: ",[3337,16700,16702],{"href":16701},"\u002Fblog\u002Fheroctl-vs-coolify","HeroCtl vs Coolify"," cobre o trade-off de adotar uma ferramenta com HA real versus um painel single-server elegante; ",[3337,16705,16707],{"href":16706},"\u002Fblog\u002Fheroctl-vs-dokploy","HeroCtl vs Dokploy"," cobre a diferença de adotar um cluster com plano de controle replicado versus um painel que internamente roda Swarm.",[12,16710,16711],{},"E se a pergunta for \"qual estágio combina comigo agora?\", a resposta honesta quase sempre é: o anterior ao que você acha que precisa. Volta um, fica até doer, sobe quando doer mesmo.",[3351,16713,16714],{},"html pre.shiki code .sH3jZ, html code.shiki .sH3jZ{--shiki-default:#8B949E}html pre.shiki code .sQhOw, html code.shiki .sQhOw{--shiki-default:#FFA657}html pre.shiki code .s9uIt, html code.shiki .s9uIt{--shiki-default:#A5D6FF}html pre.shiki code .sFSAA, html code.shiki .sFSAA{--shiki-default:#79C0FF}html pre.shiki code .suJrU, html code.shiki .suJrU{--shiki-default:#FF7B72}html pre.shiki code .sZEs4, html code.shiki .sZEs4{--shiki-default:#E6EDF3}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":229,"searchDepth":244,"depth":244,"links":16716},[16717,16718,16719,16720,16721,16722,16723,16724,16725,16726,16727,16728],{"id":15840,"depth":244,"text":15841},{"id":15896,"depth":244,"text":15897},{"id":16065,"depth":244,"text":16066},{"id":16129,"depth":244,"text":16130},{"id":16204,"depth":244,"text":16205},{"id":16262,"depth":244,"text":16263},{"id":16441,"depth":244,"text":16442},{"id":16472,"depth":244,"text":16473},{"id":16500,"depth":244,"text":16501},{"id":16561,"depth":244,"text":16562},{"id":16601,"depth":244,"text":16602},{"id":13766,"depth":244,"text":13767},"2026-04-21","Docker Compose resolve o dev. Em produção basta até um servidor sem SLA. Acima disso, você precisa de cluster real. Trajetória honesta dos quatro estágios de maturidade.",{},{"title":15820,"description":16730},{"loc":3344},"blog\u002Fdeploy-docker-producao-do-compose-ao-cluster",[1118,1526,16736,16737,16738,3379],"producao","cluster","ha","4Rex7CknFpoABnJvD7T4kmIcg_Oe56jP98EZjFWC9UM",{"id":16741,"title":16742,"author":7,"body":16743,"category":3379,"cover":3380,"date":17807,"description":17808,"draft":3383,"extension":3384,"lastReviewed":3380,"meta":17809,"navigation":411,"path":7468,"readingTime":8769,"seo":17810,"sitemap":17811,"stem":17812,"tags":17813,"__hash__":17816},"blog_pt\u002Fblog\u002Fpostgres-em-producao-gerenciado-vs-self-hosted.md","Postgres em produção: gerenciado vs auto-hospedado, a conta honesta",{"type":9,"value":16744,"toc":17790},[16745,16748,16751,16755,16758,16764,16770,16776,16782,16788,16794,16800,16803,16807,16810,16816,16822,16828,16834,16840,16846,16850,16856,16860,16937,16940,16944,17036,17043,17047,17163,17170,17174,17177,17190,17196,17202,17205,17209,17212,17218,17228,17244,17250,17260,17266,17270,17273,17279,17300,17310,17320,17326,17330,17333,17347,17353,17359,17365,17374,17379,17382,17386,17649,17652,17656,17662,17668,17674,17680,17684,17693,17702,17717,17726,17732,17742,17748,17750,17753,17756,17759,17775,17785,17788],[12,16746,16747],{},"A decisão \"RDS ou rodo Postgres no meu cluster\" é a que SaaS brasileiro mais adia. Ela aparece num documento de arquitetura no mês um, vira um TODO no mês três, vira uma briga interna no mês seis quando a fatura da AWS chega em três dígitos altos. E enquanto isso, ninguém quer escolher — porque cada blog post sobre o assunto é escrito por alguém com viés. Quem trabalha em fornecedor gerenciado fala que self-hosted te quebra. Quem mantém Postgres há quinze anos fala que RDS é roubo. Os dois lados omitem coisa.",[12,16749,16750],{},"Este post abre a planilha de verdade. Sem floreio, sem vender lado. Quando RDS faz sentido, quando não faz, quanto custa cada cenário em real, quanto custa em hora de engenheiro, e quais são os cinco erros que fazem self-hosted virar acidente.",[19,16752,16754],{"id":16753},"o-que-servicos-gerenciados-fazem-por-voce-sem-ironia","O que serviços gerenciados fazem por você (sem ironia)",[12,16756,16757],{},"Antes de qualquer comparação, é honesto reconhecer o que RDS, Cloud SQL, Aurora e os Postgres-as-a-Service modernos (Supabase, Neon, Crunchy) entregam de fato. A propaganda inflou — mas o produto é real.",[12,16759,16760,16763],{},[27,16761,16762],{},"Backup automático com retenção configurável."," Você diz \"guarda sete dias\", e está feito. Snapshot incremental, sem janela de manutenção visível, sem cron, sem baby-sitter. Para muitos times, esse item sozinho justifica o cheque.",[12,16765,16766,16769],{},[27,16767,16768],{},"Recuperação ponto-no-tempo (PITR)."," Você descobre às onze da manhã que um deploy às nove apagou um campo importante. Em RDS, você restaura para 08:55. Sem ler manual de WAL archiving, sem rezar pra um log de transações estar íntegro num bucket. Apenas console e botão.",[12,16771,16772,16775],{},[27,16773,16774],{},"Patches de segurança automáticos."," Postgres minor releases saem a cada três meses, e cada um tem CVE razoável. Em gerenciado, isso aplica numa janela que você define. Em self-hosted, você descobre que está atrasado quando uma checagem de compliance bate.",[12,16777,16778,16781],{},[27,16779,16780],{},"Réplica de leitura em um clique."," Quer escalar leitura? Liga a réplica, espera replicar, aponta a sua aplicação. Em self-hosted, você configura streaming replication manualmente, gerencia slot de replicação, monitora atraso, define o que acontece se a conexão cair.",[12,16783,16784,16787],{},[27,16785,16786],{},"Failover Multi-AZ automático."," Em RDS Multi-AZ, a instância secundária assume em 60–120 segundos quando a primária morre, e o endpoint DNS roteia sozinho. É a feature mais cara e a mais útil do produto.",[12,16789,16790,16793],{},[27,16791,16792],{},"Métricas integradas, logs centralizados."," CloudWatch já tem tudo lá. Slow queries, cache hit ratio, conexões ativas, IO. Você abre o console e vê.",[12,16795,16796,16799],{},[27,16797,16798],{},"Horas de operação que você não passa."," Esse é o item invisível. Cada uma das features acima é uma tarde que você não gastou. Vinte tardes ao longo do ano viram um engenheiro inteiro de dedicação parcial.",[12,16801,16802],{},"Reconhecer isso é o ponto de partida honesto. RDS é um produto sério. Não é vento.",[19,16804,16806],{"id":16805},"o-que-servicos-gerenciados-nao-fazem-e-ninguem-fala","O que serviços gerenciados NÃO fazem (e ninguém fala)",[12,16808,16809],{},"Aqui mora o asterisco. As limitações abaixo não estão na primeira página da documentação.",[12,16811,16812,16815],{},[27,16813,16814],{},"Migrar pra outra plataforma vira projeto."," Quando você está em Aurora, sair de Aurora é um projeto de duas a doze semanas dependendo do tamanho. O dialeto não é puro Postgres — Aurora tem extensões e comportamentos próprios. Sair de Cloud SQL pra outra nuvem exige dump-restore, downtime planejado, reescrita de scripts, ajuste de IAM, refazer monitoramento. O custo de saída é o que financia o desconto da entrada.",[12,16817,16818,16821],{},[27,16819,16820],{},"Algumas extensões populares simplesmente não existem."," TimescaleDB não roda em RDS (a AWS oferece um equivalente próprio que não é compatível). pg_partman tem versão antiga. pgvector chegou tarde. Se a sua arquitetura depende de uma extensão específica, você pode descobrir três meses depois que ela não está disponível na sua região, na sua versão, ou em geral.",[12,16823,16824,16827],{},[27,16825,16826],{},"Tráfego de saída entre regiões custa."," Você decide colocar uma réplica em outra região pra disaster recovery. Cada gigabyte saindo da região principal pra secundária paga pedágio. Em workloads pequenos é desprezível. Em workloads de 200 GB de write por dia, vira uma fatura paralela.",[12,16829,16830,16833],{},[27,16831,16832],{},"Latência entre app e banco se eles estiverem em VPCs diferentes."," Esse é o erro silencioso. Você sobe o app numa rede e o banco em outra, com peering. A latência mínima vai de 0,3 ms (mesma rede) pra 2–4 ms (peering). Não parece muito até a sua aplicação fazer cento e vinte queries por requisição — aí viram 350 ms de latência fantasma.",[12,16835,16836,16839],{},[27,16837,16838],{},"Auditoria detalhada custa extra."," Quem fez DROP TABLE? Em RDS isso pede Performance Insights na faixa avançada (US$7 por vCPU por mês) mais um logging plugin. Não vem ligado.",[12,16841,16842,16845],{},[27,16843,16844],{},"Você não controla a janela de manutenção de verdade."," Você \"configura\" uma janela, mas em incidentes graves a AWS aplica patches fora dela. Já aconteceu, vai acontecer.",[19,16847,16849],{"id":16848},"a-conta-financeira-honesta","A conta financeira honesta",[12,16851,16852,16853,16855],{},"Câmbio de referência: R$5 por dólar. Preços de RDS em região São Paulo (",[231,16854,6938],{},"), abril\u002F2026, on-demand. Self-hosted assume VPS DigitalOcean \u002F Vultr \u002F Hetzner em São Paulo ou Miami.",[368,16857,16859],{"id":16858},"cenario-pequeno-banco-abaixo-de-10-gb-ate-100-conexoesseg","Cenário pequeno: banco abaixo de 10 GB, até 100 conexões\u002Fseg",[119,16861,16862,16873],{},[122,16863,16864],{},[125,16865,16866,16868,16870],{},[128,16867,11395],{},[128,16869,5440],{},[128,16871,16872],{},"Self-hosted",[141,16874,16875,16886,16900,16911,16922],{},[125,16876,16877,16880,16883],{},[146,16878,16879],{},"Instância",[146,16881,16882],{},"db.t4g.micro (2 vCPU burst, 1 GB RAM)",[146,16884,16885],{},"VPS 2 vCPU 4 GB já existente do app",[125,16887,16888,16890,16895],{},[146,16889,14596],{},[146,16891,16892,16893],{},"US$15 = ",[27,16894,15124],{},[146,16896,16897,16899],{},[27,16898,8021],{}," (cabe junto do app)",[125,16901,16902,16905,16908],{},[146,16903,16904],{},"Storage 10 GB gp3",[146,16906,16907],{},"US$1,15",[146,16909,16910],{},"incluso",[125,16912,16913,16916,16919],{},[146,16914,16915],{},"Backup 10 GB",[146,16917,16918],{},"US$0,95",[146,16920,16921],{},"R$0,50 (S3-compatible)",[125,16923,16924,16927,16932],{},[146,16925,16926],{},"Total",[146,16928,16929],{},[27,16930,16931],{},"R$85\u002Fmês",[146,16933,16934],{},[27,16935,16936],{},"R$0,50\u002Fmês",[12,16938,16939],{},"Diferença: R$84\u002Fmês. Em um ano, R$1 mil. Não muda a vida de ninguém. Para um MVP, RDS é defensável só pelo backup automático.",[368,16941,16943],{"id":16942},"cenario-medio-50-gb-1-mil-conexoesseg-1-replica-de-leitura","Cenário médio: 50 GB, 1 mil conexões\u002Fseg, 1 réplica de leitura",[119,16945,16946,16956],{},[122,16947,16948],{},[125,16949,16950,16952,16954],{},[128,16951,11395],{},[128,16953,5440],{},[128,16955,16872],{},[141,16957,16958,16969,16980,16990,17000,17011,17020],{},[125,16959,16960,16963,16966],{},[146,16961,16962],{},"Primária",[146,16964,16965],{},"db.r6g.large (2 vCPU, 16 GB)",[146,16967,16968],{},"VPS dedicado 4 vCPU, 8 GB — R$120",[125,16970,16971,16974,16977],{},[146,16972,16973],{},"Réplica leitura",[146,16975,16976],{},"db.r6g.large",[146,16978,16979],{},"VPS 4 vCPU, 8 GB — R$120",[125,16981,16982,16985,16988],{},[146,16983,16984],{},"Storage 50 GB gp3",[146,16986,16987],{},"US$5,75",[146,16989,16910],{},[125,16991,16992,16995,16998],{},[146,16993,16994],{},"IOPS provisionado 3000",[146,16996,16997],{},"US$60",[146,16999,16910],{},[125,17001,17002,17005,17008],{},[146,17003,17004],{},"Backup 50 GB",[146,17006,17007],{},"US$4,75",[146,17009,17010],{},"R$5 (objeto compatível)",[125,17012,17013,17016,17018],{},[146,17014,17015],{},"Bandwidth",[146,17017,15230],{},[146,17019,16910],{},[125,17021,17022,17026,17031],{},[146,17023,17024],{},[27,17025,16926],{},[146,17027,17028],{},[27,17029,17030],{},"US$280 = R$1.400\u002Fmês",[146,17032,17033],{},[27,17034,17035],{},"R$245\u002Fmês",[12,17037,17038,17039,17042],{},"Diferença: R$1.155\u002Fmês = ",[27,17040,17041],{},"R$13,8 mil\u002Fano",". Aqui a conversa começa. Vale R$14 mil pra não pensar em backup? Para um time de dois engenheiros, é um mês de trabalho de um deles. Para um time de oito, é desprezível.",[368,17044,17046],{"id":17045},"cenario-grande-500-gb-10-mil-conexoesseg-alta-disponibilidade-real","Cenário grande: 500 GB, 10 mil conexões\u002Fseg, alta disponibilidade real",[119,17048,17049,17061],{},[122,17050,17051],{},[125,17052,17053,17055,17058],{},[128,17054,11395],{},[128,17056,17057],{},"RDS Multi-AZ",[128,17059,17060],{},"Self-hosted cluster",[141,17062,17063,17073,17083,17094,17103,17114,17125,17136,17147],{},[125,17064,17065,17067,17070],{},[146,17066,16962],{},[146,17068,17069],{},"db.r6g.4xlarge (16 vCPU, 128 GB) Multi-AZ",[146,17071,17072],{},"VPS dedicado 16 vCPU, 64 GB — R$650",[125,17074,17075,17078,17081],{},[146,17076,17077],{},"Réplica síncrona Multi-AZ",[146,17079,17080],{},"inclusa",[146,17082,17072],{},[125,17084,17085,17088,17091],{},[146,17086,17087],{},"Réplica de leitura",[146,17089,17090],{},"db.r6g.2xlarge",[146,17092,17093],{},"VPS 8 vCPU, 32 GB — R$320",[125,17095,17096,17099,17101],{},[146,17097,17098],{},"Storage 500 GB io1",[146,17100,16997],{},[146,17102,16910],{},[125,17104,17105,17108,17111],{},[146,17106,17107],{},"IOPS provisionado 10 mil",[146,17109,17110],{},"US$650",[146,17112,17113],{},"NVMe local incluso",[125,17115,17116,17119,17122],{},[146,17117,17118],{},"Backup automático 500 GB",[146,17120,17121],{},"US$48",[146,17123,17124],{},"R$80 (WAL archiving)",[125,17126,17127,17130,17133],{},[146,17128,17129],{},"Performance Insights avançado",[146,17131,17132],{},"US$112",[146,17134,17135],{},"grátis (Prometheus)",[125,17137,17138,17141,17144],{},[146,17139,17140],{},"Bandwidth saída",[146,17142,17143],{},"US$100",[146,17145,17146],{},"incluso até 20 TB",[125,17148,17149,17153,17158],{},[146,17150,17151],{},[27,17152,16926],{},[146,17154,17155],{},[27,17156,17157],{},"US$2.100 = R$10,5 mil\u002Fmês",[146,17159,17160],{},[27,17161,17162],{},"R$1.700\u002Fmês",[12,17164,17165,17166,17169],{},"Diferença: R$8,8 mil\u002Fmês = ",[27,17167,17168],{},"R$105 mil\u002Fano",". Aqui é onde o gerenciado fica difícil de defender financeiramente. Mas a conta financeira é só metade. A outra metade é tempo.",[19,17171,17173],{"id":17172},"a-conta-de-tempo-mais-importante-que-a-financeira","A conta de tempo (mais importante que a financeira)",[12,17175,17176],{},"Tempo de engenheiro em São Paulo custa entre R$80 e R$250 por hora útil dependendo do nível. Considere R$150\u002Fhora como média ponderada. Esse é o multiplicador que você precisa cruzar com cada item abaixo.",[12,17178,17179,17182,17183,1523,17186,17189],{},[27,17180,17181],{},"Setup inicial."," RDS via console: trinta minutos. Você define instância, storage, security group, parameter group, e está rodando. Self-hosted bem feito: quatro a oito horas. Postgres + PgBouncer + pgBackRest pra S3 + monitoring + tunning de ",[231,17184,17185],{},"shared_buffers",[231,17187,17188],{},"work_mem"," + script de restore + teste de restore. Fazer isso em meio dia exige experiência prévia. Sem experiência, vira um sprint inteiro.",[12,17191,17192,17195],{},[27,17193,17194],{},"Operação contínua mensal."," RDS: zero. Você abre o console quando algo grita. Self-hosted bem feito: duas a quatro horas. Revisar slow queries, ajustar parâmetro que ficou apertado, verificar que backup foi feito, restore test mensal, atualizar versão menor. Isso é o regime de cruzeiro. Se você está gastando mais que isso, está acontecendo problema.",[12,17197,17198,17201],{},[27,17199,17200],{},"Quando dá pau às três da manhã."," Em RDS, você abre ticket. Plano Business da AWS responde em quatro horas para severidade alta, uma hora para crítica. Você vai dormir e acorda com workaround. Em self-hosted, você é o suporte. Se o seu sistema de monitoramento não acordou você, o cliente acordou. Se o seu plano de DR está num documento que ninguém leu há seis meses, você está improvisando.",[12,17203,17204],{},"A regra clara: ter monitoramento, plano de recuperação de desastre escrito, e teste mensal de restore — não é opcional em self-hosted. É o que separa \"self-hosted profissional\" de \"acidente esperando acontecer\".",[19,17206,17208],{"id":17207},"stack-minima-pra-postgres-self-hosted-production-grade","Stack mínima pra Postgres self-hosted production-grade",[12,17210,17211],{},"Não dá pra rodar Postgres em produção sem essa base. Cada componente abaixo resolve um modo de falha conhecido.",[12,17213,17214,17217],{},[27,17215,17216],{},"Postgres principal em servidor dedicado."," Não compartilhe disco com a aplicação. O motor depende de IOPS previsíveis, e um log do app crescendo descontrolado pode encher o volume e parar o banco. Aloque um VPS só pro banco, ou um volume separado se for o mesmo VPS no início.",[12,17219,17220,17223,17224,17227],{},[27,17221,17222],{},"Pool de conexões com PgBouncer ou Pgpool."," Postgres aloca um processo por conexão. Em duzentas conexões diretas, ele consome mais memória que a sua aplicação. PgBouncer em modo ",[231,17225,17226],{},"transaction"," resolve: dezenas de conexões reais ao banco servindo milhares de conexões da aplicação. Sem isso, você morre na primeira hora de pico.",[12,17229,17230,17233,17234,17236,17237,17239,17240,17243],{},[27,17231,17232],{},"Backup com pgBackRest ou WAL-E."," Não use ",[231,17235,5737],{}," em cron como estratégia única. ",[231,17238,5737],{}," é dump lógico — bom pra migrar versão, ruim pra recuperar banco grande no minuto certo. Você quer ",[231,17241,17242],{},"pg_basebackup"," semanal mais arquivamento contínuo de WAL pra um bucket compatível com S3 (R2 da Cloudflare, B2 da Backblaze, Wasabi, ou o próprio S3). pgBackRest faz isso e ainda valida integridade.",[12,17245,17246,17249],{},[27,17247,17248],{},"Réplica em hot standby por replicação em streaming."," Um segundo servidor recebendo o WAL em tempo real, pronto pra promover se o primário cair. Bônus: você usa esse mesmo servidor pra queries de leitura pesada, descarregando o primário.",[12,17251,17252,17259],{},[27,17253,17254,17255,17258],{},"Monitoramento com ",[231,17256,17257],{},"postgres_exporter"," + Prometheus + Grafana",", ou um plug-in equivalente do orquestrador que você usa. Você quer ver: conexões ativas, ratio de cache, taxa de transações, lag de replicação, espaço em disco, slow queries. Sem isso, você está dirigindo de olho fechado.",[12,17261,17262,17265],{},[27,17263,17264],{},"Teste de restore mensal automatizado."," Cron que pega o backup mais recente, restaura num servidor temporário, valida que algumas tabelas têm linhas. Se isso falhar, alerta o time. Backup que nunca foi restaurado é placebo. Já vimos times perderem semana inteira de dados porque o \"backup\" estava corrompido há três meses e ninguém testou.",[19,17267,17269],{"id":17268},"os-cinco-erros-que-quebram-self-hosted-postgres","Os cinco erros que quebram self-hosted Postgres",[12,17271,17272],{},"São os mesmos cinco há quinze anos. Não inovam.",[12,17274,17275,17278],{},[27,17276,17277],{},"Não testar restore."," Repetimos porque é o item mais comum. Backup que nunca foi restaurado não é backup, é arquivo. Restore mensal automatizado é o mínimo civilizado.",[12,17280,17281,17289,17290,17292,17293,17296,17297,17299],{},[27,17282,17283,17284,2403,17286,17288],{},"Manter ",[231,17285,17185],{},[231,17287,17188],{}," no padrão."," O padrão do Postgres é projetado pra rodar num servidor pequeno sem assumir nada. Em produção, ",[231,17291,17185],{}," deve ser 25% da RAM, ",[231,17294,17295],{},"effective_cache_size"," 50–75%, ",[231,17298,17188],{}," calculado por conexão simultânea. Sem isso, você tem 64 MB de cache num servidor com 16 GB de RAM e o desempenho está deixado na mesa.",[12,17301,17302,17305,17306,17309],{},[27,17303,17304],{},"Não monitorar consultas lentas."," Uma query mal escrita por um desenvolvedor distraído pode travar o banco inteiro. ",[231,17307,17308],{},"pg_stat_statements"," ligado, alerta pra qualquer query passando de 500 ms em produção. Sem isso, você descobre o problema quando o cliente abre ticket.",[12,17311,17312,17315,17316,17319],{},[27,17313,17314],{},"Disco compartilhado com o sistema operacional."," O log do sistema enche, o ",[231,17317,17318],{},"\u002Fvar"," do banco compartilha o mesmo volume, e o banco para de aceitar escrita. Postgres tem que estar em volume dedicado. NVMe se possível.",[12,17321,17322,17325],{},[27,17323,17324],{},"Um servidor só sem réplica."," Servidor cai — e cai, mais cedo ou mais tarde, hardware falha — e você está com downtime de uma a três horas restaurando do backup. Réplica síncrona em outro servidor reduz isso pra segundos.",[19,17327,17329],{"id":17328},"postgres-num-orquestrador-como-o-heroctl","Postgres num orquestrador como o HeroCtl",[12,17331,17332],{},"Aqui é onde a complexidade operacional cai. Não porque o Postgres ficou mais simples — ele continua complexo — mas porque o orquestrador absorve a parte de plumbing que normalmente você escreve à mão.",[12,17334,17335,17338,17339,17342,17343,17346],{},[27,17336,17337],{},"Postgres como tarefa do cluster."," A descrição do serviço é um arquivo de configuração de aproximadamente trinta linhas: imagem oficial do Postgres, volume nomeado pra dados, variáveis de ambiente pra credenciais, recurso reservado de CPU e memória, política de reinício. Sem ",[231,17340,17341],{},"systemd unit",", sem ",[231,17344,17345],{},"apt install",", sem firewall manual.",[12,17348,17349,17352],{},[27,17350,17351],{},"Persistência via volume nomeado replicado."," Você diz \"esse volume é replicado entre dois servidores\", e o orquestrador garante que os dados existem nos dois. Se o servidor que está rodando o Postgres cair, o cluster reagenda no segundo servidor com os dados já presentes. Tempo de recuperação na casa de segundos, não horas.",[12,17354,17355,17358],{},[27,17356,17357],{},"Backup automático integrado"," no plano Business: arquivamento contínuo de WAL pra objeto compatível com S3, snapshot semanal, retenção configurável. A mesma feature do RDS, sem cheque pra AWS.",[12,17360,17361,17364],{},[27,17362,17363],{},"Réplica de leitura como tarefa adicional."," Você descreve um segundo serviço que aponta pro primeiro como upstream de replicação. Cinco linhas extras no manifesto. Sem console, sem clique, sem etapa manual.",[12,17366,17367,17370,17371,17373],{},[27,17368,17369],{},"Métricas embutidas."," O orquestrador já está coletando CPU, memória, IO de cada contêiner. Adicionar ",[231,17372,17257],{}," é mais uma tarefa de quinze linhas. Sem montar Prometheus separado, sem provisionar Grafana, sem estourar mais um servidor.",[12,17375,17376,17378],{},[27,17377,7114],{}," se o servidor que coordena cair: o cluster elege outro coordenador em torno de sete segundos e continua agendando. O Postgres em si volta nos servidores que sobraram em seguida.",[12,17380,17381],{},"A descrição completa de um Postgres com réplica + backup + métricas no HeroCtl é em torno de cem linhas. Em Kubernetes, o equivalente é um operador externo (CloudNativePG ou Zalando) mais 300 linhas de manifesto, mais um stack de monitoramento separado, mais cert-manager pra TLS interno entre nós. Para o time de cinco pessoas, a diferença é entre uma tarde e uma sprint.",[19,17383,17385],{"id":17384},"tabela-comparativa","Tabela comparativa",[119,17387,17388,17412],{},[122,17389,17390],{},[125,17391,17392,17394,17397,17400,17403,17406,17409],{},[128,17393,2983],{},[128,17395,17396],{},"RDS São Paulo",[128,17398,17399],{},"Cloud SQL",[128,17401,17402],{},"Supabase",[128,17404,17405],{},"Neon",[128,17407,17408],{},"Postgres VPS simples",[128,17410,17411],{},"Postgres no HeroCtl",[141,17413,17414,17436,17456,17474,17492,17511,17530,17550,17569,17589,17610,17631],{},[125,17415,17416,17419,17422,17425,17428,17431,17434],{},[146,17417,17418],{},"Custo mínimo (50 GB médio)",[146,17420,17421],{},"R$1.400\u002Fmês",[146,17423,17424],{},"R$1.300\u002Fmês",[146,17426,17427],{},"R$125\u002Fmês (Pro)",[146,17429,17430],{},"R$95\u002Fmês (Launch)",[146,17432,17433],{},"R$240\u002Fmês",[146,17435,17035],{},[125,17437,17438,17441,17444,17446,17448,17450,17453],{},[146,17439,17440],{},"Backup automático",[146,17442,17443],{},"sim",[146,17445,17443],{},[146,17447,17443],{},[146,17449,17443],{},[146,17451,17452],{},"você configura",[146,17454,17455],{},"sim (Business)",[125,17457,17458,17461,17463,17465,17468,17470,17472],{},[146,17459,17460],{},"Recuperação ponto-no-tempo",[146,17462,17443],{},[146,17464,17443],{},[146,17466,17467],{},"sim (Pro)",[146,17469,17443],{},[146,17471,17452],{},[146,17473,17455],{},[125,17475,17476,17478,17481,17483,17486,17488,17490],{},[146,17477,16334],{},[146,17479,17480],{},"sim (Multi-AZ pago)",[146,17482,17443],{},[146,17484,17485],{},"parcial",[146,17487,17443],{},[146,17489,17452],{},[146,17491,17443],{},[125,17493,17494,17497,17500,17502,17504,17506,17509],{},[146,17495,17496],{},"Extensões customizadas",[146,17498,17499],{},"restrito",[146,17501,17499],{},[146,17503,17499],{},[146,17505,17499],{},[146,17507,17508],{},"total",[146,17510,17508],{},[125,17512,17513,17515,17518,17520,17523,17525,17528],{},[146,17514,7158],{},[146,17516,17517],{},"alto",[146,17519,17517],{},[146,17521,17522],{},"médio",[146,17524,17522],{},[146,17526,17527],{},"nenhum",[146,17529,17527],{},[125,17531,17532,17535,17538,17540,17543,17545,17548],{},[146,17533,17534],{},"Migração de saída",[146,17536,17537],{},"semanas",[146,17539,17537],{},[146,17541,17542],{},"dias",[146,17544,17542],{},[146,17546,17547],{},"horas",[146,17549,17547],{},[125,17551,17552,17555,17557,17559,17561,17563,17566],{},[146,17553,17554],{},"Monitoramento incluso",[146,17556,17485],{},[146,17558,17443],{},[146,17560,17443],{},[146,17562,17443],{},[146,17564,17565],{},"você monta",[146,17567,17568],{},"embutido",[125,17570,17571,17574,17577,17579,17581,17583,17586],{},[146,17572,17573],{},"Expertise mínima",[146,17575,17576],{},"nenhuma",[146,17578,17576],{},[146,17580,17576],{},[146,17582,17576],{},[146,17584,17585],{},"sênior",[146,17587,17588],{},"pleno",[125,17590,17591,17594,17597,17599,17602,17605,17608],{},[146,17592,17593],{},"Latência app↔banco",[146,17595,17596],{},"1–4 ms",[146,17598,17596],{},[146,17600,17601],{},"5–30 ms",[146,17603,17604],{},"10–50 ms",[146,17606,17607],{},"0,3 ms",[146,17609,17607],{},[125,17611,17612,17614,17617,17619,17622,17625,17628],{},[146,17613,13540],{},[146,17615,17616],{},"qualquer",[146,17618,17616],{},[146,17620,17621],{},"até 50 GB",[146,17623,17624],{},"até 100 GB",[146,17626,17627],{},"indie",[146,17629,17630],{},"startup a porte médio",[125,17632,17633,17636,17638,17640,17642,17644,17647],{},[146,17634,17635],{},"Compliance LGPD via fornecedor",[146,17637,17443],{},[146,17639,17443],{},[146,17641,17485],{},[146,17643,17485],{},[146,17645,17646],{},"você documenta",[146,17648,17646],{},[12,17650,17651],{},"Nenhuma coluna ganha em tudo. Cada uma é um conjunto coerente de tradeoffs. Quem tenta vender uma coluna como \"a melhor\" está vendendo.",[19,17653,17655],{"id":17654},"decisao-honesta-por-perfil","Decisão honesta por perfil",[12,17657,17658,17661],{},[27,17659,17660],{},"MVP até 10 GB e até cem conexões\u002Fseg."," Postgres como contêiner ao lado da aplicação, num único VPS. Backup diário pra objeto compatível com S3. Custo total, banco e tudo, na faixa de R$10\u002Fmês acima do que você já paga pelo VPS. Em algum momento você migra — e migrar com 10 GB é uma noite de domingo, não um projeto. Comece simples.",[12,17663,17664,17667],{},[27,17665,17666],{},"Indie hacker entre 10 e 100 GB."," Postgres em VPS dedicado, réplica assíncrona em segundo VPS, backup horário pra objeto S3-compatible (Cloudflare R2 ou Backblaze B2 sai a centavos). Algo entre R$120 e R$200 por mês total. Se você tem hora pra dedicar, esse é o ponto onde self-hosted compensa muito.",[12,17669,17670,17673],{},[27,17671,17672],{},"Startup early entre 100 e 500 GB."," Aqui a decisão fica de verdade. Avalie RDS São Paulo pelo argumento de compliance LGPD (a AWS já tem o caderno de certificações do datacenter) — vai sair na faixa de R$1,5 a R$3 mil por mês. Ou avalie Postgres em cluster gerenciado pelo orquestrador, em três VPS dedicados, na faixa de R$400 por mês — mas exige disciplina operacional real. Não é \"self-hosted descomplicado\". É self-hosted com orquestrador absorvendo a parte de plumbing.",[12,17675,17676,17679],{},[27,17677,17678],{},"Compliance pesada ou Enterprise."," Gerenciado faz sentido quando o framework de auditoria pede fornecedor com certificação específica. Mas leia o contrato — algumas regiões de RDS no Brasil ainda não têm todas as certificações (HIPAA, FedRAMP, PCI nível 1) que a região americana tem. Se o seu auditor pede um certificado específico, confirme que a região tem antes de assinar.",[19,17681,17683],{"id":17682},"perguntas-que-time-inexperiente-faz","Perguntas que time inexperiente faz",[12,17685,17686,17689,17690,17692],{},[27,17687,17688],{},"Posso começar com self-hosted e migrar pra RDS depois?"," Pode, e é uma estratégia válida. Postgres é Postgres. Você faz ",[231,17691,5737],{}," da base, restaura em RDS, ajusta endpoint da aplicação, descomissiona o servidor antigo. Para até 50 GB, é uma operação de algumas horas com janela curta. O caminho contrário (sair de RDS pra self-hosted) também funciona, mas ferramentas como AWS DMS facilitam mais o ingresso que a saída.",[12,17694,17695,17698,17699,17701],{},[27,17696,17697],{},"RDS São Paulo é confiável?"," A região ",[231,17700,6938],{}," é uma das mais antigas da AWS fora dos Estados Unidos, opera desde 2011, e tem três zonas de disponibilidade independentes. Em incidentes globais da AWS, São Paulo costuma ser pega junto. Em incidentes regionais, ela cai sozinha — o que aconteceu duas vezes nos últimos cinco anos por algumas horas. Confiável o suficiente pra produção, não confiável o suficiente pra dispensar plano B.",[12,17703,17704,17710,17711,17713,17714,17716],{},[27,17705,17706,17707,17709],{},"Backup com ",[231,17708,5737],{}," em cron resolve?"," Resolve pra MVP, não resolve pra produção séria. ",[231,17712,5737],{}," é dump lógico — não preserva o estado exato, perde no tempo de restore (lento pra bases grandes), e não permite recuperar pro minuto X. A combinação certa é ",[231,17715,17242],{}," físico semanal mais arquivamento contínuo de WAL. Ferramenta: pgBackRest.",[12,17718,17719,17722,17723,17725],{},[27,17720,17721],{},"Quando vale comprar Performance Insights na faixa avançada?"," Quando você está em RDS, tem mais de cinco engenheiros mexendo no schema, e precisa rastrear \"quem rodou essa query?\". Em times pequenos, o ",[231,17724,17308],{}," nativo já entrega 80% do valor — ative ele primeiro e veja se você precisa de mais.",[12,17727,17728,17731],{},[27,17729,17730],{},"E Supabase, Neon, Crunchy?"," São produtos diferentes em cima de Postgres. Supabase é Postgres + autenticação + API REST gerada + storage de arquivos — bom pra projeto que precisa de tudo isso integrado, ruim pra quem quer só banco. Neon separa storage e compute, dorme quando ocioso, ótimo pra ambiente de staging e workload spiky. Crunchy é Postgres puro com foco enterprise e operador para Kubernetes. Os três têm camadas grátis razoáveis pra MVP — vale testar antes de fechar com RDS.",[12,17733,17734,17737,17738,17741],{},[27,17735,17736],{},"Como faço HA real sem RDS Multi-AZ?"," Réplica síncrona em segundo servidor (",[231,17739,17740],{},"synchronous_standby_names"," configurado) garante que cada commit foi escrito nos dois antes de retornar OK pra aplicação. Failover via Patroni, ou via orquestrador como o HeroCtl. O ponto sensível é o split-brain: a réplica não pode promover sozinha sem confirmação externa. Patroni resolve com etcd como árbitro. HeroCtl resolve com o próprio plano de controle distribuído fazendo o papel de árbitro — sem montar serviço extra.",[12,17743,17744,17747],{},[27,17745,17746],{},"HeroCtl roda Postgres pesado em produção mesmo?"," Roda. O cluster público da própria documentação serve esse blog através de uma stack que inclui um Postgres self-hosted como tarefa do cluster, com réplica e backup. Para workloads acima de 500 GB ou com requisitos de IOPS na casa de 50 mil, recomendamos avaliar gerenciado — não porque o orquestrador não aguenta, mas porque o IOPS provisionado e o controle de I\u002FO da AWS naquela faixa começam a fazer diferença operacional real.",[19,17749,3310],{"id":3309},[12,17751,17752],{},"Não existe resposta única pra \"Postgres gerenciado ou auto-hospedado\". Existe a sua planilha. Se você abriu este post procurando confirmação, o que achou foi números — use eles.",[12,17754,17755],{},"Para os perfis em que self-hosted compensa mas a operação assusta, o HeroCtl é a camada que reduz o atrito. Backup, réplica, monitoramento e failover descritos em cem linhas de configuração, rodando no seu cluster, sem cheque pra fornecedor, sem lock-in.",[12,17757,17758],{},"Instale com:",[224,17760,17761],{"className":226,"code":5319,"language":228,"meta":229,"style":229},[231,17762,17763],{"__ignoreMap":229},[234,17764,17765,17767,17769,17771,17773],{"class":236,"line":237},[234,17766,1220],{"class":247},[234,17768,2958],{"class":251},[234,17770,5330],{"class":255},[234,17772,2964],{"class":383},[234,17774,2967],{"class":247},[12,17776,17777,17778,17781,17782,101],{},"Para mais sobre o custo total de hospedar SaaS no Brasil em 2026, leia ",[3337,17779,17780],{"href":6338},"quanto custa hospedar SaaS brasileiro",". Para a transição prática de Docker Compose pra cluster com alta disponibilidade real, leia ",[3337,17783,17784],{"href":3344},"deploy Docker em produção, do Compose ao cluster",[12,17786,17787],{},"A conta honesta é a que cabe na sua planilha. Faça os números antes de decidir.",[3351,17789,4376],{},{"title":229,"searchDepth":244,"depth":244,"links":17791},[17792,17793,17794,17799,17800,17801,17802,17803,17804,17805,17806],{"id":16753,"depth":244,"text":16754},{"id":16805,"depth":244,"text":16806},{"id":16848,"depth":244,"text":16849,"children":17795},[17796,17797,17798],{"id":16858,"depth":271,"text":16859},{"id":16942,"depth":271,"text":16943},{"id":17045,"depth":271,"text":17046},{"id":17172,"depth":244,"text":17173},{"id":17207,"depth":244,"text":17208},{"id":17268,"depth":244,"text":17269},{"id":17328,"depth":244,"text":17329},{"id":17384,"depth":244,"text":17385},{"id":17654,"depth":244,"text":17655},{"id":17682,"depth":244,"text":17683},{"id":3309,"depth":244,"text":3310},"2026-04-15","RDS começa US$15\u002Fmês — termina US$500. Auto-hospedar começa $0 — termina te acordando às 3 da manhã. Como decidir entre os dois sem mentir pra você.",{},{"title":16742,"description":17808},{"loc":7468},"blog\u002Fpostgres-em-producao-gerenciado-vs-self-hosted",[13023,17814,17815,7514,3379],"banco-de-dados","rds","lKi32ttkH7LIFaGc-1Ud1lXI8s0X-UZnJg-8vIDk0ts",{"id":17818,"title":17819,"author":7,"body":17820,"category":3379,"cover":3380,"date":18366,"description":18367,"draft":3383,"extension":3384,"lastReviewed":3380,"meta":18368,"navigation":411,"path":11727,"readingTime":8769,"seo":18369,"sitemap":18370,"stem":18371,"tags":18372,"__hash__":18376},"blog_pt\u002Fblog\u002Fobservabilidade-sem-datadog-stack-startup.md","Observabilidade sem Datadog: a stack alternativa que cabe no orçamento brasileiro",{"type":9,"value":17821,"toc":18351},[17822,17825,17828,17831,17835,17838,17841,17844,17847,17850,17853,17857,17860,17866,17872,17878,17884,17887,17891,17894,17900,17906,17912,17918,17924,17930,17936,17939,17943,17946,17949,17952,17955,17959,17962,17968,17974,17980,17986,17990,17993,17999,18005,18011,18017,18023,18026,18030,18033,18039,18045,18051,18057,18060,18064,18067,18070,18073,18076,18079,18083,18086,18089,18092,18095,18099,18248,18251,18255,18258,18264,18270,18276,18282,18284,18290,18296,18302,18308,18314,18320,18326,18328,18331,18334,18337,18342],[12,17823,17824],{},"A primeira fatura do Datadog que ultrapassa quatro dígitos em real costuma chegar num momento previsível. O time deploy mais um par de serviços, o auto-discovery do agente passa a contar containers como hosts faturáveis, alguém liga APM no backend Node, outro alguém liga RUM no frontend pra investigar lentidão de página, e na virada do mês o cartão da empresa é debitado em quase R$2 mil. O fundador olha pra planilha, soma com Vercel, soma com banco gerenciado, soma com S3, e descobre que a infraestrutura — antes uma linha discreta no orçamento — agora come o equivalente a meio salário sênior por mês.",[12,17826,17827],{},"A reação dominante é apertar os dentes e pagar. Datadog é, sem ironia, o melhor produto do mercado em observabilidade. Os dashboards são bonitos, as integrações funcionam de primeira, o APM mostra a query lenta com profundidade que poucos concorrentes alcançam, o alerting é flexível o suficiente pra modelar políticas de SLO sem virar projeto interno. Pra empresa Series B com receita acima de US$5 milhões anuais, a conta de US$2 mil ou US$5 mil é desprezível diante do tempo de engenharia que ela compra. A escolha é racional.",[12,17829,17830],{},"Pra startup brasileira de cinco a dez servidores, faturando entre R$30 mil e R$500 mil por mês, a mesma escolha é financeiramente devastadora. Esse post mapeia a alternativa concreta — quais ferramentas usar, em qual servidor rodar, quanto consome de RAM, quanto custa em armazenamento — pra entregar 95% do mesmo resultado por cerca de 10% do preço.",[19,17832,17834],{"id":17833},"por-que-o-datadog-ganhou-o-mercado","Por que o Datadog ganhou o mercado",[12,17836,17837],{},"Não dá pra falar honestamente sobre alternativas sem explicar primeiro por que o líder está onde está. Quem já operou observabilidade em alguma escala sabe: a versão \"monte você mesmo\" sempre existiu, e ainda assim Datadog cresceu pra US$2 bilhões de receita anual. Há razões reais pra isso.",[12,17839,17840],{},"A primeira é que a UX cravou um padrão. Quando você abre um dashboard de Datadog pela primeira vez, a hierarquia de informação faz sentido na hora — host map, service map, traces, logs, tudo conectado por links que cruzam os contextos sem fricção. Quem operou observabilidade nos anos 2010 com Nagios, Cacti e Munin sabe que isso não é gratuito. Foi engenharia de produto cara, durante uma década.",[12,17842,17843],{},"A segunda é a biblioteca de integrações. Postgres, MySQL, Redis, Kafka, RabbitMQ, ElasticSearch, Mongo, Cassandra, dezenas de provedores cloud, mais de seiscentos targets prontos. Cada integração vem com dashboard padrão razoável, alertas sugeridos, métricas relevantes coletadas sem você ter que ler documentação obscura.",[12,17845,17846],{},"A terceira é o APM accurate. Os tracers oficiais para as linguagens populares fazem instrumentação automática que captura o nível certo de detalhe. A query lenta no Postgres aparece com plano de execução. O endpoint p99 lento aparece com a stack trace que causou a lentidão. Esse nível de visibilidade exige investimento contínuo em cada runtime.",[12,17848,17849],{},"A quarta é o alerting flexível. Threshold simples é fácil em qualquer ferramenta. Alerting que entende sazonalidade, que cruza múltiplas séries, que aplica anomaly detection em séries esparsas — isso o Datadog faz bem porque investiu uma década calibrando.",[12,17851,17852],{},"Pra empresa que pode pagar, contratar Datadog é a decisão certa. Pra você que não pode, vale entender exatamente onde a fatura explode antes de procurar alternativa.",[19,17854,17856],{"id":17855},"os-quatro-vetores-onde-a-fatura-explode","Os quatro vetores onde a fatura explode",[12,17858,17859],{},"A página de preços do Datadog parece civilizada quando você olha de longe. US$15 por host por mês na entrada, US$23 no plano profissional, US$31 no plano empresa. Cinco hosts vezes US$23 dá US$115 — barato. O problema é que essa não é a fatura que chega.",[12,17861,17862,17865],{},[27,17863,17864],{},"Cobrança por host com containers contando como hosts."," Em alguns planos, cada container conta como host adicional pra fins de billing. A startup que roda quatro serviços em três réplicas em três servidores pensa que tem três hosts — mas a fatura conta trinta e seis pontos de telemetria. A política mudou várias vezes nos últimos anos e mesmo quem lê a documentação atenta erra a estimativa.",[12,17867,17868,17871],{},[27,17869,17870],{},"Custom metrics cobradas por métrica por minuto."," Cada métrica customizada acima do limite incluído tem custo individual. Um time bem-intencionado adiciona métricas de negócio — pedidos por minuto, valor médio do carrinho, conversão por funil — e a fatura sobe US$50, US$100, US$300 dependendo da cardinalidade das tags. Cardinalidade alta em métricas customizadas é a tarifa silenciosa que ninguém prevê.",[12,17873,17874,17877],{},[27,17875,17876],{},"APM Pro como upsell."," O APM básico vem incluso, mas as features que você efetivamente quer usar — continuous profiler, code-level visibility, deployment tracking, retenção estendida de traces — estão no APM Pro, com preço adicional por host.",[12,17879,17880,17883],{},[27,17881,17882],{},"Logs ingestion mais retention extra."," O preço de logs é em duas dimensões: ingestão (quanto entra) e retenção (por quanto tempo fica). Cinco servidores gerando 1 GB de log por dia ingerem 150 GB por mês. Reter 30 dias é uma faixa de preço; reter 90 dias é outra; reter um ano é outra. E busca em logs antigos custa por consulta em alguns planos.",[12,17885,17886],{},"Some Network Performance Monitoring, Real User Monitoring, Database Monitoring, Synthetics, CI Visibility — cada um é upsell em cima de upsell. A conta final de uma startup com cinco a dez servidores tipicamente fica entre US$200 e US$400 por mês, ou seja, R$1 mil a R$2 mil ao câmbio de R$5 por dólar. R$24 mil por ano é o equivalente a um mês de salário de pessoa sênior.",[19,17888,17890],{"id":17889},"a-stack-alternativa-com-nomes-especificos","A stack alternativa, com nomes específicos",[12,17892,17893],{},"A boa notícia: a indústria open-source de observabilidade está madura há tempos. Não é cenário de 2015 com Nagios e Munin. As ferramentas hoje cobrem cada vertical com qualidade real.",[12,17895,17896,17899],{},[27,17897,17898],{},"Métricas",": Prometheus para coleta e armazenamento, Grafana para visualização. A combinação tem quinze anos de produção em milhares de empresas, é o padrão de fato, e a maioria das aplicações modernas já expõe métricas em formato compatível.",[12,17901,17902,17905],{},[27,17903,17904],{},"Logs",": Loki, da mesma equipe que mantém o Grafana. A sintaxe de consulta é parecida com a do Prometheus, o que reduz a carga cognitiva de quem já usa um. Por GB armazenado, é tipicamente 90% mais barato que Datadog Logs porque indexa apenas labels, não o conteúdo completo.",[12,17907,17908,17911],{},[27,17909,17910],{},"Traces",": Tempo (Grafana) ou Jaeger ou SigNoz. Os três falam OpenTelemetry, então a aplicação não fica acoplada à escolha. Tempo se integra mais limpamente ao Grafana; Jaeger é o veterano com UI própria; SigNoz combina traces, métricas e logs num produto único.",[12,17913,17914,17917],{},[27,17915,17916],{},"APM",": SigNoz é o concorrente direto mais maduro hoje, com instrumentação OpenTelemetry-native. OpenObserve é alternativa mais nova com arquitetura moderna. Pyroscope cobre continuous profiling — o tipo de visibilidade de CPU e memória que o APM Pro do Datadog vende caro.",[12,17919,17920,17923],{},[27,17921,17922],{},"Erros e exceções",": Sentry self-hosted é a opção robusta — mesma ferramenta que a versão SaaS, sem o custo. GlitchTip é alternativa mais leve, drop-in compatível com SDKs do Sentry, ótima para times pequenos.",[12,17925,17926,17929],{},[27,17927,17928],{},"Uptime monitoring",": Uptime Kuma cobre 95% dos casos com instalação de cinco minutos. Statping é alternativa similar.",[12,17931,17932,17935],{},[27,17933,17934],{},"Synthetic checks",": Checkly tem free tier generoso e cobre o caso \"rodar test em browser de várias regiões\" sem você precisar manter infra de checks. Pra quem prefere homegrown, scripts Playwright em GitHub Actions resolvem.",[12,17937,17938],{},"A stack acima cobre todos os verticais que o Datadog vende. A pergunta honesta é onde cada peça fica devendo na comparação.",[19,17940,17942],{"id":17941},"o-que-cada-componente-faz-e-o-que-nao-faz","O que cada componente faz e o que não faz",[12,17944,17945],{},"Prometheus e Grafana cobrem 90% do que dashboards de Datadog cobrem. A diferença real está nas integrações: o Datadog tem integração de um clique pra seiscentos targets, enquanto Prometheus tipicamente exige escrever exporter ou usar um exporter comum — postgres_exporter, redis_exporter, blackbox_exporter, node_exporter. Pra targets populares, esses exporters existem e são bem mantidos. Pra targets exóticos, você escreve.",[12,17947,17948],{},"Loki cobre logs em 95% dos casos web. O trade-off é a indexação: Loki indexa apenas labels, não o conteúdo completo. Pra busca rica em logs com termos full-text complexos, ELK ou OpenSearch entram melhor. Pra busca por serviço, host, nível de log, status code — que é o que 95% dos times realmente fazem — Loki é mais barato e mais simples.",[12,17950,17951],{},"SigNoz e Tempo cobrem APM com qualidade. O trade-off é polimento. O profile de query lenta no Datadog APM tem mais shine — anos de UX nas vistas que importam. SigNoz está perto e melhora a cada release; em casos de uso comuns (endpoint lento, query lenta, erro spike) cobre tranquilamente. Pra investigação forense de profile de uma transação rara, o Datadog ainda ganha em refinamento.",[12,17953,17954],{},"Sentry self-hosted é praticamente idêntico ao Sentry SaaS — mesmo time mantém os dois. Você instala o stack via Docker Compose, passa quinze minutos configurando, e tem rastreamento de erros em produção. Custa zero em licença e duas a quatro horas por mês de manutenção.",[19,17956,17958],{"id":17957},"a-arquitetura-concreta-numa-stack-pequena","A arquitetura concreta numa stack pequena",[12,17960,17961],{},"Pra uma startup operando cinco a dez servidores, a arquitetura cabe em um único servidor de observabilidade dedicado. Quatro gigabytes de RAM resolvem.",[12,17963,17964,17967],{},[27,17965,17966],{},"Servidor de observabilidade (4 GB RAM)",": Prometheus consome em torno de 1,5 GB com séries de cinco a dez nodes. Grafana fica em 200 MB. Loki em 1 GB com retenção razoável. Tempo em 500 MB. Sobra espaço pra Alertmanager (50 MB) e algum exporter ou collector adicional.",[12,17969,17970,17973],{},[27,17971,17972],{},"Storage para métricas",": cinco servidores expondo cerca de 100 métricas por segundo cada, retidas por 30 dias, geram aproximadamente 10 GB de banco de séries temporais. Disco SSD comum dá conta — tipicamente R$30 por mês de armazenamento adicional na maioria dos provedores.",[12,17975,17976,17979],{},[27,17977,17978],{},"Storage para logs",": cinco servidores produzindo 1 GB de log por dia, retidos por 30 dias, são 150 GB. A solução barata é apontar Loki para um backend compatível com S3 — Cloudflare R2 cobra US$0,015 por GB por mês sem taxa de egress, ou seja, US$2,25 por mês para 150 GB. Backblaze B2 é equivalente. AWS S3 funciona mas tem egress que dói se você for ler muito; pra observability, R2 ou B2 são escolha óbvia.",[12,17981,17982,17985],{},[27,17983,17984],{},"Sampling em traces",": trace de 100% costuma ser desperdício. Sampling de 1% a 5% para traces normais, 100% para traces que contêm erro, 100% para endpoints específicos críticos. Reduz volume em ordem de magnitude sem perder o sinal que importa.",[19,17987,17989],{"id":17988},"setup-honesto-passos-sem-copy-paste","Setup honesto: passos sem copy-paste",[12,17991,17992],{},"A diferença entre tutorial de blog e operação real é o conhecimento de onde os passos quebram. Aqui vai a sequência que funciona, com as armadilhas reais.",[12,17994,17995,17998],{},[27,17996,17997],{},"Passo 1: Prometheus em container."," Sobe Prometheus apontando o scrape config para os nodes que rodam node_exporter. Cada nó precisa do node_exporter rodando — também em container, porta 9100. Configuração inicial são vinte linhas de YAML. Armadilha: service discovery dinâmico exige integração com a fonte verdadeira de hosts. Pra cluster pequeno, lista estática resolve; pra cluster que cresce, integração com a API do orquestrador.",[12,18000,18001,18004],{},[27,18002,18003],{},"Passo 2: Grafana em container."," Adiciona Prometheus como datasource, importa três a cinco dashboards prontos do Grafana Marketplace — node_exporter full, container metrics, blackbox uptime são bons pontos de partida. Em quinze minutos você tem dashboards melhores que muito setup de Datadog que vi em produção.",[12,18006,18007,18010],{},[27,18008,18009],{},"Passo 3: Loki mais Promtail (ou Grafana Agent unificado) em cada nó."," Promtail lê logs locais e empurra pra Loki. Configuração mínima são cerca de trinta linhas — definir paths de log, labels, e endpoint do Loki. Armadilha: log de aplicação que sai em formato livre força você a escrever regex de parsing. Vale o investimento de uma tarde pra padronizar logs em JSON estruturado antes de configurar parsing.",[12,18012,18013,18016],{},[27,18014,18015],{},"Passo 4: OpenTelemetry SDK na aplicação."," Cada linguagem tem o seu SDK oficial. Você inicializa no bootstrap da aplicação, define o endpoint do Tempo (ou SigNoz collector), e ganha tracing distribuído automático para HTTP, database, cache. Adicionar spans customizados em pontos críticos é trivial.",[12,18018,18019,18022],{},[27,18020,18021],{},"Passo 5: Alertmanager."," Recebe regras de alerta do Prometheus e roteia para Slack, email, PagerDuty ou webhook do Discord. Armadilha clássica: o primeiro mês você vai ter alert fatigue por threshold mal calibrado. Reserve uma hora por semana nos primeiros dois meses pra refinar regras.",[12,18024,18025],{},"Tempo total para alguém sem experiência prévia: quatro a oito horas pra ter o stack completo funcional, mais duas a três tardes refinando dashboards e alertas nas duas semanas seguintes. Ao câmbio de R$200 por hora de engenharia, o investimento total é R$1,2 mil a R$2,5 mil. Substitui R$1 mil a R$2 mil por mês de Datadog indefinidamente. Payback em um a dois meses.",[19,18027,18029],{"id":18028},"onde-o-auto-hospedado-fica-devendo","Onde o auto-hospedado fica devendo",[12,18031,18032],{},"A honestidade aqui é o teste de quem está vendendo a alternativa de boa-fé versus quem está vendendo a versão simplificada da realidade.",[12,18034,18035,18038],{},[27,18036,18037],{},"Database Monitoring profundo."," Datadog DBM tem visibilidade detalhada em Postgres e Redis, com plano de execução por query, lock waits, slow query analysis. O postgres_exporter cobre métricas de saúde básicas — conexões, transações, replicação, cache hit ratio. Slow query analysis profunda em open source exige pgBadger ou raspagem manual de pg_stat_statements, com bem mais trabalho do que clicar em \"Enable DBM\" no Datadog.",[12,18040,18041,18044],{},[27,18042,18043],{},"Real User Monitoring."," Datadog RUM mede tempo de carregamento percebido pelo usuário real, distribuído por geografia, navegador, dispositivo. A combinação de Sentry com Plausible cobre parte do espaço, mas com gaps. Se RUM detalhado é parte central da estratégia de produto, Datadog ganha hoje.",[12,18046,18047,18050],{},[27,18048,18049],{},"Network Performance Monitoring."," Datadog NPM tem visibilidade de pacote em redes complexas, especialmente útil em arquiteturas que cruzam múltiplas zonas. Não há equivalente self-hosted prático para o caso geral.",[12,18052,18053,18056],{},[27,18054,18055],{},"Synthetic monitoring global."," Datadog roda checks de mais de trinta regiões. Self-hosted exige você rodar checks de regiões múltiplas — viável mas trabalhoso. Checkly cobre o vão com tier intermediário acessível.",[12,18058,18059],{},"Resumo: 95% dos casos de observabilidade que startup precisa estão cobertos. Os 5% que ficam de fora são features enterprise raramente usadas em startup.",[19,18061,18063],{"id":18062},"custo-concreto-comparado","Custo concreto comparado",[12,18065,18066],{},"Vale fazer a planilha em real, com números que você pode reproduzir.",[12,18068,18069],{},"Datadog em cinco hosts, com APM Pro, 100 GB de logs por mês, 30 métricas customizadas e RUM ativo: cerca de US$400 por mês, ou R$2 mil ao câmbio de R$5 por dólar.",[12,18071,18072],{},"Stack auto-hospedada num VPS dedicado com 4 GB de RAM (R$80 por mês na maioria dos provedores brasileiros), mais armazenamento de logs em S3-compatível (R$30 por mês para 150 GB em R2 ou B2), mais valor estimado de tempo de manutenção (duas horas por mês a R$200 por hora, R$400 por mês): R$510 por mês.",[12,18074,18075],{},"Diferença mensal: R$1.490. Diferença anual: R$17.880. Em três anos, R$53 mil — equivalente ao salário de dois meses de pessoa sênior, ou ao custo de adquirir um cliente médio em vendas B2B.",[12,18077,18078],{},"Importante: o tempo de manutenção é estimativa pessimista. Times que padronizam o setup tipicamente gastam menos de uma hora por mês após o investimento inicial. Em três anos, a manutenção compõe mas não vira projeto contínuo.",[19,18080,18082],{"id":18081},"como-o-heroctl-encaixa","Como o HeroCtl encaixa",[12,18084,18085],{},"O orquestrador expõe métricas do cluster em formato Prometheus por padrão. Não há agente proprietário pra instalar em cada servidor — o cluster expõe agregado em endpoint único, e o Prometheus rascpa direto.",[12,18087,18088],{},"Logs seguem arquitetura de escritor único embutida. Em vez de cada container produzir log que precisa ser coletado por um agente em cada nó, o cluster centraliza a captura e expõe interface de consulta. Isso reduz overhead operacional — você não monta um agente em cada servidor.",[12,18090,18091],{},"A stack OSS (Prometheus, Grafana, Loki, Tempo, Sentry) roda como jobs no próprio cluster. Você submete o manifesto do Prometheus como qualquer outro serviço, e o orquestrador cuida de health check, restart, rolling deploy e roteamento. Overhead operacional adicional: zero.",[12,18093,18094],{},"Pra startup que já roda HeroCtl, ligar observabilidade completa é uma tarde. O cluster já dá tudo de plumbing — falta só decidir os dashboards.",[19,18096,18098],{"id":18097},"comparativo-datadog-vs-new-relic-vs-stack-oss-auto-hospedada","Comparativo: Datadog vs New Relic vs Stack OSS auto-hospedada",[119,18100,18101,18116],{},[122,18102,18103],{},[125,18104,18105,18107,18110,18113],{},[128,18106,2983],{},[128,18108,18109],{},"Datadog",[128,18111,18112],{},"New Relic",[128,18114,18115],{},"Stack OSS auto-hospedada",[141,18117,18118,18132,18145,18158,18171,18183,18197,18211,18223,18235],{},[125,18119,18120,18123,18126,18129],{},[146,18121,18122],{},"Custo mensal pra 5 hosts",[146,18124,18125],{},"R$1k-2k",[146,18127,18128],{},"R$800-1.5k",[146,18130,18131],{},"R$80-510",[125,18133,18134,18136,18139,18142],{},[146,18135,17898],{},[146,18137,18138],{},"Excelente, integrações de 1 clique",[146,18140,18141],{},"Boa, integrações fortes",[146,18143,18144],{},"Prometheus + Grafana, exporters por target",[125,18146,18147,18149,18152,18155],{},[146,18148,17904],{},[146,18150,18151],{},"Excelente, busca rica",[146,18153,18154],{},"Boa, busca rica",[146,18156,18157],{},"Loki, busca por label",[125,18159,18160,18162,18165,18168],{},[146,18161,17916],{},[146,18163,18164],{},"Profundidade líder de mercado",[146,18166,18167],{},"Próximo de Datadog",[146,18169,18170],{},"SigNoz\u002FTempo, 80% do shine",[125,18172,18173,18175,18178,18180],{},[146,18174,17910],{},[146,18176,18177],{},"Sampling avançado",[146,18179,18177],{},[146,18181,18182],{},"OpenTelemetry, sampling configurável",[125,18184,18185,18188,18191,18194],{},[146,18186,18187],{},"Alerting",[146,18189,18190],{},"Anomaly detection, sazonalidade",[146,18192,18193],{},"Anomaly detection",[146,18195,18196],{},"Threshold + Alertmanager (sem AI)",[125,18198,18199,18202,18205,18208],{},[146,18200,18201],{},"Integrações",[146,18203,18204],{},"600+ prontas",[146,18206,18207],{},"400+ prontas",[146,18209,18210],{},"100+ exporters comunitários",[125,18212,18213,18215,18218,18220],{},[146,18214,17573],{},[146,18216,18217],{},"Baixa (botão liga)",[146,18219,18217],{},[146,18221,18222],{},"Média (config + manutenção)",[125,18224,18225,18227,18230,18232],{},[146,18226,7158],{},[146,18228,18229],{},"Alto (formato proprietário)",[146,18231,18229],{},[146,18233,18234],{},"Zero (formatos abertos)",[125,18236,18237,18239,18242,18245],{},[146,18238,13540],{},[146,18240,18241],{},"Series B+ com receita",[146,18243,18244],{},"Series A-B com receita",[146,18246,18247],{},"Bootstrapped, seed, Series A",[12,18249,18250],{},"A última coluna é a que importa pra startup brasileira. O lock-in zero significa que se a stack OSS deixar de servir, você migra os dashboards e regras com investimento contido — formato aberto roda em qualquer lugar.",[19,18252,18254],{"id":18253},"quando-ficar-no-datadog","Quando ficar no Datadog",[12,18256,18257],{},"A honestidade obriga a apontar quando a alternativa não compensa.",[12,18259,18260,18263],{},[27,18261,18262],{},"Empresa Series B ou maior com receita justificando."," Acima de US$5 milhões de ARR, R$2 mil por mês desaparece no orçamento. O tempo que você economiza não montando stack vale mais que o caixa.",[12,18265,18266,18269],{},[27,18267,18268],{},"Compliance que exige fornecedor SOC2 ou ISO certificado nominalmente."," Alguns frameworks listam ferramentas pré-aprovadas. Se você precisa do nome Datadog ou New Relic numa lista de auditoria, a alternativa não cabe.",[12,18271,18272,18275],{},[27,18273,18274],{},"Time sem capacidade pra montar stack."," Se a equipe de engenharia tem três pessoas focadas em produto e zero em infra, montar Prometheus mais Grafana mais Loki é distração de quatro a oito horas que o time não tem. Datadog free tier ou New Relic free tier resolvem o início.",[12,18277,18278,18281],{},[27,18279,18280],{},"Necessidade de NPM ou DBM grau enterprise."," Para os 5% de casos onde Datadog tem feature insubstituível, ficar nele é decisão técnica correta.",[19,18283,4244],{"id":4243},[12,18285,18286,18289],{},[27,18287,18288],{},"Posso usar Datadog free tier?","\nSim, e faz sentido pra começar. Cinco hosts, retenção curta, sem APM, sem logs avançados. Funciona pra time de duas pessoas validando ideia. A migração começa quando o tier gratuito acaba e a estimativa de custo aparece — geralmente entre seis e doze meses depois.",[12,18291,18292,18295],{},[27,18293,18294],{},"Grafana Cloud é uma boa alternativa intermediária?","\nÉ. Grafana Cloud free tier oferece 10k séries, 50 GB de logs, 50 GB de traces. Pago começa em US$8 por mês com volume razoável. Cobre a faixa entre \"Datadog é caro demais\" e \"auto-hospedar dá trabalho\". Trade-off é o lock-in moderado — formatos são abertos, mas você não controla retenção e custos fica em outra planilha.",[12,18297,18298,18301],{},[27,18299,18300],{},"Quanto custa storage de logs em S3-compatível no Brasil?","\nCloudflare R2 cobra US$0,015 por GB por mês, sem taxa de egress. Backblaze B2 cobra US$0,005 por GB por mês com US$0,01 por GB de egress. Para 150 GB em R2: US$2,25 por mês, ou R$11. Para 1 TB em B2: US$5 por mês mais egress conforme uso. Em ambos os casos, o custo é desprezível.",[12,18303,18304,18307],{},[27,18305,18306],{},"OpenTelemetry vs StatsD?","\nOpenTelemetry é o padrão atual e cobre métricas, traces e logs. StatsD foi o padrão dos anos 2010 pra métricas, ainda existe, mas é narrow. Se você está começando, vá direto em OpenTelemetry — todos os SDKs modernos suportam, todos os backends modernos suportam, e o investimento de aprender vale por anos.",[12,18309,18310,18313],{},[27,18311,18312],{},"Sentry vale auto-hospedar?","\nPra time pequeno, GlitchTip resolve com menos overhead — instalação simples, mesma API que Sentry, drop-in compatível com SDKs. Pra time que precisa das features avançadas (Performance, Profiling, Replay), Sentry self-hosted vale o trabalho de montar Docker Compose. Free tier do Sentry SaaS é generoso e cobre o início.",[12,18315,18316,18319],{},[27,18317,18318],{},"Quanto consome a stack OSS em RAM e CPU?","\nPra cinco a dez nodes monitorados: Prometheus 1,5 GB de RAM, Grafana 200 MB, Loki 1 GB, Tempo 500 MB. Total em torno de 3,5 GB. CPU médio é baixo — pico nos scrapes de 5 a 10% de uma vCPU. Cabe em VPS de 4 GB com folga.",[12,18321,18322,18325],{},[27,18323,18324],{},"HeroCtl tem dashboards prontos?","\nSim. O cluster expõe métricas em formato Prometheus, e o painel de administração embutido inclui dashboards básicos por job — uso de CPU, memória, status de réplicas, latência de health check. Pra dashboards mais elaborados, suba Grafana como job no próprio cluster e aponte pro endpoint de métricas do plano de controle.",[19,18327,3310],{"id":3309},[12,18329,18330],{},"A diferença entre R$2 mil e R$500 por mês não é detalhe — é R$18 mil por ano. Pra startup em estágio de validação, é o que separa contratar pessoa adicional e ficar no time atual. Pra startup em estágio de crescimento, é a margem que justifica investir em produto em vez de em fornecedor.",[12,18332,18333],{},"A escolha não é \"Datadog ou nada\". É \"qual ferramenta serve à fase atual da empresa\". Em fase early, a stack OSS auto-hospedada vence em custo com paridade funcional. Em fase late, Datadog vence em produtividade com custo absorvido. O erro comum é continuar pagando Datadog porque nunca foi reavaliado — auditoria anual de stack é prática de empresa madura, mesmo entre as que escolhem ficar pagando.",[12,18335,18336],{},"Se você roda HeroCtl, a stack OSS sobe como job comum no cluster. Sem agente extra, sem provisioner de infra, sem terceiro fornecedor. O orçamento que sobra vai pro próximo engenheiro contratado.",[224,18338,18340],{"className":18339,"code":5319,"language":2530},[2528],[231,18341,5319],{"__ignoreMap":229},[12,18343,18344,18345,2403,18348,101],{},"Pra continuar a leitura: ",[3337,18346,18347],{"href":6338},"Quanto custa hospedar SaaS no Brasil em 2026",[3337,18349,18350],{"href":7468},"Postgres em produção: gerenciado vs self-hosted",{"title":229,"searchDepth":244,"depth":244,"links":18352},[18353,18354,18355,18356,18357,18358,18359,18360,18361,18362,18363,18364,18365],{"id":17833,"depth":244,"text":17834},{"id":17855,"depth":244,"text":17856},{"id":17889,"depth":244,"text":17890},{"id":17941,"depth":244,"text":17942},{"id":17957,"depth":244,"text":17958},{"id":17988,"depth":244,"text":17989},{"id":18028,"depth":244,"text":18029},{"id":18062,"depth":244,"text":18063},{"id":18081,"depth":244,"text":18082},{"id":18097,"depth":244,"text":18098},{"id":18253,"depth":244,"text":18254},{"id":4243,"depth":244,"text":4244},{"id":3309,"depth":244,"text":3310},"2026-04-08","Datadog cobra US$15-31\u002Fhost\u002Fmês. Pra startup com 5 servidores, isso vira R$1k\u002Fmês só de monitoring. A stack auto-hospedada chega no mesmo lugar por R$50.",{},{"title":17819,"description":18367},{"loc":11727},"blog\u002Fobservabilidade-sem-datadog-stack-startup",[18373,18374,11790,18375,6395],"observabilidade","datadog","open-source","Wxnbc6y3xBfcUTnLyG9o9V0FbSswzVmF2dSBr_ZdNOk",{"id":18378,"title":18379,"author":7,"body":18380,"category":3379,"cover":3380,"date":19105,"description":19106,"draft":3383,"extension":3384,"lastReviewed":3380,"meta":19107,"navigation":411,"path":4368,"readingTime":4401,"seo":19108,"sitemap":19109,"stem":19110,"tags":19111,"__hash__":19114},"blog_pt\u002Fblog\u002Fmulti-tenant-saas-isolamento-real.md","Multi-tenant SaaS com isolamento real: 3 padrões e quando cada um vira pesadelo",{"type":9,"value":18381,"toc":19092},[18382,18389,18392,18396,18399,18405,18411,18417,18423,18430,18434,18441,18452,18457,18482,18487,18516,18522,18526,18529,18547,18552,18577,18582,18606,18612,18616,18626,18633,18636,18641,18666,18671,18688,18694,18696,18857,18860,18864,18867,18873,18879,18885,18891,18894,18898,18901,18907,18919,18928,18934,18937,18941,18944,18950,18956,18962,18968,18977,18981,18984,18990,19000,19006,19009,19011,19017,19027,19033,19039,19054,19060,19066,19068,19071,19074,19077,19082,19085],[12,18383,18384,18385,18388],{},"A primeira pergunta de um comprador B2B sério, depois que o produto passa pela demo e antes de o jurídico entrar na sala, é sempre a mesma: \"meus dados estão isolados dos outros clientes?\". Se a sua resposta for \"ah, a gente filtra por ",[231,18386,18387],{},"tenant_id"," em cada query\", o contrato acabou de virar fumaça. O comprador não está pedindo uma justificativa técnica — está pedindo uma garantia que sobreviva a uma auditoria, a um incidente, e a uma rotação de dev júnior.",[12,18390,18391],{},"Existem três padrões reais de isolamento multi-tenant em SaaS B2B. Cada um tem benefícios óbvios na apresentação e custos invisíveis na operação. Esse post mapeia os três, mostra exatamente quando cada um vira pesadelo, e explica a jornada típica de uma startup brasileira que começa com cinquenta clientes pequenos e termina atendendo um banco regulado.",[19,18393,18395],{"id":18394},"por-que-isso-importa-agora-nao-no-ano-que-vem","Por que isso importa agora — não no ano que vem",[12,18397,18398],{},"Multi-tenancy é uma decisão arquitetural que parece postergável até o exato momento em que deixa de ser. Quatro forças estão empurrando essa decisão pra frente do roadmap das startups B2B brasileiras em 2026:",[12,18400,18401,18404],{},[27,18402,18403],{},"LGPD virou exigência prática, não só legal."," A lei está em vigor desde 2020, mas os DPOs corporativos começaram a pedir evidência operacional só nos últimos dois anos. A pergunta deixou de ser \"vocês estão em conformidade?\" e virou \"como vocês demonstram tratamento adequado de dados pessoais?\". Demonstração exige separação visível, log de acesso, e processo claro de exclusão. Pool puro torna tudo isso mais difícil — não impossível, mas mais difícil de justificar pra um auditor que nunca viu sua arquitetura.",[12,18406,18407,18410],{},[27,18408,18409],{},"Cliente B2B grande exige isolamento como pré-requisito de contrato."," Esse é o ponto do parágrafo de abertura. Se o seu pipeline tem uma proposta de R$ 50 mil por mês com uma operação de logística regional, é praticamente certo que o departamento de segurança da informação deles vai mandar um questionário de cento e oitenta perguntas. Quase metade das perguntas é sobre isolamento. Responder \"compartilhamos um banco com filtros lógicos\" entrega a conta pro concorrente que respondeu \"schema dedicado por cliente\" — mesmo que a diferença real, em termos de risco, seja pequena.",[12,18412,18413,18416],{},[27,18414,18415],{},"Compliance setorial pode exigir isolamento físico."," Saúde (LGPD + CFM), financeiro (Bacen, CVM), educação básica privada (LGPD + ECA), seguros (SUSEP). Setores regulados ocasionalmente listam \"segregação de dados por cliente em camada física\" como controle exigido. Quando isso aparece, schema-per-tenant resolve com algum esforço; pool não resolve.",[12,18418,18419,18422],{},[27,18420,18421],{},"Um cliente vai virar dez vezes maior que os outros."," A distribuição de uso em SaaS B2B segue lei de potência. O seu maior cliente vai consumir mais recursos do que os cinquenta menores somados. No pool puro, esse cliente degrada a experiência de todos os outros — e você não consegue cobrar mais por isso sem um modelo de cobrança que precifique uso, o que ninguém quer construir antes do necessário.",[12,18424,18425,18426,18429],{},"E a quinta força, talvez a mais importante: ",[27,18427,18428],{},"migrar de um padrão pra outro depois de ter clientes em produção é projeto de meses, não de dias."," Você vai escolher errado em algum eixo — todo mundo escolhe — mas escolher conscientemente faz a diferença entre \"refatoração de seis semanas\" e \"reescrita de seis meses\".",[19,18431,18433],{"id":18432},"padrao-1-pool-compartilha-tudo","Padrão 1 — Pool (compartilha tudo)",[12,18435,18436,18437,18440],{},"Setup mais simples possível. Um banco de dados, uma instância da aplicação, uma stack de infraestrutura. Todos os clientes vivem nas mesmas tabelas. Cada query da aplicação tem um filtro adicional ",[231,18438,18439],{},"WHERE tenant_id = ?"," injetado por um middleware antes de chegar ao banco. Postgres Row-Level Security (RLS) reforça esse filtro no nível do banco — uma segunda camada que dispara mesmo se o middleware da aplicação esquecer.",[12,18442,18443,18444,18447,18448,18451],{},"Onboarding de novo cliente é literalmente um ",[231,18445,18446],{},"INSERT"," na tabela ",[231,18449,18450],{},"tenants",". Trinta milissegundos depois o cliente já tem ambiente funcional. O custo marginal de adicionar tenant é praticamente zero — você está só usando mais linhas no mesmo banco, mais bytes no mesmo cache.",[12,18453,18454],{},[27,18455,18456],{},"Pontos fortes do pool:",[2735,18458,18459,18462,18465,18468,18475],{},[70,18460,18461],{},"Custo operacional baixo. Um banco pra fazer backup, uma stack pra monitorar, uma versão de aplicação rodando.",[70,18463,18464],{},"Onboarding instantâneo. Fluxo de signup com cartão de crédito é trivial.",[70,18466,18467],{},"Escala sublinear. Mil clientes não custam mil vezes mais que um.",[70,18469,18470,18471,18474],{},"Cross-tenant analytics são naturais. Dashboard interno de \"quantos usuários ativos no mês\" é um ",[231,18472,18473],{},"SELECT COUNT(*)"," sem ginástica.",[70,18476,18477,18478,18481],{},"Migrations são simples. Um ",[231,18479,18480],{},"ALTER TABLE"," aplica pra todos os clientes ao mesmo tempo.",[12,18483,18484],{},[27,18485,18486],{},"Pontos fracos do pool:",[2735,18488,18489,18500,18503,18506,18509],{},[70,18490,18491,18492,18495,18496,18499],{},"Bug de SQL é incidente crítico. Um ",[231,18493,18494],{},"WHERE"," esquecido, um ",[231,18497,18498],{},"JOIN"," que vaza pra outro contexto, uma migration mal escrita — e dados de cliente A aparecem na tela de cliente B. Esse incidente já matou empresas (literalmente: contratos cancelados em massa, perda de confiança irreversível). RLS no Postgres é o cinto de segurança que reduz drasticamente esse risco, mas exige disciplina pra configurar bem e testar todas as roles.",[70,18501,18502],{},"Vizinho barulhento. Um cliente que dispara um relatório pesado às quatorze horas da terça consome o pool de conexões e degrada a latência de todos os outros. Você pode adicionar limites de query por tenant, mas isso é trabalho adicional.",[70,18504,18505],{},"Backup é tudo-ou-nada. Restaurar um cliente específico depois de uma operação destrutiva exige snapshot do banco inteiro, restore em ambiente paralelo, e export-import seletivo. Operação chata de uma a quatro horas.",[70,18507,18508],{},"Compliance que exige separação física não atende. Se o cliente perguntar \"onde fisicamente meus dados moram?\", a resposta é \"no mesmo arquivo de dados que os de todos os outros clientes\" — verdade que afasta perfis específicos.",[70,18510,18511,18512,18515],{},"Customização vira coluna nullable. Cliente Y precisa de um campo extra. Você adiciona. Outro cliente não usa esse campo. Em seis meses ninguém lembra pra que serve aquela coluna ",[231,18513,18514],{},"extra_data_3",". Esse acúmulo é um dos sintomas mais previsíveis do pool maduro.",[12,18517,18518,18521],{},[27,18519,18520],{},"Quando o pool faz sentido:"," SaaS B2B SMB (clientes pequenos e médios), tenants relativamente similares em uso, baixo risco regulatório, time de engenharia pequeno (três a oito pessoas), produto ainda buscando product-market fit. Praticamente todo SaaS começa aqui — e está certo. O erro não é começar com pool; é não saber quando sair.",[19,18523,18525],{"id":18524},"padrao-2-schema-per-tenant-banco-compartilhado-schemas-separados","Padrão 2 — Schema-per-tenant (banco compartilhado, schemas separados)",[12,18527,18528],{},"Meio termo arquitetural. Você ainda tem uma instância de banco — uma instância de Postgres rodando, com seus parâmetros, conexões, replicação. Mas dentro dela, cada cliente tem o seu próprio schema. Postgres chama de schema; MySQL chama de database; o conceito é o mesmo: namespace nomeado dentro do servidor, com tabelas próprias, índices próprios, e privilégios próprios.",[12,18530,18531,18532,18535,18536,18539,18540,571,18543,18546],{},"A aplicação seleciona o schema correto via ",[231,18533,18534],{},"SET search_path TO tenant_acme"," (ou equivalente) no início de cada conexão, baseado em qual tenant está fazendo a request. As tabelas existem com a mesma estrutura em todos os schemas, mas são fisicamente separadas: schema ",[231,18537,18538],{},"tenant_acme"," tem suas próprias linhas de ",[231,18541,18542],{},"users",[231,18544,18545],{},"tenant_xyz"," tem as suas, e queries dentro de um schema não enxergam o outro sem privilégio explícito.",[12,18548,18549],{},[27,18550,18551],{},"Pontos fortes do schema-per-tenant:",[2735,18553,18554,18561,18568,18571,18574],{},[70,18555,18556,18557,18560],{},"Isolamento de dados forte por padrão. Sem ",[231,18558,18559],{},"WHERE tenant_id"," em lugar nenhum — as tabelas estão fisicamente separadas. Bug de SQL fica circunscrito ao schema atual.",[70,18562,18563,18564,18567],{},"Backup por tenant é prático. ",[231,18565,18566],{},"pg_dump --schema=tenant_acme"," exporta só aquele cliente. Restaurar é o mesmo: subir num ambiente paralelo, importar o schema, e mover dados específicos.",[70,18569,18570],{},"Quotas de recurso por schema. Postgres permite limitar conexões por role, e roles podem ser amarradas a schemas. Você pode garantir que tenant grande não consome todas as conexões do banco.",[70,18572,18573],{},"Customização limpa. Cliente Y precisa de um campo extra? Adicione no schema dele apenas. Outros clientes nem sabem que aquele campo existe. O esquema base segue limpo.",[70,18575,18576],{},"Demonstração de separação fica óbvia pra auditoria. \"Cada cliente tem seu próprio namespace de banco com privilégios isolados\" é resposta que satisfaz a maior parte dos questionários de segurança.",[12,18578,18579],{},[27,18580,18581],{},"Pontos fracos do schema-per-tenant:",[2735,18583,18584,18587,18594,18600,18603],{},[70,18585,18586],{},"Migrations multiplicam por N. Uma migration de dez minutos com mil schemas vira cento e sessenta horas de trabalho de banco se rodar em série. Você precisa de paralelismo cuidadoso, scripts de migration que conhecem o conjunto de schemas, e janela de manutenção planejada — ou estratégia de migrations sem bloqueio que funcione esquema-a-esquema.",[70,18588,18589,18590,18593],{},"Pool de conexões fica complicado. Se cada conexão precisa de ",[231,18591,18592],{},"SET search_path"," por tenant, o pgBouncer simples não funciona — ele reusa conexões entre clientes diferentes. Soluções: pool por schema (quebra cardinalidade), session-mode pooling (mais lento), ou middleware da aplicação que gerencia o reset.",[70,18595,18596,18597,18599],{},"Cross-tenant analytics ficam caros. Pra responder \"quantos usuários ativos eu tenho em todos os clientes?\" você precisa unionar mil tabelas. Solução real: ETL diário pra um warehouse separado (ClickHouse, BigQuery), com ",[231,18598,18387],{}," denormalizado.",[70,18601,18602],{},"Bug em código de switching ainda é risco. Se o middleware seleciona o schema errado por bug de session leakage entre requests, você tem o mesmo tipo de vazamento que o pool tem. Menos comum, mas possível.",[70,18604,18605],{},"Limite prático de schemas. Postgres aguenta dezenas de milhares de schemas, mas o catálogo do banco fica pesado em algum ponto — listagens lentas, autovacuum competindo. Empresas que rodam mais de cinco mil schemas em uma instância única reportam dor.",[12,18607,18608,18611],{},[27,18609,18610],{},"Quando o schema-per-tenant faz sentido:"," SaaS B2B mid-market, dez a mil clientes, alguns clientes de alto valor que justificam customização, compliance moderada. É o padrão \"intermediário\" no sentido literal — você troca um pouco da simplicidade operacional do pool por um isolamento mais forte e por flexibilidade de customização.",[19,18613,18615],{"id":18614},"padrao-3-app-per-tenant-silo-completo","Padrão 3 — App-per-tenant (silo completo)",[12,18617,18618,18619,571,18622,18625],{},"Cada cliente recebe instância dedicada de tudo: aplicação, banco, cache, fila de jobs, agendador. O que compartilham é só a infraestrutura física — o cluster de máquinas onde os contêineres rodam. Mas cada workload tem o seu próprio banco com seus próprios dados, sua própria URL (",[231,18620,18621],{},"acme.app.com",[231,18623,18624],{},"cliente-xyz.app.com","), e potencialmente sua própria versão da aplicação.",[12,18627,18628,18629,18632],{},"Implementação séria desse padrão exige orquestrador. Sem orquestração, provisionar um novo cliente significa criar manualmente máquina virtual, rodar setup de banco, deploy da aplicação, configurar DNS, emitir certificado TLS — operação de horas que ninguém vai aguentar repetir vinte vezes por mês. Com orquestrador, isso é um job parametrizado: você dispara uma definição que diz \"novo tenant ",[231,18630,18631],{},"acme",", plano enterprise, banco isolado, certificado automático\", o cluster aloca, configura, e dispara em um a três minutos.",[12,18634,18635],{},"Kubernetes faz isso com namespaces e Helm. HeroCtl faz com job templates. Outros orquestradores fazem com primitivas próprias. O que importa é que o tempo de onboarding de um novo cliente nessa arquitetura — minutos, não segundos como no pool — não vire dor humana porque está automatizado.",[12,18637,18638],{},[27,18639,18640],{},"Pontos fortes do app-per-tenant:",[2735,18642,18643,18646,18657,18660,18663],{},[70,18644,18645],{},"Isolamento máximo. Não há código compartilhado consultando dados de mais de um cliente — fisicamente impossível. Bug de SQL afeta só o cliente daquela instância.",[70,18647,18648,18649,18652,18653,18656],{},"Customização total. Cliente A pode rodar versão ",[231,18650,18651],{},"2.4"," da aplicação, cliente B versão ",[231,18654,18655],{},"2.5",". Útil pra testes graduais de release, ou pra atender clientes que pediram um patch específico.",[70,18658,18659],{},"Falha isolada. Se o banco do cliente A corrompeu, cliente B nem percebe. Cliente A tem outage; cliente B não tem.",[70,18661,18662],{},"Compliance pesada fica viável. FedRAMP, HIPAA com requisitos multi-tenant rígidos, contratos com cláusula de \"infraestrutura dedicada\" — todos passam.",[70,18664,18665],{},"Deploys regionais por cliente. Cliente brasileiro com exigência de dados em território nacional? Roda no datacenter de São Paulo. Cliente europeu? Frankfurt. A primitiva de \"rodar tenant onde ele precisa estar\" passa a existir.",[12,18667,18668],{},[27,18669,18670],{},"Pontos fracos do app-per-tenant:",[2735,18672,18673,18676,18679,18682,18685],{},[70,18674,18675],{},"Custo escala linear. Mil clientes pequenos custam aproximadamente mil vezes mais que um cliente. Sem ganho de pool. Pra clientes de baixo ticket, a margem some.",[70,18677,18678],{},"Onboarding leva minutos, não segundos. Pode ser inaceitável pra modelos self-service com signup por cartão de crédito. Funciona pra modelos de venda assistida onde o onboarding é processo, não fluxo de compra.",[70,18680,18681],{},"Operação multiplica por N. Cada banco precisa de backup, cada aplicação precisa de monitoramento, cada deploy precisa de validação. Sem ferramentas de orquestração centralizada, vira inviável em duas dezenas de clientes.",[70,18683,18684],{},"Cross-tenant analytics são caros. Pior que schema-per-tenant — você tem que sincronizar dados de bancos completamente separados. ETL pra warehouse comum é ainda mais necessário.",[70,18686,18687],{},"Custo de infraestrutura mínimo por tenant. Cada Postgres dedicado tem overhead de duzentos a quinhentos megabytes de RAM mesmo ocioso. Cada aplicação Go ou Node mais cem a duzentos megabytes. O floor de gasto é real.",[12,18689,18690,18693],{},[27,18691,18692],{},"Quando o app-per-tenant faz sentido:"," SaaS enterprise, ARR alto por cliente (R$ 10 mil\u002Fmês por cliente pra cima é referência confortável), compliance exigente, customização cliente é diferencial competitivo. Funciona também em contextos de cinquenta a mil clientes onde o ticket médio sustenta o custo. Empresas que vendem self-service no Stripe e cobram R$ 99\u002Fmês por usuário não cabem aqui — a economia não fecha.",[19,18695,17385],{"id":17384},[119,18697,18698,18713],{},[122,18699,18700],{},[125,18701,18702,18704,18707,18710],{},[128,18703,2983],{},[128,18705,18706],{},"Pool",[128,18708,18709],{},"Schema-per-tenant",[128,18711,18712],{},"App-per-tenant",[141,18714,18715,18729,18743,18757,18771,18788,18802,18816,18830,18844],{},[125,18716,18717,18720,18723,18726],{},[146,18718,18719],{},"Custo por tenant",[146,18721,18722],{},"Sublinear (quase zero adicional)",[146,18724,18725],{},"Quase linear (overhead pequeno)",[146,18727,18728],{},"Linear (instância dedicada)",[125,18730,18731,18734,18737,18740],{},[146,18732,18733],{},"Tempo de onboarding",[146,18735,18736],{},"Segundos (INSERT)",[146,18738,18739],{},"Segundos a minutos (CREATE SCHEMA + migrate)",[146,18741,18742],{},"Minutos (provisionar pilha)",[125,18744,18745,18748,18751,18754],{},[146,18746,18747],{},"Performance overhead",[146,18749,18750],{},"Nenhum (compartilha cache, etc)",[146,18752,18753],{},"Pequeno (mais relations no catálogo)",[146,18755,18756],{},"Alto (overhead por instância)",[125,18758,18759,18762,18765,18768],{},[146,18760,18761],{},"Risco de leak por bug",[146,18763,18764],{},"Alto (mitigado por RLS)",[146,18766,18767],{},"Médio (mitigado por search_path)",[146,18769,18770],{},"Praticamente nulo",[125,18772,18773,18776,18779,18785],{},[146,18774,18775],{},"Backup por tenant",[146,18777,18778],{},"Difícil (snapshot completo)",[146,18780,18781,18782,16056],{},"Fácil (",[231,18783,18784],{},"pg_dump --schema",[146,18786,18787],{},"Trivial (backup dedicado)",[125,18789,18790,18793,18796,18799],{},[146,18791,18792],{},"Customização cliente",[146,18794,18795],{},"Cara (colunas nullable)",[146,18797,18798],{},"Boa (campos extras no schema)",[146,18800,18801],{},"Total (versão própria do app)",[125,18803,18804,18807,18810,18813],{},[146,18805,18806],{},"Compliance enterprise",[146,18808,18809],{},"Difícil de demonstrar",[146,18811,18812],{},"Demonstrável",[146,18814,18815],{},"Forte por construção",[125,18817,18818,18821,18824,18827],{},[146,18819,18820],{},"Faixa de tenants ideal",[146,18822,18823],{},"1 a 10 mil",[146,18825,18826],{},"10 a 5 mil",[146,18828,18829],{},"10 a 1.000",[125,18831,18832,18835,18838,18841],{},[146,18833,18834],{},"Cross-tenant analytics",[146,18836,18837],{},"Trivial (uma query)",[146,18839,18840],{},"Pesado (UNION N tabelas ou ETL)",[146,18842,18843],{},"Pesado (ETL obrigatório)",[125,18845,18846,18848,18851,18854],{},[146,18847,16408],{},[146,18849,18850],{},"2 a 5 devs",[146,18852,18853],{},"4 a 10 devs com infra básica",[146,18855,18856],{},"4 a 10 devs com orquestrador",[12,18858,18859],{},"Os limites superiores de faixa de tenants são aproximados — empresas excederam todos eles com esforço. Os números servem como referência de quando começa a doer.",[19,18861,18863],{"id":18862},"a-jornada-tipica-de-saas-brasileiro","A jornada típica de SaaS brasileiro",[12,18865,18866],{},"A maioria dos SaaS B2B brasileiros segue um caminho previsível, e entender o caminho ajuda a escolher o estágio atual sem subdimensionar nem superdimensionar.",[12,18868,18869,18872],{},[27,18870,18871],{},"Estágio 1: zero a cinquenta clientes."," Pool é a escolha óbvia. Time pequeno, custo baixo, ninguém pediu compliance ainda, todos os clientes são parecidos em uso. Foque em product-market fit — qualquer hora gasta com isolamento agora é hora roubada do produto. RLS no Postgres desde o dia um é o investimento mínimo de defesa.",[12,18874,18875,18878],{},[27,18876,18877],{},"Estágio 2: cinquenta a quinhentos clientes, primeiro cliente B2B mid-market chega."," Aqui começa a apertar. Aquele cliente com cento e cinquenta usuários consome seis vezes mais recursos que os outros. O questionário de segurança chega com a pergunta sobre isolamento. Avaliar schema-per-tenant fica racional. Híbrido também é opção: pool pros pequenos, schema dedicado pros maiores que pediram explicitamente. Migração nesse estágio é menos dolorosa porque a base ainda é gerenciável.",[12,18880,18881,18884],{},[27,18882,18883],{},"Estágio 3: quinhentos clientes ou primeiro cliente enterprise."," Agora a decisão é estrutural. Schema-per-tenant pra todos? App-per-tenant pros enterprise e schema pro resto? Híbrido com três camadas (pool nos free, schema nos pagos, app nos enterprise)? A resposta depende do mix de clientes — empresas com poucos clientes muito grandes tendem a app-per-tenant; empresas com mil clientes médios ficam em schema-per-tenant.",[12,18886,18887,18890],{},[27,18888,18889],{},"Estágio 4: enterprise mode."," App-per-tenant pros high-value, com schema-per-tenant ou pool sustentando os menores. Esse é o estado de empresas como Salesforce (que historicamente fez schema-per-tenant em escala extrema), Notion (pool altamente otimizado), e ferramentas enterprise mais novas que adotam app-per-tenant desde o nascimento.",[12,18892,18893],{},"A transição entre estágios é onde mora a engenharia mais cara da carreira de um SaaS. Quem já passou por isso conhece o cheiro.",[19,18895,18897],{"id":18896},"como-o-heroctl-ajuda-no-estagio-3-e-4","Como o HeroCtl ajuda no estágio 3 e 4",[12,18899,18900],{},"O modelo app-per-tenant exige um orquestrador competente. Não é negociável: sem provisioning automatizado, a complexidade operacional inviabiliza o modelo. Quatro primitivas que um orquestrador precisa entregar pra que app-per-tenant funcione, e como o HeroCtl resolve cada uma:",[12,18902,18903,18906],{},[27,18904,18905],{},"Job templates parametrizados."," Você descreve \"tenant\" uma vez — qual aplicação roda, qual banco, qual ingress, quais variáveis de ambiente, qual quota de CPU e memória. Pra cada cliente novo, você só varia os parâmetros (nome, subdomínio, plano). No HeroCtl, isso é um job spec curto com placeholders de variáveis.",[12,18908,18909,2578,18912,18915,18916,18918],{},[27,18910,18911],{},"API de onboarding.",[231,18913,18914],{},"POST \u002Fv1\u002Fjobs"," com as variáveis do novo cliente. Em segundos a poucos minutos, o cluster provisiona contêineres, sobe o banco, registra no roteador interno, emite certificado TLS automático pra ",[231,18917,18621],{},". Sem operação manual.",[12,18920,18921,18924,18925,18927],{},[27,18922,18923],{},"Roteamento integrado por subdomínio."," Cada tenant ganha um subdomínio próprio com TLS automático. O roteador interno do orquestrador resolve ",[231,18926,18621],{}," pro contêiner certo sem que você configure DNS por cliente — wildcard de DNS aponta pro cluster, e o orquestrador faz o resto.",[12,18929,18930,18933],{},[27,18931,18932],{},"Quotas e auditoria por tenant."," Cada job carrega limites de recurso (CPU, RAM, disco). Cliente que tentar consumir mais do que o plano permite, satura no próprio limite e não afeta vizinhos. No plano Business, log detalhado de quem deployou qual versão de qual tenant, quando — útil pra auditoria interna e pra responder questionários de cliente.",[12,18935,18936],{},"O cluster público do HeroCtl roda hoje em quatro servidores totalizando cinco vCPUs e dez gigabytes de RAM, sustentando múltiplos sites com TLS automático. Quando um nó coordenador cai, o cluster elege outro coordenador em cerca de sete segundos — janela curta o suficiente pra que clientes não percebam, e detalhe operacional importante pra quem opera app-per-tenant em produção. Não estamos prometendo magia: estamos descrevendo o que já roda.",[19,18938,18940],{"id":18939},"cinco-erros-caros-em-multi-tenant","Cinco erros caros em multi-tenant",[12,18942,18943],{},"Erros que aparecem com frequência suficiente pra valer um aviso explícito.",[12,18945,18946,18949],{},[27,18947,18948],{},"Compartilhar schema desde o dia um sem RLS."," Pool sem Row-Level Security é apenas uma camada de defesa: o middleware da aplicação. Uma camada falha em algum momento. RLS é a segunda camada — barata de configurar, e diferença entre incidente embaraçoso e incidente fatal. Configure desde o início, mesmo que o time ache exagero.",[12,18951,18952,18955],{},[27,18953,18954],{},"Migrar muito tarde de pool pra schema."," Empresa que cresceu pra dez mil clientes em pool e descobre que precisa migrar pra schema-per-tenant tem um projeto de quatro a oito meses pela frente. Reescrita do middleware, migração de dados em janelas, validação por cliente. Quem migrou em quinhentos tenants gastou três semanas; quem migrou em dez mil gastou um trimestre.",[12,18957,18958,18961],{},[27,18959,18960],{},"Customização ad-hoc no pool."," Cliente Y pede um campo extra. Você adiciona como coluna nullable. Em três meses outros clientes pediram outras três colunas. Em seis meses ninguém entende mais a tabela. O que parecia atalho vira dívida que paga juros toda sprint. Resista a esse padrão; ou aceite que você precisa de schema-per-tenant pra atender essas customizações limpamente.",[12,18963,18964,18967],{},[27,18965,18966],{},"Backup só do banco principal."," Quando você sai do pool, backup precisa ser repensado. Schema separado precisa de backup separado consciente. App-per-tenant precisa de backup por banco. Esquecer isso e descobrir num incidente é catastrófico — empresas perderam dados de cliente único porque o backup global não cobria os bancos por tenant.",[12,18969,18970,18973,18974,18976],{},[27,18971,18972],{},"Cross-tenant analytics no schema-per-tenant via UNION."," Funciona em dez clientes, fica pesado em cem, vira inviável em mil. Construa ETL pra warehouse separado desde cedo — ClickHouse ou BigQuery com ",[231,18975,18387],{}," denormalizado é a solução padrão. Tentar manter tudo no transacional é receita de query de quarenta minutos.",[19,18978,18980],{"id":18979},"lgpd-e-multi-tenancy","LGPD e multi-tenancy",[12,18982,18983],{},"A LGPD não obriga modelo arquitetural específico, mas obriga demonstração de tratamento adequado. Cada padrão tem implicações diferentes.",[12,18985,18986,18989],{},[27,18987,18988],{},"Pool:"," você precisa demonstrar separação lógica robusta (RLS configurado, testado, auditado), log de acesso a dados pessoais (quem leu o quê, quando), e processo de exclusão que cobre todas as tabelas relevantes pro direito ao esquecimento (artigo 18). Tudo viável, mas com mais trabalho de demonstração.",[12,18991,18992,18995,18996,18999],{},[27,18993,18994],{},"Schema-per-tenant:"," demonstração fica mais simples. \"Cada cliente tem seu schema isolado, com privilégios próprios, e exclusão de dados é ",[231,18997,18998],{},"DROP SCHEMA","\" — frase que satisfaz auditor sem dor. Direito ao esquecimento é praticamente trivial nesse modelo.",[12,19001,19002,19005],{},[27,19003,19004],{},"App-per-tenant:"," separação física é demonstrável de forma direta. Auditoria fica mais simples ainda. Direito ao esquecimento é o destruir do banco do cliente.",[12,19007,19008],{},"Em todos os modelos: log de acesso a dados pessoais (artigo 16, requisito de armazenamento) é responsabilidade da camada de aplicação — independe do modelo de isolamento. Construa esse log desde cedo.",[19,19010,3226],{"id":3225},[12,19012,19013,19016],{},[27,19014,19015],{},"Postgres RLS é confiável em produção?","\nSim, e amplamente usado. As pegadinhas são duas: garantir que todas as roles que conectam ao banco sejam não-privilegiadas (super-user ignora RLS), e testar políticas com testes automatizados que rodam em CI. Quem configura RLS uma vez e não testa, descobre buracos depois.",[12,19018,19019,19022,19023,19026],{},[27,19020,19021],{},"Como automatizar migrations em schema-per-tenant?","\nPadrão comum: tabela ",[231,19024,19025],{},"tenant_metadata"," com lista de schemas e versão atual de cada um. Job de migration consulta, aplica em paralelo (com limite de concorrência pra não saturar o banco), atualiza versão. Ferramentas como Flyway e migrate com wrapper customizado funcionam. Reserve janela de manutenção pra migrations grandes mesmo com paralelismo.",[12,19028,19029,19032],{},[27,19030,19031],{},"App-per-tenant não fica caro demais pra escalar?","\nFica, se o ticket médio for baixo. A regra prática: ARR de R$ 10 mil\u002Fmês por cliente sustenta confortavelmente o custo de infra dedicada. Abaixo disso, a margem aperta. Pra clientes pequenos, mantenha pool ou schema. App-per-tenant é arma pra clientes que pagam pela exclusividade.",[12,19034,19035,19038],{},[27,19036,19037],{},"Posso misturar modelos (high-value app-per-tenant, resto pool)?","\nSim, e híbrido é o estado final mais comum em SaaS maduro. A complexidade operacional aumenta — você opera duas arquiteturas, não uma — mas a economia compensa quando os clientes high-value justificam o esforço. Exige time com maturidade de pelo menos seis a dez engenheiros.",[12,19040,19041,19046,19047,19049,19050,19053],{},[27,19042,19043,19045],{},[231,19044,18387],{}," no path ou subdomínio?","\nSubdomínio (",[231,19048,18621],{},") costuma ser melhor pra branding e pra cookies isolados. Path (",[231,19051,19052],{},"app.com\u002Facme",") é mais simples no DNS e roteamento. Subdomínio combina melhor com app-per-tenant; path combina bem com pool. Escolha cedo, porque mudar depois quebra integrações de cliente.",[12,19055,19056,19059],{},[27,19057,19058],{},"Encryption per tenant é viável?","\nEm pool, chave por tenant na camada de aplicação é o caminho — overhead razoável, e você fica com chaves derivadas de uma chave-mestra protegida. Em schema-per-tenant, mesma estratégia. Em app-per-tenant, encryption-at-rest do banco já dá isolamento natural. Encryption per tenant é caro e raramente exigido — só vá pra lá se o cliente pedir explicitamente em contrato.",[12,19061,19062,19065],{},[27,19063,19064],{},"Quanto tempo leva onboarding em cada modelo?","\nPool: trinta a duzentos milissegundos (uma transação no banco). Schema-per-tenant: dois a trinta segundos (CREATE SCHEMA + migrations). App-per-tenant: trinta segundos a três minutos (provisionar instâncias, subir banco, registrar TLS). Esse tempo entra no fluxo de UX de signup — modelos self-service de cartão de crédito não comportam tempo de minutos sem alguma forma de fila ou notificação assíncrona.",[19,19067,3310],{"id":3309},[12,19069,19070],{},"A escolha de padrão multi-tenant não é tecnicamente difícil — é organizacionalmente difícil. Difícil porque exige antecipar três a cinco anos de crescimento de produto e clientela, e quase ninguém antecipa bem. A defesa não é escolher perfeito; é escolher conscientemente, com trilha de migração mapeada pro próximo estágio, e com instrumentação que avise quando o modelo atual está pedindo aposentadoria.",[12,19072,19073],{},"Pool é certo no começo. Schema-per-tenant é certo na transição pra mid-market. App-per-tenant é certo quando o cliente paga pela exclusividade ou quando o compliance exige. Híbrido é o destino comum.",[12,19075,19076],{},"Se você está construindo SaaS B2B brasileiro em 2026 e o produto está chegando ao estágio em que multi-tenancy importa, vale conhecer um orquestrador que torna app-per-tenant operacionalmente acessível pra times pequenos:",[224,19078,19080],{"className":19079,"code":5319,"language":2530},[2528],[231,19081,5319],{"__ignoreMap":229},[12,19083,19084],{},"Quatro servidores, cinco vCPUs, dez gigabytes de RAM — o cluster público de demonstração roda em recursos que cabem em qualquer plano de cloud regional. Eleição de coordenador em cerca de sete segundos quando algo cai. Roteamento e TLS embutidos. É a fundação que falta pra muita arquitetura de tenant isolado em time pequeno.",[12,19086,19087,19088,2403,19090,101],{},"Pra mais sobre infra de SaaS brasileiro, veja ",[3337,19089,18350],{"href":7468},[3337,19091,6339],{"href":6338},{"title":229,"searchDepth":244,"depth":244,"links":19093},[19094,19095,19096,19097,19098,19099,19100,19101,19102,19103,19104],{"id":18394,"depth":244,"text":18395},{"id":18432,"depth":244,"text":18433},{"id":18524,"depth":244,"text":18525},{"id":18614,"depth":244,"text":18615},{"id":17384,"depth":244,"text":17385},{"id":18862,"depth":244,"text":18863},{"id":18896,"depth":244,"text":18897},{"id":18939,"depth":244,"text":18940},{"id":18979,"depth":244,"text":18980},{"id":3225,"depth":244,"text":3226},{"id":3309,"depth":244,"text":3310},"2026-04-01","Pool, schema-per-tenant, app-per-tenant. Cada padrão tem benefícios óbvios e custos invisíveis. Como decidir antes do primeiro cliente B2B sério perguntar 'meus dados estão isolados?'.",{},{"title":18379,"description":19106},{"loc":4368},"blog\u002Fmulti-tenant-saas-isolamento-real",[19112,15814,19113,3379,4409],"multi-tenancy","isolamento","vj9T2Gjq944o3AovTuQsgPGzwJgwsCHxlqLvxQwpPYw",{"id":19116,"title":19117,"author":7,"body":19118,"category":6383,"cover":3380,"date":19790,"description":19791,"draft":3383,"extension":3384,"lastReviewed":3380,"meta":19792,"navigation":411,"path":19793,"readingTime":4401,"seo":19794,"sitemap":19795,"stem":19796,"tags":19797,"__hash__":19802},"blog_pt\u002Fblog\u002Fstrapi-directus-ghost-auto-hospedado-guia.md","Strapi, Directus e Ghost auto-hospedados: guia honesto pra agências e indie hackers",{"type":9,"value":19119,"toc":19775},[19120,19123,19126,19129,19132,19136,19139,19145,19151,19161,19167,19173,19177,19180,19183,19186,19189,19192,19195,19199,19202,19205,19208,19211,19214,19217,19221,19224,19227,19230,19233,19236,19239,19241,19244,19444,19447,19451,19454,19477,19506,19532,19536,19539,19545,19551,19557,19563,19567,19570,19576,19582,19588,19591,19595,19598,19604,19610,19616,19622,19628,19632,19638,19644,19650,19656,19662,19666,19669,19675,19681,19687,19692,19698,19701,19703,19709,19715,19721,19727,19733,19739,19745,19747,19750,19753,19756,19761,19772],[12,19121,19122],{},"Toda agência brasileira que hospeda site de cliente conhece o dilema. Você tem trinta contas ativas, cada uma com um Wordpress no Wordpress.com Business custando entre US$25 e US$45 por mês — quando o cliente não exige Wordpress.com VIP, que sobe pra três dígitos. Some isso, multiplique por trinta, divida pelo dólar do mês, e a margem some. A alternativa mais antiga é alugar uma hospedagem compartilhada barata e empilhar trinta sites num servidor PHP que cai junto na primeira terça-feira do mês — reputação queimada por economia de quinhentos reais.",[12,19124,19125],{},"Há um caminho do meio que ficou viável nos últimos dois anos: substituir o monolito de PHP por um CMS moderno auto-hospedado. Strapi, Directus e Ghost são os três que mais aparecem em projetos de agência e em SaaS indie no Brasil. Cada um resolve um problema diferente, cada um tem armadilha própria, e a documentação oficial de cada um vende o produto em vez de comparar honestamente. Esse post é a comparação que faltava.",[12,19127,19128],{},"A audiência aqui é dupla. De um lado, a agência de cinco a vinte pessoas que entrega site ou plataforma editorial pra cliente — esse perfil precisa decidir entre cloud gerenciado e auto-hospedagem com base em custo por cliente, não em hype técnico. Do outro, o desenvolvedor solo ou indie hacker que está escolhendo a stack do próprio projeto e quer saber qual CMS escala melhor sem virar dor de cabeça aos sábados.",[12,19130,19131],{},"Os números são o esqueleto do post. Custos em dólares foram convertidos pra real usando a faixa atual de R$5,00 a R$5,30 por dólar — onde o intervalo importa, está marcado. Requisitos de RAM e CPU foram coletados das documentações oficiais e validados em VPS de teste rodando workload sintético. Se algum número parecer otimista, é porque é o piso — produção real costuma pedir 30 a 50 por cento mais.",[19,19133,19135],{"id":19134},"por-que-cms-auto-hospedado-virou-viavel-em-2026","Por que CMS auto-hospedado virou viável em 2026",[12,19137,19138],{},"Cinco fatores combinados destravaram o cenário. Nenhum deles é novo isoladamente; o que mudou é que todos amadureceram ao mesmo tempo.",[12,19140,19141,19144],{},[27,19142,19143],{},"O custo de máquina virtual caiu pra perto do absurdo."," Hetzner, DigitalOcean, OVH e até provedores nacionais como Magalu Cloud e UOL Host vendem VPS de 2 vCPU e 4 GB de RAM por menos de R$60 por mês. Cinco anos atrás, a mesma capacidade custava o triplo. Pra agência que historicamente terceirizava infra pra revendedores de hospedagem, agora faz mais sentido alugar uma máquina dedicada e empilhar workloads ali.",[12,19146,19147,19150],{},[27,19148,19149],{},"Painéis de orquestração self-hosted cobrem o que faltava em ops."," Coolify, Dokploy, CapRover e o próprio HeroCtl entregam o que era exclusividade de fornecedores caros: deploy a partir de um arquivo de configuração, certificado TLS automático, rollback de uma versão pra outra, métricas básicas. A barreira pra rodar um Strapi em produção caiu de \"uma semana de provisionamento manual\" pra \"cinco minutos depois do servidor estar de pé\".",[12,19152,19153,19156,19157,19160],{},[27,19154,19155],{},"Os CMS modernos publicam imagens Docker oficiais e maduras."," Faz três anos que você precisava montar Dockerfile próprio pra Strapi em produção; hoje o time oficial publica imagem testada com receita de docker-compose de referência. Mesmo pra Ghost, que historicamente tinha empacotamento próprio, a imagem ",[231,19158,19159],{},"ghost:5-alpine"," é a forma recomendada pelo time oficial.",[12,19162,19163,19166],{},[27,19164,19165],{},"As comunidades brasileiras pararam de ser invisíveis."," O canal Strapi BR no Discord tem milhares de membros ativos, o fórum oficial do Directus responde em inglês mas com alta participação de devs brasileiros, e a documentação do Ghost foi traduzida em peças por contribuidores locais. Não é a comunidade WordPress (que é gigante e cheia de tutorial em PT-BR), mas é o suficiente pra desbloquear a maioria dos problemas sem ter que decifrar inglês técnico no quarto erro consecutivo.",[12,19168,19169,19172],{},[27,19170,19171],{},"Wordpress.com aumentou preço de forma agressiva."," Quem acompanhou o Heroku virar pago em 2022 reconhece o padrão: serviço gratuito ou barato vira premium, plano antigo é descontinuado, conta legada migra ou paga mais. Wordpress.com fez o equivalente nos últimos dois anos — o tier \"Personal\" subiu, o tier \"Premium\" subiu mais, e features que antes vinham no plano médio agora exigem o tier Business ou superior. Cada aumento é um empurrão a mais em direção à auto-hospedagem.",[19,19174,19176],{"id":19175},"strapi-o-cms-api-first","Strapi — o CMS API-first",[12,19178,19179],{},"Strapi é o que mais se parece com \"Wordpress moderno pra dev\". Você define o tipo de conteúdo na interface administrativa (post, autor, categoria, produto, qualquer coisa), e o Strapi gera automaticamente uma API REST e uma API GraphQL pra ler e escrever esse conteúdo. Não há frontend nele — é puro backend headless. O frontend é responsabilidade sua, geralmente um Next.js, Nuxt ou Astro consumindo a API.",[12,19181,19182],{},"A stack é Node.js no backend, banco Postgres ou MySQL pra persistência, e um painel administrativo em React que vem embutido. O painel é o ponto forte do produto: editor não-técnico consegue criar conteúdo sem treinamento, organizar mídia, agendar publicação, gerenciar usuários. Pra agência, isso é venda fácil — o cliente entra no admin e reconhece o paradigma \"Wordpress mas mais limpo\".",[12,19184,19185],{},"O requisito mínimo realístico em produção é 2 vCPU, 2 GB de RAM e 10 GB de armazenamento. A documentação oficial fala em 1 GB, mas com qualquer plugin ativo e tráfego além de teste local, a memória estoura. Em VPS de R$50 a R$80 por mês você roda confortável; em VPS de R$30 (1 GB de RAM) o processo morre toda vez que um upload de mídia maior acontece.",[12,19187,19188],{},"Os pontos fortes são consistentes. Plugin ecosystem rico — autenticação social, internacionalização, integração com S3 pra mídia, gerador de sitemap, tudo já existe. GraphQL nativo sem configuração extra, o que fecha bem com frontend moderno. Hooks customizados (lifecycle hooks, middlewares, policies) resolvem regra de negócio sem precisar de microserviço separado. A interface administrativa é genuinamente boa — comparada com Drupal ou Wordpress sem plugin de admin, é outro nível.",[12,19190,19191],{},"Os pontos fracos também são consistentes, e cabe falar em voz alta. A transição entre versões majores costuma quebrar — a migração de v4 pra v5 foi notória, com mudanças de API incompatíveis e necessidade de reescrever plugins customizados. Se você adotar Strapi pra um projeto de longo prazo, reserve uma janela de upgrade a cada doze ou dezoito meses como custo recorrente, não como surpresa. Migrações de schema também exigem disciplina — adicionar campo é fácil, renomear ou tipar diferente sem perder dado pede script de migração escrito à mão. E algumas features que aparecem no marketing só rodam no Strapi Cloud (a versão paga deles), como preview ao vivo entre ambientes — auto-hospedando você não tem isso pronto.",[12,19193,19194],{},"Quando faz sentido escolher Strapi: SaaS que precisa de blog próprio e knowledge base no mesmo CMS, agência que entrega pra cliente acostumado com \"Wordpress mas sem PHP\", projeto headless commerce onde os SKUs são modelados como tipo de conteúdo, e qualquer cenário em que ter GraphQL pronto economiza dias de trabalho.",[19,19196,19198],{"id":19197},"directus-o-cms-pra-dados-existentes","Directus — o CMS pra dados existentes",[12,19200,19201],{},"Directus é uma criatura diferente. Em vez de te forçar a criar tipo de conteúdo do zero dentro dele, ele coloca uma interface administrativa em cima de qualquer banco que você já tenha. Você apontaria pra um Postgres legado com vinte tabelas existentes, e o Directus mostra cada tabela como uma coleção editável, respeitando os tipos de coluna, as chaves estrangeiras e até as constraints. É a ferramenta que mais se aproxima de \"admin universal pra qualquer banco SQL\".",[12,19203,19204],{},"A stack é Node.js no backend, suporte oficial a Postgres, MySQL, MariaDB, SQLite, Oracle e SQL Server, e um painel administrativo em Vue. O suporte a banco é deliberadamente amplo — o produto foi desenhado pra adaptar, não pra impor schema próprio. Você pode usar Directus contra um banco zerado e deixar ele criar as tabelas via interface, ou apontar pra um banco com dez anos de histórico e esperar que tudo apareça organizado no admin.",[12,19206,19207],{},"O requisito mínimo é mais leve que Strapi. 1 vCPU, 1 GB de RAM e 5 GB de armazenamento rodam confortável pra workload pequeno e médio. Em VPS de R$30 a R$50 por mês você consegue subir um Directus servindo dezenas de coleções com tráfego moderado. Pra projetos menores, SQLite como banco é suficiente — cabe num único arquivo, simplifica backup, evita ter um Postgres separado pra gerenciar.",[12,19209,19210],{},"Os pontos fortes saem do desenho. A capacidade de adotar banco existente sem reformular schema é genuinamente única — nenhum CMS popular faz isso tão bem. Real-time updates via WebSockets vêm prontos, o que abre porta pra dashboards e ferramentas internas que reagem a mudança em tempo real sem precisar de uma camada adicional. Permissões granulares por coleção, por campo e até por linha (com base em condição) cobrem cenários de multi-tenancy sem hack. A documentação é decente, mantida ativa, e o time responde dúvida em fórum em prazos razoáveis.",[12,19212,19213],{},"Os pontos fracos: a curva de aprendizado pra customizações avançadas (extensions, hooks customizados, panels de dashboard) é mais íngreme que Strapi. O ecossistema de plugins é menor — onde Strapi tem dez plugins de SEO, Directus tem dois ou três. E pra editor não-técnico, a interface é menos amigável que a do Strapi — Directus prioriza poder e flexibilidade, não onboarding suave.",[12,19215,19216],{},"Quando faz sentido escolher Directus: agência que pegou cliente com banco MySQL legado de dez anos e precisa entregar painel administrativo sem refazer schema, ferramenta interna onde a modelagem é dirigida pelos dados (CRM custom, gestão de estoque, plataforma de operações), aplicação cuja entidade central é \"dado relacional\", não \"documento editorial\". Também é a escolha óbvia quando o cliente já tem Postgres ou MySQL rodando outro sistema e quer aproveitar.",[19,19218,19220],{"id":19219},"ghost-o-cms-de-publicacao","Ghost — o CMS de publicação",[12,19222,19223],{},"Ghost é o oposto da neutralidade. Não pretende ser CMS universal — é blog e plataforma de newsletter, especializado em conteúdo editorial. Quem tenta usar Ghost pra produto de e-commerce ou app SaaS está usando ferramenta errada. Quem usa pra blog corporativo, site de mídia, podcast com membership ou newsletter paga, encontra um produto polido e focado.",[12,19225,19226],{},"A stack é Node.js no backend, banco MySQL ou SQLite (Postgres não é oficialmente suportado), e frontend em Handlebars com tema. O frontend é parte do pacote — o Ghost serve as páginas direto, com tema instalado via upload. Há modo headless (você usa só a Content API e monta o frontend separado), mas o caso comum é Ghost servindo tudo.",[12,19228,19229],{},"O requisito mínimo é o mais leve dos três. 1 vCPU, 1 GB de RAM e 5 GB de armazenamento rodam Ghost com folga pra blog de tráfego médio. Em VPS de R$30 dá pra rodar — com o cuidado de configurar SMTP externo pra newsletter (mandar email a partir do próprio servidor é receita pra cair no spam).",[12,19231,19232],{},"Os pontos fortes são afiados. SEO out-of-the-box é o melhor entre os três — meta tags, sitemap, schema.org, AMP (quando faz sentido), tudo configurado por padrão. Sistema de membership e paywall vem nativo: você cria níveis de assinatura, cobra via Stripe, libera conteúdo pago automaticamente. O editor markdown é genuinamente bom, com cards (chamadas, callouts, código) que cobrem o caso comum sem virar editor de Word. Os temas focam em legibilidade e tipografia editorial — nada da estética genérica de tema Wordpress.",[12,19234,19235],{},"Os pontos fracos saem da especialização. Plugin ecosystem é fechado por design — apps de integração existem no Ghost.org como produto pago, e instalar app customizado é mais difícil que em Strapi ou Directus. Não-blog é território hostil — tentar modelar produto, autor com perfil rico, taxonomia complexa esbarra em decisões de design que priorizam o caso \"post + autor + tag\". E suporte oficial a Postgres não existe — se você tem padrão de empresa em Postgres, vai operar MySQL paralelo só pro Ghost.",[12,19237,19238],{},"Quando faz sentido escolher Ghost: blog corporativo com paywall ou conteúdo premium, site de mídia ou jornalismo independente, podcast que quer monetizar via membership, content marketing levado a sério com editor que vai usar o admin todo dia. Pra qualquer coisa fora desse escopo, é forçar a barra.",[19,19240,17385],{"id":17384},[12,19242,19243],{},"Os três CMS modernos lado a lado com Wordpress (a referência herdada) e Payload (concorrente recente que vale mencionar):",[119,19245,19246,19267],{},[122,19247,19248],{},[125,19249,19250,19252,19255,19258,19261,19264],{},[128,19251,2983],{},[128,19253,19254],{},"Strapi",[128,19256,19257],{},"Directus",[128,19259,19260],{},"Ghost",[128,19262,19263],{},"Wordpress",[128,19265,19266],{},"Payload",[141,19268,19269,19285,19302,19320,19337,19354,19373,19391,19409,19425],{},[125,19270,19271,19274,19277,19279,19281,19283],{},[146,19272,19273],{},"RAM mínima realística",[146,19275,19276],{},"2 GB",[146,19278,11502],{},[146,19280,11502],{},[146,19282,11502],{},[146,19284,19276],{},[125,19286,19287,19289,19292,19294,19297,19300],{},[146,19288,16319],{},[146,19290,19291],{},"30–60 min",[146,19293,19291],{},[146,19295,19296],{},"15–30 min",[146,19298,19299],{},"10–20 min",[146,19301,19291],{},[125,19303,19304,19307,19310,19312,19315,19318],{},[146,19305,19306],{},"Modo headless",[146,19308,19309],{},"Sim, default",[146,19311,19309],{},[146,19313,19314],{},"Opcional",[146,19316,19317],{},"Opcional (REST + GraphQL)",[146,19319,19309],{},[125,19321,19322,19325,19327,19329,19332,19335],{},[146,19323,19324],{},"GraphQL nativo",[146,19326,3065],{},[146,19328,3065],{},[146,19330,19331],{},"Não (REST)",[146,19333,19334],{},"Plugin externo",[146,19336,3065],{},[125,19338,19339,19342,19344,19347,19350,19352],{},[146,19340,19341],{},"Multi-tenancy fácil",[146,19343,8334],{},[146,19345,19346],{},"Bom",[146,19348,19349],{},"Difícil",[146,19351,19334],{},[146,19353,19346],{},[125,19355,19356,19359,19362,19364,19367,19370],{},[146,19357,19358],{},"Membership \u002F paywall",[146,19360,19361],{},"Plugin",[146,19363,19361],{},[146,19365,19366],{},"Nativo",[146,19368,19369],{},"Plugin pago",[146,19371,19372],{},"Customizado",[125,19374,19375,19378,19381,19383,19386,19389],{},[146,19376,19377],{},"Plugin ecosystem",[146,19379,19380],{},"Rico",[146,19382,8334],{},[146,19384,19385],{},"Fraco",[146,19387,19388],{},"Riquíssimo",[146,19390,14480],{},[125,19392,19393,19396,19399,19401,19404,19406],{},[146,19394,19395],{},"Custo Cloud (USD\u002Fmês inicial)",[146,19397,19398],{},"15",[146,19400,5636],{},[146,19402,19403],{},"11",[146,19405,5636],{},[146,19407,19408],{},"35",[125,19410,19411,19413,19415,19417,19419,19422],{},[146,19412,4896],{},[146,19414,3140],{},[146,19416,4891],{},[146,19418,4891],{},[146,19420,19421],{},"Riquíssima",[146,19423,19424],{},"Inglês",[125,19426,19427,19429,19432,19435,19438,19441],{},[146,19428,8368],{},[146,19430,19431],{},"API + admin",[146,19433,19434],{},"Admin sobre dado",[146,19436,19437],{},"Conteúdo editorial",[146,19439,19440],{},"Site genérico",[146,19442,19443],{},"App custom Node.js",[12,19445,19446],{},"A coluna \"tempo até primeiro deploy\" assume servidor já provisionado e Docker instalado. A coluna \"custo Cloud\" é o tier de entrada do produto — escala de preço sobe conforme limites de tráfego, membros ou seats no admin. A coluna \"documentação em PT-BR\" reflete o que existe oficial mais o que a comunidade brasileira mantém ativa; nenhum dos três tem manual completo traduzido, mas Strapi tem o melhor caminho de aprendizado em português.",[19,19448,19450],{"id":19449},"setup-auto-hospedado-em-alto-nivel","Setup auto-hospedado em alto nível",[12,19452,19453],{},"A receita não é copy-paste — é o roteiro mental do que vai ser preciso. Detalhes específicos mudam por VPS e por escolha de orquestrador.",[12,19455,19456,19457,19459,19460,19463,19464,571,19467,571,19470,571,19473,19476],{},"Pra ",[27,19458,19254],{},", o setup minimamente sério é docker-compose com três serviços: Strapi, Postgres e Redis (Redis é opcional, mas acelera o admin notavelmente quando há mais de cinco editores). Volume nomeado pra ",[231,19461,19462],{},"\u002Fsrv\u002Fstrapi\u002Fuploads"," (mídia) e pra dados do Postgres. Painel sobe na porta 1337 internamente, exposto via subdomínio com TLS pelo roteador do orquestrador. Variáveis de ambiente críticas: ",[231,19465,19466],{},"APP_KEYS",[231,19468,19469],{},"JWT_SECRET",[231,19471,19472],{},"ADMIN_JWT_SECRET",[231,19474,19475],{},"DATABASE_*",". Esquecer qualquer uma dessas faz o admin não subir ou perder sessão a cada restart.",[12,19478,19456,19479,19481,19482,571,19485,571,19488,571,19491,571,19494,19497,19498,19501,19502,19505],{},[27,19480,19257],{},", o setup é parecido mas mais leve. Docker-compose com Directus e banco (SQLite cabe num volume só, Postgres se a expectativa é multi-usuário com escrita concorrente). Sem Redis necessário pra começar. Painel na porta 8055. Variáveis críticas: ",[231,19483,19484],{},"KEY",[231,19486,19487],{},"SECRET",[231,19489,19490],{},"ADMIN_EMAIL",[231,19492,19493],{},"ADMIN_PASSWORD",[231,19495,19496],{},"DB_*",". Ponto de atenção: se você apontar Directus pra banco existente com schema rico, abra o admin com calma e configure as permissões antes de dar acesso pra qualquer outro usuário — por padrão o role ",[231,19499,19500],{},"admin"," vê tudo e o role ",[231,19503,19504],{},"public"," vê nada, o que é razoável; mas se você criar role intermediário sem cuidado, expõe coleções inteiras sem querer.",[12,19507,19456,19508,19510,19511,19514,19515,19517,19518,571,19521,19524,19525,19527,19528,19531],{},[27,19509,19260],{},", docker-compose com Ghost e MySQL. SQLite serve pra desenvolvimento mas é desencorajado em produção pelo time oficial. Volume nomeado pra ",[231,19512,19513],{},"\u002Fvar\u002Flib\u002Fghost\u002Fcontent"," (temas, mídia, configs) e pra MySQL. Configurar SMTP externo é etapa obrigatória — Mailgun, Postmark e Resend têm tier gratuito ou barato, qualquer um deles serve. Sem SMTP, recuperação de senha não funciona, newsletter não envia, signup de membro fica quebrado. Variáveis críticas: ",[231,19516,10252],{}," (domínio público com https), ",[231,19519,19520],{},"database__connection__*",[231,19522,19523],{},"mail__*",". Erro comum: configurar ",[231,19526,10252],{}," como ",[231,19529,19530],{},"http:\u002F\u002Flocalhost"," em produção e descobrir só depois que todos os links de email saíram quebrados.",[19,19533,19535],{"id":19534},"custos-comparados","Custos comparados",[12,19537,19538],{},"A planilha honesta de cloud gerenciado contra auto-hospedado, em moeda corrente (R$5,00 por dólar como referência):",[12,19540,19541,19544],{},[27,19542,19543],{},"Strapi Cloud"," começa em US$15 por mês no tier Developer (R$75), sobe pra US$99 por mês no tier Pro (R$495) com features como ambientes separados de staging e produção, mais seats no admin e suporte. Auto-hospedado em VPS de R$50 a R$80 por mês roda Strapi com folga pra workload pequeno e médio. Diferença mensal: de R$25 a R$445 dependendo do tier que você compararia. Pra agência com cinco clientes em Strapi, isso se traduz em economia anual entre R$1.500 e R$26.700.",[12,19546,19547,19550],{},[27,19548,19549],{},"Directus Cloud"," começa em US$25 por mês no tier Standard (R$125), sobe pra US$99 por mês no tier Pro (R$495) e tem tier Enterprise com preço sob consulta. Auto-hospedado em VPS de R$50 por mês cobre o caso comum. Diferença similar à do Strapi — entre R$75 e R$445 por mês por instância.",[12,19552,19553,19556],{},[27,19554,19555],{},"Ghost Pro"," começa em US$11 por mês no tier Starter (R$55) com até 500 membros e um único staff seat, escala pra US$31 (R$155) com 1.000 membros, e atinge US$249 por mês (R$1.245) no tier que suporta 50 mil membros. Auto-hospedado em VPS de R$50 a R$80 por mês não tem teto de membros — você pode ter 50 mil ou 500 mil sem mudar o servidor (a única coisa que muda é o volume de email transacional, que escala separado). Pra publicação que cresce em audiência, a economia anual auto-hospedando Ghost passa de R$10 mil rapidamente.",[12,19558,19559,19562],{},[27,19560,19561],{},"Wordpress.com Business"," custa US$25 por mês (R$125), VIP fica em três dígitos. Comparar com auto-hospedagem de Wordpress numa VPS de R$50 é meh — Wordpress é pesado por natureza, exige mais cuidado de segurança e backup, e o ecossistema de plugin é fonte recorrente de incidente de produção. Pra projeto novo em 2026, é mais sensato escolher entre Strapi, Directus ou Ghost do que herdar a complexidade do PHP.",[19,19564,19566],{"id":19565},"estrategia-pra-agencia-hospedando-trinta-clientes","Estratégia pra agência hospedando trinta clientes",[12,19568,19569],{},"Três opções com tradeoffs claros.",[12,19571,19572,19575],{},[27,19573,19574],{},"Opção A — uma VPS por cliente."," Isolamento total: se um cliente derruba o servidor dele, os outros vinte e nove não sentem. Custo direto: 30 VPS × R$30 a R$50 = R$900 a R$1.500 por mês só de infra. Custo operacional: trinta vezes tudo — trinta atualizações de SO, trinta certificados pra monitorar, trinta backups pra orquestrar. Pra agência com mais de dez clientes, a sobrecarga operacional come a margem que a opção tinha em primeiro lugar.",[12,19577,19578,19581],{},[27,19579,19580],{},"Opção B — um cluster compartilhado rodando trinta instâncias dos CMS."," Quatro servidores totalizando 5 vCPU e 10 GB de RAM (a configuração que rodamos em produção aqui no HeroCtl) hospedam confortavelmente trinta instâncias de Strapi\u002FDirectus\u002FGhost com tráfego típico de cliente PME. Custo de infra: cerca de R$300 a R$400 por mês pelo cluster inteiro. Custo operacional: uma estratégia única de monitoramento, uma estratégia única de backup, um lugar pra olhar quando algo pesa o sistema. Margem da agência aumenta porque o ponto onde você cobra é o mesmo e o ponto onde você gasta caiu.",[12,19583,19584,19587],{},[27,19585,19586],{},"Opção C — cluster compartilhado com cada cliente em subdomínio próprio."," Variação da opção B, mas com roteamento explícito por subdomínio (cliente1.suaagencia.com, cliente2.suaagencia.com) ou domínio próprio do cliente (loja-do-cliente.com.br). O roteador integrado do orquestrador resolve a parte de TLS automático e direcionamento de tráfego. Multi-tenancy fica no nível de DNS + container, não no nível do CMS — cada cliente tem instância isolada de Strapi\u002FDirectus\u002FGhost com banco próprio. Pra agência que vende \"site exclusivo\" como diferencial, é a forma de manter a promessa sem multiplicar VPS.",[12,19589,19590],{},"A opção B com elementos da C é o que faz mais sentido pra agência típica. Cluster compartilhado, instâncias isoladas, subdomínio ou domínio próprio por cliente, backup centralizado.",[19,19592,19594],{"id":19593},"backup-e-migracao-entre-cms","Backup e migração entre CMS",[12,19596,19597],{},"Migração entre CMS é território onde fornecedores omitem detalhe deliberadamente. A verdade prática:",[12,19599,19600,19603],{},[27,19601,19602],{},"Strapi pra Strapi"," (entre versões ou entre instâncias) tem export e import via plugin oficial, gera arquivo JSON com schema e dados. Funciona bem pra migração entre staging e produção; entre versões majores, pode pedir ajuste manual no JSON antes do import.",[12,19605,19606,19609],{},[27,19607,19608],{},"Strapi pra Directus"," não tem ferramenta pronta. Schema é diferente o suficiente pra exigir mapping manual — script em Node lendo a API REST do Strapi e escrevendo na API REST do Directus, item por item. Pra base de mil ou dez mil registros é trabalho de uma tarde; pra base maior, vale paralelizar.",[12,19611,19612,19615],{},[27,19613,19614],{},"Wordpress pra Strapi"," tem ferramentas third-party (wp2strapi e variantes), todas parciais. O que migra bem é post + autor + categoria + mídia. O que não migra bem é qualquer custom post type complexo, plugin de SEO com metadados próprios, ou estrutura de menu. Reserve um a três dias por site na migração e revise mídia manualmente.",[12,19617,19618,19621],{},[27,19619,19620],{},"Ghost pra Ghost"," tem export e import nativo no admin — gera JSON com posts, autores, configurações de site, membros. Funciona limpo entre instâncias e entre versões.",[12,19623,19624,19627],{},[27,19625,19626],{},"Backup do banco"," é a etapa não-negociável. Pg_dump (Postgres) ou mysqldump (MySQL) diário, copiado pra storage objeto fora do servidor (S3, Backblaze B2, Wasabi). Sem isso, qualquer incidente — disco corrompido, rm acidental, hack — vira evento de extinção pra dados do cliente. Custo de S3 com versionamento pra um cluster pequeno fica abaixo de R$50 por mês mesmo guardando trinta dias de retenção.",[19,19629,19631],{"id":19630},"cinco-erros-que-matam-cms-auto-hospedado","Cinco erros que matam CMS auto-hospedado",[12,19633,19634,19637],{},[27,19635,19636],{},"Não atualizar."," CMS desatualizado é vulnerabilidade aberta. Cron de update mensal é o piso — calendário fixo, janela de manutenção combinada com cliente, teste de smoke depois. Não fazer isso significa que mais cedo ou mais tarde alguém abre o admin do cliente sem credencial.",[12,19639,19640,19643],{},[27,19641,19642],{},"Senha admin fraca."," Admin\u002Fadmin em produção continua acontecendo em 2026. Senha forte gerada por gerenciador de senha, autenticação de dois fatores quando o CMS suporta, role separado pra editor (o cliente não recebe senha de admin total).",[12,19645,19646,19649],{},[27,19647,19648],{},"Sem backup automático."," Cliente vê seis meses de conteúdo sumir e a relação acaba. Backup do banco diário, retido por trinta dias mínimo, copiado pra storage fora do servidor que hospeda o CMS. Testar restore pelo menos uma vez por trimestre — backup que nunca foi restaurado é teoria, não backup.",[12,19651,19652,19655],{},[27,19653,19654],{},"Storage de mídia local sem CDN."," Imagens grandes em VPS pequena derrubam o servidor quando uma página viraliza. Configurar storage objeto (S3, R2, Spaces) pra mídia desde o dia um, mesmo que o tráfego seja baixo no começo. Strapi e Directus têm provedores oficiais pra isso; Ghost suporta via configuração.",[12,19657,19658,19661],{},[27,19659,19660],{},"Email transacional não testado."," Strapi e Directus precisam de SMTP configurado pra password reset funcionar. Ghost depende de SMTP pra newsletter inteira. Configurar e testar no dia do deploy — mandar email de teste pra você mesmo, conferir caixa de entrada e pasta de spam, ajustar SPF\u002FDKIM se cair em spam. Sem isso, o cliente descobre que o site quebrou no dia em que precisar trocar a própria senha.",[19,19663,19665],{"id":19664},"heroctl-como-infra-de-agencia","HeroCtl como infra de agência",[12,19667,19668],{},"A última parte do guia é honesta sobre como o HeroCtl encaixa nesse cenário. Não pretendemos ser a única opção — Coolify, Dokploy e CapRover cobrem casos parecidos com tradeoffs diferentes. O que o HeroCtl traz pra agência hospedando CMS é:",[12,19670,19671,19674],{},[27,19672,19673],{},"Templates de job pra subir CMS novo em segundos."," Em vez de escrever docker-compose do zero pra cada cliente, você guarda um arquivo de configuração de cinquenta linhas com Strapi + Postgres já parametrizado, troca o domínio e o nome do banco, e submete. Cliente novo entra em produção em menos tempo que demora pra fazer café.",[12,19676,19677,19680],{},[27,19678,19679],{},"Roteamento por subdomínio com TLS automático."," Cada cliente em subdomínio próprio (ou domínio próprio com DNS apontando) recebe certificado Let's Encrypt sem intervenção. Renovação acontece sozinha. Você não toca em arquivo de configuração de servidor web — o roteador integrado lida com isso.",[12,19682,19683,19686],{},[27,19684,19685],{},"Métricas por job."," Qual cliente está pesando o cluster fica visível no painel — CPU, memória, requisições por segundo, latência. Quando um cliente passa do volume contratado, você vê antes de o cluster sentir.",[12,19688,19689,19691],{},[27,19690,13658],{}," (no plano Business) cobre todos os clientes de uma vez. Em vez de configurar trinta scripts de pg_dump separados, é uma política central com retenção configurável.",[12,19693,19694,19697],{},[27,19695,19696],{},"Auditoria detalhada"," (no plano Business) cobre exigência de LGPD pra cliente que precisa demonstrar quem acessou o quê e quando. Pra agência atendendo cliente em saúde, finanças ou educação, deixa de ser luxo.",[12,19699,19700],{},"A linha entre o que vem no plano Community (gratuito, sem limite de servidores ou jobs) e o que está no Business é desenhada pelo tipo de exigência que aparece quando a agência cresce. Pra cinco ou dez clientes, Community resolve. Pra trinta clientes onde dois deles exigem SSO e um exige relatório de auditoria, o Business paga ele mesmo no primeiro mês.",[19,19702,16602],{"id":16601},[12,19704,19705,19708],{},[27,19706,19707],{},"Wordpress vs esses três — quando ainda Wordpress ganha?","\nQuando o cliente tem equipe interna acostumada com Wordpress, quando o site depende de plugin específico que só existe em Wordpress (alguns plugins de e-commerce hyper-localizados, alguns LMS), e quando o orçamento é tão pequeno que treinar editor em CMS novo custa mais do que a economia de hospedagem. Pra projeto novo em 2026 sem essas restrições, raramente.",[12,19710,19711,19714],{},[27,19712,19713],{},"Posso rodar Strapi em VPS de R$30?","\nTecnicamente sim, na prática é fonte de incidente. 1 GB de RAM é o piso e qualquer pico de tráfego ou upload de mídia maior derruba o processo. Suba pra R$50 a R$80 — a diferença é menor que um almoço, e a estabilidade vira outra coisa.",[12,19716,19717,19720],{},[27,19718,19719],{},"Ghost e Strapi no mesmo servidor, ok?","\nEm VPS pequena (4 GB de RAM ou menos) é apertado e sujeito a contenção. Em servidor de 8 GB ou mais com docker-compose separando recursos, funciona. Em cluster com orquestrador, é o caso comum — os dois rodam em hosts diferentes ou compartilham com isolamento de processo.",[12,19722,19723,19726],{},[27,19724,19725],{},"Como migro Strapi v4 pra v5 sem virar a noite?","\nDocumente o esquema atual antes de mexer. Suba ambiente de staging com v5 e o mesmo banco copiado. Rode o migrador oficial e verifique tudo no admin. Reescreva plugins customizados antes de promover pra produção — eles não migram automaticamente. Reserve dois a quatro dias úteis pra um Strapi médio. Sem ambiente de staging, não vire o jogo direto em produção.",[12,19728,19729,19732],{},[27,19730,19731],{},"Email transacional pra Ghost newsletter — qual provedor mais barato?","\nMailgun tem tier gratuito até cinco mil emails por mês, depois custa por volume. Resend tem tier gratuito até três mil. Postmark é pago desde o primeiro email mas é o mais confiável em entrega. Pra newsletter pequena (até dois mil membros), Mailgun ou Resend gratuito resolve. Acima disso, Postmark vale o custo pela taxa de entrega.",[12,19734,19735,19738],{},[27,19736,19737],{},"Tem case de agência brasileira escalando assim?","\nTem várias, mas as que falam em público são minoria. O padrão típico é agência com dez a trinta clientes, cluster de três ou quatro servidores em provedor cloud, instâncias separadas por cliente, backup centralizado. Quando a agência publica número, costuma falar em economia de cinquenta a setenta por cento sobre o equivalente em hospedagem gerenciada — o que bate com a aritmética acima.",[12,19740,19741,19744],{},[27,19742,19743],{},"Mídia de imagens grandes — onde guardar?","\nStorage objeto fora do servidor que hospeda o CMS. AWS S3, Cloudflare R2, Backblaze B2 e DigitalOcean Spaces cobrem o caso. R2 e B2 têm preço melhor que S3 puro pra workload de leitura intensiva. Configure desde o dia um, mesmo com tráfego baixo — migrar mídia depois é dor de cabeça que não compensa.",[19,19746,3310],{"id":3309},[12,19748,19749],{},"Os três CMS modernos cobrem três casos distintos. Strapi pra quem quer admin polido com API headless e plugin pra tudo. Directus pra quem tem dado e precisa de admin sobre ele. Ghost pra quem publica conteúdo editorial e quer paywall sem hack.",[12,19751,19752],{},"Auto-hospedar virou viável porque máquina ficou barata, orquestrador self-hosted ficou bom, e os três produtos amadureceram empacotamento pra Docker. Pra agência com mais de cinco clientes, a economia de cloud pra auto-hospedagem em cluster compartilhado paga uma pessoa do time em poucos meses.",[12,19754,19755],{},"Se você quer testar o caminho do orquestrador sobre cluster próprio:",[224,19757,19759],{"className":19758,"code":2949,"language":2530},[2528],[231,19760,2949],{"__ignoreMap":229},[12,19762,19763,19764,19768,19769,19771],{},"Posts relacionados que aprofundam pontos específicos: ",[3337,19765,19767],{"href":19766},"\u002Fblog\u002Fheroku-auto-hospedado-2026","Heroku auto-hospedado em 2026"," cobre o panorama mais amplo de \"fugir do PaaS caro\", e ",[3337,19770,6339],{"href":6338}," traz a planilha completa de infra pra produto digital saindo do zero.",[12,19773,19774],{},"Sem cerimônia.",{"title":229,"searchDepth":244,"depth":244,"links":19776},[19777,19778,19779,19780,19781,19782,19783,19784,19785,19786,19787,19788,19789],{"id":19134,"depth":244,"text":19135},{"id":19175,"depth":244,"text":19176},{"id":19197,"depth":244,"text":19198},{"id":19219,"depth":244,"text":19220},{"id":17384,"depth":244,"text":17385},{"id":19449,"depth":244,"text":19450},{"id":19534,"depth":244,"text":19535},{"id":19565,"depth":244,"text":19566},{"id":19593,"depth":244,"text":19594},{"id":19630,"depth":244,"text":19631},{"id":19664,"depth":244,"text":19665},{"id":16601,"depth":244,"text":16602},{"id":3309,"depth":244,"text":3310},"2026-03-25","Os três CMS modernos open-source que devs brasileiros mais auto-hospedam. Cada um pra um caso. Tabela comparativa, requisitos reais e quando vale a pena pagar a versão cloud.",{},"\u002Fblog\u002Fstrapi-directus-ghost-auto-hospedado-guia",{"title":19117,"description":19791},{"loc":19793},"blog\u002Fstrapi-directus-ghost-auto-hospedado-guia",[19798,19799,19800,19801,7514,6397],"cms","strapi","directus","ghost","YWCTQFR2lDtctXIIqDtAaxEdn14-z2w_4OZJuuCW7B0",{"id":19804,"title":19805,"author":7,"body":19806,"category":6383,"cover":3380,"date":20392,"description":20393,"draft":3383,"extension":3384,"lastReviewed":3380,"meta":20394,"navigation":411,"path":8717,"readingTime":3387,"seo":20395,"sitemap":20396,"stem":20397,"tags":20398,"__hash__":20402},"blog_pt\u002Fblog\u002Fmigrar-de-kubernetes-pra-stack-mais-simples-case.md","Migrar de Kubernetes pra stack mais simples: case real de redução de complexidade",{"type":9,"value":19807,"toc":20373},[19808,19815,19822,19825,19829,19832,19835,19841,19847,19853,19859,19865,19871,19874,19878,19881,19887,19893,19899,19905,19911,19914,19918,19921,19931,19940,19949,19955,19961,19967,19970,19974,19977,19983,19989,19995,20001,20004,20008,20011,20015,20018,20021,20024,20028,20031,20107,20110,20113,20117,20120,20123,20126,20130,20133,20136,20139,20142,20146,20157,20160,20164,20167,20177,20183,20189,20195,20201,20214,20218,20221,20227,20233,20239,20243,20246,20278,20281,20285,20288,20291,20294,20297,20299,20305,20311,20317,20323,20329,20335,20341,20343,20346,20349,20352,20357,20360,20370],[12,19809,19810,19811,19814],{},"A narrativa pública dos últimos seis anos foi sempre na mesma direção: todo mundo migra ",[27,19812,19813],{},"para"," Kubernetes. Conferências, posts patrocinados, vagas de SRE, cases de fornecedor — o vetor é único. Saiu de máquina virtual nua e subiu pra K8s. Saiu de Heroku e subiu pra K8s. Saiu de Docker Compose e subiu pra K8s. A direção é uma seta só, e quem não está na seta deve estar fazendo errado.",[12,19816,19817,19818,19821],{},"A realidade silenciosa que ninguém publica em conferência é o vetor inverso: centenas de times migram ",[27,19819,19820],{},"fora"," do Kubernetes depois de descobrir que pagaram caro pela complexidade que não precisavam. Não é manchete, mas acontece todo mês. Empresa de quinze devs com cluster EKS de seis nós percebe que o time de plataforma virou metade do orçamento de engenharia. Startup que adotou K8s no segundo dia descobre que três anos depois ainda gasta uma sexta-feira inteira por mês só atualizando versão de Helm chart de operadores. Time de produto que deveria estar shippando feature está debugando webhook de admission controller.",[12,19823,19824],{},"Esse post é o playbook pra essa migração inversa, com as armadilhas reais que a gente viu acontecer. Não é pitch — é manual operacional. Se você lê isso e decide ficar em Kubernetes, ótimo. A decisão informada de ficar é tão valiosa quanto a decisão informada de sair.",[19,19826,19828],{"id":19827},"a-pergunta-de-qualificacao-voce-devia-sequer-considerar-isso","A pergunta de qualificação: você devia sequer considerar isso?",[12,19830,19831],{},"Antes de qualquer coisa, descarte o caso. Migração inversa só faz sentido pra um perfil específico — e a maioria dos times que pensa em sair de K8s não está nesse perfil. Os outros estão pesquisando alternativa quando deveriam estar contratando mais um SRE ou simplificando o uso atual do K8s.",[12,19833,19834],{},"O perfil em que a migração faz sentido tem seis sinais simultâneos:",[12,19836,19837,19840],{},[27,19838,19839],{},"Sinal 1: a empresa roda Kubernetes em produção há um ano ou mais."," Migração não é experimento. Se o time está em K8s há três meses e já está reclamando, o problema é onboarding, não plataforma. Espere o ciclo de aprendizado completar antes de declarar bancarrota.",[12,19842,19843,19846],{},[27,19844,19845],{},"Sinal 2: o time de plataforma tem entre uma e três pessoas."," Empresas com cinco ou mais engenheiros dedicados à plataforma têm escala de operação que justifica K8s. Abaixo disso, a ferramenta tende a consumir o time inteiro em manutenção.",[12,19848,19849,19852],{},[27,19850,19851],{},"Sinal 3: o cluster tem menos de cinquenta servidores em produção."," Acima desse número, o ecossistema de K8s te dá ferramentas de tooling — escalonamento horizontal de nós, balanceamento entre regiões, federação multi-cluster — que outra stack não te dá. Abaixo, você está pagando overhead pra capacidade que não usa.",[12,19854,19855,19858],{},[27,19856,19857],{},"Sinal 4: os apps são típicos."," Web HTTP, banco relacional, cache em memória, jobs assíncronos, alguma fila. Se a stack inclui operador exótico de banco distribuído, malha de serviço com políticas L7 sofisticadas, ou agendamento de GPU pra treinamento de modelo, a migração inversa fica complicada.",[12,19860,19861,19864],{},[27,19862,19863],{},"Sinal 5: 80% do tempo de plataforma é manutenção, não feature nova."," Se o time de plataforma passa a maioria das semanas atualizando Helm chart, debugando upgrade de versão de cluster, ou arrumando webhook que falhou, é sintoma claro. A plataforma virou produto interno que consome ela mesma.",[12,19866,19867,19870],{},[27,19868,19869],{},"Sinal 6: o salário total de plataforma representa mais de 5% do MRR."," Não é regra absoluta, mas é métrica útil. Quando o time que opera a infra custa mais que um vigésimo da receita recorrente mensal, a infra está cara demais pra escala atual da empresa.",[12,19872,19873],{},"Se a sua empresa marca os seis, vale ler o resto do post. Se marca três ou quatro, leia mas decida com cautela. Se marca um ou dois, provavelmente o problema é outro.",[19,19875,19877],{"id":19876},"quem-definitivamente-nao-deve-migrar","Quem definitivamente não deve migrar",[12,19879,19880],{},"Mesma honestidade no inverso. Existe perfil em que sair de K8s é decisão errada, e quem se enquadra deveria fechar essa aba.",[12,19882,19883,19886],{},[27,19884,19885],{},"Time forte de plataforma com processo maduro."," Se você tem cinco engenheiros de plataforma que dominam K8s, pipeline de CI\u002FCD estável, runbook escrito, observabilidade configurada — sair de tudo isso pra começar do zero numa stack mais simples é jogar fora investimento real. A simplicidade do destino não compensa o reset.",[12,19888,19889,19892],{},[27,19890,19891],{},"Stack que depende de operadores críticos."," Banco relacional com replicação automática gerenciada por operador, fila distribuída com balanceamento gerenciado por operador, banco colunar com bootstrap automático. Esses operadores são valor real. Trocar pra \"humano cuida disso\" é regressão operacional, não simplificação.",[12,19894,19895,19898],{},[27,19896,19897],{},"Compliance que exige Kubernetes nominalmente."," Alguns frameworks de auditoria — FedRAMP em determinados níveis, certos contratos de governo, alguns selos de segurança setoriais — listam ferramentas pré-aprovadas. Se o seu compliance officer precisa apontar pra um certificado existente, K8s é a resposta. Migrar pra ferramenta que não está na lista cria fricção que custa mais do que economia.",[12,19900,19901,19904],{},[27,19902,19903],{},"Federação multi-cluster em produção."," Se você roda workloads que se movem entre clusters em regiões diferentes, com replicação de estado coordenada por ferramenta tipo Argo ou FluxCD em modo multi-cluster, o ecossistema do K8s tem primitivas que outras stacks não têm. Migrar disso é projeto de seis meses no mínimo.",[12,19906,19907,19910],{},[27,19908,19909],{},"Workloads de ML\u002FAI com agendamento de GPU complexo."," Treinamento distribuído, particionamento de GPU, agendamento que entende afinidade de hardware específico. K8s tem operadores e plugins maduros pra isso. Stack mais simples não tem.",[12,19912,19913],{},"Se você se enquadra em qualquer um desses cinco, a recomendação honesta é ficar onde está e otimizar o uso atual do K8s.",[19,19915,19917],{"id":19916},"pre-flight-assessment-um-a-dois-dias-antes-de-comprometer","Pré-flight assessment: um a dois dias antes de comprometer",[12,19919,19920],{},"Migração inversa começa com inventário. Antes de marcar reunião de \"vamos sair do K8s\", o time precisa medir o que tem hoje. Sem números, a decisão é vibe — e vibe não sobrevive ao primeiro problema imprevisto durante cutover.",[12,19922,19923,19926,19927,19930],{},[27,19924,19925],{},"Inventário de manifests."," Rode ",[231,19928,19929],{},"kubectl get all -A --output yaml > all.yaml"," e conte. Quantos arquivos no repositório de manifestos? Quantas linhas no agregado? Quantos namespaces? A nossa medição informal em times pequenos: empresa com dez apps típicos costuma ter entre 1.500 e 4.000 linhas de YAML, espalhadas entre Deployment, Service, Ingress, ConfigMap, Secret, HorizontalPodAutoscaler, e algum NetworkPolicy. Cada uma dessas linhas é trabalho de migração.",[12,19932,19933,2578,19936,19939],{},[27,19934,19935],{},"Inventário de releases Helm.",[231,19937,19938],{},"helm list -A"," mostra cada chart instalado. Cada um é uma decisão. Chart de operador de banco — vai virar job comum no destino, com replicação manual? Chart de ingress — vai virar config de roteador integrado? Chart de monitoring — vai virar agente externo? Quanto mais charts, mais tempo de migração.",[12,19941,19942,2578,19945,19948],{},[27,19943,19944],{},"Inventário de operadores.",[231,19946,19947],{},"kubectl get crds"," lista cada Custom Resource Definition. Cada CRD é uma dependência crítica que provavelmente não tem equivalente direto no destino. Se a saída tem três ou quatro CRDs (cert-manager, ingress-nginx, prometheus-operator, sealed-secrets), está dentro do esperado pra time pequeno. Se tem trinta CRDs, a migração não é trivial — você construiu plataforma sobre plataforma.",[12,19950,19951,19954],{},[27,19952,19953],{},"Inventário de RBAC e políticas complexas."," NetworkPolicy declarando isolamento entre namespaces, PodSecurityPolicy ou PodSecurityStandards configurados, RoleBinding de granularidade fina. Tudo isso precisa de equivalente no destino, e o equivalente raramente é 1:1.",[12,19956,19957,19960],{},[27,19958,19959],{},"Volume de tráfego."," Requisições por segundo no horário de pico, conexões simultâneas no banco, throughput agregado de saída. O destino precisa absorver tudo isso. Se você nunca mediu, mede agora — antes de comprometer cronograma de migração.",[12,19962,19963,19966],{},[27,19964,19965],{},"Mapeamento de Service para Ingress."," Cada Service exposto vira ponto de entrada no destino. Lista de domínios, certificados associados, sticky sessions configuradas, regras de path-based routing. Sem essa lista, a migração quebra exatamente no momento de cutover.",[12,19968,19969],{},"Esse assessment leva um a dois dias pra um dev competente. É barato. Pular essa etapa é a maior fonte de migração que estoura cronograma.",[19,19971,19973],{"id":19972},"decisao-de-stack-alvo","Decisão de stack alvo",[12,19975,19976],{},"Quatro opções principais hoje pra time pequeno. Cada uma com tradeoff explícito.",[12,19978,19979,19982],{},[27,19980,19981],{},"Opção A: Docker Swarm."," Compatibilidade direta com formato Compose, multi-server simples, baixa curva de aprendizado. Bom pra time de um dev que já conhece Compose. Limitação séria: Swarm está em modo manutenção há tempos, sem desenvolvimento ativo de feature nova. Roda e funciona, mas você está apostando em ferramenta que não evolui.",[12,19984,19985,19988],{},[27,19986,19987],{},"Opção B: Nomad."," Similar a K8s em modelo declarativo, mas mais simples e com binário único. Bom pra quem gosta de modelo declarativo robusto e quer HA real. Limitação: a licença mudou pra modelo restrito desde 2023, e a empresa por trás foi adquirida em 2025. Pra adoção nova hoje, é caminho com asterisco.",[12,19990,19991,19994],{},[27,19992,19993],{},"Opção C: HeroCtl."," Orquestrador independente com plano de controle replicado, binário único, configuração curta. Bom pra quem quer simplicidade operacional e alta disponibilidade real desde o primeiro dia. Limitação honesta: ecossistema menor que K8s, sem biblioteca profunda de operadores prontos.",[12,19996,19997,20000],{},[27,19998,19999],{},"Opção D: painel self-hosted (Coolify, Dokploy, similares)."," Painel web que orquestra Docker numa máquina ou pequeno conjunto. Bom pra time muito pequeno sem requisitos formais de HA. Limitação: arquitetura que não suporta consenso distribuído real entre vários servidores — cresceu, virou ponto único de falha.",[12,20002,20003],{},"A escolha depende do perfil. Time de um dev sem requisito de SLA = Opção D. Time pequeno com requisito de HA real = Opção C. Time que prefere modelo declarativo robusto e aceita licença restrita = Opção B. Time já investido em Compose = Opção A.",[19,20005,20007],{"id":20006},"os-cinco-passos-da-migracao","Os cinco passos da migração",[12,20009,20010],{},"A partir daqui o playbook assume que a stack alvo é HeroCtl, mas o esqueleto se aplica a qualquer destino. Ajuste os mapeamentos conceituais pra Swarm\u002FNomad\u002FCoolify conforme escolha.",[368,20012,20014],{"id":20013},"passo-1-setup-do-destino-em-paralelo-uma-semana","Passo 1 — Setup do destino em paralelo (uma semana)",[12,20016,20017],{},"Regra dura: nunca migrar in-place. O cluster K8s atual continua rodando intocado durante toda a migração. O destino é provisionado em paralelo, em servidores novos, com domínio temporário ou subdomínio de teste.",[12,20019,20020],{},"Três a cinco servidores Linux novos. Instalar a stack alvo. Validar que a rede entre os servidores funciona, que o storage persiste após reboot, que certificados são emitidos automaticamente, que secrets podem ser injetados em apps. Conectar o destino com o mesmo registry de imagens que o K8s atual usa — assim a mesma imagem que roda em produção vai pro destino sem rebuild.",[12,20022,20023],{},"Esse passo é deliberadamente leve. A intenção é provar que o destino funciona com app sintético antes de comprometer migração de app real.",[368,20025,20027],{"id":20026},"passo-2-migracao-de-manifests-para-spec-do-destino-uma-a-duas-semanas","Passo 2 — Migração de manifests para spec do destino (uma a duas semanas)",[12,20029,20030],{},"A maior parte do esforço está aqui. Cada workload do K8s precisa ser re-expressa no formato do destino. O mapeamento conceitual de K8s pra HeroCtl serve de referência:",[2735,20032,20033,20043,20049,20055,20061,20067,20073,20079,20085,20091,20101],{},[70,20034,20035,20038,20039,20042],{},[27,20036,20037],{},"Deployment + ReplicaSet"," → job com ",[231,20040,20041],{},"replicas: N",". O conceito é o mesmo: N cópias do mesmo workload, balanceadas entre servidores.",[70,20044,20045,20048],{},[27,20046,20047],{},"Service ClusterIP"," → service interno. No HeroCtl não precisa criar — qualquer task tem nome resolvível dentro do cluster por padrão.",[70,20050,20051,20054],{},[27,20052,20053],{},"Service LoadBalancer ou Ingress"," → ingress integrado. Sem operador externo, sem cert-manager separado, sem ingress-nginx — tudo embutido no orquestrador.",[70,20056,20057,20060],{},[27,20058,20059],{},"Pod"," → task. Conceito 1:1.",[70,20062,20063,20066],{},[27,20064,20065],{},"PersistentVolume"," → volume nomeado. Pode exigir cópia de dados, dependendo do storage backend usado em K8s.",[70,20068,20069,20072],{},[27,20070,20071],{},"ConfigMap"," → bloco de env ou arquivo no spec. Não há objeto separado.",[70,20074,20075,20078],{},[27,20076,20077],{},"Secret"," → secret integrado do orquestrador. Encriptado em repouso no plano de controle.",[70,20080,20081,20084],{},[27,20082,20083],{},"HorizontalPodAutoscaler"," → política de scaling no spec do job. Disparada por uso de CPU, RAM, ou métrica custom.",[70,20086,20087,20090],{},[27,20088,20089],{},"DaemonSet"," → job com restrição de placement \"1 por nó\".",[70,20092,20093,20096,20097,20100],{},[27,20094,20095],{},"CronJob"," → job tipo ",[231,20098,20099],{},"periodic"," com expressão cron.",[70,20102,20103,20106],{},[27,20104,20105],{},"Helm chart"," → spec custom. Não converte 1:1 — re-escrever na mão.",[12,20108,20109],{},"Em linhas brutas, a redução é dramática. Um app web típico em K8s tem 30 a 50 linhas de Deployment, mais 20 de Service, mais 50 a 100 de Ingress + cert-manager + annotations. Total 100 a 170 linhas. O equivalente em HeroCtl fica entre 30 e 50 linhas, agregando tudo num único arquivo.",[12,20111,20112],{},"Tempo médio de migração por app: um a três dias pra dev competente. Dez apps em três semanas é ritmo realista. Se chegar muito mais lento, há operador escondido ou complexidade não detectada no assessment — pare e re-meça.",[368,20114,20116],{"id":20115},"passo-3-migracao-de-banco-e-storage-um-a-tres-dias","Passo 3 — Migração de banco e storage (um a três dias)",[12,20118,20119],{},"Duas estratégias. Se o banco é gerenciado (RDS, Cloud SQL, equivalente), o destino só aponta a nova string de conexão e pronto — o banco fica onde estava, agnóstico de plataforma. Se o banco é self-hosted no K8s, é dump-and-restore manual: pg_dump no banco antigo, pg_restore no novo, com janela de manutenção curta no momento de cutover.",[12,20121,20122],{},"Volumes persistentes do K8s viram volumes nomeados no destino. Pode exigir cópia de dados via rsync ou snapshot — dependendo do storage backend, isso é janela adicional.",[12,20124,20125],{},"Secrets são extraídos do K8s e re-inseridos no destino. Use canal seguro (kubectl get secret -o yaml é só meio de leitura; nunca commitar arquivo intermediário). No HeroCtl, secrets são submetidos via API com TLS e ficam encriptados no plano de controle.",[368,20127,20129],{"id":20128},"passo-4-cutover-uma-a-tres-horas-normalmente-noturno","Passo 4 — Cutover (uma a três horas, normalmente noturno)",[12,20131,20132],{},"O passo crítico. Pre-checks antes de qualquer mudança de DNS: smoke test no destino — login funciona, página principal carrega, banco está conectado, latência é aceitável, fila processa job, métricas chegam no monitoring. Se algum dos cinco falha, aborta o cutover.",[12,20134,20135],{},"DNS preparado: TTL reduzido pra 60 segundos vinte e quatro horas antes da janela. Sem isso, propagação leva horas e rollback é doloroso.",[12,20137,20138],{},"Cutover propriamente dito: muda o registro DNS pra apontar pros IPs do destino. Monitora 5xx e latência em janela de cinco minutos. Se algo quebra significativamente nos primeiros trinta minutos, switch DNS de volta pro K8s — rollback completo em sessenta segundos de propagação adicional.",[12,20140,20141],{},"Mantém o cluster K8s rodando como standby por trinta dias. Não desliga. O custo extra é justificado: se algum bug latente aparece na semana três do destino, você ainda tem onde voltar.",[368,20143,20145],{"id":20144},"passo-5-decommission-do-k8s-uma-a-duas-horas-apos-trinta-dias","Passo 5 — Decommission do K8s (uma a duas horas, após trinta dias)",[12,20147,20148,20149,20152,20153,20156],{},"Trinta dias depois do cutover, sem incidente significativo, hora de desligar. ",[231,20150,20151],{},"kubectl delete cluster"," no caso self-hosted, ou ",[231,20154,20155],{},"aws eks delete-cluster"," (ou equivalente em outras nuvens) no caso gerenciado. Cancelar managed addons separadamente — a fatura tem itens que não somem só com delete-cluster.",[12,20158,20159],{},"Reembolso prorrata do mês corrente do plano gerenciado, se o provedor oferece. Cancelamento das instâncias de worker. Backup final do estado do cluster antes do delete, em caso de auditoria futura.",[19,20161,20163],{"id":20162},"as-seis-armadilhas-do-caminho","As seis armadilhas do caminho",[12,20165,20166],{},"Assessment técnico cobre o que você consegue medir. As armadilhas abaixo são o que escapa do assessment e quebra o cronograma. Cada uma já causou migração que estourou prazo em algum time real.",[12,20168,20169,20172,20173,20176],{},[27,20170,20171],{},"Armadilha 1: dependência oculta em operador."," Você acha que não tem operador complexo, mas cert-manager + ingress-nginx + sealed-secrets já é stack de três operadores. E provavelmente tem mais — kube-state-metrics pra monitoring, external-dns pra atualizar DNS automaticamente, reloader pra reiniciar pods quando ConfigMap muda. Mapear ",[179,20174,20175],{},"tudo",". Cada operador é trabalho de migração que o assessment superficial perde.",[12,20178,20179,20182],{},[27,20180,20181],{},"Armadilha 2: assumir que Helm chart é re-escrevível em um dia."," Chart simples com cinco templates é re-escrita de poucas horas. Chart complexo com trinta templates, valores aninhados, hooks de pre-install\u002Fpost-install, e dependências de subcharts pode levar uma semana só pra mapear pra spec equivalente. Calibre a estimativa pelo chart mais complexo, não pelo mais simples.",[12,20184,20185,20188],{},[27,20186,20187],{},"Armadilha 3: sticky sessions sem documentar."," O ingress-nginx em K8s suporta sessão persistente por configuração de annotation. Se o app depende disso (carrinho de compras, sessão de admin, websocket persistente) e ninguém documentou, a migração quebra exatamente no cutover quando um usuário começa a alternar entre dois servidores backend e perde estado de sessão. Auditar configuração de ingress antes — não confiar só no que o time lembra.",[12,20190,20191,20194],{},[27,20192,20193],{},"Armadilha 4: limites de recurso diferentes."," K8s usa limit\u002Frequest com semântica precisa: request é garantia, limit é teto. O destino pode ter modelo declarativo diferente (limite hard, ou cota agregada por job, ou semântica de soft-limit). Erro de tuning aqui quebra autoscaling — o app fica subdimensionado em produção e não escala quando deveria, ou superdimensionado e desperdiça capacidade. Re-medir consumo real após cutover, ajustar limites na primeira semana.",[12,20196,20197,20200],{},[27,20198,20199],{},"Armadilha 5: formato de log."," Alguns ingress em K8s emitem log em JSON por default — parser downstream (Loki, Datadog, ELK) está configurado pra esse formato. Destino pode emitir log em texto plano ou formato diferente. Parsing downstream quebra silenciosamente — alertas param de disparar porque o pattern não bate mais. Verificar formato de log do roteador integrado do destino antes do cutover.",[12,20202,20203,20206,20207,5840,20210,20213],{},[27,20204,20205],{},"Armadilha 6: pipeline de CI\u002FCD acoplado."," GitOps com ArgoCD ou FluxCD apontando pra K8s precisa ser re-trabalhado. Se o pipeline aplica manifesto declarativo com ",[231,20208,20209],{},"kubectl apply",[231,20211,20212],{},"helm upgrade",", isso não funciona no destino. Adapter scripts no estágio de deploy são necessários — receber o manifesto velho, traduzir pra spec novo, submeter via API. Estimar uma a duas semanas só pra pipeline de CI\u002FCD, separado do tempo de migração de manifests.",[19,20215,20217],{"id":20216},"cronograma-realista","Cronograma realista",[12,20219,20220],{},"Calibração honesta de expectativa, em três faixas de tamanho.",[12,20222,20223,20226],{},[27,20224,20225],{},"Time de um a dois devs, cinco a dez apps:"," quatro a seis semanas total. Decomposição: uma semana de setup do destino, duas a três semanas de migração de manifests e ajuste, um a três dias de cutover, trinta dias de operação paralela, um dia de decommission. Atenção: o trabalho de migração rouba foco do desenvolvimento de produto durante esse período. Considere janela de feature freeze.",[12,20228,20229,20232],{},[27,20230,20231],{},"Time de três a cinco devs, vinte a cinquenta apps:"," oito a doze semanas. A multiplicação não é linear — apps adicionais aumentam matriz de testes de cutover. Vale dedicar uma pessoa em tempo integral à migração e manter o resto do time em produto.",[12,20234,20235,20238],{},[27,20236,20237],{},"Empresa com cem ou mais apps:"," projeto de quatro a seis meses, com uma a duas pessoas dedicadas. Nesse tamanho, a migração vira fase com gerente de projeto, marcos quinzenais, e relatórios de status. Não é sprint.",[19,20240,20242],{"id":20241},"resultados-tipicos-pos-migracao","Resultados típicos pós-migração",[12,20244,20245],{},"Faixas observadas em times que completaram a migração. Não são garantias — são pontos de referência.",[2735,20247,20248,20254,20260,20266,20272],{},[70,20249,20250,20253],{},[27,20251,20252],{},"Redução de RAM total:"," 30% a 50%. O overhead de Kubernetes é real, e some quando você sai. Cluster que usava 32 GB de RAM agregado vira algo entre 16 e 22 GB pro mesmo workload.",[70,20255,20256,20259],{},[27,20257,20258],{},"Redução de custo cloud:"," 40% a 70%. Vem de três frentes: sem managed control plane (US$73\u002Fmês por cluster sai do orçamento), sem NAT gateway por subnet (alguns provedores cobram por GB), instâncias menores possíveis (overhead de plataforma sai do consumo).",[70,20261,20262,20265],{},[27,20263,20264],{},"Tempo de deploy:"," similar ou ligeiramente melhor. Não é onde está o ganho — K8s é razoavelmente rápido em deploy quando configurado bem.",[70,20267,20268,20271],{},[27,20269,20270],{},"Tempo de aprendizado pra dev novo:"," uma semana, contra quatro a seis em K8s. O modelo mental é mais simples — menos abstrações intermediárias entre \"quero rodar isso\" e \"está rodando\".",[70,20273,20274,20277],{},[27,20275,20276],{},"Tempo de operação mensal:"," uma a três horas-dev de manutenção, contra vinte a quarenta em K8s. O ganho maior. É aqui que o ROI se materializa.",[12,20279,20280],{},"Pra calibrar a última métrica: cluster público de demonstração da gente roda em quatro servidores totalizando cinco vCPUs e dez gigabytes de RAM, com plano de controle ocupando entre 200 e 400 MB por servidor. Eleição de novo coordenador, em caso de falha do atual, leva cerca de sete segundos. Spec de aplicação típica em HeroCtl tem cerca de cinquenta linhas — comparado a trezentas linhas ou mais de YAML em Kubernetes pra equivalente \"hello world\" com TLS e ingress.",[19,20282,20284],{"id":20283},"a-pergunta-inevitavel-vai-voltar-pra-kubernetes-eventualmente","A pergunta inevitável: vai voltar pra Kubernetes eventualmente?",[12,20286,20287],{},"Honestidade. Depende de escala.",[12,20289,20290],{},"Time que cresce pra trinta ou mais devs, com cem ou mais servidores em produção, multi-região, com requisito de federação entre clusters, eventualmente bate no teto de stack mais simples. Nessa escala, K8s vira escolha racional — o ecossistema te dá ferramentas que outras stacks não têm. A migração de volta é projeto de meses, não dias, mas é caminho viável.",[12,20292,20293],{},"Pra startups que se mantêm sub-cinquenta servidores ao longo de cinco anos — a maioria absoluta delas — raramente faz sentido voltar. O ganho operacional da stack mais simples se mantém durante toda a vida útil do produto.",[12,20295,20296],{},"Migração reversa (HeroCtl → K8s) também é projeto de semanas, não dias. Não é decisão one-way. Se a empresa cresce muito mais rápido do que esperava, o caminho de volta existe — mais caro do que ficar, mas existe. A decisão de migrar agora não te prende pra sempre.",[19,20298,16602],{"id":16601},[12,20300,20301,20304],{},[27,20302,20303],{},"Em quanto tempo paga o ROI?","\nPra time de um a dois devs com cluster pequeno, a migração paga em três a seis meses — o salário-equivalente de tempo recuperado em manutenção excede o custo do projeto de migração. Pra times maiores, depende do quanto o time de plataforma consumia em manutenção; tipicamente seis a doze meses.",[12,20306,20307,20310],{},[27,20308,20309],{},"Posso manter Kubernetes pra um workload específico e migrar o resto?","\nSim, e em alguns casos é a estratégia correta. Workload com operador crítico (banco distribuído, fila com balanceamento gerenciado) fica no K8s. O resto vai pra stack mais simples. Os dois clusters convivem com domínios separados ou path-based routing num roteador upstream. Custa um pouco mais que consolidar, mas evita re-escrever o que ainda funciona bem.",[12,20312,20313,20316],{},[27,20314,20315],{},"Helm charts complexos: vale re-escrever?","\nCaso a caso. Chart de operador de terceiro com cinquenta arquivos: provavelmente não vale, mantém em K8s ou troca a tecnologia. Chart próprio com vinte templates: vale, é re-escrita de poucos dias e elimina dependência de Helm.",[12,20318,20319,20322],{},[27,20320,20321],{},"ArgoCD funciona com HeroCtl?","\nNão diretamente — ArgoCD foi feito pra aplicar manifesto K8s. Mas o conceito de GitOps funciona: pipeline observa o repositório, traduz spec do destino pra payload de API, submete via curl autenticado. Plugin nativo está em consideração; por enquanto é adapter script de cinquenta linhas.",[12,20324,20325,20328],{},[27,20326,20327],{},"O time que aprendeu Kubernetes — vão ficar resentidos?","\nPergunta legítima. Curva de aprendizado de K8s é investimento real, e ninguém gosta de ver investimento descartado. Conversa direta: a habilidade não some. K8s continua sendo padrão de mercado pra escala grande, e dev que já dominou continua empregável e valioso. A migração é decisão de produto pra escala atual, não veredicto sobre o conhecimento individual.",[12,20330,20331,20334],{},[27,20332,20333],{},"Cloud agnostic é mais ou menos viável depois?","\nMais viável, na prática. Stack mais simples roda em qualquer servidor Linux com Docker — bare metal, VPS de qualquer provedor, instância de qualquer nuvem. K8s gerenciado amarra você ao provedor (EKS na AWS, GKE na Google, AKS na Azure) — cada um com sabor próprio. Sair amplia opções.",[12,20336,20337,20340],{},[27,20338,20339],{},"Tem case público de empresa que fez essa migração?","\nVários, mas a maioria não publica em conferência (o vetor narrativo continua sendo K8s pra todos os lados). Em fóruns e em conversas informais, é fácil encontrar relato. Se você quer conversar com alguém que fez a migração, escreve pra gente — fazemos a ponte.",[19,20342,3310],{"id":3309},[12,20344,20345],{},"A decisão de sair de Kubernetes pra stack mais simples não é confissão de derrota — é reconhecimento de que a ferramenta certa depende da escala atual da empresa, e que a escala atual da empresa não é a do livro de marketing do colosso. Time pequeno, cluster pequeno, apps típicas, plataforma consumindo metade do orçamento de engenharia: é exatamente o cenário em que a migração inversa paga.",[12,20347,20348],{},"Não é decisão de uma tarde. É projeto de quatro a seis semanas pra time pequeno, com inventário, mapeamento, cutover noturno, trinta dias de operação paralela, e decommission cuidadoso. Mas é projeto cujo ROI se mede em horas-dev recuperadas todo mês — todo mês, pelos próximos anos da empresa.",[12,20350,20351],{},"Se quiser experimentar HeroCtl como destino candidato:",[224,20353,20355],{"className":20354,"code":5319,"language":2530},[2528],[231,20356,5319],{"__ignoreMap":229},[12,20358,20359],{},"Roda em qualquer servidor Linux com Docker. Três servidores formam plano de controle replicado com alta disponibilidade real. Spec de aplicação fica entre trinta e cinquenta linhas, agregando todo o necessário (replicação, ingress, certificado automático, secrets). Plano Community gratuito permanente cobre toda a stack descrita aqui — só Business e Enterprise adicionam SSO, RBAC granular, auditoria detalhada, escrow de código e suporte com SLA, voltados pra empresas com requisitos formais de plataforma.",[12,20361,20362,20363,20366,20367,20369],{},"Pra contexto adicional, ",[3337,20364,20365],{"href":5344},"k3s vs HeroCtl: quando cada um faz sentido"," trata da escolha quando o time já decidiu sair do K8s vanilla mas hesita entre distribuição leve de K8s e orquestrador independente. E ",[3337,20368,15790],{"href":15789}," é o argumento de fundo pra quem ainda não está convencido de que a complexidade é desnecessária na escala atual.",[12,20371,20372],{},"Migração inversa não é manchete de conferência. Mas é a decisão certa pra mais times do que a narrativa pública admite.",{"title":229,"searchDepth":244,"depth":244,"links":20374},[20375,20376,20377,20378,20379,20386,20387,20388,20389,20390,20391],{"id":19827,"depth":244,"text":19828},{"id":19876,"depth":244,"text":19877},{"id":19916,"depth":244,"text":19917},{"id":19972,"depth":244,"text":19973},{"id":20006,"depth":244,"text":20007,"children":20380},[20381,20382,20383,20384,20385],{"id":20013,"depth":271,"text":20014},{"id":20026,"depth":271,"text":20027},{"id":20115,"depth":271,"text":20116},{"id":20128,"depth":271,"text":20129},{"id":20144,"depth":271,"text":20145},{"id":20162,"depth":244,"text":20163},{"id":20216,"depth":244,"text":20217},{"id":20241,"depth":244,"text":20242},{"id":20283,"depth":244,"text":20284},{"id":16601,"depth":244,"text":16602},{"id":3309,"depth":244,"text":3310},"2026-03-18","Quando a empresa adota K8s cedo demais, todo mundo paga. O caminho inverso — sair do K8s pra orquestração mais simples — é viável e mais comum do que parece. O que validar antes, durante e depois.",{},{"title":19805,"description":20393},{"loc":8717},"blog\u002Fmigrar-de-kubernetes-pra-stack-mais-simples-case",[20399,6394,20400,20401,6383],"kubernetes","simplificacao","case","nGhoKSJRWblNSpKliOntafZT4d4_08UtcYNVdSwckaU",{"id":20404,"title":20405,"author":7,"body":20406,"category":6383,"cover":3380,"date":21756,"description":21757,"draft":3383,"extension":3384,"lastReviewed":3380,"meta":21758,"navigation":411,"path":21759,"readingTime":6388,"seo":21760,"sitemap":21761,"stem":21762,"tags":21763,"__hash__":21764},"blog_pt\u002Fblog\u002Fmigrar-do-heroku-guia-tecnico.md","Migrar do Heroku pra cluster próprio: guia técnico em 5 passos",{"type":9,"value":20407,"toc":21743},[20408,20411,20414,20418,20421,20424,20478,20481,20484,20488,20491,20496,20509,20512,20515,20520,20538,20541,20546,20562,20574,20579,20595,20604,20607,20621,20626,20629,20658,20661,20666,20695,20698,20701,20704,20708,20711,20717,20720,20726,20729,20735,20738,20741,20745,20748,20891,20894,20899,20957,20962,21018,21021,21026,21029,21053,21058,21069,21072,21076,21079,21084,21093,21113,21131,21136,21144,21149,21273,21276,21281,21284,21287,21292,21295,21313,21316,21320,21323,21328,21331,21336,21342,21347,21382,21385,21390,21397,21402,21405,21413,21416,21421,21424,21428,21431,21434,21488,21491,21494,21498,21501,21515,21532,21550,21558,21574,21580,21586,21592,21596,21599,21630,21633,21636,21639,21641,21647,21653,21669,21675,21681,21687,21700,21702,21705,21708,21724,21727,21730,21740],[12,20409,20410],{},"Em 28 de novembro de 2022, a Salesforce desligou o plano gratuito do Heroku. Centenas de milhares de hobby projects foram apagados de uma vez, e o ciclo de notícias durou uns dois meses — gente migrando pra Render, pra Fly.io, pra Railway, pra um VPS qualquer. O que ninguém previu naquele momento é o que aconteceu depois: quatro anos passaram, estamos em 2026, e ainda existem milhares de SaaS brasileiros em produção pagando entre US$25 e US$100 por mês por dyno só porque \"migrar\" é o décimo terceiro item da backlog. Sempre tem uma feature mais urgente. Sempre tem um cliente perguntando quando sai o módulo X. Migrar dá zero receita nova — então fica.",[12,20412,20413],{},"Esse post é o plano pra fazer essa migração caber em uma semana de trabalho de um dev part-time, e o restante de um mês pra estabilizar. Não é um manifesto, não é uma comparação de fornecedores, não é \"venha pro HeroCtl\". É um runbook. No final tem uma seção sobre opções de destino, incluindo o nosso produto, mas se você terminar de ler e for pra Render ou pra Coolify ou pra Fly.io, o post fez o trabalho.",[19,20415,20417],{"id":20416},"por-que-ainda-doi-migrar-a-verdade-nao-dita","Por que ainda dói migrar (a verdade não dita)",[12,20419,20420],{},"A primeira coisa que precisa ficar clara: não é o Dockerfile. Escrever Dockerfile pra um app Rails ou Node é meia tarde — tem template pronto pra cada framework, tem cinco posts no DEV explicando, tem o Copilot escrevendo. Se a sua resistência é \"ainda não dockerizamos\", essa parte é a menos importante.",[12,20422,20423],{},"A dor está no ecossistema:",[2735,20425,20426,20444,20450,20456,20462,20468],{},[70,20427,20428,20431,20432,571,20434,571,20437,571,20440,20443],{},[27,20429,20430],{},"Postgres com extensions específicas"," que você esqueceu que ativou em 2019. ",[231,20433,17308],{},[231,20435,20436],{},"pgcrypto",[231,20438,20439],{},"hstore",[231,20441,20442],{},"postgis"," — cada uma é um motivo pra migração quebrar silenciosamente.",[70,20445,20446,20449],{},[27,20447,20448],{},"Redis Premium com persistência"," que você usa pra fila do Sidekiq E pra cache E pra rate limit. Pra cache pode reiniciar do zero. Pra fila não pode.",[70,20451,20452,20455],{},[27,20453,20454],{},"Sidekiq workers stateful"," com jobs agendados meses à frente. Migrar enquanto eles rodam é correr atrás do trem em movimento.",[70,20457,20458,20461],{},[27,20459,20460],{},"Heroku Scheduler"," com aquele cron que ninguém olha desde 2020 mas que faz o relatório mensal do CEO.",[70,20463,20464,20467],{},[27,20465,20466],{},"Papertrail"," integrado, NewRelic instrumentado, Bugsnag em todos os erros — três SaaS extras que você nem sabe se vão fazer sentido na nova arquitetura.",[70,20469,20470,20473,20474,20477],{},[27,20471,20472],{},"Buildpack"," que rodou seis anos sem ninguém saber direito o que faz. Tem um ",[231,20475,20476],{},"bin\u002Fpost_compile"," que minifica algo, tem variável de ambiente que define qual versão do Ruby — em algum lugar, a sua aplicação depende de seis comportamentos do buildpack que nunca foram documentados.",[12,20479,20480],{},"E tem a parte humana: você e o seu time internalizaram primitivas Heroku ao longo de anos. Procfile, slug compilation, dynos, release phase, config vars. Tudo isso virou intuição. Quando a gente vai refazer fora do Heroku, refaz inconscientemente — e em geral mal, porque o Heroku tinha defaults que escondem decisões importantes que agora são suas.",[12,20482,20483],{},"A migração técnica leva uma semana. A migração mental leva um mês. Esse post tenta encurtar os dois.",[19,20485,20487],{"id":20486},"pre-flight-check-uma-a-duas-horas-antes-de-qualquer-commit","Pré-flight check — uma a duas horas, antes de qualquer commit",[12,20489,20490],{},"Antes de abrir o editor, você precisa do inventário. A maior parte das migrações que dão errado é por uma surpresa que poderia ter sido descoberta na primeira hora.",[12,20492,20493],{},[27,20494,20495],{},"Inventário de apps:",[224,20497,20499],{"className":226,"code":20498,"language":228,"meta":229,"style":229},"heroku apps\n",[231,20500,20501],{"__ignoreMap":229},[234,20502,20503,20506],{"class":236,"line":237},[234,20504,20505],{"class":247},"heroku",[234,20507,20508],{"class":255}," apps\n",[12,20510,20511],{},"Quantos apps existem na conta? Quais ainda estão em uso de verdade? Quais podem virar cron-job e morrer? Quais foram criados pra um cliente que saiu em 2021? Marque cada um numa planilha com três colunas: nome, status (vivo\u002Fzumbi\u002Fcron), prioridade de migração (alta\u002Fmédia\u002Fbaixa).",[12,20513,20514],{},"A maioria das contas tem 30% de apps zumbis. Migrar zumbi não tem ROI — destruir tem.",[12,20516,20517],{},[27,20518,20519],{},"Inventário de addons por app:",[224,20521,20523],{"className":226,"code":20522,"language":228,"meta":229,"style":229},"heroku addons -a meu-app\n",[231,20524,20525],{"__ignoreMap":229},[234,20526,20527,20529,20532,20535],{"class":236,"line":237},[234,20528,20505],{"class":247},[234,20530,20531],{"class":255}," addons",[234,20533,20534],{"class":251}," -a",[234,20536,20537],{"class":255}," meu-app\n",[12,20539,20540],{},"Cada linha é uma decisão futura. Postgres? Redis? Papertrail? Heroku Scheduler? SendGrid? Mailgun? Pra cada um, escreva na planilha: vai migrar pra equivalente self-hosted, vai virar SaaS externo, ou vai descartar. Se você não sabe pra que serve, pesquise antes — não na hora do cutover.",[12,20542,20543],{},[27,20544,20545],{},"Inventário de buildpacks:",[224,20547,20549],{"className":226,"code":20548,"language":228,"meta":229,"style":229},"heroku buildpacks -a meu-app\n",[231,20550,20551],{"__ignoreMap":229},[234,20552,20553,20555,20558,20560],{"class":236,"line":237},[234,20554,20505],{"class":247},[234,20556,20557],{"class":255}," buildpacks",[234,20559,20534],{"class":251},[234,20561,20537],{"class":255},[12,20563,20564,20565,571,20568,571,20571,20573],{},"Multi-buildpack? Custom buildpack? Se a saída tem mais de uma linha, leia cada um. Buildpack customizado costuma ter hooks (",[231,20566,20567],{},"bin\u002Frelease",[231,20569,20570],{},"bin\u002Fcompile",[231,20572,20476],{},") que executam coisas específicas. Você vai precisar replicar esses passos no Dockerfile ou num release container.",[12,20575,20576],{},[27,20577,20578],{},"Inventário de env vars:",[224,20580,20582],{"className":226,"code":20581,"language":228,"meta":229,"style":229},"heroku config -a meu-app\n",[231,20583,20584],{"__ignoreMap":229},[234,20585,20586,20588,20591,20593],{"class":236,"line":237},[234,20587,20505],{"class":247},[234,20589,20590],{"class":255}," config",[234,20592,20534],{"class":251},[234,20594,20537],{"class":255},[12,20596,20597,20598,571,20600,20603],{},"Exporte tudo pra arquivo seguro. NÃO commite. NÃO mande pelo Slack. NÃO cole no ChatGPT. Esse arquivo tem ",[231,20599,453],{},[231,20601,20602],{},"SECRET_KEY_BASE",", chave de API de pagamento. Trate como senha, porque é exatamente isso.",[12,20605,20606],{},"Atenção a duas armadilhas:",[2735,20608,20609,20615],{},[70,20610,20611,20612,20614],{},"Variáveis com caractere ",[231,20613,1272],{}," no nome (algumas libs antigas usam) escapam diferente em containers.",[70,20616,20617,20620],{},[231,20618,20619],{},"BUNDLE_WITHOUT=development:test"," gravado em produção é bomba relógio depois da migração.",[12,20622,20623],{},[27,20624,20625],{},"Inventário de Procfile:",[12,20627,20628],{},"Cada linha do Procfile é um serviço:",[2735,20630,20631,20637,20643,20649],{},[70,20632,20633,20636],{},[231,20634,20635],{},"web"," vira o container principal.",[70,20638,20639,20642],{},[231,20640,20641],{},"worker"," vira segundo container ou job separado.",[70,20644,20645,20648],{},[231,20646,20647],{},"release"," vira step pré-deploy (typicamente migrations).",[70,20650,20651,5840,20654,20657],{},[231,20652,20653],{},"clock",[231,20655,20656],{},"scheduler"," vira cron job.",[12,20659,20660],{},"Se o seu Procfile tem cinco linhas, você vai ter cinco serviços no destino. Não são detalhes — são o desenho da topologia.",[12,20662,20663],{},[27,20664,20665],{},"Métricas atuais:",[224,20667,20669],{"className":226,"code":20668,"language":228,"meta":229,"style":229},"heroku ps -a meu-app\nheroku logs --tail -a meu-app\n",[231,20670,20671,20681],{"__ignoreMap":229},[234,20672,20673,20675,20677,20679],{"class":236,"line":237},[234,20674,20505],{"class":247},[234,20676,9419],{"class":255},[234,20678,20534],{"class":251},[234,20680,20537],{"class":255},[234,20682,20683,20685,20688,20691,20693],{"class":236,"line":244},[234,20684,20505],{"class":247},[234,20686,20687],{"class":255}," logs",[234,20689,20690],{"class":251}," --tail",[234,20692,20534],{"class":251},[234,20694,20537],{"class":255},[12,20696,20697],{},"Quantos dynos rodando? Qual o tipo (Standard-1X, Performance-M)? Volume de logs por minuto? Latência média no NewRelic? Pico de CPU\u002Fmemória do mês passado?",[12,20699,20700],{},"Esses números servem pra dimensionar o destino. Migrar e descobrir depois que a memória é metade do necessário é o jeito mais rápido de quebrar a confiança no projeto inteiro.",[12,20702,20703],{},"No fim do pré-flight você tem uma planilha com tudo. Esse arquivo é o coração da migração. Toda decisão volta pra ele.",[19,20705,20707],{"id":20706},"passo-1-escolha-de-stack-alvo-decisao-arquitetural-30-minutos","Passo 1 — Escolha de stack alvo (decisão arquitetural, 30 minutos)",[12,20709,20710],{},"Três caminhos possíveis. Vou ser honesto sobre cada um.",[12,20712,20713,20716],{},[27,20714,20715],{},"Opção A — VPS único com painel self-hosted.","\nUm servidor na DigitalOcean ou Hetzner, instala Coolify ou Dokploy, deploya seu app pelo painel. Custo: R$30 a R$50 por mês pra começar, escala bem até uns 10 apps em servidor médio. Sem alta disponibilidade — se o servidor cai, tudo cai. SLA que você consegue prometer: best-effort.",[12,20718,20719],{},"Ideal pra: indie hacker, projeto pessoal, MVP, SaaS sem cliente que exige SLA por escrito.",[12,20721,20722,20725],{},[27,20723,20724],{},"Opção B — Cluster com alta disponibilidade.","\nTrês ou mais servidores, orquestrador que coordena entre eles, sobrevive à queda de um servidor sem afetar tráfego. Custo: R$150 a R$300 por mês pra um cluster de três nós modestos. SLA possível: 99,9% sem desespero.",[12,20727,20728],{},"Ideal pra: SaaS B2B com clientes pagantes, qualquer aplicação onde meia hora de downtime gera ticket de suporte.",[12,20730,20731,20734],{},[27,20732,20733],{},"Opção C — Plataforma gerenciada externa.","\nRender, Railway, Fly.io. Você paga mais, mas zero ops. Custo: R$200 a R$500 por mês pra workload comparável a 2-3 dynos Heroku, escala linear daí em diante.",[12,20736,20737],{},"Ideal pra: time que não tem absolutamente ninguém pra cuidar de servidor e prefere transferir o problema pra outra empresa.",[12,20739,20740],{},"Decisão honesta, em uma pergunta: tem cliente exigindo SLA? Se não, opção A. Se sim, B. Se o time não tem ninguém disposto a aprender mínima ops, C. Não existe resposta certa universal — existe resposta certa pra o seu contexto. Misturar os três também é válido: app principal em B, ferramenta interna em A, scheduler isolado em C.",[19,20742,20744],{"id":20743},"passo-2-dockerizacao-meio-dia-a-dois-dias-por-app","Passo 2 — Dockerização (meio dia a dois dias por app)",[12,20746,20747],{},"Aqui o trabalho técnico começa. A lógica geral é a mesma pra qualquer stack:",[224,20749,20753],{"className":20750,"code":20751,"language":20752,"meta":229,"style":229},"language-dockerfile shiki shiki-themes github-dark-default","FROM ruby:3.3-slim AS builder\nWORKDIR \u002Fapp\nCOPY Gemfile Gemfile.lock .\u002F\nRUN bundle install --without development test\nCOPY . .\nRUN bundle exec rake assets:precompile\n\nFROM ruby:3.3-slim\nWORKDIR \u002Fapp\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n    libpq5 nodejs && rm -rf \u002Fvar\u002Flib\u002Fapt\u002Flists\u002F*\nCOPY --from=builder \u002Fusr\u002Flocal\u002Fbundle \u002Fusr\u002Flocal\u002Fbundle\nCOPY --from=builder \u002Fapp \u002Fapp\nEXPOSE 3000\nCMD [\"bundle\", \"exec\", \"puma\", \"-C\", \"config\u002Fpuma.rb\"]\n","dockerfile",[231,20754,20755,20769,20777,20785,20793,20800,20807,20811,20818,20824,20831,20836,20843,20850,20858],{"__ignoreMap":229},[234,20756,20757,20760,20763,20766],{"class":236,"line":237},[234,20758,20759],{"class":383},"FROM",[234,20761,20762],{"class":387}," ruby:3.3-slim ",[234,20764,20765],{"class":383},"AS",[234,20767,20768],{"class":387}," builder\n",[234,20770,20771,20774],{"class":236,"line":244},[234,20772,20773],{"class":383},"WORKDIR",[234,20775,20776],{"class":387}," \u002Fapp\n",[234,20778,20779,20782],{"class":236,"line":271},[234,20780,20781],{"class":383},"COPY",[234,20783,20784],{"class":387}," Gemfile Gemfile.lock .\u002F\n",[234,20786,20787,20790],{"class":236,"line":415},[234,20788,20789],{"class":383},"RUN",[234,20791,20792],{"class":387}," bundle install --without development test\n",[234,20794,20795,20797],{"class":236,"line":434},[234,20796,20781],{"class":383},[234,20798,20799],{"class":387}," . .\n",[234,20801,20802,20804],{"class":236,"line":459},[234,20803,20789],{"class":383},[234,20805,20806],{"class":387}," bundle exec rake assets:precompile\n",[234,20808,20809],{"class":236,"line":464},[234,20810,412],{"emptyLinePlaceholder":411},[234,20812,20813,20815],{"class":236,"line":479},[234,20814,20759],{"class":383},[234,20816,20817],{"class":387}," ruby:3.3-slim\n",[234,20819,20820,20822],{"class":236,"line":484},[234,20821,20773],{"class":383},[234,20823,20776],{"class":387},[234,20825,20826,20828],{"class":236,"line":490},[234,20827,20789],{"class":383},[234,20829,20830],{"class":387}," apt-get update && apt-get install -y --no-install-recommends \\\n",[234,20832,20833],{"class":236,"line":508},[234,20834,20835],{"class":387},"    libpq5 nodejs && rm -rf \u002Fvar\u002Flib\u002Fapt\u002Flists\u002F*\n",[234,20837,20838,20840],{"class":236,"line":529},[234,20839,20781],{"class":383},[234,20841,20842],{"class":387}," --from=builder \u002Fusr\u002Flocal\u002Fbundle \u002Fusr\u002Flocal\u002Fbundle\n",[234,20844,20845,20847],{"class":236,"line":535},[234,20846,20781],{"class":383},[234,20848,20849],{"class":387}," --from=builder \u002Fapp \u002Fapp\n",[234,20851,20852,20855],{"class":236,"line":546},[234,20853,20854],{"class":383},"EXPOSE",[234,20856,20857],{"class":387}," 3000\n",[234,20859,20860,20863,20866,20869,20871,20874,20876,20879,20881,20884,20886,20889],{"class":236,"line":552},[234,20861,20862],{"class":383},"CMD",[234,20864,20865],{"class":387}," [",[234,20867,20868],{"class":255},"\"bundle\"",[234,20870,571],{"class":387},[234,20872,20873],{"class":255},"\"exec\"",[234,20875,571],{"class":387},[234,20877,20878],{"class":255},"\"puma\"",[234,20880,571],{"class":387},[234,20882,20883],{"class":255},"\"-C\"",[234,20885,571],{"class":387},[234,20887,20888],{"class":255},"\"config\u002Fpuma.rb\"",[234,20890,9536],{"class":387},[12,20892,20893],{},"Multi-stage. Build pesado fica num estágio que é descartado. Imagem final tem só o necessário pra rodar.",[12,20895,20896],{},[27,20897,20898],{},"Por linguagem:",[2735,20900,20901,20917,20929,20944],{},[70,20902,20903,6564,20906,20909,20910,571,20913,20916],{},[27,20904,20905],{},"Ruby\u002FRails",[231,20907,20908],{},"ruby:3.x-slim"," como base, multi-stage pra reduzir tamanho. O slug compilation do Heroku virou suas próprias linhas no Dockerfile — ",[231,20911,20912],{},"bundle install",[231,20914,20915],{},"assets:precompile",", copiar artefatos.",[70,20918,20919,6564,20922,20925,20926,101],{},[27,20920,20921],{},"Node",[231,20923,20924],{},"node:20-alpine"," resolve a maioria dos casos. Atenção a deps com binários nativos (sharp, bcrypt, sqlite3, canvas) — Alpine usa musl, e algumas libs precisam de glibc. Se quebrar, troque pra ",[231,20927,20928],{},"node:20-slim",[70,20930,20931,6564,20934,20937,20938,5840,20940,20943],{},[27,20932,20933],{},"Python\u002FDjango",[231,20935,20936],{},"python:3.x-slim",", gunicorn ou uvicorn como server. ",[231,20939,8515],{},[231,20941,20942],{},"pyproject.toml"," no estágio de build.",[70,20945,20946,6564,20949,20952,20953,20956],{},[27,20947,20948],{},"Elixir\u002FPhoenix",[231,20950,20951],{},"elixir:1.x-alpine",", release como artefato (",[231,20954,20955],{},"mix release","), runtime image só com erlang.",[12,20958,20959],{},[27,20960,20961],{},"Mapeamento Procfile → Docker:",[119,20963,20964,20974],{},[122,20965,20966],{},[125,20967,20968,20971],{},[128,20969,20970],{},"Procfile",[128,20972,20973],{},"Equivalente em destino",[141,20975,20976,20988,20998,21008],{},[125,20977,20978,20983],{},[146,20979,20980],{},[231,20981,20982],{},"web: bundle exec puma",[146,20984,20985,20987],{},[231,20986,20862],{}," do container principal",[125,20989,20990,20995],{},[146,20991,20992],{},[231,20993,20994],{},"worker: bundle exec sidekiq",[146,20996,20997],{},"Container separado, mesma imagem, comando diferente",[125,20999,21000,21005],{},[146,21001,21002],{},[231,21003,21004],{},"release: bundle exec rake db:migrate",[146,21006,21007],{},"Job de release, executa antes do rolling deploy",[125,21009,21010,21015],{},[146,21011,21012],{},[231,21013,21014],{},"clock: bundle exec clockwork",[146,21016,21017],{},"Cron job, ou container singleton",[12,21019,21020],{},"A maior parte dos orquestradores modernos (HeroCtl, Render, Railway, Coolify) entende esses quatro formatos diretamente.",[12,21022,21023],{},[27,21024,21025],{},"Assets:",[12,21027,21028],{},"Slug compilation do Heroku faz precompile automático. Em Docker você precisa pensar:",[2735,21030,21031,21037,21043],{},[70,21032,21033,21034,20943],{},"Rails: ",[231,21035,21036],{},"RUN bundle exec rake assets:precompile",[70,21038,21039,21040,20943],{},"Node: ",[231,21041,21042],{},"RUN npm run build",[70,21044,21045,21046,2403,21049,21052],{},"Asset host (CDN): se você usa CloudFront ou S3 pra servir static, configurar ",[231,21047,21048],{},"RAILS_SERVE_STATIC_FILES",[231,21050,21051],{},"ASSET_HOST"," corretamente.",[12,21054,21055],{},[27,21056,21057],{},"Tempo médio realista:",[2735,21059,21060,21063,21066],{},[70,21061,21062],{},"App Rails médio (CRUD com Sidekiq): 1 a 2 dias.",[70,21064,21065],{},"App Node simples (API, sem build pesado de frontend): 4 horas.",[70,21067,21068],{},"App com 5+ workers stateful e processamento de mídia: 3 a 5 dias.",[12,21070,21071],{},"A primeira app demora mais. A segunda demora metade. Da terceira em diante, é mecânico.",[19,21073,21075],{"id":21074},"passo-3-migracao-de-banco-a-parte-mais-arriscada-2-a-8-horas","Passo 3 — Migração de banco (a parte mais arriscada, 2 a 8 horas)",[12,21077,21078],{},"Aqui mora o medo. Banco é o único lugar onde \"voltar atrás\" é caro. Tudo o mais é redeploy.",[12,21080,21081],{},[27,21082,21083],{},"Postgres:",[12,21085,21086,21087,21089,21090,21092],{},"Heroku Postgres expõe acesso direto via ",[231,21088,5737],{}," se você tiver as credenciais (estão em ",[231,21091,453],{},"). Antes de qualquer coisa, descubra suas extensions:",[224,21094,21098],{"className":21095,"code":21096,"language":21097,"meta":229,"style":229},"language-sql shiki shiki-themes github-dark-default","SELECT extname, extversion FROM pg_extension;\n","sql",[231,21099,21100],{"__ignoreMap":229},[234,21101,21102,21105,21108,21110],{"class":236,"line":237},[234,21103,21104],{"class":383},"SELECT",[234,21106,21107],{"class":387}," extname, extversion ",[234,21109,20759],{"class":383},[234,21111,21112],{"class":387}," pg_extension;\n",[12,21114,21115,21116,571,21118,571,21120,571,21122,571,21124,571,21127,21130],{},"Comuns: ",[231,21117,20436],{},[231,21119,20439],{},[231,21121,20442],{},[231,21123,17308],{},[231,21125,21126],{},"uuid-ossp",[231,21128,21129],{},"unaccent",". Se o destino não tem todas, ou tem em versão diferente, você descobre antes — não no meio do restore às 3 da manhã.",[12,21132,21133],{},[27,21134,21135],{},"Destino possível pra Postgres:",[2735,21137,21138,21141],{},[70,21139,21140],{},"Postgres rodando como job no próprio cluster (RPO\u002FRTO menor, controle total, você cuida do backup).",[70,21142,21143],{},"Postgres gerenciado regional — RDS São Paulo, Neon, Supabase, Aiven. Mais caro, menos ops.",[12,21145,21146],{},[27,21147,21148],{},"Migração com mínimo downtime — opção A (com janela):",[224,21150,21152],{"className":226,"code":21151,"language":228,"meta":229,"style":229},"# Drena tráfego: coloca app em manutenção, espera Sidekiq esvaziar\nheroku maintenance:on -a meu-app\n\n# Dump\npg_dump $HEROKU_DATABASE_URL --no-owner --no-privileges --format=custom --file=dump.sql\n\n# Restore no destino\npg_restore --no-owner --no-privileges --dbname=$DEST_DATABASE_URL dump.sql\n\n# Smoke test no destino\npsql $DEST_DATABASE_URL -c 'SELECT count(*) FROM users;'\n\n# Cutover de DNS, app no destino aponta pro novo banco\nheroku maintenance:off -a meu-app  # opcional, só pra Heroku continuar atendendo \u002Fhealthz\n",[231,21153,21154,21159,21170,21174,21179,21198,21202,21207,21226,21230,21235,21249,21253,21258],{"__ignoreMap":229},[234,21155,21156],{"class":236,"line":237},[234,21157,21158],{"class":240},"# Drena tráfego: coloca app em manutenção, espera Sidekiq esvaziar\n",[234,21160,21161,21163,21166,21168],{"class":236,"line":244},[234,21162,20505],{"class":247},[234,21164,21165],{"class":255}," maintenance:on",[234,21167,20534],{"class":251},[234,21169,20537],{"class":255},[234,21171,21172],{"class":236,"line":271},[234,21173,412],{"emptyLinePlaceholder":411},[234,21175,21176],{"class":236,"line":415},[234,21177,21178],{"class":240},"# Dump\n",[234,21180,21181,21183,21186,21189,21192,21195],{"class":236,"line":434},[234,21182,5737],{"class":247},[234,21184,21185],{"class":387}," $HEROKU_DATABASE_URL ",[234,21187,21188],{"class":251},"--no-owner",[234,21190,21191],{"class":251}," --no-privileges",[234,21193,21194],{"class":251}," --format=custom",[234,21196,21197],{"class":251}," --file=dump.sql\n",[234,21199,21200],{"class":236,"line":459},[234,21201,412],{"emptyLinePlaceholder":411},[234,21203,21204],{"class":236,"line":464},[234,21205,21206],{"class":240},"# Restore no destino\n",[234,21208,21209,21212,21215,21217,21220,21223],{"class":236,"line":479},[234,21210,21211],{"class":247},"pg_restore",[234,21213,21214],{"class":251}," --no-owner",[234,21216,21191],{"class":251},[234,21218,21219],{"class":251}," --dbname=",[234,21221,21222],{"class":387},"$DEST_DATABASE_URL",[234,21224,21225],{"class":255}," dump.sql\n",[234,21227,21228],{"class":236,"line":484},[234,21229,412],{"emptyLinePlaceholder":411},[234,21231,21232],{"class":236,"line":490},[234,21233,21234],{"class":240},"# Smoke test no destino\n",[234,21236,21237,21240,21243,21246],{"class":236,"line":508},[234,21238,21239],{"class":247},"psql",[234,21241,21242],{"class":387}," $DEST_DATABASE_URL ",[234,21244,21245],{"class":251},"-c",[234,21247,21248],{"class":255}," 'SELECT count(*) FROM users;'\n",[234,21250,21251],{"class":236,"line":529},[234,21252,412],{"emptyLinePlaceholder":411},[234,21254,21255],{"class":236,"line":535},[234,21256,21257],{"class":240},"# Cutover de DNS, app no destino aponta pro novo banco\n",[234,21259,21260,21262,21265,21267,21270],{"class":236,"line":546},[234,21261,20505],{"class":247},[234,21263,21264],{"class":255}," maintenance:off",[234,21266,20534],{"class":251},[234,21268,21269],{"class":255}," meu-app",[234,21271,21272],{"class":240},"  # opcional, só pra Heroku continuar atendendo \u002Fhealthz\n",[12,21274,21275],{},"Janela típica: 30 minutos a 2 horas, dependendo do tamanho do banco. Pra base abaixo de 5GB, 30 min é folgado.",[12,21277,21278],{},[27,21279,21280],{},"Migração com mínimo downtime — opção B (logical replication):",[12,21282,21283],{},"Replicação lógica do Postgres permite que você inicie a cópia enquanto o app continua escrevendo no Heroku. Quando a réplica chega no estado atual, faz o cutover de DNS e o destino vira o novo primário.",[12,21285,21286],{},"Funciona se o destino conseguir alcançar o Heroku via rede. Pra Heroku Postgres precisa abrir whitelist do IP do destino (Heroku tem mecanismo pra isso em planos pagos). Setup leva uma tarde, cutover dura segundos.",[12,21288,21289],{},[27,21290,21291],{},"Redis:",[12,21293,21294],{},"Duas naturezas distintas — trate diferente:",[2735,21296,21297,21303],{},[70,21298,21299,21302],{},[27,21300,21301],{},"Redis como cache",": simplesmente reinicie do zero no destino. O cache reaquece sozinho. Não há nada a migrar.",[70,21304,21305,21308,21309,21312],{},[27,21306,21307],{},"Redis como fila Sidekiq\u002FResque com persistência",": aqui dói. Snapshot via ",[231,21310,21311],{},"BGSAVE",", transfira o RDB, restore no destino. Ou: pause os workers no Heroku, processe a fila até o fim, faça cutover com fila vazia.",[12,21314,21315],{},"Redis Premium do Heroku tem persistência ligada por padrão; Redis simples no destino pode não ter — confira antes.",[19,21317,21319],{"id":21318},"passo-4-dns-ssl-e-cutover-1-a-3-horas","Passo 4 — DNS, SSL e cutover (1 a 3 horas)",[12,21321,21322],{},"O cutover é a hora da verdade. Tudo o que veio antes era preparação.",[12,21324,21325],{},[27,21326,21327],{},"24 horas antes:",[12,21329,21330],{},"Reduz o TTL do registro DNS pra 60 segundos. Isso garante que, quando você apontar pro destino, propaga rápido. TTL alto é o que faz cutover virar pesadelo de 6 horas com metade dos clientes ainda hitando o servidor antigo.",[12,21332,21333],{},[27,21334,21335],{},"Setup paralelo:",[12,21337,21338,21339,622],{},"App rodando em paralelo nos dois destinos. Heroku continua respondendo no domínio antigo. Destino responde num domínio temporário (ex: ",[231,21340,21341],{},"app-novo.heroctl.com",[12,21343,21344],{},[27,21345,21346],{},"Smoke test no destino:",[224,21348,21350],{"className":226,"code":21349,"language":228,"meta":229,"style":229},"curl https:\u002F\u002Fapp-novo.heroctl.com\u002Fhealthz\ncurl https:\u002F\u002Fapp-novo.heroctl.com\u002Fapi\u002Fv1\u002Fusuarios -H \"Authorization: Bearer $TOKEN\"\n# Hit endpoints críticos manualmente, com olhos humanos\n",[231,21351,21352,21359,21377],{"__ignoreMap":229},[234,21353,21354,21356],{"class":236,"line":237},[234,21355,1220],{"class":247},[234,21357,21358],{"class":255}," https:\u002F\u002Fapp-novo.heroctl.com\u002Fhealthz\n",[234,21360,21361,21363,21366,21369,21372,21375],{"class":236,"line":244},[234,21362,1220],{"class":247},[234,21364,21365],{"class":255}," https:\u002F\u002Fapp-novo.heroctl.com\u002Fapi\u002Fv1\u002Fusuarios",[234,21367,21368],{"class":251}," -H",[234,21370,21371],{"class":255}," \"Authorization: Bearer ",[234,21373,21374],{"class":387},"$TOKEN",[234,21376,1207],{"class":255},[234,21378,21379],{"class":236,"line":271},[234,21380,21381],{"class":240},"# Hit endpoints críticos manualmente, com olhos humanos\n",[12,21383,21384],{},"Se algo estiver errado, descubra agora. Depois do cutover você vai estar lidando com tickets de suporte simultaneamente.",[12,21386,21387],{},[27,21388,21389],{},"Cutover:",[12,21391,21392,21393,21396],{},"Muda o CNAME (ou A record) do domínio de produção pro destino. Em até 60 segundos, novos requests vão pro destino novo. Heroku continua respondendo no domínio antigo (a URL ",[231,21394,21395],{},"*.herokuapp.com",") por 30 dias — isso é cinto de segurança importante.",[12,21398,21399],{},[27,21400,21401],{},"SSL\u002FTLS:",[12,21403,21404],{},"Heroku tinha certificado automático embutido. No destino, dependendo da escolha:",[2735,21406,21407,21410],{},[70,21408,21409],{},"HeroCtl, Coolify, Render, Railway, Fly.io: certificado automático via Let's Encrypt, sem você pensar.",[70,21411,21412],{},"VPS único nu: você configura cert-manager-equivalente, ou Caddy com ACME, ou nginx + certbot.",[12,21414,21415],{},"Antes do cutover de DNS, valida que o destino emitiu o certificado pra o domínio. Let's Encrypt valida via HTTP-01 ou DNS-01 — o desafio HTTP-01 só funciona depois do DNS apontar, então tem ovo-galinha. Solução: emite via DNS-01 antes (não precisa do DNS apontar pra o destino), ou aceita 30 segundos de erro de TLS no momento do cutover.",[12,21417,21418],{},[27,21419,21420],{},"Sticky sessions:",[12,21422,21423],{},"Se o seu app usa WebSocket, ou tem sessão em memória (em vez de Redis ou banco), você precisa de sticky session no balanceador. Heroku não fazia isso por padrão, mas alguns apps acabam dependendo de roteamento estável sem perceber. No destino, configure cookie-based session affinity se necessário.",[19,21425,21427],{"id":21426},"passo-5-decommissao-heroku-1-hora-30-dias-depois","Passo 5 — Decommissão Heroku (1 hora, 30 dias depois)",[12,21429,21430],{},"Trinta dias é o cinto de segurança. Mantenha o app no Heroku ligado, sem tráfego (afinal o DNS já apontou pra outro lugar), só pra caso de emergência. Custo: o que você já estava pagando, divido proporcionalmente até a data de cancelamento.",[12,21432,21433],{},"Trinta dias depois, se nada quebrou:",[224,21435,21437],{"className":226,"code":21436,"language":228,"meta":229,"style":229},"heroku addons:destroy heroku-postgresql -a meu-app\nheroku addons:destroy heroku-redis -a meu-app\nheroku addons:destroy papertrail -a meu-app\nheroku apps:destroy meu-app\n",[231,21438,21439,21453,21466,21479],{"__ignoreMap":229},[234,21440,21441,21443,21446,21449,21451],{"class":236,"line":237},[234,21442,20505],{"class":247},[234,21444,21445],{"class":255}," addons:destroy",[234,21447,21448],{"class":255}," heroku-postgresql",[234,21450,20534],{"class":251},[234,21452,20537],{"class":255},[234,21454,21455,21457,21459,21462,21464],{"class":236,"line":244},[234,21456,20505],{"class":247},[234,21458,21445],{"class":255},[234,21460,21461],{"class":255}," heroku-redis",[234,21463,20534],{"class":251},[234,21465,20537],{"class":255},[234,21467,21468,21470,21472,21475,21477],{"class":236,"line":271},[234,21469,20505],{"class":247},[234,21471,21445],{"class":255},[234,21473,21474],{"class":255}," papertrail",[234,21476,20534],{"class":251},[234,21478,20537],{"class":255},[234,21480,21481,21483,21486],{"class":236,"line":415},[234,21482,20505],{"class":247},[234,21484,21485],{"class":255}," apps:destroy",[234,21487,20537],{"class":255},[12,21489,21490],{},"Cada addon tem que ser cancelado separadamente — alguns têm billing próprio que continua mesmo com app destruído. Confere a fatura do mês seguinte com lupa.",[12,21492,21493],{},"Heroku faz reembolso pro-rata até o dia da cancelação. Não esqueça de cancelar a conta inteira se for o último app — senão você paga taxa de plataforma todo mês por nada.",[19,21495,21497],{"id":21496},"armadilhas-comuns","Armadilhas comuns",[12,21499,21500],{},"A maior parte das migrações trava nessas oito coisas. Lê tudo antes de começar.",[12,21502,21503,21506,21507,571,21509,571,21511,21514],{},[27,21504,21505],{},"Slug compilation hooks invisíveis."," Apps antigos têm ",[231,21508,20567],{},[231,21510,20476],{},[231,21512,21513],{},"bin\u002Fpre_compile",". Esses scripts rodam dentro do buildpack e fazem coisas como minificar JS, gerar arquivos derivados, ou rodar uma migração que ninguém lembra. Antes de Dockerizar, abre cada um e replica num step do Dockerfile ou em release container.",[12,21516,21517,21520,21521,21524,21525,21527,21528,21531],{},[27,21518,21519],{},"Config vars com formato quebrado."," Heroku aceita ",[231,21522,21523],{},"MY:VAR"," como nome de variável (com ",[231,21526,1272],{},"). Containers em geral também, mas algumas ferramentas de orquestração escapam diferente. Renomeia pra ",[231,21529,21530],{},"MY_VAR"," antes de migrar.",[12,21533,21534,21537,21538,21541,21542,21545,21546,21549],{},[27,21535,21536],{},"Redis URL com formato variante."," Heroku usa ",[231,21539,21540],{},"redis:\u002F\u002Fh:senha@host:port",". Alguns clients (gems Ruby antigas, principalmente) esperam ",[231,21543,21544],{},"redis:\u002F\u002F:senha@host:port",". Se ver ",[231,21547,21548],{},"Redis::CommandError: WRONGPASS",", é provavelmente isso.",[12,21551,21552,21557],{},[27,21553,21554,21556],{},[231,21555,20619],{}," gravado no env."," Quando você roda esse mesmo container fora do Heroku, ele continua sem instalar gems de desenvolvimento. Em produção, ok. Em staging onde você precisa rodar testes, quebra. Limpa essa variável antes de usar a config dump em outro ambiente.",[12,21559,21560,2578,21563,21566,21567,571,21570,21573],{},[27,21561,21562],{},"Gems específicas do Heroku.",[231,21564,21565],{},"rails_12factor"," (deprecado mas ainda em apps de 2014), ",[231,21568,21569],{},"heroku_san",[231,21571,21572],{},"taps",". Removeu, fim. Se algo depender, troca por equivalente padrão.",[12,21575,21576,21579],{},[27,21577,21578],{},"DNS com Heroku-DNS-Target."," Heroku recomenda usar ALIAS ou ANAME pra apontar pro app, em vez de CNAME, pra raízes de domínio. Quando migrar, troca pra A record direto pro IP do destino. ALIAS apontando pro Heroku é o que vai te ferrar em domínios apex.",[12,21581,21582,21585],{},[27,21583,21584],{},"Papertrail \u002F NewRelic \u002F Bugsnag desligados sem substituto."," Logs e observabilidade são fáceis de deixar pra depois e quebrar na primeira hora pós-migração. Antes do cutover, tem que ter: logs centralizados (HeroCtl tem escritor único embutido; Render expõe via UI; Coolify tem Loki opcional), métricas básicas (CPU, memória, requests), e alguma ferramenta de erros (Sentry self-hosted ou SaaS).",[12,21587,21588,21591],{},[27,21589,21590],{},"Sidekiq\u002FResque com jobs em voo durante cutover."," Durante o momento do cutover, alguns jobs vão pra fila do destino sem terem sido processados no origem. Se o seu job não é idempotente (pode rodar duas vezes sem efeito colateral), isso é problema. Solução: pause os workers no Heroku 5 minutos antes do cutover, espera fila esvaziar, faz cutover com fila vazia.",[19,21593,21595],{"id":21594},"cronograma-realista-pra-startup-media-5-a-10-apps-heroku","Cronograma realista pra startup média (5 a 10 apps Heroku)",[12,21597,21598],{},"Time pequeno, um dev part-time:",[2735,21600,21601,21607,21613,21619,21625],{},[70,21602,21603,21606],{},[27,21604,21605],{},"Semana 1",": pré-flight completo + escolha de stack + setup do destino (cluster vazio rodando, painel acessível).",[70,21608,21609,21612],{},[27,21610,21611],{},"Semana 2",": Dockerização do primeiro app de baixo risco + migração de banco em ambiente de staging.",[70,21614,21615,21618],{},[27,21616,21617],{},"Semana 3",": cutover do primeiro app em produção + validação de 7 dias.",[70,21620,21621,21624],{},[27,21622,21623],{},"Semanas 4 a 6",": migração dos demais apps em paralelo, ritmo de 1 a 2 por semana.",[70,21626,21627,21629],{},[27,21628,16926],{},": 4 a 6 semanas de elapsed time, talvez 80 horas de trabalho efetivo distribuídas.",[12,21631,21632],{},"Time médio (3 devs, 20 apps): 8 semanas, 200 horas de trabalho efetivo.",[12,21634,21635],{},"Time grande (cluster de 50+ apps): trate como projeto formal, com gerente de projeto, e calcule trimestre.",[12,21637,21638],{},"A regra de bolso: nunca migre mais de 2 apps em paralelo se for o mesmo dev fazendo. O custo de contexto-switching engole o ganho de paralelismo.",[19,21640,3226],{"id":3225},[12,21642,21643,21646],{},[27,21644,21645],{},"Quanto custa a migração em horas-homem?","\nPra um SaaS de 5 apps, dev part-time: ~80 horas. A R$200\u002Fh, R$16k. Comparado a R$2k\u002Fmês de fatura Heroku que você economiza, payback em 8 meses. Nos 4 anos seguintes, é só economia.",[12,21648,21649,21652],{},[27,21650,21651],{},"E se eu não tiver Docker setup?","\nNão precisa pré-instalar nada — as plataformas de destino constroem a imagem por você (Render, Railway, Fly.io aceitam Dockerfile direto do git). HeroCtl exige imagem em registry, então você sobe pra ECR, GCR, Docker Hub ou GHCR. Pra uso local, instala Docker Desktop e tá pronto.",[12,21654,21655,21658,21659,21661,21662,21664,21665,21668],{},[27,21656,21657],{},"Heroku Postgres tem export limit?","\nTem limite de IOPS durante ",[231,21660,5737],{}," em planos baixos. Bancos acima de 5GB em plano Hobby podem precisar ",[231,21663,5737],{}," em modo paralelo (",[231,21666,21667],{},"-j",") ou usar logical replication pra evitar carga grande. Pra Standard ou superior, sem problema relevante.",[12,21670,21671,21674],{},[27,21672,21673],{},"Sidekiq scheduled jobs sobrevivem?","\nSobrevivem se você migrar o Redis com snapshot (BGSAVE → restore). Se reiniciar Redis do zero no destino, perde scheduled jobs. Considera isso no cutover: ou faz a transferência de Redis junto, ou aceita reagendar manualmente alguns jobs.",[12,21676,21677,21680],{},[27,21678,21679],{},"Posso testar com 1 app antes?","\nEsse é o caminho recomendado. Pega o app menos crítico (interno, ou de baixíssimo tráfego), faz a migração inteira nele primeiro. Aprende com os tropeços ali. Depois migra os de produção com confiança. A primeira migração ensina mais que ler 10 posts como esse.",[12,21682,21683,21686],{},[27,21684,21685],{},"E se a migração falhar?","\nOs 30 dias de Heroku rodando em paralelo são a sua rede. Se o destino quebrar de forma irreversível na primeira hora, volta o DNS pro Heroku, leva 60 segundos, vida normal. O único caso onde rollback é caro é se você fez cutover de banco com escritas no destino — aí precisa replicar de volta. Por isso a recomendação é cutover de DNS e cutover de banco simultâneos, com janela curta.",[12,21688,21689,21692,21693,21696,21697,21699],{},[27,21690,21691],{},"Tem caminho de migração assistida do HeroCtl?","\nPra o HeroCtl, sim — temos um conversor experimental que lê ",[231,21694,21695],{},"app.json"," + ",[231,21698,20970],{}," e gera um manifesto de job equivalente. Funciona pra apps simples (web + worker + release), e tropeça em casos exóticos (multi-buildpack pesado, hooks customizados). Se quiser testar, manda mensagem.",[19,21701,3310],{"id":3309},[12,21703,21704],{},"Migrar do Heroku quatro anos depois é constrangedor — tinha que ter saído em 2022. Mas quatro anos virando cinco é pior. O custo composto de não migrar (R$25k a R$100k por ano em fatura Heroku acumulada, mais a fragilidade de depender de um produto que a Salesforce já mostrou que não tem afeto por usuários pequenos) é maior que o custo de uma semana de trabalho focado.",[12,21706,21707],{},"Se você decidir testar o HeroCtl, instala em qualquer servidor Linux:",[224,21709,21710],{"className":226,"code":2949,"language":228,"meta":229,"style":229},[231,21711,21712],{"__ignoreMap":229},[234,21713,21714,21716,21718,21720,21722],{"class":236,"line":237},[234,21715,1220],{"class":247},[234,21717,2958],{"class":251},[234,21719,2961],{"class":255},[234,21721,2964],{"class":383},[234,21723,2967],{"class":247},[12,21725,21726],{},"Funciona em 1 servidor (modo simples) ou em 3+ (modo HA real). O plano Community é gratuito sem limite de servidores e sem limite de jobs — você não precisa decidir nada comercial pra fazer a migração inteira.",[12,21728,21729],{},"Se decidir pelo Render, Railway ou Coolify, ótimo também. O ponto desse post não é capturar você como cliente — é tirar você do Heroku. Quatro anos depois, é hora.",[12,21731,21732,21733,21736,21737,101],{},"Pra contexto adicional sobre auto-hospedagem em 2026, lê ",[3337,21734,21735],{"href":19766},"Heroku auto-hospedado: o estado da arte em 2026",". Pra entender por que construímos um orquestrador novo em vez de adotar um existente, lê ",[3337,21738,21739],{"href":6547},"Por que criamos o HeroCtl",[3351,21741,21742],{},"html pre.shiki code .sQhOw, html code.shiki .sQhOw{--shiki-default:#FFA657}html pre.shiki code .s9uIt, html code.shiki .s9uIt{--shiki-default:#A5D6FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .sFSAA, html code.shiki .sFSAA{--shiki-default:#79C0FF}html pre.shiki code .suJrU, html code.shiki .suJrU{--shiki-default:#FF7B72}html pre.shiki code .sZEs4, html code.shiki .sZEs4{--shiki-default:#E6EDF3}html pre.shiki code .sH3jZ, html code.shiki .sH3jZ{--shiki-default:#8B949E}",{"title":229,"searchDepth":244,"depth":244,"links":21744},[21745,21746,21747,21748,21749,21750,21751,21752,21753,21754,21755],{"id":20416,"depth":244,"text":20417},{"id":20486,"depth":244,"text":20487},{"id":20706,"depth":244,"text":20707},{"id":20743,"depth":244,"text":20744},{"id":21074,"depth":244,"text":21075},{"id":21318,"depth":244,"text":21319},{"id":21426,"depth":244,"text":21427},{"id":21496,"depth":244,"text":21497},{"id":21594,"depth":244,"text":21595},{"id":3225,"depth":244,"text":3226},{"id":3309,"depth":244,"text":3310},"2026-03-11","O fim do plano gratuito do Heroku em novembro\u002F2022 transformou migração em prioridade pra centenas de times brasileiros. Plano detalhado com checklist, tempo estimado, e armadilhas comuns.",{},"\u002Fblog\u002Fmigrar-do-heroku-guia-tecnico",{"title":20405,"description":21757},{"loc":21759},"blog\u002Fmigrar-do-heroku-guia-tecnico",[20505,6394,6397,3393,6396],"F-DwMAVr8fAgCzUJD2TUGJ1fPKk1DrRptr3FLmwPkio",{"id":21766,"title":21767,"author":7,"body":21768,"category":8764,"cover":3380,"date":22475,"description":22476,"draft":3383,"extension":3384,"lastReviewed":3380,"meta":22477,"navigation":411,"path":6334,"readingTime":3387,"seo":22478,"sitemap":22479,"stem":22480,"tags":22481,"__hash__":22485},"blog_pt\u002Fblog\u002Faws-ecs-vs-kubernetes-vs-auto-hospedado.md","AWS ECS vs Kubernetes vs auto-hospedado: três caminhos pra rodar containers em 2026",{"type":9,"value":21769,"toc":22460},[21770,21773,21776,21779,21783,21786,21789,21814,21817,21820,21824,21827,21830,21836,21842,21848,21854,21860,21863,21867,21870,21884,21888,21891,21894,21908,21912,21918,21944,21948,21951,21968,21972,21975,21978,21995,21998,22002,22005,22031,22035,22038,22221,22224,22228,22231,22237,22243,22249,22255,22261,22265,22268,22337,22340,22361,22364,22367,22371,22377,22383,22389,22395,22401,22407,22413,22415,22418,22421,22424,22427,22443,22446,22455,22458],[12,21771,21772],{},"A AWS hoje vende, no mínimo, quatro produtos diferentes pra rodar contêiner em produção: ECS (com EC2 ou com Fargate), EKS, App Runner e Lightsail Containers. Não é redundância de catálogo nem confusão interna — é resposta direta ao mercado. Cada um cobre uma fatia distinta de quem está chegando na AWS com a mesma pergunta básica: como subir um contêiner, manter ele vivo, expor pra internet, atualizar sem cair, e dormir tranquilo.",[12,21774,21775],{},"ECS é a aposta da AWS pra quem não quer Kubernetes. Não é \"Kubernetes mais simples\", é uma alternativa proprietária ao Kubernetes, escrita pelos engenheiros da Amazon antes do K8s virar consenso. EKS é Kubernetes gerenciado, mesmo da prateleira que GKE e AKS. Auto-hospedado é a saída do AWS inteiro — você roda em qualquer servidor Linux, paga só o servidor, e leva os seus contêineres com você se o provedor mudar de humor.",[12,21777,21778],{},"Os três caminhos resolvem o mesmo problema com tradeoffs muito diferentes. Este post coloca lado a lado o que cada um cobra, o que cada um amarra, e em que contexto cada um faz sentido — sem fingir que existe um vencedor uniforme.",[19,21780,21782],{"id":21781},"aws-ecs-o-que-e-exatamente","AWS ECS: o que é exatamente",[12,21784,21785],{},"ECS é o orquestrador proprietário da Amazon. Não é open-source, não roda fora da AWS, não tem implementação alternativa. Foi anunciado em 2014, antes do Kubernetes ganhar tração, e desde então a AWS investe nele como a porta de entrada \"AWS-nativa, sem K8s\" pro mundo de contêineres.",[12,21787,21788],{},"O modelo conceitual é próprio:",[2735,21790,21791,21797,21803,21808],{},[70,21792,21793,21796],{},[27,21794,21795],{},"Task definition"," ao invés de Pod. É um arquivo JSON descrevendo o contêiner, recursos, portas, variáveis de ambiente, IAM role.",[70,21798,21799,21802],{},[27,21800,21801],{},"Service"," ao invés de Deployment. Mantém N tasks rodando, faz health check, integra com Application Load Balancer.",[70,21804,21805,21807],{},[27,21806,6875],{}," é só um agrupamento lógico — sem plano de controle pago. O control plane é gratuito (a AWS gerencia internamente, você não vê nem mantém).",[70,21809,21810,21813],{},[27,21811,21812],{},"Capacity provider"," define onde as tasks rodam: EC2 (você gerencia instâncias) ou Fargate (serverless por vCPU\u002FRAM\u002Fsegundo).",[12,21815,21816],{},"A integração com o resto da AWS é o ponto forte real. Task pega IAM role direto, sem sidecar de auth. Logs vão pra CloudWatch sem agente. Imagens vêm de ECR sem configurar pull secret. ALB roteia tráfego pras tasks com service discovery automático. Tudo isso com console gráfico decente, CLI estável, e SDK em todas as linguagens.",[12,21818,21819],{},"Comparado ao K8s, ECS é deliberadamente simples. Não tem CRDs, não tem operators, não tem Helm charts, não tem sidecar pattern formalizado, não tem controle de admissão. Você tem task, service, cluster — e acabou. Pra um time já mergulhado em AWS, essa simplicidade é o argumento.",[19,21821,21823],{"id":21822},"aws-ecs-onde-doi","AWS ECS: onde dói",[12,21825,21826],{},"O lock-in é absoluto, e vale a pena nomear isso primeiro. Task definition não roda fora da AWS. ECR não é registry portável (você até consegue puxar, mas a IAM amarra de volta). ALB é AWS-only. Service discovery via Cloud Map é AWS-only. CloudWatch é AWS-only. Você não está adotando \"uma forma de rodar contêineres\" — está adotando uma stack inteira que só existe lá dentro. Migrar pra fora exige reescrever cada peça.",[12,21828,21829],{},"O custo aparece em camadas que ninguém soma na primeira avaliação:",[12,21831,21832,21835],{},[27,21833,21834],{},"Fargate",": US$0.04 por vCPU-hora + US$0.0044 por GB-hora. Uma app modesta com 0.5 vCPU + 1 GB, rodando 24×7, custa US$25\u002Fmês — R$125 ao câmbio de R$5\u002FUSD. Parece pouco até você lembrar que cada microserviço é uma task, e que o produção típico tem 8 a 15 microserviços + tasks de fila + cron jobs. Cinco aplicações pequenas viram tranquilo R$600 só de Fargate.",[12,21837,21838,21841],{},[27,21839,21840],{},"CloudWatch Logs",": US$0.50 por GB ingerido + US$0.03 por GB armazenado por mês. Uma app que loga 5 GB\u002Fmês deixa US$2.65 — R$13. Multiplicado por dez serviços, R$130\u002Fmês só de log. E é a opção \"barata\" — se você ligar Insights pra fazer queries sérias, dobra.",[12,21843,21844,21847],{},[27,21845,21846],{},"Egress",": US$0.09 por GB depois dos primeiros 100 GB grátis — R$0.45\u002FGB. Uma app servindo 500 GB de tráfego de saída por mês paga R$180. Streaming de vídeo, downloads de imagem, API pública pesada: o egress vira o item maior da fatura, frequentemente passando do compute.",[12,21849,21850,21853],{},[27,21851,21852],{},"Rede",": VPC é gratuita, mas NAT Gateway custa US$0.045\u002Fhora — US$32\u002Fmês fixo, R$160 — só pra existir, mais US$0.045 por GB processado. Você precisa de NAT pra qualquer task em subnet privada que chame internet (atualizar pacote, falar com API externa, mandar e-mail via SES). Em produção com alta disponibilidade, a recomendação é NAT em duas zonas — dois NAT Gateways, R$320\u002Fmês baseline antes de qualquer tráfego.",[12,21855,21856,21859],{},[27,21857,21858],{},"Application Load Balancer",": US$0.0225\u002Fhora (US$16\u002Fmês fixo) + US$0.008 por LCU-hora. Para uma app com tráfego moderado, US$25\u002Fmês é realista — R$125.",[12,21861,21862],{},"Soma realista pra uma operação pequena com cinco apps em Fargate, ALB compartilhado, NAT em uma zona só, logs moderados: R$1.000 a R$1.500\u002Fmês. Cresce linear com o número de tasks. Não é caro pelos padrões enterprise, mas é múltiplas vezes o custo equivalente em VPS dedicado.",[19,21864,21866],{"id":21865},"aws-ecs-quem-usa-e-ama-com-razao","AWS ECS: quem usa e ama com razão",[12,21868,21869],{},"Existe um perfil claro pra quem ECS é a resposta certa, e a gente recomenda sem reservas pra esses casos:",[2735,21871,21872,21875,21878,21881],{},[70,21873,21874],{},"Empresa que já é 100% AWS, com time treinado no console e nas IAM policies. Adicionar ECS é incremental — não requer aprender ferramenta nova fora da bolha.",[70,21876,21877],{},"Workloads de burst, scheduled jobs, ETLs noturnos. Fargate brilha quando você quer 50 tasks rodando por 12 minutos por dia e zero o resto do tempo. Pagar por segundo é honesto.",[70,21879,21880],{},"Compliance que exige AWS específica (FedRAMP High, contratos federais americanos, certas configurações HIPAA com BAA AWS). Quando a auditoria pede AWS, ECS te entrega o caminho mais curto sem instalar K8s em cima.",[70,21882,21883],{},"Time que prioriza zero-ops sobre custo e portabilidade. Se você não tem ninguém pra manter uma instância EC2, Fargate é genuinamente menos trabalho — você nunca vê uma máquina, nunca patcheia kernel, nunca aparece pra falar de saturação de disco.",[19,21885,21887],{"id":21886},"kubernetes-o-que-e-exatamente","Kubernetes: o que é exatamente",[12,21889,21890],{},"A audiência conhece K8s, então o resumo aqui é curto. Padrão de fato pra orquestração desde por volta de 2018, com ecossistema CNCF gigante (cert-manager, ingress controllers, operators pra praticamente qualquer banco). API consistente entre clouds, o que torna multi-cloud genuinamente viável (caro, mas viável). Curva de aprendizado bem documentada — 300+ linhas de manifesto pra colocar um hello world com TLS no ar.",[12,21892,21893],{},"Modelos de operação:",[2735,21895,21896,21902],{},[70,21897,21898,21901],{},[27,21899,21900],{},"Gerenciado"," (EKS, GKE, AKS): provedor mantém o plano de controle. Cobra cerca de US$73\u002Fmês por cluster nas três grandes — R$365. Mais NAT, ALB, observabilidade, registry. Time típico mínimo: 2 SREs.",[70,21903,21904,21907],{},[27,21905,21906],{},"Self-managed"," com k3s, kubeadm, kops, Rancher: você instala em VMs ou bare metal. Sem custo de plano de controle, mas você vira o time de plataforma. Time mínimo: 1 SRE muito bom ou 2 medianos.",[19,21909,21911],{"id":21910},"kubernetes-onde-doi","Kubernetes: onde dói",[12,21913,21914,21915,21917],{},"Já cobrimos a fundo em ",[3337,21916,15790],{"href":15789},". Resumo direto:",[2735,21919,21920,21926,21932,21938],{},[70,21921,21922,21925],{},[27,21923,21924],{},"Custo operacional",": 1 a 2 SREs dedicados, R$30-40k\u002Fmês cada em CLT no Brasil. Esse é o item maior da conta — multiplique por doze meses e o cluster passou da casa de R$500k\u002Fano só em pessoas.",[70,21927,21928,21931],{},[27,21929,21930],{},"Curva",": 6+ meses pra um time produtivo de fato (não \"entrega manifesto\", e sim \"debuga problema às três da manhã sem destruir produção\").",[70,21933,21934,21937],{},[27,21935,21936],{},"Stack ao redor",": cert-manager, ingress controller, operador de métricas, agente de logs, malha de serviços se houver — cada um com versão própria, política de atualização própria, modelo de falha próprio.",[70,21939,21940,21943],{},[27,21941,21942],{},"Manifestos longos",": \"hello world\" com namespace + deployment + service + ingress + cert + RBAC fica em 300 linhas. Helm reduz duplicação mas adiciona uma camada conceitual.",[19,21945,21947],{"id":21946},"kubernetes-quem-usa-e-justifica","Kubernetes: quem usa e justifica",[12,21949,21950],{},"Os perfis em que K8s é a escolha óbvia, sem ironia:",[2735,21952,21953,21956,21959,21962,21965],{},[70,21954,21955],{},"Empresa Series B+ com time de plataforma de 3 ou mais pessoas dedicadas. A escala humana sustenta a complexidade.",[70,21957,21958],{},"Multi-cloud ou neutralidade de fornecedor como requisito real (não como aspiração de slide). Você efetivamente vai rodar em duas clouds, e K8s é a única abstração madura que cobre as duas.",[70,21960,21961],{},"Workloads que dependem de operadores específicos maduros: operador de Postgres com replicação, operador de Kafka com balanceamento, operador de Cassandra com bootstrap. Reescrever isso \"no braço\" custa mais do que o cluster.",[70,21963,21964],{},"Compliance nominal — alguns frameworks listam Kubernetes pelo nome em controles. Se o seu auditor precisa apontar pra um certificado SOC2 que diz \"Kubernetes 1.28\", a ferramenta tem que se chamar Kubernetes.",[70,21966,21967],{},"Operação acima de 50 servidores em produção sustentada. Nesse tamanho, o ecossistema CNCF te dá ferramentas que você teria que construir do zero em alternativas menores.",[19,21969,21971],{"id":21970},"auto-hospedado-moderno","Auto-hospedado moderno",[12,21973,21974],{},"A terceira opção é o que mudou nos últimos dois anos. Auto-hospedado deixou de ser \"Docker Compose num servidor com sorte\" e virou uma categoria com produtos sérios — HeroCtl é um deles, mas Coolify, Dokploy, Caprover e outros também ocupam o espaço.",[12,21976,21977],{},"A proposta comum:",[2735,21979,21980,21983,21986,21989,21992],{},[70,21981,21982],{},"Um binário (ou imagem Docker simples) instalado em N servidores Linux com Docker.",[70,21984,21985],{},"Plano de controle replicado, com eleição automática de coordenador. Você perde um servidor, o cluster continua.",[70,21987,21988],{},"Roteador embutido, certificados Let's Encrypt automáticos.",[70,21990,21991],{},"Sem dependência de provedor cloud — roda em qualquer VPS, qualquer bare metal, qualquer mistura.",[70,21993,21994],{},"Modelo comercial honesto: Community gratuito permanente sem feature gate artificial, Business pago publicado pra quem precisa de SSO\u002Fauditoria\u002FSLA, Enterprise pra contratos com escrow e suporte 24×7.",[12,21996,21997],{},"O custo se reduz a duas linhas: as VPS e o tempo do dev part-time que cuida disso. Três droplets de US$24\u002Fmês cada na DigitalOcean — R$360\u002Fmês — sustentam uma operação que em ECS ficaria entre R$1.500 e R$3.000.",[19,21999,22001],{"id":22000},"auto-hospedado-onde-doi","Auto-hospedado: onde dói",[12,22003,22004],{},"Honestidade vale mais que folheto. Onde auto-hospedado não é a resposta:",[2735,22006,22007,22013,22019,22025],{},[70,22008,22009,22012],{},[27,22010,22011],{},"Você é responsável por tudo",". Sem suporte AWS pra ligar quando der ruim. Comunidade ativa ajuda, e o suporte pago Business existe — mas a primeira linha de defesa é você ler o log.",[70,22014,22015,22018],{},[27,22016,22017],{},"Faixa de escala saudável: 1 a 500 servidores",". Acima disso, ferramental específico de Kubernetes ainda ganha. Não é defeito do produto — é onde a CNCF gastou dez anos polindo coisas que ninguém mais tem.",[70,22020,22021,22024],{},[27,22022,22023],{},"Compliance enterprise específico",". Se o seu auditor precisa que o orquestrador apareça em uma lista pré-aprovada de fornecedores, e essa lista lista AWS\u002FAzure\u002FGCP\u002FK8s, auto-hospedado novo te exclui por padrão.",[70,22026,22027,22030],{},[27,22028,22029],{},"Integrações nativas AWS",": Cognito como auth, S3 com IAM direto na task, RDS com IAM auth — tudo isso dá pra adaptar, mas a adaptação é trabalho extra. Em ECS funciona sem pensar.",[19,22032,22034],{"id":22033},"lado-a-lado-doze-criterios-sem-ressalva","Lado a lado: doze critérios sem ressalva",[12,22036,22037],{},"A tabela abaixo é a versão honesta da decisão. Câmbio R$5\u002FUSD usado em todas as estimativas em reais.",[119,22039,22040,22055],{},[122,22041,22042],{},[125,22043,22044,22046,22049,22052],{},[128,22045,2983],{},[128,22047,22048],{},"AWS ECS (Fargate)",[128,22050,22051],{},"Kubernetes (EKS)",[128,22053,22054],{},"Auto-hospedado",[141,22056,22057,22071,22085,22099,22112,22125,22139,22152,22165,22179,22193,22207],{},[125,22058,22059,22062,22065,22068],{},[146,22060,22061],{},"Custo mínimo R$\u002Fmês — 5 apps pequenas",[146,22063,22064],{},"R$1.000-1.500",[146,22066,22067],{},"R$1.500-2.500 + time SRE",[146,22069,22070],{},"R$300-500 + dev part-time",[125,22072,22073,22076,22079,22082],{},[146,22074,22075],{},"Custo previsível mês a mês",[146,22077,22078],{},"Não — egress + log variam",[146,22080,22081],{},"Não — soma de muitas linhas",[146,22083,22084],{},"Sim — VPS é fixa",[125,22086,22087,22090,22093,22096],{},[146,22088,22089],{},"Lock-in (0-10)",[146,22091,22092],{},"10 — task def é AWS-only",[146,22094,22095],{},"4 — manifestos portáveis com ressalvas",[146,22097,22098],{},"1 — VPS Linux qualquer",[125,22100,22101,22103,22106,22109],{},[146,22102,16319],{},[146,22104,22105],{},"2-4 horas (com IAM bem)",[146,22107,22108],{},"1-3 dias",[146,22110,22111],{},"15-30 minutos",[125,22113,22114,22116,22119,22122],{},[146,22115,3152],{},[146,22117,22118],{},"Média (conceitos próprios + AWS)",[146,22120,22121],{},"Alta (6+ meses pra produtividade real)",[146,22123,22124],{},"Baixa (modelo Heroku)",[125,22126,22127,22130,22133,22136],{},[146,22128,22129],{},"Ecossistema de operadores",[146,22131,22132],{},"Restrito ao catálogo AWS",[146,22134,22135],{},"Centenas, maduros",[146,22137,22138],{},"Limitado, em crescimento",[125,22140,22141,22143,22146,22149],{},[146,22142,7106],{},[146,22144,22145],{},"Nativo (AWS regions)",[146,22147,22148],{},"Nativo via federação",[146,22150,22151],{},"Manual, com cuidado",[125,22153,22154,22157,22160,22162],{},[146,22155,22156],{},"Suporte 24\u002F7",[146,22158,22159],{},"Pago à parte (Business+)",[146,22161,22159],{},[146,22163,22164],{},"Pago Enterprise",[125,22166,22167,22170,22173,22176],{},[146,22168,22169],{},"Compliance enterprise nominal",[146,22171,22172],{},"Forte (FedRAMP, HIPAA)",[146,22174,22175],{},"Forte (listado nominalmente)",[146,22177,22178],{},"Em construção",[125,22180,22181,22184,22187,22190],{},[146,22182,22183],{},"Faixa ideal de escala",[146,22185,22186],{},"1-200 tasks",[146,22188,22189],{},"50-100.000 servidores",[146,22191,22192],{},"1-500 servidores",[125,22194,22195,22198,22201,22204],{},[146,22196,22197],{},"Time mínimo",[146,22199,22200],{},"1 dev + um leitor de docs AWS",[146,22202,22203],{},"2 SREs",[146,22205,22206],{},"1 dev part-time",[125,22208,22209,22212,22215,22218],{},[146,22210,22211],{},"Migration pain (sair)",[146,22213,22214],{},"Alto — reescrever stack",[146,22216,22217],{},"Baixo — manifestos são portáveis",[146,22219,22220],{},"Mínimo — Docker é Docker",[12,22222,22223],{},"A coluna que importa varia por contexto, e é exatamente esse o ponto: não existe vencedor uniforme.",[19,22225,22227],{"id":22226},"decisao-por-contexto","Decisão por contexto",[12,22229,22230],{},"Tradução prática das tabelas em recomendação direta. Se o seu cenário cai num desses cinco, a resposta é a indicada — sem floreio.",[12,22232,22233,22236],{},[27,22234,22235],{},"\"Já estamos em AWS, time pequeno, contratos exigem AWS.\"","\nECS Fargate. O lock-in já é fato consumado, e Fargate elimina o trabalho de gerenciar instância. Você troca custo previsível por zero-ops, que é o tradeoff certo quando o time tem poucos braços e não pode parar pra patchear kernel.",[12,22238,22239,22242],{},[27,22240,22241],{},"\"Multi-cloud strategy ou compliance exige neutralidade entre fornecedores.\"","\nKubernetes. Se o time é forte, k3s self-managed em VMs reduz drasticamente o custo do plano de controle. Se o time é mediano, EKS gerenciado em uma cloud principal e equivalente na outra. Não pague o custo do K8s sem o requisito real — o requisito real existe e a ferramenta cabe.",[12,22244,22245,22248],{},[27,22246,22247],{},"\"Startup early stage, custos doem, time não é especialista AWS.\"","\nAuto-hospedado. HeroCtl, Coolify, Dokploy — o segmento amadureceu. Three droplets, um dev part-time, R$400\u002Fmês de infra, e você fica com a operação inteira sob controle. Quando o produto ganhar tração e a empresa ficar grande, dá pra reavaliar — mas chegar até lá custando R$400\u002Fmês é a diferença entre fechar runway e não fechar.",[12,22250,22251,22254],{},[27,22252,22253],{},"\"Big enterprise, compliance lista K8s nominalmente, time de plataforma com 5+ pessoas.\"","\nEKS gerenciado. O custo do plano de controle desaparece no orçamento, o time absorve a complexidade, e a auditoria fica satisfeita. Esse é o caso canônico de K8s — não tente economizar aqui.",[12,22256,22257,22260],{},[27,22258,22259],{},"\"Solo dev experimentando, side project, MVP.\"","\nRender ou Railway na nuvem hospedada (paga só o que usa, zero ops), ou Coolify em um VPS de US$5. Não monte cluster pra um projeto que pode morrer em três meses. Quando passar de US$1k MRR e ficar claro que vai sobreviver, migra pra HeroCtl ou Dokploy num cluster de três VPS.",[19,22262,22264],{"id":22263},"migrar-de-ecs-pro-auto-hospedado-caminho-pratico","Migrar de ECS pro auto-hospedado: caminho prático",[12,22266,22267],{},"Pra quem já está em ECS e quer reduzir conta, o mapeamento conceitual é mais simples do que parece. Os primitivos batem quase um-pra-um:",[119,22269,22270,22279],{},[122,22271,22272],{},[125,22273,22274,22277],{},[128,22275,22276],{},"ECS",[128,22278,2995],{},[141,22280,22281,22288,22295,22301,22308,22315,22322,22329],{},[125,22282,22283,22285],{},[146,22284,21795],{},[146,22286,22287],{},"Job spec",[125,22289,22290,22292],{},[146,22291,21801],{},[146,22293,22294],{},"Group dentro do job",[125,22296,22297,22299],{},[146,22298,6875],{},[146,22300,6875],{},[125,22302,22303,22305],{},[146,22304,21834],{},[146,22306,22307],{},"Servidor dedicado (VPS ou bare metal)",[125,22309,22310,22312],{},[146,22311,5602],{},[146,22313,22314],{},"Roteador integrado, com TLS automático",[125,22316,22317,22319],{},[146,22318,21840],{},[146,22320,22321],{},"Escritor único embutido",[125,22323,22324,22327],{},[146,22325,22326],{},"IAM role da task",[146,22328,5679],{},[125,22330,22331,22334],{},[146,22332,22333],{},"ECR",[146,22335,22336],{},"ECR continua funcionando, ou registry interno",[12,22338,22339],{},"Caminho prático pra uma app simples:",[67,22341,22342,22349,22352,22355,22358],{},[70,22343,22344,22345,22348],{},"Suba três VPS Linux com Docker. Instale o orquestrador num dos três (",[231,22346,22347],{},"curl -sSL get.heroctl.com\u002Finstall.sh | sh","). Os outros dois entram como agentes — comando único pra cada.",[70,22350,22351],{},"Pega a task definition em JSON. Mapeia: contêiner, recursos, portas, variáveis de ambiente, secrets. Vira um arquivo de configuração de ~50 linhas.",[70,22353,22354],{},"Submete via CLI. O cluster decide onde rodar, abre porta, registra no roteador, emite certificado Let's Encrypt, começa a servir.",[70,22356,22357],{},"Aponta o DNS do domínio pro IP do servidor coordenador (ou pra um Load Balancer DNS-based se tiver mais de uma região).",[70,22359,22360],{},"Testa em staging por uma semana. Se ok, repete pra produção e descomissiona ECS.",[12,22362,22363],{},"Tempo médio por app simples: 1 a 3 horas, incluindo o teste. Apps com dependência forte de IAM\u002FCognito\u002FSQS levam mais — você precisa adaptar a chamada AWS pra ir via SDK + chave (em vez de IAM role implícito). Apps stateless de HTTP são quase mecânicas.",[12,22365,22366],{},"Economia anual típica em scale-up modesto (15 microserviços, 1 ALB, NAT em uma zona, logs moderados): R$50.000 a R$150.000 que saem da fatura AWS e viram salário ou marketing. O componente humano também muda — você deixa de precisar de um especialista AWS dedicado.",[19,22368,22370],{"id":22369},"perguntas-que-aparecem","Perguntas que aparecem",[12,22372,22373,22376],{},[27,22374,22375],{},"Posso usar ECS Fargate sem ALB pra economizar?","\nTecnicamente sim, expondo a task com IP público — mas você perde TLS automático, balanceamento de carga, health check em camada 7, e service discovery. Pra produção real isso não é uma economia, é dívida. Vale só pra workloads internos sem ingress (jobs de fila, ETLs).",[12,22378,22379,22382],{},[27,22380,22381],{},"EKS Anywhere é viável fora da AWS?","\nExiste e funciona, mas o custo de licença é caro e a integração com o ecossistema AWS é parcial — você ganha o nome \"EKS\" sem ganhar a integração nativa. Pra rodar K8s fora da AWS, k3s ou kubeadm têm melhor relação custo\u002Fbenefício na prática.",[12,22384,22385,22388],{},[27,22386,22387],{},"Migrar de ECS pra auto-hospedado, quanto leva no realista?","\nApps simples: 1-3 horas cada. Operação inteira com 10-15 serviços: 2 a 4 semanas se você for fazer cuidado, com testes em staging. O gargalo costuma ser as dependências de serviços AWS-específicos (SQS, SNS, Cognito), não o orquestrador em si.",[12,22390,22391,22394],{},[27,22392,22393],{},"Manter os dois (ECS + auto-hospedado em paralelo) faz sentido?","\nFaz, durante a migração e às vezes permanente. Workloads que dependem fortemente de IAM nativo (acesso direto a S3 sem chaves, por exemplo) podem ficar em ECS. O resto vai pro cluster auto-hospedado. Roteamento por DNS resolve a divisão de tráfego.",[12,22396,22397,22400],{},[27,22398,22399],{},"Compliance que exige AWS, posso usar HeroCtl em EC2?","\nPode. HeroCtl roda em qualquer VPS Linux com Docker — incluindo instâncias EC2. Você perde a vantagem de portabilidade total, mas mantém o modelo operacional simples e o custo previsível. É uma boa opção pra times que precisam ficar dentro da AWS por contrato mas querem fugir da complexidade nativa.",[12,22402,22403,22406],{},[27,22404,22405],{},"ECS App Runner é alternativa boa?","\nApp Runner é a oferta da AWS pra \"Heroku em cima de ECS\". Funciona pra apps muito simples (uma imagem, uma porta, build automático do Git). Cobra mais que Fargate equivalente e tem menos controle. Pra MVP de fim de semana, é razoável. Pra produção séria, ECS direto com Fargate dá mais flexibilidade pelo mesmo dinheiro.",[12,22408,22409,22412],{},[27,22410,22411],{},"GKE Autopilot vs Fargate vs HeroCtl?","\nGKE Autopilot e Fargate ocupam o mesmo nicho conceitual: serverless por pod\u002Ftask, você não vê o nó. GKE Autopilot é geralmente mais barato pra workloads estáveis, e mais caro pra burst. Ambos têm lock-in forte. HeroCtl ataca o problema por outro lado — você vê o servidor de propósito, paga ele inteiro, e o orquestrador distribui as cargas. Pra workload estável de longa duração, sai mais barato. Pra workload de burst extremo, serverless ganha.",[19,22414,3310],{"id":3309},[12,22416,22417],{},"Não existe um caminho que ganhe nos doze critérios da tabela. ECS ganha em integração AWS, perde em portabilidade. Kubernetes ganha em ecossistema, perde em simplicidade. Auto-hospedado ganha em custo e clareza, perde em ferramental específico de escala extrema.",[12,22419,22420],{},"A escolha certa depende do seu time, do seu compliance, dos seus contratos, e do estágio da empresa. A escolha errada é não fazer a conta — adotar ECS porque \"é o padrão AWS\" sem somar Fargate + ALB + NAT + CloudWatch + egress; adotar Kubernetes porque \"é o que tá na moda\" sem ter os 2 SREs; ou ficar em auto-hospedado caseiro frágil quando a operação já passou de 50 servidores e o ecossistema CNCF passou a justificar.",[12,22422,22423],{},"Se você está revendo a stack de orquestração de contêineres em 2026, a recomendação prática é simples: meça o custo real dos doze meses anteriores, identifique em qual dos cinco perfis o seu time se encaixa, e decida. Se o perfil é \"startup early, time pequeno, custo dói\", o caminho de menor risco é experimentar auto-hospedado em paralelo durante um mês, antes de migrar.",[12,22425,22426],{},"Pra começar:",[224,22428,22429],{"className":226,"code":5319,"language":228,"meta":229,"style":229},[231,22430,22431],{"__ignoreMap":229},[234,22432,22433,22435,22437,22439,22441],{"class":236,"line":237},[234,22434,1220],{"class":247},[234,22436,2958],{"class":251},[234,22438,5330],{"class":255},[234,22440,2964],{"class":383},[234,22442,2967],{"class":247},[12,22444,22445],{},"Três VPS Linux, dez minutos por servidor, e você tem cluster com plano de controle replicado, roteador integrado, certificados automáticos. A partir daí, é uma questão de mover serviço por serviço da fatura AWS pro cluster próprio.",[12,22447,22448,22449,22451,22452,22454],{},"Leituras relacionadas: ",[3337,22450,15790],{"href":15789}," explica em mais detalhe quando o colosso não cabe; ",[3337,22453,20365],{"href":5344}," compara as duas alternativas leves dentro da categoria auto-hospedado.",[12,22456,22457],{},"Orquestração de contêineres é uma decisão de longo prazo. Faça pela conta certa, não pela inércia.",[3351,22459,4376],{},{"title":229,"searchDepth":244,"depth":244,"links":22461},[22462,22463,22464,22465,22466,22467,22468,22469,22470,22471,22472,22473,22474],{"id":21781,"depth":244,"text":21782},{"id":21822,"depth":244,"text":21823},{"id":21865,"depth":244,"text":21866},{"id":21886,"depth":244,"text":21887},{"id":21910,"depth":244,"text":21911},{"id":21946,"depth":244,"text":21947},{"id":21970,"depth":244,"text":21971},{"id":22000,"depth":244,"text":22001},{"id":22033,"depth":244,"text":22034},{"id":22226,"depth":244,"text":22227},{"id":22263,"depth":244,"text":22264},{"id":22369,"depth":244,"text":22370},{"id":3309,"depth":244,"text":3310},"2026-03-04","ECS é a oferta da AWS pra fugir de Kubernetes. Kubernetes é Kubernetes. Auto-hospedado é o caminho de saída do AWS. Cada um faz sentido em contextos específicos — sem trade-off uniforme.",{},{"title":21767,"description":22476},{"loc":6334},"blog\u002Faws-ecs-vs-kubernetes-vs-auto-hospedado",[6393,22482,20399,22483,8764,22484],"ecs","fargate","auto-hospedado","YVTtwfno7Gy285X7Hwvle3OAdzecREtE8nFfd0IQQyg",{"id":22487,"title":22488,"author":7,"body":22489,"category":8764,"cover":3380,"date":23029,"description":23030,"draft":3383,"extension":3384,"lastReviewed":3380,"meta":23031,"navigation":411,"path":5344,"readingTime":8769,"seo":23032,"sitemap":23033,"stem":23034,"tags":23035,"__hash__":23038},"blog_pt\u002Fblog\u002Fk3s-vs-heroctl-quando-cada-um-faz-sentido.md","k3s vs HeroCtl: quando você precisa de Kubernetes leve e quando não precisa de Kubernetes",{"type":9,"value":22490,"toc":23015},[22491,22502,22505,22509,22516,22523,22526,22533,22537,22548,22562,22565,22569,22572,22578,22584,22590,22596,22602,22606,22613,22616,22619,22622,22626,22632,22638,22644,22650,22656,22660,22666,22672,22678,22684,22690,22692,22695,22838,22841,22845,22848,22854,22860,22866,22872,22878,22882,22885,22891,22897,22903,22906,22908,22911,22917,22923,22926,22929,22931,22937,22943,22949,22955,22961,22967,22973,22977,22983,22986,22989,22992,22997,23000,23012],[12,22492,22493,22494,22497,22498,22501],{},"A pergunta chega quase semanal na nossa caixa de entrada: \"vocês são tipo um k3s, né?\". A resposta curta é não. A resposta longa começa percebendo que k3s e HeroCtl são confundidos porque ocupam o mesmo espaço mental — \"orquestração sem a complexidade do Kubernetes pleno\" — mas resolvem problemas que só parecem iguais por fora. k3s ",[27,22495,22496],{},"é"," Kubernetes, destilado. HeroCtl ",[27,22499,22500],{},"não é"," Kubernetes, e essa diferença muda tudo o que vem depois: o que você lê, o que você instala, o que você contrata, o que você comemora aos sábados.",[12,22503,22504],{},"Este post é pra tech leads que conhecem K8s o suficiente pra ter cicatrizes e estão considerando alguma alternativa mais leve. A intenção não é convencer ninguém a abandonar Kubernetes — Kubernetes é a escolha certa pra muito caso. A intenção é dar o mapa pra você decidir entre k3s e HeroCtl sem misturar as premissas dos dois.",[19,22506,22508],{"id":22507},"o-que-k3s-e-exatamente","O que k3s é, exatamente",[12,22510,22511,22512,22515],{},"k3s é uma distribuição de Kubernetes mantida pela Rancher (hoje SUSE). É ",[27,22513,22514],{},"Kubernetes pleno e certificado pela CNCF"," — a mesma API, os mesmos controladores, o mesmo modelo de objeto. O que muda é o empacotamento.",[12,22517,22518,22519,22522],{},"Em vez de cinco a sete componentes separados rodando como serviços de sistema, k3s entrega um único binário de cerca de 50 MB que sobe API server, scheduler, controller manager, kubelet e container runtime numa única árvore de processos. O armazenamento padrão é SQLite em vez do banco distribuído tradicional do Kubernetes — você pode trocar pelo banco distribuído quando quiser HA real, ou usar um cluster externo de banco SQL via driver ",[231,22520,22521],{},"kine",". Os plugins de provedor de nuvem foram removidos do binário — se você precisa deles, instala separado.",[12,22524,22525],{},"A instalação cabe num comando, sobe em menos de 30 segundos num servidor modesto, e o requisito mínimo de RAM é 512 MB. Funciona em Raspberry Pi. Funciona em uma VPS de 5 dólares. Funciona em hardware industrial sem ventoinha rodando dentro de uma caixa de aço numa fábrica.",[12,22527,22528,22529,22532],{},"O ponto mais importante: ",[27,22530,22531],{},"kubectl, manifestos K8s, operators, charts de templating e tudo mais que você aprendeu sobre Kubernetes funcionam idênticos",". Um cluster k3s aceita os mesmos arquivos YAML que um cluster gerenciado da AWS aceita. A migração de um pra outro é, na prática, copiar manifestos. Compatibilidade é a feature.",[19,22534,22536],{"id":22535},"o-que-k3s-nao-faz-mesmo-sendo-leve","O que k3s NÃO faz, mesmo sendo \"leve\"",[12,22538,22539,22540,22543,22544,22547],{},"A palavra \"leve\" engana. k3s é leve em ",[27,22541,22542],{},"footprint"," (RAM, disco, número de processos), não em ",[27,22545,22546],{},"modelo mental",". O que ele tira é a barreira de instalação e a dependência de cinco serviços externos pra subir. O que ele mantém é tudo que torna Kubernetes Kubernetes:",[2735,22549,22550,22553,22556,22559],{},[70,22551,22552],{},"Manifesto de \"hello world\" continua passando das 100 linhas quando você adiciona Service, Ingress e ConfigMap. Adicionando TLS automático e RBAC mínimo, vai pra 300+.",[70,22554,22555],{},"Você continua precisando entender namespaces, services, ingress, persistent volumes, secrets, configmaps, RBAC, network policies, pod disruption budgets, liveness\u002Freadiness probes, init containers, sidecars, taints, tolerations, affinity rules, e assim por diante.",[70,22557,22558],{},"Operators e charts de templating continuam sendo o caminho idiomático pra qualquer coisa não-trivial. Postgres replicado? Operator. Kafka? Operator. Certificados automáticos? Operator. Métricas? Stack de três produtos.",[70,22560,22561],{},"A curva de aprendizado é praticamente a mesma. k3s tira talvez 10% — o pedaço de \"instalar e manter o plano de controle\". Os 90% restantes — entender como o sistema modela aplicações, como os controladores reconciliam estado, como debugar quando uma probe começa a falhar — continuam ali, intactos.",[12,22563,22564],{},"Se um SRE veterano olha pra um manifesto k3s, ele se sente em casa. Se um desenvolvedor de produto que nunca tocou Kubernetes olha pra esse mesmo manifesto, ele se sente exatamente tão perdido quanto se estivesse olhando pra um manifesto de cluster gerenciado.",[19,22566,22568],{"id":22567},"quem-deve-usar-k3s-perfil-real","Quem deve usar k3s (perfil real)",[12,22570,22571],{},"Vamos ser concretos. k3s faz sentido pra:",[12,22573,22574,22577],{},[27,22575,22576],{},"Times que já falam Kubernetes fluente e querem rodar em hardware barato."," Edge computing, IoT, lojas físicas com servidor local, fábricas com gateways industriais, ambientes on-prem com hardware modesto. O time já sabe operar K8s — k3s só permite levar essa expertise pra lugares onde um plano de controle de 4 GB de RAM seria inviável.",[12,22579,22580,22583],{},[27,22581,22582],{},"Empresa migrando de Kubernetes gerenciado pra self-managed pra reduzir custo."," Cluster gerenciado em provedor de nuvem cobra cerca de US$73\u002Fmês só pelo plano de controle, multiplicado pelo número de clusters. Some NAT, balanceadores de carga, observabilidade — fica caro. Quem já pagou esse pedágio e quer parar pode subir k3s em VPS comuns e cortar a conta em ordem de magnitude. A operação não fica mais simples; o boleto fica menor.",[12,22585,22586,22589],{},[27,22587,22588],{},"Workloads que dependem do ecossistema CNCF."," Operators maduros pra Postgres com replicação automática (CloudNativePG, Zalando), Kafka (Strimzi), Cassandra, Elasticsearch — esses operators existem porque alguém investiu três anos polindo. Se a sua arquitetura depende de quatro deles em produção, você quer Kubernetes pleno, e k3s te dá Kubernetes pleno.",[12,22591,22592,22595],{},[27,22593,22594],{},"Quem quer ferramentas K8s-compatíveis funcionando 1:1."," kubectl, charts de templating, ArgoCD pra GitOps, ferramentas de scanning de imagem, ferramentas de policy como OPA Gatekeeper. Se o seu pipeline de CI\u002FCD existente usa essas ferramentas, k3s mantém todas funcionando sem adaptação.",[12,22597,22598,22601],{},[27,22599,22600],{},"Compliance que exige distribuição CNCF-certified."," Alguns frameworks de auditoria pedem nominalmente uma distribuição certificada. k3s aparece nessa lista. HeroCtl não — somos jovens demais pra estar em qualquer lista, e nossa proposta é diferente o suficiente pra que algumas listas nunca venham a nos incluir.",[19,22603,22605],{"id":22604},"o-que-heroctl-e-exatamente","O que HeroCtl é, exatamente",[12,22607,22608,22609,22612],{},"HeroCtl é um orquestrador independente. Não é uma distribuição derivada de Kubernetes; não compartilha API; não usa os mesmos primitivos. É uma camada ",[27,22610,22611],{},"diferente"," que atende uma intenção parecida — rodar contêineres em vários servidores com alta disponibilidade real — usando outro vocabulário e outras decisões de design.",[12,22614,22615],{},"Concretamente: um único arquivo executável que você instala em N servidores Linux. Os primeiros três viram quórum pro plano de controle replicado. Você submete jobs via CLI, API ou painel web embutido. Um job é um arquivo de configuração de cerca de 50 linhas que descreve a aplicação inteira — incluindo réplicas, ingress, certificados, segredos. O cluster decide onde rodar, faz health check, gerencia rolling deploys, emite certificados automáticos via roteador integrado.",[12,22617,22618],{},"Não há operadores especializados pra instalar, não há stacks de observabilidade montadas em separado, não há malha de serviço configurada à parte. Métricas persistentes rodam como job do próprio sistema. Logs têm escritor único embutido. Criptografia entre serviços e gerenciamento de chaves vêm prontos. Ingress com TLS automático é parte do binário.",[12,22620,22621],{},"A consequência é um modelo operacional curto. Subir uma aplicação nova é descrever, submeter, esperar — e o cluster cuida de roteamento, certificado, replicação, métricas e health check sem que você instale nada extra.",[19,22623,22625],{"id":22624},"o-que-heroctl-nao-faz-limites-honestos","O que HeroCtl NÃO faz (limites honestos)",[12,22627,22628,22631],{},[27,22629,22630],{},"Não é compatível com a API do Kubernetes."," kubectl não conversa com HeroCtl. Charts de templating não rodam. Manifestos K8s não são aceitos. Se a sua dependência crítica é uma ferramenta do ecossistema CNCF que fala com a API do Kubernetes, HeroCtl não substitui — é uma ferramenta diferente, com vocabulário próprio.",[12,22633,22634,22637],{},[27,22635,22636],{},"Não tem ecossistema de operadores especializados."," Não há um operador maduro de Postgres com replicação automática esperando pra ser instalado. Você roda Postgres como um job comum e cuida de backup e replicação como humano cuida — não delega pra controlador externo. Pra muitos times isso é alívio; pra outros é regressão.",[12,22639,22640,22643],{},[27,22641,22642],{},"Faixa de escala recomendada vai de 1 a 500 servidores."," Testamos até centenas em laboratório, validamos algumas dezenas em produção. Acima disso, Kubernetes (pleno ou em distribuição como k3s) ganha por ecossistema — ferramentas de federação multi-cluster, autoscaling cruzado entre regiões, primitivas de migração de armazenamento entre nuvens existem ali e ainda não existem aqui.",[12,22645,22646,22649],{},[27,22647,22648],{},"Federação multi-cluster não é nativa."," Se você precisa de várias regiões orquestradas como uma única superfície, com workloads se movendo automaticamente entre elas, ferramentas como Rancher Fleet ou os recursos multi-cluster do Kubernetes resolvem hoje. HeroCtl não.",[12,22651,22652,22655],{},[27,22653,22654],{},"Compliance que lista Kubernetes nominalmente."," Se a sua certificação exige nominalmente uma distribuição certificada pela CNCF, HeroCtl não cumpre — somos um produto novo, jovem demais pra figurar em listas estabelecidas. k3s, OpenShift e Talos cumprem. Esse é o caminho.",[19,22657,22659],{"id":22658},"quem-deve-usar-heroctl-perfil-real","Quem deve usar HeroCtl (perfil real)",[12,22661,22662,22665],{},[27,22663,22664],{},"Times que NÃO querem aprender Kubernetes mas precisam de orquestração com HA real."," Painéis self-hosted populares funcionam bem em um servidor mas não têm consenso distribuído — quando você quer três servidores aguentando perda de um sem downtime, esses painéis não servem. Kubernetes serviria, mas custa um SRE no time. HeroCtl é o meio que faltava.",[12,22667,22668,22671],{},[27,22669,22670],{},"Indie hackers e startups até cerca de R$1M de receita anual."," Stack típica: aplicação web, banco relacional, fila assíncrona, cache. Não há Kafka, não há Cassandra, não há sete operadores de banco. Pra esse perfil, o ecossistema CNCF é capacidade ociosa cara — você paga em curva de aprendizado e em complexidade operacional sem usar o que paga.",[12,22673,22674,22677],{},[27,22675,22676],{},"Aplicações web típicas sem dependências exóticas."," HTTP em cima de banco SQL e cache em memória cobre talvez 70% do mercado SaaS. Pra esse pedaço, Kubernetes é overkill e HeroCtl é dimensionado.",[12,22679,22680,22683],{},[27,22681,22682],{},"Quem quer \"simplicidade do Coolify com HA real\"."," Coolify, Dokploy e similares acertaram a experiência mas erraram a alta disponibilidade. Kubernetes acertou a alta disponibilidade mas errou a experiência. HeroCtl tenta acertar os dois ao custo de não ser Kubernetes.",[12,22685,22686,22689],{},[27,22687,22688],{},"Compliance LGPD-only."," Se o seu compliance é LGPD e contratos comerciais brasileiros, sem FedRAMP nem ITAR no horizonte, a ausência de certificações específicas não é bloqueio.",[19,22691,4826],{"id":4825},[12,22693,22694],{},"A tabela abaixo cobre os critérios que mais aparecem na decisão. Cada linha tem ressalva — leia o texto.",[119,22696,22697,22708],{},[122,22698,22699],{},[125,22700,22701,22703,22706],{},[128,22702,2983],{},[128,22704,22705],{},"k3s",[128,22707,2995],{},[141,22709,22710,22721,22732,22743,22753,22763,22772,22783,22794,22805,22816,22827],{},[125,22711,22712,22715,22718],{},[146,22713,22714],{},"Tipo de produto",[146,22716,22717],{},"Distribuição de Kubernetes",[146,22719,22720],{},"Orquestrador independente, não-Kubernetes",[125,22722,22723,22726,22729],{},[146,22724,22725],{},"Linhas pra hello world + TLS + ingress",[146,22727,22728],{},"200–300 (manifestos + operador de TLS)",[146,22730,22731],{},"~50 (job spec)",[125,22733,22734,22737,22740],{},[146,22735,22736],{},"RAM mínima total no cluster",[146,22738,22739],{},"512 MB por nó (1.5 GB em 3 nós HA)",[146,22741,22742],{},"~600 MB pelo plano de controle (200–400 MB por nó × 3)",[125,22744,22745,22747,22750],{},[146,22746,3152],{},[146,22748,22749],{},"8–16 semanas (curva K8s completa)",[146,22751,22752],{},"1–2 semanas",[125,22754,22755,22758,22760],{},[146,22756,22757],{},"Compatibilidade kubectl + charts de templating",[146,22759,16926],{},[146,22761,22762],{},"Nenhuma — vocabulário próprio",[125,22764,22765,22767,22770],{},[146,22766,11372],{},[146,22768,22769],{},"Não — instala à parte",[146,22771,16385],{},[125,22773,22774,22777,22780],{},[146,22775,22776],{},"Certificados automáticos embutidos",[146,22778,22779],{},"Não — operador externo",[146,22781,22782],{},"Sim, embutidos",[125,22784,22785,22788,22791],{},[146,22786,22787],{},"Métricas embutidas",[146,22789,22790],{},"Não — stack externa de 3 produtos",[146,22792,22793],{},"Sim, job do próprio sistema",[125,22795,22796,22799,22802],{},[146,22797,22798],{},"Logs centralizados",[146,22800,22801],{},"Não — stack externa de 2 produtos",[146,22803,22804],{},"Sim, escritor único embutido",[125,22806,22807,22810,22813],{},[146,22808,22809],{},"Ecossistema de operators",[146,22811,22812],{},"Vasto (centenas)",[146,22814,22815],{},"Inexistente — workloads como jobs comuns",[125,22817,22818,22821,22824],{},[146,22819,22820],{},"Faixa de escala recomendada",[146,22822,22823],{},"1 nó a 10 mil+",[146,22825,22826],{},"1 a 500 servidores",[125,22828,22829,22832,22835],{},[146,22830,22831],{},"Modelo comercial",[146,22833,22834],{},"Open source (Apache 2.0), suportado pela SUSE",[146,22836,22837],{},"Community gratuita + Business pago + Enterprise",[12,22839,22840],{},"A coluna que mais importa varia por contexto. Pra time que já tem expertise K8s, \"compatibilidade kubectl\" pesa muito. Pra time que está começando, \"linhas pra hello world\" e \"curva de aprendizado\" pesam mais.",[19,22842,22844],{"id":22843},"quando-os-dois-estao-na-conversa-decisao-pratica","Quando os dois estão na conversa (decisão prática)",[12,22846,22847],{},"Cinco cenários reais que aparecem em conversas com leitores. As respostas são diretas porque a realidade é direta.",[12,22849,22850,22853],{},[27,22851,22852],{},"\"Já temos Kubernetes gerenciado e dói operacionalmente.\"","\nk3s reduz custo cloud porque você sai do plano de controle pago. A dor operacional permanece — manifestos longos, operadores de TLS, stacks externas de observabilidade. Você economiza na fatura mas não no tempo. HeroCtl reduz a dor de raiz, mas exige aprender outra ferramenta e re-escrever as primitivas. Se a dor é financeira, k3s. Se a dor é tempo de engenharia, HeroCtl.",[12,22855,22856,22859],{},[27,22857,22858],{},"\"Estamos começando agora, queremos algo simples.\"","\nHeroCtl. Kubernetes (pleno ou k3s) adiciona meses de curva de aprendizado que não geram valor pro produto na fase inicial. Você passa três meses aprendendo charts de templating e ingress controllers em vez de shippar features. Em early-stage, custo de oportunidade é tudo.",[12,22861,22862,22865],{},[27,22863,22864],{},"\"Compliance exige distribuição CNCF-certified.\"","\nk3s ou Talos. HeroCtl não cumpre essa lista. Não é orgulho — é honestidade. Quando estivermos prontos pra essas listas, voltamos a conversar.",[12,22867,22868,22871],{},[27,22869,22870],{},"\"Time tem 1 SRE forte que adora Kubernetes.\"","\nk3s. Deixa o SRE feliz, mantém todo o conhecimento existente do time, e ainda corta a fatura cloud. HeroCtl forçaria o SRE a re-aprender e abandonar ferramentas que ele domina — fricção desnecessária quando a expertise já está paga.",[12,22873,22874,22877],{},[27,22875,22876],{},"\"Time tem 0 SRE e cresce pelo produto.\"","\nHeroCtl. Kubernetes sem expertise é receita pra desastre — você vai descobrir o que é um pod stuck em CrashLoopBackOff numa noite de sexta, sem ter contexto pra debugar. HeroCtl é dimensionado pra time que não tem plantão dedicado a infra.",[19,22879,22881],{"id":22880},"a-migracao-improvavel","A migração improvável",[12,22883,22884],{},"Migrar de k3s pra HeroCtl, ou vice-versa, é uma operação que parece pior do que é.",[12,22886,22887,22890],{},[27,22888,22889],{},"Conceitualmente, os dois são similares."," Ambos rodam contêineres, ambos têm noção de réplicas, ambos têm ingress, ambos têm health check, ambos têm rolling deploy. Se você sabe fazer uma coisa, sabe pensar a outra.",[12,22892,22893,22896],{},[27,22894,22895],{},"Sintaticamente, são incompatíveis."," Manifesto Kubernetes não converte 1:1 pra job spec HeroCtl. Os campos não casam, as abstrações não são as mesmas, os defaults são diferentes. Você re-escreve.",[12,22898,22899,22902],{},[27,22900,22901],{},"Re-escrever não é tão caro quanto parece."," Pra time típico com 20 a 40 specs em produção, a migração toma uma tarde. O motivo é que a maioria dos manifestos K8s tem repetição estrutural enorme — 80% dos campos são padronizados, e você descobre rapidamente o mapeamento. Pra times com poucas dezenas de jobs, conversor manual basta. Acima disso, estamos abertos a conversar sobre conversores experimentais.",[12,22904,22905],{},"A migração do outro lado (HeroCtl → k3s) é mais cara, porque você está saindo de um modelo enxuto pra um modelo verboso. Você ganha ecossistema; paga em verbosidade.",[19,22907,18063],{"id":18062},[12,22909,22910],{},"Cenário: 4 VPS em provedor europeu de baixo custo, cada uma com 4 vCPU e 8 GB de RAM. Custo de infraestrutura: cerca de R$100\u002Fmês por VPS, R$400\u002Fmês total.",[12,22912,22913,22916],{},[27,22914,22915],{},"k3s self-managed nesse cenário"," custa R$400\u002Fmês de infra mais salário parcial de SRE. SRE forte no Brasil custa R$15k a R$25k\u002Fmês cheio. Ainda que você aloque só 30% do tempo dele pro cluster — o que é otimista pra time pequeno — são R$5k a R$7,5k de custo de gente. Total: R$5,4k a R$7,9k\u002Fmês.",[12,22918,22919,22922],{},[27,22920,22921],{},"HeroCtl Community no mesmo cenário"," custa R$400\u002Fmês de infra mais alocação de dev part-time pro cluster. Como o modelo operacional é mais curto, 10% do tempo de um dev sênior basta — R$1,5k a R$2,5k\u002Fmês. Total: R$1,9k a R$2,9k\u002Fmês.",[12,22924,22925],{},"A diferença está no salário de gente. k3s pede mais expertise; mais expertise custa mais. A infra é praticamente igual.",[12,22927,22928],{},"Esse cálculo se inverte quando o time já tem SRE pago independentemente da escolha de orquestrador. Se o SRE existe pelo resto da stack, o custo marginal de operar k3s é baixo, e o ecossistema CNCF passa a valer ouro. É outro tipo de empresa.",[19,22930,3226],{"id":3225},[12,22932,22933,22936],{},[27,22934,22935],{},"k3s ainda é Kubernetes pleno?","\nSim. k3s é certificado pela CNCF como distribuição conformante. Os mesmos manifestos rodam, kubectl funciona idêntico, a API é a mesma. As remoções foram de dependências e plugins de nuvem — não da API nem da semântica.",[12,22938,22939,22942],{},[27,22940,22941],{},"HeroCtl pode rodar em Raspberry Pi como k3s?","\nTecnicamente, sim — HeroCtl roda em qualquer servidor Linux com Docker, incluindo ARM. Praticamente, o caso de uso \"edge em Raspberry Pi\" é território onde k3s tem anos de polimento e HeroCtl ainda não foi exercitado o bastante. Se o seu uso é edge industrial em hardware ARM modesto, k3s é a escolha mais batida hoje. HeroCtl em Pi funciona pra hobby; pra produção edge, espere mais alguns trimestres.",[12,22944,22945,22948],{},[27,22946,22947],{},"kubectl funciona no HeroCtl?","\nNão. HeroCtl tem CLI própria e API própria. A intenção foi diferente desde o início — não tentamos ser compatíveis com Kubernetes. Quem quer kubectl quer Kubernetes; é a ferramenta certa pra essa pessoa.",[12,22950,22951,22954],{},[27,22952,22953],{},"Como migrar de Kubernetes gerenciado pra k3s?","\nA maioria dos manifestos roda direto. As exceções costumam ser: anotações específicas do provedor de nuvem (load balancer, storage class), integrações de IAM nativas e algum ingress controller que assumia infraestrutura cloud. Você troca por equivalentes do ecossistema CNCF (MetalLB pra LB, longhorn ou storage local pra volumes) e refaz as anotações. Pra cluster com poucas dezenas de manifestos, a migração leva alguns dias.",[12,22956,22957,22960],{},[27,22958,22959],{},"HeroCtl tem multi-region como Rancher Fleet?","\nNão nativo. Hoje o quórum do plano de controle é dimensionado pra um cluster por região. Você pode operar HeroCtl em várias regiões em paralelo, cada uma com seu cluster, mas não há hoje uma camada de federação que apresente todos como superfície única. Está no roadmap. Quem precisa disso hoje, k3s + Rancher Fleet ou Kubernetes pleno + Karmada são caminhos exercitados.",[12,22962,22963,22966],{},[27,22964,22965],{},"Qual escala mais alto?","\nKubernetes (pleno ou k3s). Empresas operam clusters K8s com dezenas de milhares de nós em produção. HeroCtl mira faixa \"1 a 500 servidores\" e não pretende competir acima disso. Se você opera no nível de centenas de milhares de máquinas, K8s é o caminho — não por escolha, por dimensionamento.",[12,22968,22969,22972],{},[27,22970,22971],{},"Posso rodar os dois lado a lado?","\nSim. Ambos são orquestradores que rodam contêineres em servidores Linux. Você pode ter um cluster k3s pra workloads que dependem do ecossistema CNCF e um cluster HeroCtl pra apps web típicas — eles não conflitam, são produtos diferentes. Alguns clientes nossos fazem exatamente isso: HeroCtl pro produto principal, k3s pra ambiente de testes que precisa imitar o cluster gerenciado de produção do cliente final.",[19,22974,22976],{"id":22975},"fechamento-honesto","Fechamento honesto",[12,22978,22979,22980,22982],{},"A pergunta inicial — \"vocês são tipo um k3s, né?\" — tem agora uma resposta longa. Não somos. k3s é Kubernetes empacotado pra caber em hardware modesto, mantendo intacta toda a curva de aprendizado e todo o ecossistema. HeroCtl é uma camada ",[27,22981,22611],{}," de Kubernetes, com vocabulário próprio, modelo operacional mais curto, sem ecossistema de operadores e sem compatibilidade com kubectl.",[12,22984,22985],{},"Se você já fala Kubernetes fluente e quer levar essa expertise pra hardware barato ou edge, k3s é a escolha. Se você nunca quis aprender Kubernetes mas precisa de orquestração com alta disponibilidade real, HeroCtl é a escolha. Se a sua dor é compliance que lista distribuições certificadas, k3s ou Talos. Se a sua dor é tempo de engenharia gasto em manifestos longos e operadores externos, HeroCtl.",[12,22987,22988],{},"Não há vencedor universal — há ferramentas que combinam com contextos diferentes. A escolha errada não é nem k3s nem HeroCtl; é adotar qualquer uma das duas sem entender qual problema você está realmente resolvendo.",[12,22990,22991],{},"Quem quiser experimentar HeroCtl no servidor mais próximo, o caminho é único:",[224,22993,22995],{"className":22994,"code":5319,"language":2530},[2528],[231,22996,5319],{"__ignoreMap":229},[12,22998,22999],{},"Cinco minutos depois você tem um cluster de um nó rodando. Adicione mais dois servidores com o mesmo comando + token, e tem alta disponibilidade real — sem instalar operador externo, sem montar stack de observabilidade, sem aprender vocabulário novo de manifestos.",[12,23001,23002,23003,23005,23006,23008,23009,23011],{},"Pra continuar a leitura, dois posts conversam diretamente com este: ",[3337,23004,15790],{"href":15789}," trata da decisão geral de não adotar K8s; ",[3337,23007,6335],{"href":6334}," compara as três famílias quando o servidor da nuvem está na mesa. E pra entender por que existimos como produto separado em vez de ser mais uma distribuição K8s, ",[3337,23010,6548],{"href":6547}," tem o histórico completo.",[12,23013,23014],{},"A intenção, como sempre, é simples: orquestração de contêineres, sem cerimônia — mas com honestidade sobre quando cerimônia é o que você precisa.",{"title":229,"searchDepth":244,"depth":244,"links":23016},[23017,23018,23019,23020,23021,23022,23023,23024,23025,23026,23027,23028],{"id":22507,"depth":244,"text":22508},{"id":22535,"depth":244,"text":22536},{"id":22567,"depth":244,"text":22568},{"id":22604,"depth":244,"text":22605},{"id":22624,"depth":244,"text":22625},{"id":22658,"depth":244,"text":22659},{"id":4825,"depth":244,"text":4826},{"id":22843,"depth":244,"text":22844},{"id":22880,"depth":244,"text":22881},{"id":18062,"depth":244,"text":18063},{"id":3225,"depth":244,"text":3226},{"id":22975,"depth":244,"text":22976},"2026-02-26","k3s é Kubernetes empacotado pra caber em 512MB. Pra quem já fala K8s e quer levar pra menos. HeroCtl é uma camada DIFERENTE de Kubernetes. Como decidir entre os dois sem misturar premissas.",{},{"title":22488,"description":23030},{"loc":5344},"blog\u002Fk3s-vs-heroctl-quando-cada-um-faz-sentido",[22705,20399,8764,23036,23037],"edge","lightweight","e0MEZ4kZ3WtWRTBjTi5cAEySShdIbDnP0Wmel36-tAk",{"id":23040,"title":23041,"author":7,"body":23042,"category":8764,"cover":3380,"date":23618,"description":23619,"draft":3383,"extension":3384,"lastReviewed":3380,"meta":23620,"navigation":411,"path":23621,"readingTime":8769,"seo":23622,"sitemap":23623,"stem":23624,"tags":23625,"__hash__":23630},"blog_pt\u002Fblog\u002Fheroctl-vs-nomad.md","HeroCtl vs Nomad: a alternativa pra quem foi pego pela mudança de licença",{"type":9,"value":23043,"toc":23605},[23044,23047,23050,23054,23067,23070,23073,23077,23080,23086,23089,23095,23101,23105,23108,23111,23117,23123,23129,23132,23136,23139,23142,23145,23148,23151,23154,23158,23161,23167,23173,23179,23185,23188,23192,23195,23201,23211,23217,23220,23228,23231,23233,23409,23412,23416,23419,23425,23435,23445,23451,23457,23483,23486,23490,23493,23503,23509,23515,23521,23523,23529,23535,23544,23550,23560,23566,23572,23578,23580,23583,23586,23589,23596,23602],[12,23045,23046],{},"A história do Nomad é, em retrospectiva, um aviso. Pra muita gente que escolheu Nomad entre 2020 e 2022 — pelo argumento de \"mais simples que Kubernetes, código aberto de verdade, governança aberta\" — os dois anúncios que vieram depois mudaram a base do contrato. Em agosto de 2023 a licença mudou. Em fevereiro de 2025 a empresa foi vendida. O produto técnico continua bom. O contrato em volta dele, não é mais o mesmo que estava na mesa quando você assinou.",[12,23048,23049],{},"Este post é sobre essa diferença. Não é uma crítica ao núcleo técnico do Nomad — vamos chegar nele. É sobre o problema estrutural de adotar uma ferramenta cuja base contratual pode mudar entre uma reorganização e a próxima, e o que fica pra quem decide hoje, em abril de 2026.",[19,23051,23053],{"id":23052},"onde-o-nomad-acertou-e-continua-acertando","Onde o Nomad acertou (e continua acertando)",[12,23055,23056,23057,571,23060,571,23063,23066],{},"Antes de qualquer crítica, o crédito devido. O Nomad é tecnicamente bom. Plano de controle replicado funciona em produção. A interface de linha de comando é consistente — ",[231,23058,23059],{},"nomad job run",[231,23061,23062],{},"nomad job stop",[231,23064,23065],{},"nomad alloc logs"," se comportam de forma previsível em mil clusters diferentes. A operação multi-region foi pensada de fato, com federação entre datacenters e roteamento entre eles. Suporta workloads não-Docker (binários nativos, máquinas virtuais leves, drivers customizados) — uma flexibilidade que o concorrente maior nunca priorizou.",[12,23068,23069],{},"Quem operou Nomad em produção sério raramente reclama do núcleo. Os incidentes que aparecem em pós-morten públicos quase sempre estão na borda — integração com o gerenciador de configuração, integração com o roteador externo, integração com o cofre de segredos — não no orquestrador propriamente dito.",[12,23071,23072],{},"Esse desempenho técnico é importante porque define o tom do resto do post: o problema do Nomad não é o código. O código é bom. O problema é o que aconteceu em volta do código.",[19,23074,23076],{"id":23075},"a-linha-do-tempo-em-datas-absolutas","A linha do tempo, em datas absolutas",[12,23078,23079],{},"Vale recapitular sem dramatizar.",[12,23081,23082,23085],{},[27,23083,23084],{},"Agosto de 2023."," A HashiCorp, então empresa de capital aberto, anuncia mudança de licença em todos os produtos principais — incluindo Terraform, Vault, Consul e Nomad. A licença migra de Mozilla Public License 2.0 (uma licença aberta, com cópias da definição da OSI) pra Business Source License 1.1 — uma licença \"source available\". A diferença prática é a cláusula que restringe uso em produtos comerciais que compitam com a oferta paga da empresa. Você ainda pode ler o código. Pode rodar internamente. Não pode mais embeddar num produto comercial seu, e não pode mais oferecer como serviço gerenciado pra terceiros, sem licenciamento separado.",[12,23087,23088],{},"A reação da comunidade foi imediata. Em poucas semanas, um fork do Terraform — o OpenTofu — saiu do papel, com governança da Linux Foundation. Meses depois, o Vault ganhou o OpenBao com governança parecida. Nomad e Consul ficaram sem fork comunitário equivalente forte. Houve discussões, contribuições paradas, algumas saídas de mantenedores — mas nada do tamanho do que aconteceu com Terraform.",[12,23090,23091,23094],{},[27,23092,23093],{},"Fevereiro de 2025."," A IBM anuncia aquisição da HashiCorp por aproximadamente US$6.4 bilhões. A operação fecha ainda em 2025. HashiCorp passa a fazer parte do portfólio IBM — alinhado a ofertas existentes da IBM em torno de plataformas internas, gerenciamento de configuração e nuvem híbrida.",[12,23096,23097,23100],{},[27,23098,23099],{},"Hoje (abril de 2026)."," A licença BSL continua em vigor. O suporte oficial é exclusivamente pelo canal IBM. A cadência de release segue, mas o roadmap responde a OKRs internos da IBM agora — não mais a um plano de produto independente. Não há fork comunitário forte equivalente ao OpenTofu pra Nomad. Quem está em produção, está em produção; quem está adotando hoje, está adotando uma ferramenta cujo dono mudou duas vezes em 30 meses.",[19,23102,23104],{"id":23103},"o-que-isso-significa-na-pratica","O que isso significa na prática",[12,23106,23107],{},"Pra quem já tinha Nomad em produção antes de agosto de 2023, a situação é gerenciável. A versão imediatamente anterior à mudança de licença está congelada em MPL 2.0 — você pode continuar com ela, pegar patches selecionados, esperar amadurecer um fork. Não é confortável, mas é praticável.",[12,23109,23110],{},"Pra quem está decidindo em 2026, é uma decisão diferente. Três asteriscos importam:",[12,23112,23113,23116],{},[27,23114,23115],{},"A próxima feature crítica pode subir só na versão paga."," A licença não impede isso, e a empresa não tem mais um plano de produto independente que mantenha as features estratégicas no caminho aberto. É uma escolha agora, não um princípio.",[12,23118,23119,23122],{},[27,23120,23121],{},"O roadmap responde a OKRs IBM."," Isso pode ser bom — IBM tem músculo de engenharia, vai investir — ou ruim, se as prioridades da IBM (compliance, governamental, integração com produtos legados) forem diferentes das suas. Você não controla qual dos dois acontece.",[12,23124,23125,23128],{},[27,23126,23127],{},"Preços comerciais podem ser revisitados em uma próxima reorganização."," Aquisições grandes costumam ter um período de \"descoberta de valor\" onde tabelas de preço são reavaliadas. Não há regra que impeça uma nova rodada de mudanças contratuais em 12 ou 24 meses. Você não tem proteção contra isso.",[12,23130,23131],{},"Comunidade técnica registra esses sinais. A taxa de contribuições externas ao Nomad caiu depois de agosto de 2023. Empresas que antes exibiam casos de uso públicos pararam de publicar. Talks em conferências esfriaram. O ecossistema continua existindo — mas perdeu a tração de produto-de-comunidade que tinha entre 2018 e 2022.",[19,23133,23135],{"id":23134},"a-licao-certa-nao-e-codigo-aberto-ou-nada","A lição certa não é \"código aberto ou nada\"",[12,23137,23138],{},"Aqui chega a parte que importa pra qualquer ferramenta de infraestrutura — incluindo o HeroCtl.",[12,23140,23141],{},"O problema do Nomad não foi virar pago. Empresas precisam ser sustentáveis; cobrar por software é legítimo; software comercial sério é melhor pra todos do que software aberto que entra em manutenção esquelética porque ninguém paga.",[12,23143,23144],{},"O problema do Nomad foi mudar o contrato com quem já tinha apostado. Quem escolheu Nomad em 2021 baseado na licença aberta tinha uma expectativa razoável — que aquela base seria estável. Não foi. Em três anos, a base virou outra coisa, e o custo de saída era — exatamente — a quantidade de trabalho que tinha sido investido na escolha original.",[12,23146,23147],{},"Isso revela uma assimetria. Software aberto que pode virar comercial a qualquer momento é mais arriscado do que software comercial publicado desde o dia um, com termos congelados pra contratos existentes. O primeiro parece mais seguro porque \"é aberto\". É uma percepção errada quando o controle do projeto está concentrado em uma única empresa, sujeita a aquisição, IPO, mudança de CEO ou pressão de investidor. O contrato pode mudar; a percepção de segurança era ilusão.",[12,23149,23150],{},"Software comercial honesto — preços publicados, termos congelados, sem mudança retroativa, mecanismo de continuidade caso a empresa encerre — é estruturalmente mais previsível.",[12,23152,23153],{},"Esse é o pivô do HeroCtl.",[19,23155,23157],{"id":23156},"como-o-heroctl-resolve-isso-estruturalmente","Como o HeroCtl resolve isso estruturalmente",[12,23159,23160],{},"O HeroCtl nasceu comercial. Não houve fase de \"open source enquanto crescemos, comercial depois\". Os termos estão na mesa desde o dia um, publicados, com mecanismos contra-rug-pull explícitos.",[12,23162,23163,23166],{},[27,23164,23165],{},"Plano Community gratuito permanente."," Sem limite de servidores. Sem limite de jobs. Sem feature gate artificial. Roda toda a stack — alta disponibilidade real, roteador integrado, certificados automáticos, criptografia entre serviços, métricas e logs. Indivíduos e times pequenos nunca precisam sair do Community.",[12,23168,23169,23172],{},[27,23170,23171],{},"Sem phone-home, sem kill-switch."," Uma vez instalado, o cluster funciona sem nunca falar com servidor da empresa. Não há ativação periódica que expira. Não há flag que possa ser revogada de fora. Se a internet do escritório cair pra sempre, o cluster continua rodando.",[12,23174,23175,23178],{},[27,23176,23177],{},"Escrow de código-fonte no Enterprise."," Contratos Enterprise incluem cláusula de escrow — o código é depositado com terceira parte custodiante. Se a empresa encerrar operações, o código vai pros clientes pagantes via custodiante, com licença pra continuidade interna. Não é \"confie em nós\"; é um mecanismo legal que sobrevive ao desaparecimento da empresa.",[12,23180,23181,23184],{},[27,23182,23183],{},"Preços publicados."," Business e Enterprise têm preços visíveis na página de planos — sem \"fale com vendas\" obrigatório como tática de qualificação. Sem cláusula de revisão unilateral; o preço acordado fica congelado pra contratos existentes.",[12,23186,23187],{},"A diferença com o que aconteceu em agosto de 2023 e fevereiro de 2025 não é uma promessa. É uma estrutura.",[19,23189,23191],{"id":23190},"comparacao-tecnica-honesta","Comparação técnica honesta",[12,23193,23194],{},"Tirando licença, qual é a diferença técnica? Em alto nível, surpreendentemente menos do que você imaginaria.",[12,23196,23197,23200],{},[27,23198,23199],{},"Primitivas similares."," Nomad organiza trabalho em job → group → task. HeroCtl organiza em job → replica → task. Os conceitos mapeiam quase um-a-um. Um job descreve o serviço, o agrupamento determina réplica e localização, a task é o que efetivamente roda. Ambos suportam jobs de longa duração (services), jobs em lote (batch) e jobs periódicos.",[12,23202,23203,23206,23207,23210],{},[27,23204,23205],{},"Plano de controle replicado em ambos."," Os dois usam consenso entre servidores pra durabilidade do estado. Ambos toleram a perda de uma minoria de servidores sem indisponibilidade. Ambos elegem coordenador automaticamente. No HeroCtl, o teste de caos público mostra eleição em torno de sete segundos depois de um ",[231,23208,23209],{},"kill -9"," no servidor que coordena.",[12,23212,23213,23216],{},[27,23214,23215],{},"Diferença chave 1: bateria incluída vs montar a malha."," Aqui as filosofias divergem. Nomad foi desenhado pra ser composto com outros componentes do mesmo ecossistema — gerenciador de configuração externo pra service mesh, cofre de segredos externo, e algum gateway separado pra ingress. Isso dá flexibilidade enorme em cenários complexos, mas significa que rodar Nomad em produção honestamente costuma exigir três produtos em paralelo, cada um com seu próprio plano de controle, sua própria atualização, sua própria curva de aprendizado.",[12,23218,23219],{},"HeroCtl tem roteador integrado, certificados automáticos via Let's Encrypt e criptografia entre serviços embutidos no binário único. Você não monta a malha — ela vem montada. Pra times pequenos isso é dois meses de trabalho economizados; pra times grandes operando dezenas de datacenters federados, é menos flexibilidade.",[12,23221,23222,23225,23226,101],{},[27,23223,23224],{},"Diferença chave 2: faixa de aplicação."," Nomad mira escala alta. Há clusters públicos rodando dezenas de milhares de nós. O ecossistema é mais maduro nessa faixa — e quem está descendo do Nomad porque a complexidade não se justifica costuma estar fazendo a mesma conta que descrevemos em ",[3337,23227,15790],{"href":15789},[12,23229,23230],{},"HeroCtl mira a faixa \"1 a 500 servidores\" — single-server pra prototipagem, três pra alta disponibilidade real, dezenas a centenas pra escala produtiva de SaaS médio. Acima disso, ainda não testamos em larga escala em produção; o roadmap chega lá, mas não é a prioridade do trimestre.",[19,23232,4826],{"id":4825},[119,23234,23235,23246],{},[122,23236,23237],{},[125,23238,23239,23241,23244],{},[128,23240,2983],{},[128,23242,23243],{},"Nomad (sob BSL\u002FIBM)",[128,23245,2995],{},[141,23247,23248,23258,23267,23280,23291,23301,23312,23323,23334,23345,23356,23367,23378,23389,23400],{},[125,23249,23250,23252,23255],{},[146,23251,22831],{},[146,23253,23254],{},"Source available (BSL 1.1) + comercial via IBM",[146,23256,23257],{},"Comercial desde o dia 1, plano gratuito permanente",[125,23259,23260,23263,23265],{},[146,23261,23262],{},"Plano de controle replicado",[146,23264,3065],{},[146,23266,3065],{},[125,23268,23269,23272,23275],{},[146,23270,23271],{},"Eleição de coordenador",[146,23273,23274],{},"Sim, em segundos",[146,23276,23277,23278],{},"Sim, ~7 segundos após ",[231,23279,23209],{},[125,23281,23282,23285,23288],{},[146,23283,23284],{},"Roteador HTTP\u002FTLS",[146,23286,23287],{},"Externo (gateway de terceiro)",[146,23289,23290],{},"Embutido",[125,23292,23293,23295,23298],{},[146,23294,3923],{},[146,23296,23297],{},"Externos (operador especializado)",[146,23299,23300],{},"Embutidos (Let's Encrypt automático)",[125,23302,23303,23306,23309],{},[146,23304,23305],{},"Criptografia entre serviços",[146,23307,23308],{},"Externa (gerenciador de configuração + cofre)",[146,23310,23311],{},"Embutida",[125,23313,23314,23317,23320],{},[146,23315,23316],{},"Cofre de segredos",[146,23318,23319],{},"Externo (cofre dedicado)",[146,23321,23322],{},"Embutido (cluster é o cofre)",[125,23324,23325,23328,23331],{},[146,23326,23327],{},"Métricas + logs",[146,23329,23330],{},"Stack externa",[146,23332,23333],{},"Job interno + escritor único embutido",[125,23335,23336,23339,23342],{},[146,23337,23338],{},"Linhas pra app+ingress+TLS",[146,23340,23341],{},"80–120 linhas em vários arquivos",[146,23343,23344],{},"~50 linhas em um arquivo",[125,23346,23347,23350,23353],{},[146,23348,23349],{},"Ecossistema de drivers",[146,23351,23352],{},"Profundo (Docker, exec, java, qemu, plugins)",[146,23354,23355],{},"Docker como runtime",[125,23357,23358,23361,23364],{},[146,23359,23360],{},"Escala máxima testada",[146,23362,23363],{},"Dezenas de milhares de nós",[146,23365,23366],{},"1–500 nós (faixa-alvo)",[125,23368,23369,23372,23375],{},[146,23370,23371],{},"Suporte oficial",[146,23373,23374],{},"Canal IBM",[146,23376,23377],{},"Direto da fabricante; SLA no Business",[125,23379,23380,23383,23386],{},[146,23381,23382],{},"Contrato congelado pra clientes existentes",[146,23384,23385],{},"Não — mudou em 2023",[146,23387,23388],{},"Sim, cláusula explícita",[125,23390,23391,23394,23397],{},[146,23392,23393],{},"Mecanismo de continuidade se a empresa encerrar",[146,23395,23396],{},"Implícito (BSL converte pra MPL após 4 anos)",[146,23398,23399],{},"Escrow ativo no Enterprise",[125,23401,23402,23405,23407],{},[146,23403,23404],{},"Phone-home \u002F kill-switch",[146,23406,3059],{},[146,23408,3059],{},[12,23410,23411],{},"A coluna que tira o sono é a penúltima. \"Contrato congelado pra clientes existentes\" é exatamente o que faltou em agosto de 2023 — quem tinha aderido com expectativa de licença aberta foi pego pelo retroativo. Em HeroCtl, isso é uma cláusula explícita.",[19,23413,23415],{"id":23414},"migracao-de-nomad-pro-heroctl","Migração de Nomad pro HeroCtl",[12,23417,23418],{},"A boa notícia da convergência de primitivas: a migração não é um redesenho de arquitetura. É, na maior parte, uma tradução de arquivo.",[12,23420,23421,23424],{},[27,23422,23423],{},"Mapeamento direto."," Um job no Nomad vira um job no HeroCtl. Um group vira um agrupamento de réplicas. Uma task continua sendo a unidade que roda no agente. Constraints de placement (node class, datacenter, atributo customizado) têm equivalentes diretos. Update strategies (rolling, canary, blue-green) idem. Health checks via comando ou HTTP idem.",[12,23426,23427,23430,23431,23434],{},[27,23428,23429],{},"O que muda no arquivo."," O arquivo de configuração do HeroCtl é menor — em torno de 50 linhas pra um caso comum de aplicação web com ingress e segredos, comparado a 80–120 linhas em jobspec equivalente. A diferença vem de menos abstrações intermediárias e da integração nativa com o roteador (você descreve ",[231,23432,23433],{},"ingress: { host, tls: true }"," no próprio job, não num documento separado).",[12,23436,23437,23440,23441,23444],{},[27,23438,23439],{},"O que precisa de adaptação."," Integrações com o cofre de segredos externo precisam virar ",[231,23442,23443],{},"secrets:"," blocos no próprio job (o cluster é o cofre no HeroCtl). Service mesh via gerenciador de configuração externo precisa ser substituído pela criptografia entre serviços embutida — geralmente é simplificação, não regressão. Drivers não-Docker (exec, java) hoje não têm equivalente direto; aplicações que dependem disso ficam com Nomad ou empacotam em contêiner.",[12,23446,23447,23450],{},[27,23448,23449],{},"Conversor experimental."," Há um conversor de jobspec em desenvolvimento — pega um arquivo Nomad em entrada, emite um arquivo HeroCtl em saída, com avisos pros casos não-cobertos. Está em desenvolvimento, não promovemos como produto pronto. Cobre os casos comuns (job de serviço com Docker, ingress, health check, secrets); os casos de borda ainda exigem revisão manual. Se for relevante pra sua migração, escreve pra gente.",[12,23452,23453,23456],{},[27,23454,23455],{},"Plano em fases."," O caminho que recomendamos pra quem tem produção em Nomad:",[2735,23458,23459,23465,23471,23477],{},[70,23460,23461,23464],{},[27,23462,23463],{},"Fase 1 (semanas 1–2)."," Subir cluster HeroCtl em paralelo, com 3 servidores. Migrar primeiro um job não-crítico — preferencialmente um job batch ou periódico que não tem usuário acordado dependendo dele. Validar logs, métricas, comportamento sob falha.",[70,23466,23467,23470],{},[27,23468,23469],{},"Fase 2 (semanas 3–4)."," Migrar uma aplicação web com poucos usuários. Validar emissão de certificado, rolling deploy, comportamento durante perda de servidor. Comparar latência e taxa de erro com o Nomad equivalente.",[70,23472,23473,23476],{},[27,23474,23475],{},"Fase 3 (semanas 5+)."," Cutover por aplicação, não cutover do cluster inteiro. DNS aponta pra HeroCtl, monitorar uma semana, próxima aplicação. Mantém Nomad rodando o que ainda não migrou.",[70,23478,23479,23482],{},[27,23480,23481],{},"Fase 4 (quando confortável)."," Decommission do Nomad. Documenta o que aprendeu na sua wiki interna pra próxima ferramenta — porque sempre tem próxima ferramenta.",[12,23484,23485],{},"Pra times com poucas dezenas de jobs, a migração inteira é uma tarde. Pra times com centenas de jobs, e drivers exóticos, é trabalho sob medida — escreve pra gente que ajudamos a planejar.",[19,23487,23489],{"id":23488},"quando-o-nomad-continua-sendo-a-escolha-certa","Quando o Nomad continua sendo a escolha certa",[12,23491,23492],{},"Honestidade primeiro: não migra por moda.",[12,23494,23495,23498,23499,23502],{},[27,23496,23497],{},"Se você já está rodando Nomad em produção sem problema operacional, fique."," Mudança de licença pra quem não embedda nem oferece como serviço gerenciado é gerenciável — você roda internamente, atualiza com cuidado, espera o ecossistema decantar. Migrar uma stack que funciona é trabalho desnecessário. Pra quem está saindo do Nomad atrás de algo mais simples e single-server, vale considerar ",[3337,23500,23501],{"href":16701},"Coolify como alternativa"," antes de assumir que o caminho é HeroCtl.",[12,23504,23505,23508],{},[27,23506,23507],{},"Se sua arquitetura depende profundamente de outros componentes do mesmo ecossistema."," Cofre de segredos integrado com gerenciador de configuração integrado com Nomad, com políticas e ACLs federadas — desfazer essa integração é caro. O custo de saída pode ser maior que o asterisco de licença.",[12,23510,23511,23514],{},[27,23512,23513],{},"Se você opera multi-region em escala grande."," Centenas de datacenters federados, com workloads se movendo entre eles, dependendo de federação madura entre clusters. Nomad teve oito anos investidos nessa direção. HeroCtl tem alguns trimestres em produção real. A escolha conservadora pra esse perfil é Nomad — e está tudo bem.",[12,23516,23517,23520],{},[27,23518,23519],{},"Se você tem contratos governamentais que listam fornecedores nominalmente."," Alguns frameworks (FedRAMP, ITAR, contratos federais) exigem fornecedores listados. IBM agora atende essa lista. HeroCtl é jovem demais. Se o seu compliance officer precisa apontar pro nome de uma empresa em uma lista de auditoria, hoje a resposta é Nomad via IBM, não HeroCtl.",[19,23522,16602],{"id":16601},[12,23524,23525,23528],{},[27,23526,23527],{},"HeroCtl é só um clone do Nomad?","\nNão. Convergência de primitivas (job, agrupamento, task, plano de controle replicado) reflete que esses são os blocos certos pra orquestração de contêineres — não cópia. As diferenças importantes (bateria incluída em vez de malha externa, contrato comercial congelado, faixa de aplicação 1–500) são escolhas estruturais opostas, não detalhe de implementação. Se fosse clone, o arquivo de configuração teria 100+ linhas e dependeria de três produtos paralelos.",[12,23530,23531,23534],{},[27,23532,23533],{},"E se a HeroCtl mudar de licença?","\nA pergunta é justa — é exatamente o tipo de pergunta que importa depois de agosto de 2023. Três proteções: o contrato comercial publicado tem cláusula de termos congelados pra clientes existentes (preço acordado fica, não muda retroativamente); o binário não tem phone-home nem kill-switch (uma vez instalado, roda independente); contratos Enterprise têm escrow ativo (código vai pros clientes pagantes se a empresa encerrar). Não é \"confie em nós\". É estrutura legal e técnica que sobrevive a mudança de gestão, aquisição ou encerramento.",[12,23536,23537,23540,23541,23543],{},[27,23538,23539],{},"O conversor de jobspec converte integração com cofre de segredos e gerenciador de configuração?","\nNão totalmente. Integrações com cofre externo viram ",[231,23542,23443],{}," blocos no job HeroCtl — o conversor faz a transformação sintática, mas a você cabe revisar a lógica (rotação, política de acesso, escopo). Service mesh via gerenciador externo geralmente vira a criptografia embutida, com simplificação na maioria dos casos. Os casos exóticos (políticas dinâmicas, segredos com renovação coordenada) ficam com aviso de \"revisar manualmente\" no relatório do conversor.",[12,23545,23546,23549],{},[27,23547,23548],{},"E os plugins de driver do Nomad? Tenho um driver customizado pra rodar binários nativos.","\nHoje, HeroCtl roda sobre Docker como runtime. Drivers exóticos (exec, java, qemu, customizados) não têm equivalente direto — a aplicação precisa ser empacotada em contêiner. Pra muita coisa, isso é simplificação; pra alguns workloads (binários compilados estaticamente, máquinas virtuais leves), é trabalho extra. Se você depende de driver não-Docker em produção, fala com a gente antes de migrar.",[12,23551,23552,23555,23556,23559],{},[27,23553,23554],{},"E os jobs periódicos e em lote?","\nSuportados. HeroCtl tem jobs de longa duração, jobs em lote (executa, termina, libera) e jobs periódicos (cron-like). A sintaxe é direta — uma chave ",[231,23557,23558],{},"schedule: \"*\u002F5 * * * *\""," no arquivo de configuração. O que ainda não temos é fan-out massivo de batch (milhares de tasks paralelas com agregação de resultado) — pra isso, ferramentas dedicadas a fluxo de dados continuam melhores.",[12,23561,23562,23565],{},[27,23563,23564],{},"Posso operar HeroCtl atrás de um Nomad existente?","\nTecnicamente sim — HeroCtl roda em qualquer servidor Linux com Docker, então você pode descrever um job Nomad que sobe o agente HeroCtl. Mas a recomendação é o contrário: rodar HeroCtl em paralelo, migrar aplicação por aplicação, decomissionar Nomad quando confortável. Aninhar dois orquestradores é manter dois planos de controle, dois modelos mentais, dois conjuntos de logs — sem ganho.",[12,23567,23568,23571],{},[27,23569,23570],{},"O preço do Business é maior ou menor que o do Nomad Enterprise?","\nOs preços do Business e Enterprise estão publicados na página de planos do HeroCtl — sem \"fale com vendas\" obrigatório como tática de qualificação. A licença comercial do Nomad sob IBM é negociada caso a caso e não tem preço público; comparações diretas dependem de cotação. O ponto que destacamos não é \"somos mais baratos que IBM\" — é \"nosso preço é público e congelado pra contratos existentes\". Você sabe o que paga em cinco anos. Essa previsibilidade é o produto.",[12,23573,23574,23577],{},[27,23575,23576],{},"Como funciona o suporte?","\nCommunity tem fórum público e canais comunitários — sem SLA. Business tem suporte oficial direto da fabricante com SLA de horas em primeira resposta. Enterprise adiciona suporte 24×7 e desenvolvimento dedicado pra extensões específicas. Importante: suporte oficial é direto, não terceirizado via canal, não dependente de vendor extra na cadeia.",[19,23579,3310],{"id":3309},[12,23581,23582],{},"A história do Nomad é menos sobre Nomad e mais sobre a forma de adotar infraestrutura. Software aberto controlado por uma única empresa é frágil em escala de anos — não no código, mas no contrato. Aquisição, IPO, mudança de gestão, pressão de investidor: qualquer um desses pode reescrever a base sob seus pés.",[12,23584,23585],{},"A resposta certa não é \"rejeite tudo que tem CNPJ por trás\". A resposta certa é exigir que o contrato seja explícito desde o dia um, com termos congelados pra quem já assinou e mecanismo de continuidade caso a empresa desapareça. Software comercial honesto, com essas três propriedades, é estruturalmente mais previsível do que software aberto que pode mudar.",[12,23587,23588],{},"Esse é o desenho do HeroCtl. Comercial desde o dia um. Plano Community gratuito permanente, sem feature gate artificial. Business e Enterprise com preços publicados. Sem phone-home, sem kill-switch. Escrow no Enterprise.",[12,23590,23591,23592,23595],{},"Pra instalar: ",[231,23593,23594],{},"curl -sSL https:\u002F\u002Fget.heroctl.com\u002Finstall.sh | sh"," em um servidor Linux com Docker. Pra alta disponibilidade real, o mesmo comando em três servidores — eles formam quórum automaticamente.",[12,23597,23598,23599,23601],{},"Pra entender a motivação por trás disso, leia ",[3337,23600,6548],{"href":6547}," — explica os três caminhos que existiam em 2026, a lacuna que cada um deixava, e o que tentamos preencher.",[12,23603,23604],{},"Se você está em Nomad e quer conversar sobre migração, escreve. Se está em Nomad e está bem, fica em Nomad — e aproveita pra ler o contrato com mais atenção da próxima vez que chegar uma renovação. Essa é a verdadeira lição de agosto de 2023.",{"title":229,"searchDepth":244,"depth":244,"links":23606},[23607,23608,23609,23610,23611,23612,23613,23614,23615,23616,23617],{"id":23052,"depth":244,"text":23053},{"id":23075,"depth":244,"text":23076},{"id":23103,"depth":244,"text":23104},{"id":23134,"depth":244,"text":23135},{"id":23156,"depth":244,"text":23157},{"id":23190,"depth":244,"text":23191},{"id":4825,"depth":244,"text":4826},{"id":23414,"depth":244,"text":23415},{"id":23488,"depth":244,"text":23489},{"id":16601,"depth":244,"text":16602},{"id":3309,"depth":244,"text":3310},"2026-02-19","HashiCorp trocou a licença do Nomad em agosto de 2023 e foi adquirida pela IBM em fevereiro de 2025. Pra quem está adotando hoje, é um asterisco grande.",{},"\u002Fblog\u002Fheroctl-vs-nomad",{"title":23041,"description":23619},{"loc":23621},"blog\u002Fheroctl-vs-nomad",[23626,23627,23628,23629,8764,6394],"nomad","hashicorp","ibm","bsl","ldA_zoX2zVOSfHZp3m3ZByftSpWCup4Q80hma-jYWWw",{"id":23632,"title":23633,"author":7,"body":23634,"category":8764,"cover":3380,"date":24174,"description":24175,"draft":3383,"extension":3384,"lastReviewed":3380,"meta":24176,"navigation":411,"path":24177,"readingTime":8769,"seo":24178,"sitemap":24179,"stem":24180,"tags":24181,"__hash__":24186},"blog_pt\u002Fblog\u002Frender-vs-railway-vs-fly-io-comparativo.md","Render vs Railway vs Fly.io: comparativo brasileiro 2026",{"type":9,"value":23635,"toc":24162},[23636,23639,23642,23645,23649,23652,23663,23666,23669,23672,23676,23687,23693,23699,23705,23711,23717,23721,23724,23729,23734,23739,23744,23749,23753,23756,23765,23770,23781,23786,23791,23793,23984,23987,23991,23994,24000,24006,24012,24018,24021,24025,24028,24034,24040,24046,24052,24056,24059,24065,24071,24077,24083,24085,24091,24097,24106,24112,24118,24124,24134,24136,24139,24142,24144,24149,24159],[12,23637,23638],{},"Em agosto de 2022 a Salesforce anunciou o fim do plano gratuito do Heroku. A decisão foi escrita em duas linhas num post de blog corporativo, virou meme em três horas, e em três meses estava reescrevendo o mapa de PaaS hospedado pra todo dev indie do mundo. Brasileiro pegou o golpe duas vezes: perdeu o tier grátis e ainda viu o dólar subir de R$5,20 pra R$5,90 no mesmo período.",[12,23640,23641],{},"Três produtos pegaram a maior parte da herança: Render, Railway e Fly.io. Cada um aposta numa filosofia diferente — preço fixo previsível, pay-as-you-go com UI bonita, ou edge multi-região com primitivas de baixo nível. Pra dev brasileiro, a escolha mistura DX, custo em USD que vira reais, latência pra São Paulo, e o teto de escala antes do projeto começar a doer no bolso.",[12,23643,23644],{},"Esse artigo é o mapa honesto. Sem ranking de \"melhor\", porque não existe — existe o melhor pra cada estágio. E no fim da linha, quando os três ficam caros, existe o caminho do auto-hospedado, que é onde o HeroCtl entra. Mas vamos por partes.",[19,23646,23648],{"id":23647},"a-heranca-do-heroku","A herança do Heroku",[12,23650,23651],{},"Pra entender o que cada um copiou e o que cada um descartou, vale lembrar o que o Heroku fez bem nos seus dez anos de glória.",[12,23653,23654,23655,23658,23659,23662],{},"A primeira coisa foi ",[231,23656,23657],{},"git push heroku main",". Aquele comando virou o padrão mental de deploy pra uma geração inteira de devs. Não tinha pipeline a configurar, não tinha registro de imagem a popular, não tinha arquivo de orquestração a escrever. Você empurrava código pro repositório remoto e a plataforma cuidava do resto — buildpack detectava a linguagem, instalava dependências, subia o processo. Render e Railway herdaram isso quase intacto. Fly.io trocou por ",[231,23660,23661],{},"fly deploy",", que tem a mesma cara mas trabalha com imagem de contêiner explícita.",[12,23664,23665],{},"A segunda coisa foi a noção de \"dyno\" como unidade de cobrança e escala. Você não pensava em servidor, vCPU ou RAM — pensava em quantos processos web e quantos workers. Render manteve essa simplificação no plano Starter. Railway abandonou e cobra pelo recurso real consumido. Fly.io trocou dyno por VM com tamanho declarado.",[12,23667,23668],{},"A terceira coisa foi o marketplace de addons: Postgres, Redis, MongoDB, e-mail transacional, tudo a um clique. Esse é o pedaço onde os três sucessores divergem mais. Render tem alguns addons gerenciados nativos. Railway tem um marketplace de templates que cobre o básico. Fly.io te empurra pra rodar seu próprio Postgres num app dedicado, com toda a responsabilidade que isso traz.",[12,23670,23671],{},"E a quarta coisa, a dolorosa, foi o vendor lock-in disfarçado de simplicidade. Quem tinha cinquenta serviços no Heroku descobriu em 2022 que migrar custaria meses. Os três sucessores prometem ser melhores nesse quesito; veremos.",[19,23673,23675],{"id":23674},"render-o-heroku-20-previsivel","Render: o \"Heroku 2.0 previsível\"",[12,23677,23678,23679,23682,23683,23686],{},"Render é o sucessor mais conservador. A premissa é simples: você descreve o serviço num arquivo ",[231,23680,23681],{},"render.yaml"," ou pelo painel, conecta o repositório, e cada push em ",[231,23684,23685],{},"main"," dispara um deploy. Build, certificado TLS, domínio customizado, tudo automático.",[12,23688,23689,23692],{},[27,23690,23691],{},"Filosofia."," Preços fixos por instância. A instância Starter mais barata custa US$7\u002Fmês — e custa US$7\u002Fmês independente de você fazer cinco requests por dia ou cinquenta mil. Existe um plano free, mas com asterisco grande: o serviço dorme depois de quinze minutos sem tráfego e leva uns trinta segundos pra acordar no primeiro request. É exatamente o mesmo trade-off do Heroku free de 2015. Funciona pra portfolio, não funciona pra produto sério.",[12,23694,23695,23698],{},[27,23696,23697],{},"Pontos fortes."," A previsibilidade do orçamento é o grande chamariz pra time pequeno. Você sabe que três serviços Starter vão custar US$21\u002Fmês, ponto. Não tem surpresa de fim de mês porque um cron rodou em loop. Postgres e Redis gerenciados existem como produtos próprios, com backup automático e versão recente. O painel é limpo, foca em fazer poucas coisas bem. Latência pra São Paulo a partir do datacenter de Ohio fica em torno de 120ms — não é ideal, mas é viável pra app web típico onde o gargalo costuma ser query de banco.",[12,23700,23701,23704],{},[27,23702,23703],{},"Pontos fracos."," O free tier dormindo é triste pra qualquer coisa que não seja vitrine pessoal. Escalar custa caro porque é linear: quatro instâncias Starter custam quatro vezes US$7. Não há multi-region nativo no plano básico — você fica preso à região que escolheu. CDN e edge computing são limitados; quem precisa de cache geográfico pesado vai sofrer. E o Postgres gerenciado começa em US$7\u002Fmês, então o piso real de um app com banco é US$14\u002Fmês, o que pra MVP em estágio zero de receita já incomoda.",[12,23706,23707,23710],{},[27,23708,23709],{},"Custo em real."," App simples sem banco: US$7\u002Fmês = R$36 a R$40 dependendo do câmbio. Com Postgres mínimo: US$14\u002Fmês = R$72 a R$80. Versão de produção com duas instâncias web e Postgres Standard (US$20\u002Fmês): US$34\u002Fmês = R$170 a R$190. Some domínio, e-mail transacional, monitoring e você está em R$300\u002Fmês fácil pra um SaaS pequeno. Não é caro pelo padrão americano. É caro pelo padrão brasileiro de quem tira o salário do próprio MRR.",[12,23712,23713,23716],{},[27,23714,23715],{},"Quando faz sentido."," Indie hacker que já está no Heroku e quer migrar com o mínimo de fricção mental. Time de uma a três pessoas que valoriza orçamento previsível mais do que custo mínimo absoluto. App web tradicional sem requisitos de baixa latência geográfica. Projeto onde você prefere pagar US$30\u002Fmês e não pensar mais a pagar US$10\u002Fmês com possibilidade de explodir pra US$80 num mês ruim.",[19,23718,23720],{"id":23719},"railway-o-pay-as-you-go-com-ux-premium","Railway: o \"pay-as-you-go com UX premium\"",[12,23722,23723],{},"Railway é o sucessor que ousou inverter o modelo de cobrança. Em vez de instância fixa, você paga pelo recurso real consumido — vCPU, RAM, network egress, storage. A premissa é que apps pequenos e jobs intermitentes ficam mais baratos no pay-as-you-go do que no instance-based.",[12,23725,23726,23728],{},[27,23727,23691],{}," Cobrança granular por uso real. Você não escolhe tamanho de máquina, você escolhe o app e o Railway decide quanto recurso entregar conforme a demanda, dentro de um teto. UI excelente — provavelmente a mais bonita do segmento PaaS hospedado. Templates one-click cobrem dezenas de combinações: Postgres, Redis, MongoDB, MeiliSearch, n8n, Strapi.",[12,23730,23731,23733],{},[27,23732,23697],{}," A UX vence no primeiro contato. Em quinze minutos você tem um app rodando com banco, Redis e dashboard de logs em tempo real. O marketplace de templates é amigável pra quem não quer escrever Dockerfile. Pra apps low-traffic o pay-as-you-go pode sair bem mais barato que instância fixa do Render — um cron que roda dez segundos por dia paga só esses dez segundos, não vinte e quatro horas.",[12,23735,23736,23738],{},[27,23737,23703],{}," Custo imprevisível é o calcanhar. O Railway tem teto suave de gasto, mas não rígido por padrão — um job em loop infinito pode queimar US$50 num fim de semana antes de você perceber. O pricing tem letras miúdas: o plano Hobby (US$5\u002Fmês) inclui US$5 de uso, então tecnicamente você começa do zero todo mês, mas a conta pode passar disso fácil. O plano gratuito original foi removido em 2023 — outra repetição do padrão Heroku. Datacenter é US-only, latência pra SP fica nos mesmos 120ms do Render. E houve histórico de mudanças de pricing que pegaram usuários de surpresa, tipo a remoção do trial mais generoso em meados de 2023.",[12,23740,23741,23743],{},[27,23742,23709],{}," Hobby plan: US$5\u002Fmês fixo = R$25 a R$28. Mas o uso real costuma puxar a conta pra US$10-20\u002Fmês num app com banco e workers leves = R$50 a R$110. Em mês ruim, com pico de tráfego, é fácil ver a conta encostar em US$30-40 = R$150 a R$220. O segundo desvio padrão é o que assusta.",[12,23745,23746,23748],{},[27,23747,23715],{}," Time pequeno em fase de experimentação, lançando dezenas de testes por semana, onde a maioria nunca pega tráfego e seria desperdício pagar instância fixa. Apps low-traffic genuinamente pequenos onde pay-per-use sai mais barato no longo prazo. Devs que valorizam UI bonita e fluxo de deploy sem fricção acima de previsibilidade rígida de orçamento. Projetos pessoais que rodam em rajada.",[19,23750,23752],{"id":23751},"flyio-o-edge-multi-region-pra-workloads-serios","Fly.io: o \"edge multi-region pra workloads sérios\"",[12,23754,23755],{},"Fly.io é o mais técnico dos três. A premissa é diferente desde a base: seu app não roda numa região, ele roda em várias. Quando um usuário no Brasil acessa, o request bate na região mais próxima — e Fly.io tem ponto em São Paulo, o GRU. Pra latência percebida pelo usuário brasileiro, isso é a coisa mais importante do mercado de PaaS hoje.",[12,23757,23758,23760,23761,23764],{},[27,23759,23691],{}," Aplicação global por padrão. VMs reais (não contêineres compartilhados) em cima do Firecracker. Primitivas de baixo nível — você lida com ",[231,23762,23763],{},"fly.toml",", com volumes persistentes regionais, com rede privada entre apps via WireGuard, com IPs anycast. Mais poder, mais responsabilidade.",[12,23766,23767,23769],{},[27,23768,23697],{}," O datacenter GRU é vantagem real e mensurável: latência pra usuário em São Paulo cai de 120ms (Render\u002FRailway via US) pra 30-60ms. Pra app interativo, isso é a diferença entre \"rápido\" e \"instantâneo\". Multi-region é nativo — você roda o mesmo binário em três continentes, e o roteamento bate na região mais perto do usuário. Volumes persistentes regionais permitem patterns como Postgres com Litestream replicando pra storage de objeto. O pricing começa muito barato: US$1.94\u002Fmês pela menor VM (shared-cpu-1x, 256MB), mais frações de centavo por GB transferido.",[12,23771,23772,23774,23775,571,23778,23780],{},[27,23773,23703],{}," Curva de aprendizado real. ",[231,23776,23777],{},"flyctl",[231,23779,23763],{},", conceitos de Machines vs Apps, redes WireGuard — tudo isso você tem que digerir. Não é \"abre painel e clica deploy\", é \"leia a doc por uma tarde\". Pricing variável tipo Railway, com a mesma armadilha: app que cresce de repente pode triplicar o custo num mês. A comunidade é menor que Render\u002FRailway, especialmente em PT-BR — encontrar tutorial brasileiro recente é tarefa. E houve incidentes de estabilidade reportados publicamente em 2023-2024 que afetaram confiança da base; melhoraram, mas a memória ainda pesa.",[12,23782,23783,23785],{},[27,23784,23709],{}," App pequeno com VM mínima e storage modesto: US$2-6\u002Fmês = R$10 a R$32. Postgres rodado como app dedicado (você é responsável pelo backup): mais US$2-10\u002Fmês = R$10 a R$50. App produção sério com duas regiões e bandwidth real: US$15-40\u002Fmês = R$80 a R$220. A faixa baixa é imbatível pra projeto pessoal; a faixa alta começa a competir com auto-hospedado em VPS dedicada.",[12,23787,23788,23790],{},[27,23789,23715],{}," B2B SaaS com clientes distribuídos em múltiplas regiões — app que precisa estar em US-East e em GRU simultaneamente sem você operar dois clusters. App onde latência pra usuário brasileiro é diferencial competitivo. Time confortável com primitivas tipo VM, rede mesh, storage block regional — tipicamente devs que têm background em DevOps ou que migraram de bare-metal. Projeto pessoal de hobby onde os US$2\u002Fmês pagam cinco apps de uma vez.",[19,23792,17385],{"id":17384},[119,23794,23795,23808],{},[122,23796,23797],{},[125,23798,23799,23801,23803,23805],{},[128,23800,2983],{},[128,23802,15023],{},[128,23804,15026],{},[128,23806,23807],{},"Fly.io",[141,23809,23810,23824,23838,23852,23866,23879,23893,23904,23916,23930,23944,23958,23972],{},[125,23811,23812,23815,23818,23821],{},[146,23813,23814],{},"Custo mínimo USD\u002Fmês (app real)",[146,23816,23817],{},"US$7 (Starter)",[146,23819,23820],{},"US$5 (Hobby plan) + uso",[146,23822,23823],{},"US$2-3 (shared-cpu-1x)",[125,23825,23826,23829,23832,23835],{},[146,23827,23828],{},"Custo mínimo R$\u002Fmês (câmbio R$5,50)",[146,23830,23831],{},"~R$40",[146,23833,23834],{},"~R$30 + uso variável",[146,23836,23837],{},"~R$15",[125,23839,23840,23843,23846,23849],{},[146,23841,23842],{},"Modelo de cobrança",[146,23844,23845],{},"Instância fixa",[146,23847,23848],{},"Pay-as-you-go",[146,23850,23851],{},"VM declarada + uso",[125,23853,23854,23857,23860,23863],{},[146,23855,23856],{},"Latência pra São Paulo",[146,23858,23859],{},"~120ms (Ohio)",[146,23861,23862],{},"~120ms (US)",[146,23864,23865],{},"~30-60ms (GRU)",[125,23867,23868,23871,23874,23876],{},[146,23869,23870],{},"Multi-region nativo",[146,23872,23873],{},"Não no plano base",[146,23875,3059],{},[146,23877,23878],{},"Sim, central no produto",[125,23880,23881,23884,23887,23890],{},[146,23882,23883],{},"Free tier real",[146,23885,23886],{},"Sim, com sleep",[146,23888,23889],{},"Removido em 2023",[146,23891,23892],{},"Não, mas piso muito baixo",[125,23894,23895,23897,23899,23901],{},[146,23896,14426],{},[146,23898,3059],{},[146,23900,3059],{},[146,23902,23903],{},"Sim (GRU)",[125,23905,23906,23909,23911,23913],{},[146,23907,23908],{},"Preview deploys por PR",[146,23910,3065],{},[146,23912,3065],{},[146,23914,23915],{},"Sim, via CLI",[125,23917,23918,23921,23924,23927],{},[146,23919,23920],{},"Postgres gerenciado",[146,23922,23923],{},"Sim, US$7\u002Fmês",[146,23925,23926],{},"Sim, via template",[146,23928,23929],{},"Não nativo (você roda)",[125,23931,23932,23935,23938,23941],{},[146,23933,23934],{},"Scale automático",[146,23936,23937],{},"Manual no Starter",[146,23939,23940],{},"Sim, vertical e horizontal",[146,23942,23943],{},"Sim, via Machines API",[125,23945,23946,23949,23952,23955],{},[146,23947,23948],{},"Lock-in de plataforma",[146,23950,23951],{},"Médio (alguns addons proprietários)",[146,23953,23954],{},"Alto (templates customizados)",[146,23956,23957],{},"Baixo (Dockerfile padrão)",[125,23959,23960,23963,23966,23969],{},[146,23961,23962],{},"Foco da audiência",[146,23964,23965],{},"Ex-Heroku previsível",[146,23967,23968],{},"Indie hacker UI-first",[146,23970,23971],{},"Dev técnico edge-first",[125,23973,23974,23976,23979,23981],{},[146,23975,14473],{},[146,23977,23978],{},"Pequena, crescendo",[146,23980,4921],{},[146,23982,23983],{},"Muito pequena",[12,23985,23986],{},"A tabela esconde nuance que vale explicitar: nenhum dos três é \"melhor\" em tudo. Render ganha em previsibilidade. Railway ganha em UX. Fly.io ganha em performance pra usuário brasileiro. A escolha é função do que você está otimizando.",[19,23988,23990],{"id":23989},"o-que-os-tres-tem-em-comum-e-onde-o-heroctl-entra","O que os três têm em comum (e onde o HeroCtl entra)",[12,23992,23993],{},"Quatro pontos os três compartilham, e cada um deles é um motivo pra eventualmente sair.",[12,23995,23996,23999],{},[27,23997,23998],{},"Primeiro: cobrança em USD."," Nenhum dos três fatura em real. Câmbio sobe, sua conta sobe junto, e você descobre em fevereiro que a infra que custava R$300 em janeiro custa R$340 sem nenhuma mudança técnica. Pra time bootstrapped sem proteção cambial, isso é exposição que ninguém pediu pra ter.",[12,24001,24002,24005],{},[27,24003,24004],{},"Segundo: você não controla o servidor."," Você não escolhe o kernel, não tem acesso SSH, não roda processo em background fora do que a plataforma permite. Pra noventa por cento dos casos isso é vantagem. Pros dez por cento restantes — quando você precisa de fine-tuning, de daemon customizado, de alguma capability específica do sistema operacional — você está limitado.",[12,24007,24008,24011],{},[27,24009,24010],{},"Terceiro: free tiers minguando ano após ano."," Heroku matou o free em 2022. Railway removeu o trial generoso em 2023. Render mantém free com sleep mas tem reduzido limites. O padrão é claro: o free tier serve pra adquirir dev em estágio zero de receita; quando o produto cresce, a empresa precisa monetizar e o free encolhe. Não é traição, é economia. Mas implica que sua estratégia de longo prazo não pode depender do free continuar como está.",[12,24013,24014,24017],{},[27,24015,24016],{},"Quarto e mais importante: quando a startup cresce, o custo escala desproporcionalmente."," App pequeno US$15\u002Fmês é desprezível. App real com cinco serviços, dois bancos, Redis, e dois ambientes (staging + prod) começa em US$80-150\u002Fmês — entre R$450 e R$850. Some workers, jobs em background, monitoring, e você passa de US$200\u002Fmês fácil. É nesse ponto que o auto-hospedado deixa de ser hobby de DevOps e vira economia clara.",[12,24019,24020],{},"A faixa típica onde o trade-off vira: quando seu PaaS hospedado passa de US$50\u002Fmês de gastos consistentes, três VPS Hetzner de US$5 cada (~R$80 total) rodando uma plataforma de orquestração começam a fazer sentido financeiro. Você troca conveniência por economia, e ganha controle do servidor de quebra. O HeroCtl é desenhado pra essa faixa: instalação simples, alta disponibilidade real entre múltiplos servidores, certificados automáticos, painel web. Sem cerimônia operacional, sem time de SRE.",[19,24022,24024],{"id":24023},"decisao-por-estagio-do-projeto","Decisão por estágio do projeto",[12,24026,24027],{},"A pergunta certa não é \"qual é o melhor PaaS\", é \"qual é o melhor pro estágio onde estou agora\".",[12,24029,24030,24033],{},[27,24031,24032],{},"Estágio hobby, zero receita."," Render free tier (com sleep), ou Fly.io aproveitando a faixa mínima (US$2-3\u002Fmês cobre projeto pessoal), ou um VPS de US$5 mensais com Coolify rodando solo se você curte mexer. Railway perdeu posto aqui depois de remover o tier grátis original.",[12,24035,24036,24039],{},[27,24037,24038],{},"Estágio indie hacker, até US$5k MRR."," Render se você prioriza orçamento previsível e o app tem perfil \"instância roda 24\u002F7 com tráfego constante\". Railway se você está experimentando muito, quer UI bonita, e o pay-as-you-go vai te favorecer. Custo nessa faixa fica em US$15-50\u002Fmês, gerenciável.",[12,24041,24042,24045],{},[27,24043,24044],{},"Estágio startup early, US$5k a US$50k MRR."," Hora de avaliar com seriedade. Se latência pra usuário brasileiro importa (B2C, app interativo), Fly.io vira candidato forte por causa do GRU. Se o time já tem um dev confortável com infra básica, auto-hospedado simples (Coolify num servidor, ou HeroCtl em três pra alta disponibilidade) começa a pagar. A conta nessa faixa em PaaS hospedado roda em US$80-300\u002Fmês — em auto-hospedado, R$150-400\u002Fmês com mais headroom.",[12,24047,24048,24051],{},[27,24049,24050],{},"Estágio startup com primeiro cliente B2B sério, SLA exigido."," Aqui o PaaS hospedado começa a quebrar de outras maneiras: você precisa de SLA contratual, de redundância em múltiplos servidores, de janela de manutenção previsível, de logs de auditoria. Render e Railway não oferecem SLA forte no plano padrão. Fly.io oferece, mas a multi-region implica complexidade operacional que a equipe vai ter que aprender de qualquer jeito. Esse é o ponto onde o HeroCtl com cluster de três servidores entra como alternativa: alta disponibilidade real, painel administrativo, auditoria, sem o mensalidade de US$300+ do PaaS hospedado pra mesmo nível de robustez. A outra opção é o caminho oposto: AWS gerenciado se algum cliente puxa requisitos de compliance específicos.",[19,24053,24055],{"id":24054},"quando-nao-sair-de-render-railway-ou-flyio","Quando NÃO sair de Render, Railway ou Fly.io",[12,24057,24058],{},"Migração custa caro, e na maior parte dos casos é otimização prematura. Quatro situações claras pra ficar onde você está.",[12,24060,24061,24064],{},[27,24062,24063],{},"Time de uma ou duas pessoas sem nenhum tempo pra coisa operacional."," Se você é fundador solo no produto e cada hora gasta em infra é uma hora não gasta em vendas, manter o PaaS é decisão correta. R$200\u002Fmês de hospedado é mais barato que dezessete horas suas no mês mexendo em servidor.",[12,24066,24067,24070],{},[27,24068,24069],{},"Custo de plataforma é desprezível comparado à receita."," Regra simples: se a infra é menos de dois por cento do MRR, não otimize. SaaS de US$50k MRR gastando US$500\u002Fmês de hospedado está pagando um por cento de infra. É excelente. Mexer ali é micromizar pra economizar moedas.",[12,24072,24073,24076],{},[27,24074,24075],{},"Você usa addon proprietário sem substituto fácil."," Se você depende de algum addon específico de Railway que não tem equivalente óbvio fora — algum template customizado com integração proprietária, alguma feature única — a migração não é só re-deploy, é re-arquitetura. Avalie o custo total antes.",[12,24078,24079,24082],{},[27,24080,24081],{},"Migração levaria mais de duas semanas e a empresa não pode parar pra isso."," Há momentos em que o produto está em hiper-crescimento, ou em ciclo crítico de funding, ou simplesmente em sprint de feature que importa pro cliente. Não migre infra nessas janelas. Anote a dívida técnica e volte depois.",[19,24084,3226],{"id":3225},[12,24086,24087,24090],{},[27,24088,24089],{},"Posso usar Render pra produção e Railway pra staging?","\nPode, e tem gente que faz. A justificativa é simples: produção exige previsibilidade (Render brilha aí), staging tem tráfego rajado e idealmente deveria custar pouco quando ninguém está usando (Railway pay-as-you-go vence). O custo de manter dois fornecedores é o overhead mental de duas dashboards e dois conjuntos de credenciais. Faz sentido pra time disciplinado, atrapalha pra time pequeno que prefere monocultura.",[12,24092,24093,24096],{},[27,24094,24095],{},"Fly.io GRU region é confiável?","\nHoje sim, com asterisco. Funciona bem desde 2023, latência mensurada pra SP\u002FRJ é o que promete (30-60ms tipicamente). O asterisco é que GRU é uma região menor no portfólio do Fly, então capacidade pode ficar apertada em picos e features novas costumam chegar em US-East primeiro. Pra produção séria, vale rodar em pelo menos duas regiões (GRU + uma US) com failover.",[12,24098,24099,24102,24103,24105],{},[27,24100,24101],{},"Como migro de Render pra HeroCtl sem downtime?","\nRoteiro pragmático: provisione três VPS, instale o HeroCtl, suba a aplicação em paralelo apontando pra um domínio temporário. Replique o banco com ",[231,24104,5737],{}," + carga inicial, depois mantenha em sincronia com replicação lógica até o switchover. Quando estiver pronto, troque o DNS do domínio principal pro novo cluster com TTL baixo. A janela de risco fica em torno do TTL do DNS — tipicamente cinco a dez minutos. Bancos pequenos (até alguns GB) migram numa tarde; bancos grandes pedem janela coordenada.",[12,24107,24108,24111],{},[27,24109,24110],{},"Postgres gerenciado nesses três é bom?","\nRender Postgres é decente, com backup automático e versão atualizada — equivalente ao Heroku Postgres clássico. Railway Postgres via template funciona, mas o backup é mais manual e a configuração default é conservadora. Fly.io não tem Postgres gerenciado próprio; você roda como app, o que dá controle e responsabilidade. Pra time que não quer cuidar de banco, Render leva nesse quesito. Pra time que prefere controle, Fly.io.",[12,24113,24114,24117],{},[27,24115,24116],{},"Qual desses tem suporte em português?","\nNenhum oficialmente. Documentação é toda em inglês, suporte por chat\u002Fe-mail é em inglês. Há comunidades não-oficiais em PT-BR no Discord e no Twitter pra cada um, mas a maioria dos tickets sérios você abre em inglês. Pra time desconfortável com isso, é variável que pesa.",[12,24119,24120,24123],{},[27,24121,24122],{},"E performance pra app Rails \u002F Django \u002F Node?","\nPros três frameworks os três PaaS funcionam bem. Render tem buildpack Rails maduro e roda Sidekiq fácil. Railway detecta Django e Node automaticamente via templates. Fly.io tem documentação específica pra Rails e pra Phoenix, com deploy guides oficiais. A diferença prática aparece em detalhes: Rails com asset pipeline pesado fica mais rápido em Render por causa do build cache previsível; Node com workers em background ganha no Railway pelo pay-as-you-go; qualquer framework ganha em Fly.io se o usuário está no Brasil por causa do GRU.",[12,24125,24126,24129,24130,24133],{},[27,24127,24128],{},"Preview deploys por PR funcionam nos três?","\nSim nos três, com nuances. Render tem o melhor: cada PR vira uma URL temporária automaticamente, sem configuração extra. Railway oferece via integração com o repositório, configuração simples. Fly.io faz via CLI (",[231,24131,24132],{},"fly deploy --config preview.toml",") e exige um pouco mais de setup manual ou um workflow de CI customizado. Pra time que prioriza preview deploys como parte do code review, Render é o mais fluido.",[19,24135,3310],{"id":3309},[12,24137,24138],{},"A escolha entre Render, Railway e Fly.io não tem resposta universal. Render é o conservador previsível. Railway é o experimentador com UI bonita. Fly.io é o técnico com vantagem real de latência pro Brasil. Os três são honestos sobre o que são, e os três têm o mesmo destino estrutural: a partir de certo ponto de crescimento, o custo em USD escala mais rápido que sua receita em real, e o auto-hospedado começa a fazer sentido.",[12,24140,24141],{},"Quando esse ponto chegar, considere o HeroCtl. Três servidores Linux, alta disponibilidade real entre eles, certificados automáticos, painel web embutido, sem cerimônia operacional. Plano Community gratuito pra sempre, planos Business e Enterprise pra quando o time precisar de SSO, auditoria e suporte com SLA. Sem mudança retroativa de contrato.",[12,24143,22426],{},[224,24145,24147],{"className":24146,"code":5319,"language":2530},[2528],[231,24148,5319],{"__ignoreMap":229},[12,24150,24151,24152,24154,24155,24158],{},"Se quiser ler antes, dois posts complementares: ",[3337,24153,19767],{"href":19766}," cobre a tese geral de quando largar o PaaS hospedado, e ",[3337,24156,24157],{"href":14883},"Alternativas brasileiras ao Kubernetes"," entra no mérito de qual orquestrador faz sentido pra time pequeno fora dos três PaaS deste artigo.",[12,24160,24161],{},"A escolha boa é a que cabe no seu estágio agora, não a que parece sofisticada. Comece simples, migre quando o custo justificar, e nunca antes.",{"title":229,"searchDepth":244,"depth":244,"links":24163},[24164,24165,24166,24167,24168,24169,24170,24171,24172,24173],{"id":23647,"depth":244,"text":23648},{"id":23674,"depth":244,"text":23675},{"id":23719,"depth":244,"text":23720},{"id":23751,"depth":244,"text":23752},{"id":17384,"depth":244,"text":17385},{"id":23989,"depth":244,"text":23990},{"id":24023,"depth":244,"text":24024},{"id":24054,"depth":244,"text":24055},{"id":3225,"depth":244,"text":3226},{"id":3309,"depth":244,"text":3310},"2026-02-12","Os três PaaS hospedados que devs brasileiros mais usam pra escapar do Heroku. Cada um tem trade-off diferente. Análise honesta de quando ficar em cada e quando partir pra auto-hospedado.",{},"\u002Fblog\u002Frender-vs-railway-vs-fly-io-comparativo",{"title":23633,"description":24175},{"loc":24177},"blog\u002Frender-vs-railway-vs-fly-io-comparativo",[24182,24183,24184,24185,8764,14948],"render","railway","fly-io","paas","necLnKyyCDcHoJ-5v9l9jQ88TtlYM4AjuqL7Jb1logk",{"id":24188,"title":24189,"author":7,"body":24190,"category":8764,"cover":3380,"date":25337,"description":25338,"draft":3383,"extension":3384,"lastReviewed":3380,"meta":25339,"navigation":411,"path":25340,"readingTime":4401,"seo":25341,"sitemap":25342,"stem":25343,"tags":25344,"__hash__":25348},"blog_pt\u002Fblog\u002Falternativa-ao-vercel-self-hosted.md","Alternativa ao Vercel: hospedar Next.js sem lock-in",{"type":9,"value":24191,"toc":25310},[24192,24195,24198,24202,24205,24237,24240,24243,24247,24251,24254,24257,24260,24263,24267,24270,24273,24284,24295,24312,24323,24327,24330,24333,24357,24360,24364,24367,24371,24374,24380,24386,24392,24395,24399,24402,24405,24416,24419,24422,24426,24429,24432,24438,24441,24444,24448,24451,24668,24671,24675,24678,24684,24690,24696,24702,24705,24709,24712,24716,24754,24757,24761,24775,24819,24826,24935,24938,24942,24945,24984,24987,24991,24994,25030,25034,25037,25044,25047,25051,25054,25085,25088,25092,25095,25116,25119,25123,25126,25131,25151,25156,25172,25178,25181,25183,25189,25198,25212,25222,25244,25259,25265,25267,25270,25273,25276,25292,25295,25304,25307],[12,24193,24194],{},"Vercel é o melhor produto de DX que existe pra Next.js. Build automático em cada push, preview deploys com URL única por commit, edge runtime que roda perto do usuário, ISR funcionando com uma linha de configuração, analytics e Web Vitals integrados sem instalar nada. Pra quem está começando uma aplicação Next.js sozinho, é objetivamente a melhor escolha técnica.",[12,24196,24197],{},"A conta começa a doer em três pontos previsíveis. Esse post mapeia esses pontos com números reais, defende o Vercel onde ele acerta, e mostra três rotas de saída — cada uma com seu trade-off. No fim, um passo a passo de migração técnica e um cálculo concreto de quanto um time brasileiro economiza ao sair.",[19,24199,24201],{"id":24200},"onde-o-vercel-acerta","Onde o Vercel acerta",[12,24203,24204],{},"Vale começar pela parte difícil de admitir. Vercel resolve problemas reais que outros provedores não resolvem com a mesma elegância:",[2735,24206,24207,24213,24219,24225,24231],{},[70,24208,24209,24212],{},[27,24210,24211],{},"Zero-config pra Next.js."," O time do Vercel mantém o framework. Cada release nova tem suporte testado no provedor antes de virar GA. Você não precisa configurar adapter, runtime, build cache, nada.",[70,24214,24215,24218],{},[27,24216,24217],{},"Preview deploys por commit."," Cada pull request abre uma URL pública isolada com o build daquele commit. Designer revisa, PM aprova, QA testa — sem subir staging compartilhado.",[70,24220,24221,24224],{},[27,24222,24223],{},"Edge functions globais."," Código roda em mais de 30 regiões simultaneamente. Pra usuário em São Paulo, a latência de cold start é menor que muito servidor dedicado em GRU.",[70,24226,24227,24230],{},[27,24228,24229],{},"ISR e SSG out-of-the-box."," Página estática com revalidação programada funciona sem configurar CDN externo, sem invalidação manual.",[70,24232,24233,24236],{},[27,24234,24235],{},"Analytics e Web Vitals nativos."," Sem instalar script de terceiro, sem adicionar peso no bundle, métricas reais de Core Web Vitals em produção.",[12,24238,24239],{},"Pra solo dev brasileiro com SaaS de US$5k MRR, com app pequeno e tráfego controlado, o Vercel custa US$20\u002Fmês e libera o desenvolvedor pra escrever produto. É a escolha certa. Não tem ironia nessa frase.",[12,24241,24242],{},"O problema é o que acontece depois que o produto cresce.",[19,24244,24246],{"id":24245},"os-tres-pontos-onde-doi","Os três pontos onde dói",[368,24248,24250],{"id":24249},"ponto-1-custo-escalonado-em-usd","Ponto 1 — Custo escalonado em USD",[12,24252,24253],{},"O plano Pro custa US$20 por desenvolvedor por mês como piso. Em real, com câmbio rondando R$5, isso vira aproximadamente R$100 por dev por mês. Time de cinco pessoas começa em R$500\u002Fmês só de licença, antes de qualquer tráfego ou compute.",[12,24255,24256],{},"A partir daí o custo é por uso. Funções serverless cobram por GB-segundo de execução mais invocação por requisição. Tráfego de saída cobra por GB. Vercel KV, Vercel Postgres, Vercel Blob — cada serviço gerenciado tem sua tabela de preços, todas em USD.",[12,24258,24259],{},"A consequência operacional é fatura imprevisível. Tráfego sazonal — Black Friday, lançamento de feature, citação na imprensa — multiplica por dez o custo daquele mês. Em USD, com câmbio variando 5% num mês ruim, você descobre que orçou em R$5,00 e fechou em R$5,30. A multiplicação é clara: 10x de tráfego e 6% de câmbio adicional vira fatura 10,6x maior em real.",[12,24261,24262],{},"Pra startup brasileira com revenue em real e custo em dólar, o spread de margem some primeiro. Pra agência que cobra cliente em real e paga infra em dólar, a margem some segundo.",[368,24264,24266],{"id":24265},"ponto-2-lock-in-de-primitivas","Ponto 2 — Lock-in de primitivas",[12,24268,24269],{},"Esse é o ponto que ninguém vê até precisar sair.",[12,24271,24272],{},"ISR (Incremental Static Regeneration) é uma feature do Next.js, mas a implementação otimizada do Vercel usa CDN proprietária com invalidação de tag global. Self-hosted, ISR funciona localmente — cada nó tem sua cópia do cache em disco. Pra invalidar uma tag em três nós você precisa de orquestração explícita.",[12,24274,24275,24276,24279,24280,24283],{},"Edge runtime usa primitivas no estilo Cloudflare Workers — ",[231,24277,24278],{},"fetch"," global, sem acesso a ",[231,24281,24282],{},"fs",", sem módulos Node nativos. Código escrito pra edge não roda direto em Node tradicional sem refator.",[12,24285,24286,24287,24290,24291,24294],{},"Image Optimization roda na infra do Vercel. Você manda ",[231,24288,24289],{},"\u003CImage src=\"\u002Ffoo.jpg\" \u002F>"," e o provedor entrega WebP redimensionado, com cache global. Self-hosted, você precisa rodar ",[231,24292,24293],{},"sharp"," na build, ou usar um proxy de imagem dedicado, ou desabilitar a feature.",[12,24296,24297,24298,2630,24301,24303,24304,24307,24308,24311],{},"Vercel KV, Postgres e Blob são wrappers de Upstash Redis, Neon Postgres e armazenamento S3-compatível com SDK próprio. Migrar de ",[231,24299,24300],{},"@vercel\u002Fkv",[231,24302,7369],{}," direto é uma tarde de refator. Migrar de ",[231,24305,24306],{},"@vercel\u002Fpostgres"," pra cliente padrão é mais uma tarde. Migrar de ",[231,24309,24310],{},"@vercel\u002Fblob"," pra S3 envolve revisar cada upload no app.",[12,24313,24314,24315,24318,24319,24322],{},"Nenhuma dessas barreiras é intransponível. Mas saída do Vercel não é ",[231,24316,24317],{},"git remote set-url"," seguido de ",[231,24320,24321],{},"vercel logout",". É uma sprint de refator pra app de tamanho médio.",[368,24324,24326],{"id":24325},"ponto-3-bandwidth-e-funcoes-fora-de-controle","Ponto 3 — Bandwidth e funções fora de controle",[12,24328,24329],{},"Vercel não tem cap rígido por padrão no plano Pro. Você define alertas de orçamento, mas a aplicação continua servindo até o limite ser atingido — e o limite é configurável pra cima, não pra baixo.",[12,24331,24332],{},"Os três cenários ruins são previsíveis:",[2735,24334,24335,24341,24347],{},[70,24336,24337,24340],{},[27,24338,24339],{},"DDoS leve."," Mil requisições por segundo por uma hora batem em volume de bandwidth e invocação que rotineiramente passa de US$200 num plano normal. Vercel tem proteção contra ataques massivos, mas o limiar pra ativar a defesa é alto.",[70,24342,24343,24346],{},[27,24344,24345],{},"Post viral."," Sua página entra no Hacker News ou no front do Reddit, e quinhentas mil pessoas acessam num dia. O custo cai sobre você, não sobre o anunciante.",[70,24348,24349,24352,24353,24356],{},[27,24350,24351],{},"Bug em loop."," Função em produção com ",[231,24354,24355],{},"setInterval"," que esqueceu de limpar, ou rota que chama a si mesma recursivamente em SSR — descoberto na fatura.",[12,24358,24359],{},"Você descobre o estrago quando o cartão chega. O caminho de recurso existe, mas é caso a caso e depende de boa vontade do provedor. Não é uma garantia contratual de teto.",[19,24361,24363],{"id":24362},"as-tres-rotas-de-saida","As três rotas de saída",[12,24365,24366],{},"Sair do Vercel não significa pular pra Kubernetes. Há um espectro, e cada degrau troca uma coisa por outra.",[368,24368,24370],{"id":24369},"rota-a-hospedado-mais-previsivel","Rota A — Hospedado, mais previsível",[12,24372,24373],{},"Render, Railway e Fly.io ocupam essa faixa. Você ainda paga por instância em USD, ainda confia no provedor pra disponibilidade, ainda tem painel web e CI\u002FCD integrado. A diferença é o modelo de cobrança.",[12,24375,24376,24379],{},[27,24377,24378],{},"Render."," Preço fixo por instância por mês. Web service básico US$7\u002Fmês, instância maior US$25-85\u002Fmês. Latência decente pra São Paulo via Render-Cloud na região leste dos EUA. Tem free tier limitado pra projetos pessoais. Suporte a Next.js standalone direto, sem adapter custom.",[12,24381,24382,24385],{},[27,24383,24384],{},"Railway."," Modelo por uso (CPU + memória + bandwidth) com cap configurável. Preço previsível porque você define o teto. Boa pra MVP rodando barato, escala pra cima quando precisa. UX de console é excelente.",[12,24387,24388,24391],{},[27,24389,24390],{},"Fly.io."," Multi-region edge sem cobrança separada por função. Você sobe a aplicação e ela roda em N regiões com mesmo preço. Pra app que precisa de presença global mas não quer pagar tabela de função, é a escolha mais óbvia.",[12,24393,24394],{},"Trade-off da Rota A: você ainda paga em USD, ainda depende de provedor único pra disponibilidade, ainda tem que aceitar a tabela de preço deles quando muda. Mas saiu do modelo serverless-por-invocação e ganhou previsibilidade de custo. Pra muito time, é o suficiente.",[368,24396,24398],{"id":24397},"rota-b-self-hosted-simples","Rota B — Self-hosted simples",[12,24400,24401],{},"Painéis de orquestração modernos viraram categoria nos últimos dois anos. Coolify, Dokploy, Kamal — cada um com sua filosofia, todos compartilhando o mesmo modelo: instala painel num servidor único, conecta repositório, deploya aplicação.",[12,24403,24404],{},"Os números mudam de regime nessa rota. Um servidor cloud na Hetzner custa em torno de €5\u002Fmês — perto de R$30. Esse servidor único hospeda confortavelmente cinco aplicações Next.js de tamanho médio, mais um banco Postgres pequeno, mais um Redis. A DX cai pra \"instala painel, conecta repo, escolhe domínio, deploya\". Não tem build cache global, não tem preview deploy automático em cada commit (depende de configuração extra), não tem edge global.",[12,24406,24407,24408,24411,24412,24415],{},"O detalhe técnico que viabiliza a rota é o build standalone do Next.js. Adicionando ",[231,24409,24410],{},"output: 'standalone'"," no ",[231,24413,24414],{},"next.config.js",", o build gera um servidor Node compacto com todas as dependências necessárias copiadas pra dentro. A imagem Docker resultante fica em torno de 150 MB. Cada instância da aplicação consome aproximadamente 100 MB de RAM em idle, escalando conforme tráfego. Cinco apps Next.js num servidor de 4 GB sobram memória.",[12,24417,24418],{},"Trade-off da Rota B: você perde edge global. Usuário em Tóquio acessando seu app em SP vai sentir latência. Você perde preview deploy automático por commit (precisa configurar manualmente, ou usar painel que suporte). Você ganha previsibilidade total de custo: a fatura do servidor é a mesma todo mês, independente de tráfego.",[12,24420,24421],{},"Pra time brasileiro com clientes brasileiros, a perda de edge global é, na prática, irrelevante. Latência São Paulo → São Paulo é menor que latência São Paulo → Vercel-edge-São Paulo, na maioria das medições.",[368,24423,24425],{"id":24424},"rota-c-self-hosted-com-alta-disponibilidade","Rota C — Self-hosted com alta disponibilidade",[12,24427,24428],{},"Aqui mora o HeroCtl. A diferença pra Rota B é o tipo de garantia que você consegue dar pro cliente.",[12,24430,24431],{},"Painéis self-hosted simples são, por construção, single-server. Quando aquele servidor cai, o cliente cai junto. Pra app pessoal ou MVP, é aceitável. Pra contrato B2B com SLA escrito, não é.",[12,24433,24434,24435,24437],{},"A Rota C tira esse ponto único de falha colocando 3 ou 4 servidores num mesmo cluster, com plano de controle replicado entre eles. Se um servidor morre, os outros continuam servindo — e o cluster reagenda automaticamente os contêineres que estavam no nó morto pra outros nós saudáveis. Eleição de coordenador novo leva cerca de 7 segundos depois de um ",[231,24436,23209],{}," no servidor que estava liderando.",[12,24439,24440],{},"Roteador integrado emite certificados Let's Encrypt automaticamente, faz rolling deploy sem janela de manutenção, faz health check em cada contêiner. Você não monta cinco produtos pra ter ingress + TLS + métricas + logs — vem tudo no mesmo binário.",[12,24442,24443],{},"A faixa de aplicação é específica: quando a startup precisa de SLA escrito de cliente (geralmente acima de US$10k MRR ou em contrato B2B sério), a Rota B começa a ficar arriscada. Um único servidor, mesmo confiável, é uma narrativa difícil de defender quando o cliente pergunta \"e se aquele servidor cair?\". A Rota C resolve isso sem virar Kubernetes.",[19,24445,24447],{"id":24446},"lado-a-lado","Lado a lado",[12,24449,24450],{},"A tabela é a versão honesta da decisão. Não tem coluna sem ressalva.",[119,24452,24453,24469],{},[122,24454,24455],{},[125,24456,24457,24459,24461,24463,24465,24467],{},[128,24458,2983],{},[128,24460,15029],{},[128,24462,15023],{},[128,24464,15026],{},[128,24466,2771],{},[128,24468,2995],{},[141,24470,24471,24491,24507,24523,24540,24557,24574,24588,24602,24621,24635,24651],{},[125,24472,24473,24476,24479,24482,24485,24488],{},[146,24474,24475],{},"Custo mínimo BRL\u002Fmês",[146,24477,24478],{},"~R$100\u002Fdev",[146,24480,24481],{},"~R$35",[146,24483,24484],{},"~R$25",[146,24486,24487],{},"~R$30 (1 VPS)",[146,24489,24490],{},"~R$120 (3-4 VPS)",[125,24492,24493,24496,24498,24500,24503,24505],{},[146,24494,24495],{},"Custo previsível",[146,24497,3059],{},[146,24499,3065],{},[146,24501,24502],{},"Sim (com cap)",[146,24504,3065],{},[146,24506,3065],{},[125,24508,24509,24512,24515,24517,24519,24521],{},[146,24510,24511],{},"Edge global",[146,24513,24514],{},"Sim (30+ regiões)",[146,24516,3059],{},[146,24518,3059],{},[146,24520,3059],{},[146,24522,3059],{},[125,24524,24525,24528,24531,24534,24536,24538],{},[146,24526,24527],{},"ISR Next.js",[146,24529,24530],{},"Nativo, otimizado",[146,24532,24533],{},"Funciona local",[146,24535,24533],{},[146,24537,24533],{},[146,24539,24533],{},[125,24541,24542,24545,24548,24551,24553,24555],{},[146,24543,24544],{},"Image Optimization",[146,24546,24547],{},"Hospedado",[146,24549,24550],{},"Build\u002Fproxy",[146,24552,24550],{},[146,24554,24550],{},[146,24556,24550],{},[125,24558,24559,24562,24565,24568,24570,24572],{},[146,24560,24561],{},"Preview deploys",[146,24563,24564],{},"Automático por commit",[146,24566,24567],{},"Manual\u002Fbranch",[146,24569,24567],{},[146,24571,3078],{},[146,24573,3078],{},[125,24575,24576,24578,24580,24582,24584,24586],{},[146,24577,16379],{},[146,24579,3065],{},[146,24581,3065],{},[146,24583,3065],{},[146,24585,3065],{},[146,24587,3065],{},[125,24589,24590,24592,24594,24596,24598,24600],{},[146,24591,7106],{},[146,24593,3065],{},[146,24595,3062],{},[146,24597,3062],{},[146,24599,3059],{},[146,24601,7019],{},[125,24603,24604,24607,24610,24613,24616,24618],{},[146,24605,24606],{},"SLA contratual",[146,24608,24609],{},"99,99% (Enterprise)",[146,24611,24612],{},"99,95%",[146,24614,24615],{},"99,9%",[146,24617,11999],{},[146,24619,24620],{},"Configurável (você opera)",[125,24622,24623,24625,24627,24629,24631,24633],{},[146,24624,16334],{},[146,24626,3065],{},[146,24628,3065],{},[146,24630,3065],{},[146,24632,3059],{},[146,24634,3065],{},[125,24636,24637,24640,24642,24644,24646,24648],{},[146,24638,24639],{},"Suporte em PT",[146,24641,3059],{},[146,24643,3059],{},[146,24645,3059],{},[146,24647,7230],{},[146,24649,24650],{},"Sim (Business)",[125,24652,24653,24656,24659,24661,24663,24666],{},[146,24654,24655],{},"Lock-in de primitivas",[146,24657,24658],{},"Alto (KV\u002FPostgres\u002FBlob\u002FEdge)",[146,24660,7164],{},[146,24662,7164],{},[146,24664,24665],{},"Nenhum",[146,24667,24665],{},[12,24669,24670],{},"A coluna que importa muda conforme o estágio. Solo dev olha a primeira linha. Time crescendo olha \"custo previsível\". Startup com cliente B2B olha \"SLA contratual\" e \"alta disponibilidade real\".",[19,24672,24674],{"id":24673},"quando-ficar-no-vercel","Quando ficar no Vercel",[12,24676,24677],{},"Honestidade é o mecanismo de defesa de qualquer comparativo. Quatro cenários onde sair é prejuízo:",[12,24679,24680,24683],{},[27,24681,24682],{},"Solo dev fazendo SaaS pequeno em USD com revenue saudável."," Se a aplicação já cobra em dólar e o revenue passa de US$30k MRR, US$100-300\u002Fmês de Vercel é ruído contábil. O tempo gasto migrando vale mais do que a economia.",[12,24685,24686,24689],{},[27,24687,24688],{},"Marketing site Next.js de baixa complexidade."," Página estática com formulário de contato. Vercel faz isso de graça no plano Hobby, e o tier gratuito não tem limite duro pra esse perfil de tráfego. Trocar pra self-hosted é mover problema em vez de resolver.",[12,24691,24692,24695],{},[27,24693,24694],{},"Time pequeno sem ninguém pra cuidar de infra, com revenue justificando."," Vercel é, no fim, terceirização de operação. Se sua margem comporta o preço, e o seu único dev sênior precisa estar escrevendo produto, manter o Vercel é decisão de alocação de tempo, não de tecnologia.",[12,24697,24698,24701],{},[27,24699,24700],{},"Edge global crítico pra UX."," Aplicação com usuários em três continentes onde latência abaixo de 50ms globalmente é parte do produto. Self-hosted com presença global é caro e operacionalmente complicado. Vercel resolve.",[12,24703,24704],{},"Se você está em qualquer um desses quatro perfis, fecha essa aba e volta pro código. O resto do post não é pra você ainda.",[19,24706,24708],{"id":24707},"migracao-tecnica-do-vercel-pra-self-hosted","Migração técnica do Vercel pra self-hosted",[12,24710,24711],{},"Pra quem decidiu sair, o caminho tem sete passos. Cada um leva entre uma tarde e dois dias, dependendo do tamanho do app.",[368,24713,24715],{"id":24714},"_1-inventario","1. Inventário",[12,24717,24718,24719,24722,24723,6564,24725,571,24727,571,24729,571,24731,571,24734,24737,24738,24741,24742,24745,24746,24749,24750,24753],{},"Antes de mover qualquer coisa, mapeia o que está em uso. Lista de variáveis de ambiente do projeto Vercel — copia tudo num arquivo ",[231,24720,24721],{},".env.example"," versionado. Lista de dependências Vercel-only que aparecem no ",[231,24724,8509],{},[231,24726,24300],{},[231,24728,24306],{},[231,24730,24310],{},[231,24732,24733],{},"@vercel\u002Fanalytics",[231,24735,24736],{},"@vercel\u002Fspeed-insights",". Lista de features Next.js que dependem de runtime específico: ISR (busca por ",[231,24739,24740],{},"revalidate"," no código), middleware (existe ",[231,24743,24744],{},"middleware.ts"," na raiz?), edge runtime (",[231,24747,24748],{},"export const runtime = 'edge'","), Image Optimization (",[231,24751,24752],{},"\u003CImage \u002F>"," em quantas rotas?).",[12,24755,24756],{},"O inventário não muda nada. Mas decide a ordem dos próximos passos.",[368,24758,24760],{"id":24759},"_2-build-standalone","2. Build standalone",[12,24762,2662,24763,24411,24765,24767,24768,24771,24772,622],{},[231,24764,24410],{},[231,24766,24414],{},". Esse modo faz o build copiar pra ",[231,24769,24770],{},".next\u002Fstandalone\u002F"," apenas as dependências de produção realmente usadas, mais um servidor Node mínimo (",[231,24773,24774],{},"server.js",[224,24776,24778],{"className":374,"code":24777,"language":376,"meta":229,"style":229},"\u002F\u002F next.config.js\nmodule.exports = {\n  output: 'standalone',\n  \u002F\u002F demais opções\n}\n",[231,24779,24780,24785,24799,24810,24815],{"__ignoreMap":229},[234,24781,24782],{"class":236,"line":237},[234,24783,24784],{"class":240},"\u002F\u002F next.config.js\n",[234,24786,24787,24790,24792,24795,24797],{"class":236,"line":244},[234,24788,24789],{"class":251},"module",[234,24791,101],{"class":387},[234,24793,24794],{"class":251},"exports",[234,24796,424],{"class":383},[234,24798,505],{"class":387},[234,24800,24801,24804,24807],{"class":236,"line":271},[234,24802,24803],{"class":387},"  output: ",[234,24805,24806],{"class":255},"'standalone'",[234,24808,24809],{"class":387},",\n",[234,24811,24812],{"class":236,"line":415},[234,24813,24814],{"class":240},"  \u002F\u002F demais opções\n",[234,24816,24817],{"class":236,"line":434},[234,24818,1362],{"class":387},[12,24820,24821,24822,24825],{},"Build local com ",[231,24823,24824],{},"next build"," produz uma pasta de uns 150 MB. Dockerfile fica curto:",[224,24827,24829],{"className":20750,"code":24828,"language":20752,"meta":229,"style":229},"FROM node:20-alpine AS builder\nWORKDIR \u002Fapp\nCOPY package.json pnpm-lock.yaml .\u002F\nRUN corepack enable && pnpm install --frozen-lockfile\nCOPY . .\nRUN pnpm build\n\nFROM node:20-alpine\nWORKDIR \u002Fapp\nCOPY --from=builder \u002Fapp\u002F.next\u002Fstandalone .\u002F\nCOPY --from=builder \u002Fapp\u002F.next\u002Fstatic .\u002F.next\u002Fstatic\nCOPY --from=builder \u002Fapp\u002Fpublic .\u002Fpublic\nEXPOSE 3000\nCMD [\"node\", \"server.js\"]\n",[231,24830,24831,24842,24848,24855,24862,24868,24875,24879,24886,24892,24899,24906,24913,24919],{"__ignoreMap":229},[234,24832,24833,24835,24838,24840],{"class":236,"line":237},[234,24834,20759],{"class":383},[234,24836,24837],{"class":387}," node:20-alpine ",[234,24839,20765],{"class":383},[234,24841,20768],{"class":387},[234,24843,24844,24846],{"class":236,"line":244},[234,24845,20773],{"class":383},[234,24847,20776],{"class":387},[234,24849,24850,24852],{"class":236,"line":271},[234,24851,20781],{"class":383},[234,24853,24854],{"class":387}," package.json pnpm-lock.yaml .\u002F\n",[234,24856,24857,24859],{"class":236,"line":415},[234,24858,20789],{"class":383},[234,24860,24861],{"class":387}," corepack enable && pnpm install --frozen-lockfile\n",[234,24863,24864,24866],{"class":236,"line":434},[234,24865,20781],{"class":383},[234,24867,20799],{"class":387},[234,24869,24870,24872],{"class":236,"line":459},[234,24871,20789],{"class":383},[234,24873,24874],{"class":387}," pnpm build\n",[234,24876,24877],{"class":236,"line":464},[234,24878,412],{"emptyLinePlaceholder":411},[234,24880,24881,24883],{"class":236,"line":479},[234,24882,20759],{"class":383},[234,24884,24885],{"class":387}," node:20-alpine\n",[234,24887,24888,24890],{"class":236,"line":484},[234,24889,20773],{"class":383},[234,24891,20776],{"class":387},[234,24893,24894,24896],{"class":236,"line":490},[234,24895,20781],{"class":383},[234,24897,24898],{"class":387}," --from=builder \u002Fapp\u002F.next\u002Fstandalone .\u002F\n",[234,24900,24901,24903],{"class":236,"line":508},[234,24902,20781],{"class":383},[234,24904,24905],{"class":387}," --from=builder \u002Fapp\u002F.next\u002Fstatic .\u002F.next\u002Fstatic\n",[234,24907,24908,24910],{"class":236,"line":529},[234,24909,20781],{"class":383},[234,24911,24912],{"class":387}," --from=builder \u002Fapp\u002Fpublic .\u002Fpublic\n",[234,24914,24915,24917],{"class":236,"line":535},[234,24916,20854],{"class":383},[234,24918,20857],{"class":387},[234,24920,24921,24923,24925,24928,24930,24933],{"class":236,"line":546},[234,24922,20862],{"class":383},[234,24924,20865],{"class":387},[234,24926,24927],{"class":255},"\"node\"",[234,24929,571],{"class":387},[234,24931,24932],{"class":255},"\"server.js\"",[234,24934,9536],{"class":387},[12,24936,24937],{},"Imagem final em torno de 180 MB. Roda igual em qualquer ambiente que suporte container.",[368,24939,24941],{"id":24940},"_3-substituicao-de-armazenamento","3. Substituição de armazenamento",[12,24943,24944],{},"Cada serviço gerenciado do Vercel tem alternativa direta:",[2735,24946,24947,24958,24972],{},[70,24948,24949,24952,24953,2630,24955,24957],{},[27,24950,24951],{},"Vercel KV → Redis."," Você sobe um Redis no cluster (HeroCtl roda como job comum) ou usa Upstash hospedado. Cliente troca de ",[231,24954,24300],{},[231,24956,7369],{},". API é parecida; o adapter dá pra esconder atrás de uma função.",[70,24959,24960,24963,24964,2630,24966,5840,24969,101],{},[27,24961,24962],{},"Vercel Postgres → Postgres."," Postgres no cluster (job comum) ou Supabase\u002FNeon hospedados. Migration scripts continuam iguais. Cliente troca de ",[231,24965,24306],{},[231,24967,24968],{},"pg",[231,24970,24971],{},"postgres.js",[70,24973,24974,24977,24978,2630,24980,24983],{},[27,24975,24976],{},"Vercel Blob → S3-compatível."," Cloudflare R2 (sem cobrança de saída), Backblaze B2, ou MinIO no próprio cluster. Cliente troca de ",[231,24979,24310],{},[231,24981,24982],{},"@aws-sdk\u002Fclient-s3"," apontando pro endpoint custom.",[12,24985,24986],{},"A regra geral: faz a substituição num branch separado, com testes de integração rodando contra o serviço novo, antes de tocar produção.",[368,24988,24990],{"id":24989},"_4-image-optimization","4. Image Optimization",[12,24992,24993],{},"Três caminhos, escolha um:",[2735,24995,24996,25007,25015],{},[70,24997,24998,25003,25004,25006],{},[27,24999,25000,25002],{},[231,25001,24293],{}," direto no servidor."," Next.js detecta ",[231,25005,24293],{}," instalado e usa ele pra Image Optimization local. Funciona, mas consome CPU do mesmo processo que serve a aplicação.",[70,25008,25009,25014],{},[27,25010,25011,101],{},[231,25012,25013],{},"next-image-export-optimizer"," Pré-otimiza todas as imagens na build. Bom pra blog ou site com imagens estáticas. Inviável pra app com upload de usuário.",[70,25016,25017,2578,25020,5840,25023,25026,25027,25029],{},[27,25018,25019],{},"Proxy de imagem dedicado.",[231,25021,25022],{},"imgproxy",[231,25024,25025],{},"imageflow"," rodando como serviço separado. URL do ",[231,25028,24752],{}," aponta pra esse proxy. Resolve qualquer caso de uso, custa um job a mais no cluster.",[368,25031,25033],{"id":25032},"_5-isr","5. ISR",[12,25035,25036],{},"Self-hosted, ISR funciona — Next.js standalone implementa o cache local em disco. O ponto frágil é invalidação multi-region.",[12,25038,25039,25040,25043],{},"Cluster com 3 nós significa 3 cópias do cache em disco, cada uma com expiração própria. Pra blog ou site cujo conteúdo muda algumas vezes por dia, isso é aceitável: a inconsistência de alguns segundos entre nós é invisível pro usuário. Pra dashboard de e-commerce com preço atualizando a cada minuto, você precisa de invalidação coordenada — geralmente via webhook que chama ",[231,25041,25042],{},"revalidatePath"," em todos os nós simultaneamente.",[12,25045,25046],{},"A maioria dos casos cai no primeiro perfil. Não vira o problema que parece à primeira vista.",[368,25048,25050],{"id":25049},"_6-cicd","6. CI\u002FCD",[12,25052,25053],{},"Trocar o auto-deploy do Vercel por pipeline próprio:",[2735,25055,25056,25069,25075],{},[70,25057,25058,25061,25062,571,25065,25068],{},[27,25059,25060],{},"Build:"," GitHub Actions (ou GitLab CI, ou Jenkins) roda em cada push. ",[231,25063,25064],{},"pnpm install",[231,25066,25067],{},"pnpm build",", gera imagem Docker.",[70,25070,25071,25074],{},[27,25072,25073],{},"Push:"," registry de imagem (ECR, Docker Hub, GHCR). Tag por commit SHA ou data.",[70,25076,25077,25080,25081,25084],{},[27,25078,25079],{},"Deploy:"," chamada de API contra o orquestrador (",[231,25082,25083],{},"heroctl deploy job.json"," ou equivalente). Rolling update sem downtime.",[12,25086,25087],{},"Tempo de pipeline pra app médio fica em torno de 4-6 minutos. Vercel faz em 2-3 minutos. A diferença é real, mas não é catastrófica.",[368,25089,25091],{"id":25090},"_7-cutover","7. Cutover",[12,25093,25094],{},"Última etapa, e a mais delicada:",[2735,25096,25097,25104,25107,25110,25113],{},[70,25098,25099,25100,25103],{},"Sobe a versão self-hosted apontando pra um domínio temporário (",[231,25101,25102],{},"new.seuapp.com",", por exemplo).",[70,25105,25106],{},"Roda em paralelo por 7 dias. Usuários internos testam. Tráfego de canário direcionado por flag.",[70,25108,25109],{},"Compara métricas: erro rate, latência p95, custo de infra projetado.",[70,25111,25112],{},"Se parity ok, troca DNS principal pra apontar pro novo backend. TTL baixo (60s) ajuda no rollback rápido.",[70,25114,25115],{},"Mantém Vercel ligado por mais 7 dias. Só desativa o projeto depois de confirmar que ninguém está no DNS antigo.",[12,25117,25118],{},"Migração total pra app médio leva 2-3 semanas com um dev dedicado. Pra app pequeno, uma semana. Pra monolito Next.js gigante com 50 rotas e middleware complexo, um trimestre.",[19,25120,25122],{"id":25121},"calculo-concreto-pra-time-brasileiro","Cálculo concreto pra time brasileiro",[12,25124,25125],{},"Numero pra fechar o argumento. Time de cinco devs brasileiros com aplicação Next.js de tamanho médio (50 rotas, banco Postgres, storage de imagens, tráfego de 2 milhões de requisições\u002Fmês).",[12,25127,25128],{},[27,25129,25130],{},"Cenário Vercel:",[2735,25132,25133,25136,25139,25142,25145],{},[70,25134,25135],{},"5 × Pro (US$20\u002Fdev\u002Fmês) = US$100\u002Fmês",[70,25137,25138],{},"Bandwidth e function invocations (estimativa com tráfego informado): US$50-200\u002Fmês",[70,25140,25141],{},"Vercel Postgres (instância produção pequena): US$30\u002Fmês",[70,25143,25144],{},"Vercel Blob (50 GB armazenado, 100 GB transferência): US$20\u002Fmês",[70,25146,25147,25150],{},[27,25148,25149],{},"Total: US$200-400\u002Fmês = R$1.000 a R$2.000\u002Fmês"," ao câmbio atual.",[12,25152,25153],{},[27,25154,25155],{},"Cenário HeroCtl Community em 4 servidores Hetzner:",[2735,25157,25158,25161,25164,25167],{},[70,25159,25160],{},"4 × CX22 (€5,18\u002Fmês cada) = €21\u002Fmês",[70,25162,25163],{},"Cloudflare R2 (50 GB armazenado, sem cobrança de saída): ~€5\u002Fmês",[70,25165,25166],{},"Postgres rodando como job no próprio cluster: zero adicional",[70,25168,25169,25150],{},[27,25170,25171],{},"Total: €25-30\u002Fmês = R$150-180\u002Fmês",[12,25173,25174,25177],{},[27,25175,25176],{},"Diferença: R$850 a R$1.850\u002Fmês."," Em 12 meses, R$10.000 a R$22.000 de economia. Equivalente a um mês de salário de dev pleno na faixa intermediária do mercado brasileiro.",[12,25179,25180],{},"A economia paga uma migração feita em quatro semanas no primeiro ano, e fica disponível como margem operacional nos anos seguintes. Em 36 meses, R$30k-66k de diferença. É linha de orçamento que vale aparecer na reunião financeira.",[19,25182,7354],{"id":7353},[12,25184,25185,25188],{},[27,25186,25187],{},"HeroCtl roda Next.js direto?","\nSim. Build standalone gera imagem Docker, e HeroCtl orquestra qualquer imagem. Não tem adapter custom, não tem template específico — o Dockerfile mostrado acima funciona sem modificação.",[12,25190,25191,25194,25195,25197],{},[27,25192,25193],{},"E ISR sem CDN global?","\nFunciona localmente em cada nó do cluster. Cluster com 3 nós significa 3 caches independentes com expiração própria. Pra invalidação coordenada multi-nó, você usa ",[231,25196,25042],{}," chamado via webhook em todos os nós. Pra maioria dos casos (blog, site institucional, dashboard com revalidação a cada minuto), a inconsistência transitória é invisível.",[12,25199,25200,25203,25204,25207,25208,25211],{},[27,25201,25202],{},"Como faço preview deploys?","\nHeroCtl não tem preview deploy automático por commit nativo, mas suporta múltiplas versões do mesmo job rodando lado a lado. Configuração comum: pipeline cria um job com sufixo da branch (",[231,25205,25206],{},"meu-app-feature-x","), com domínio temporário (",[231,25209,25210],{},"feature-x.preview.seuapp.com","), TLS automático pelo roteador integrado. Quando a branch é mergeada e deletada, o job é despromovido. Quem quer DX exata do Vercel monta isso em 100-200 linhas de pipeline.",[12,25213,25214,25217,25218,25221],{},[27,25215,25216],{},"Edge functions sobrevivem?","\nEdge functions usam primitivas no estilo Cloudflare Workers e não rodam em Node tradicional. Self-hosted, você converte pra rotas server-side normais (",[231,25219,25220],{},"export const runtime = 'nodejs'",") ou separa em serviços próprios. Refator é por arquivo, geralmente entre 10 minutos e 2 horas dependendo do código.",[12,25223,25224,25227,25229,25230,25233,25234,1523,25236,25238,25239,21696,25241,25243],{},[27,25225,25226],{},"E se eu uso Vercel Postgres?",[231,25228,24306],{}," é wrapper de Neon Postgres. Você troca pra ",[231,25231,25232],{},"@neondatabase\u002Fserverless"," (mantém Neon hospedado), ou ",[231,25235,24968],{},[231,25237,24971],{}," apontando pra um Postgres no cluster. Schema migra direto via ",[231,25240,5737],{},[231,25242,21211],{},". Para 95% dos apps, é uma tarde de trabalho.",[12,25245,25246,25249,25250,25252,25253,25255,25256,25258],{},[27,25247,25248],{},"Vercel Image Optimization tem substituto?","\nTrês opções: ",[231,25251,24293],{}," direto no servidor (funciona, consome CPU local), ",[231,25254,25013],{}," na build (bom pra imagens estáticas), proxy dedicado tipo ",[231,25257,25022],{}," rodando como serviço separado (resolve qualquer caso). Pra app com upload de usuário, a terceira opção é a melhor escolha.",[12,25260,25261,25264],{},[27,25262,25263],{},"Quanto tempo leva migração pra app médio?","\nAplicação Next.js com 50 rotas, Postgres, storage e middleware: 2-3 semanas com um dev dedicado seguindo o passo a passo desse post. Aplicação pequena (10-15 rotas, sem storage gerenciado): uma semana. Monolito gigante com middleware complexo e dependência forte de edge runtime: trimestre inteiro.",[19,25266,3310],{"id":3309},[12,25268,25269],{},"Vercel é uma boa escolha. Pra muito caso, é a escolha certa. O ponto desse post não é \"Vercel é ruim\" — é \"Vercel não é a única escolha\". A maioria dos times brasileiros que olham a fatura mensal e suspiram não está olhando pra fora porque o produto deles é pior. Está olhando porque a economia em real, em escala de empresa, é grande o suficiente pra pagar uma migração feita com calma e sobrar caixa.",[12,25271,25272],{},"A escolha entre as três rotas depende de onde você está. Render e Railway resolvem o problema de previsibilidade sem mudar muito o modelo operacional. Coolify e Dokploy resolvem o custo radicalmente, em troca de um único servidor. HeroCtl resolve o custo e mantém a alta disponibilidade real, em troca de operar 3-4 servidores.",[12,25274,25275],{},"Se você quer testar a Rota C no menor caminho:",[224,25277,25278],{"className":226,"code":5319,"language":228,"meta":229,"style":229},[231,25279,25280],{"__ignoreMap":229},[234,25281,25282,25284,25286,25288,25290],{"class":236,"line":237},[234,25283,1220],{"class":247},[234,25285,2958],{"class":251},[234,25287,5330],{"class":255},[234,25289,2964],{"class":383},[234,25291,2967],{"class":247},[12,25293,25294],{},"Sobe 3 servidores pequenos, instala em cada um, aponta o domínio. Sobe a aplicação Next.js como job. Verifica que o roteador integrado emitiu certificado, que o rolling deploy funcionou, que matar um servidor não derrubou o site. Depois decide se a economia compensa.",[12,25296,25297,25298,25300,25301,25303],{},"Pra ler mais: ",[3337,25299,21739],{"href":6547}," explica a tese geral por trás do produto, e ",[3337,25302,19767],{"href":19766}," cobre a faixa de uso adjacente — quando você quer DX tipo Heroku rodando na sua infra, sem precisar do nível de HA do HeroCtl.",[12,25305,25306],{},"A intenção, como sempre, é a mesma: orquestração de contêineres, sem cerimônia.",[3351,25308,25309],{},"html pre.shiki code .sH3jZ, html code.shiki .sH3jZ{--shiki-default:#8B949E}html pre.shiki code .sFSAA, html code.shiki .sFSAA{--shiki-default:#79C0FF}html pre.shiki code .sZEs4, html code.shiki .sZEs4{--shiki-default:#E6EDF3}html pre.shiki code .suJrU, html code.shiki .suJrU{--shiki-default:#FF7B72}html pre.shiki code .s9uIt, html code.shiki .s9uIt{--shiki-default:#A5D6FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .sQhOw, html code.shiki .sQhOw{--shiki-default:#FFA657}",{"title":229,"searchDepth":244,"depth":244,"links":25311},[25312,25313,25318,25323,25324,25325,25334,25335,25336],{"id":24200,"depth":244,"text":24201},{"id":24245,"depth":244,"text":24246,"children":25314},[25315,25316,25317],{"id":24249,"depth":271,"text":24250},{"id":24265,"depth":271,"text":24266},{"id":24325,"depth":271,"text":24326},{"id":24362,"depth":244,"text":24363,"children":25319},[25320,25321,25322],{"id":24369,"depth":271,"text":24370},{"id":24397,"depth":271,"text":24398},{"id":24424,"depth":271,"text":24425},{"id":24446,"depth":244,"text":24447},{"id":24673,"depth":244,"text":24674},{"id":24707,"depth":244,"text":24708,"children":25326},[25327,25328,25329,25330,25331,25332,25333],{"id":24714,"depth":271,"text":24715},{"id":24759,"depth":271,"text":24760},{"id":24940,"depth":271,"text":24941},{"id":24989,"depth":271,"text":24990},{"id":25032,"depth":271,"text":25033},{"id":25049,"depth":271,"text":25050},{"id":25090,"depth":271,"text":25091},{"id":25121,"depth":244,"text":25122},{"id":7353,"depth":244,"text":7354},{"id":3309,"depth":244,"text":3310},"2026-02-04","Vercel cobra em USD, escala custo serverless por requisição, e empurra você pra dentro das primitivas dele. Pra times brasileiros, a conta vira ruim rápido. Como rodar Next.js fora.",{},"\u002Fblog\u002Falternativa-ao-vercel-self-hosted",{"title":24189,"description":25338},{"loc":25340},"blog\u002Falternativa-ao-vercel-self-hosted",[25345,25346,7514,8764,25347],"vercel","next-js","lock-in","nuWDgcPIxRXZ_mSI9lNod2iJnR294jmSi4cnuiusYEk",{"id":25350,"title":25351,"author":7,"body":25352,"category":8764,"cover":3380,"date":25889,"description":25890,"draft":3383,"extension":3384,"lastReviewed":3380,"meta":25891,"navigation":411,"path":25892,"readingTime":4401,"seo":25893,"sitemap":25894,"stem":25895,"tags":25896,"__hash__":25901},"blog_pt\u002Fblog\u002Fheroctl-vs-kamal.md","HeroCtl vs Kamal: quando você precisa de mais de um servidor",{"type":9,"value":25353,"toc":25872},[25354,25357,25363,25366,25370,25373,25376,25383,25389,25392,25396,25399,25419,25422,25425,25429,25432,25436,25439,25442,25445,25449,25455,25458,25472,25475,25479,25482,25485,25488,25492,25495,25498,25505,25509,25512,25532,25535,25538,25542,25545,25548,25551,25554,25557,25559,25671,25674,25678,25681,25687,25697,25703,25709,25713,25716,25726,25738,25751,25759,25786,25795,25797,25807,25813,25819,25825,25836,25845,25851,25853,25856,25859,25864,25867],[12,25355,25356],{},"Em 2023 o 37signals publicou números que não combinavam com o discurso da indústria. A empresa saiu da nuvem pública pra hospedar os próprios produtos em servidores dedicados, projetou economia anual de aproximadamente três milhões de dólares e abriu o ferramental que usou pra fazer essa migração. Esse ferramental ganhou nome — Kamal — e virou referência rápida pra um tipo de time que estava cansado da complexidade de orquestradores planetários.",[12,25358,25359,25360,101],{},"DHH, sócio do 37signals, popularizou a tese ao redor da ferramenta com uma frase curta: \"you don't need orchestration\". O argumento é elegante, factual e — pra a maioria dos times que ele descreve — verdadeiro. Deploy de aplicação Rails havia virado um mestrado em sistemas distribuídos sem que ninguém tivesse pedido isso. O Kamal é a resposta legítima a uma frustração legítima, e ocupa um nicho próprio dentro do ",[3337,25361,25362],{"href":19766},"segmento de Heroku auto-hospedado em 2026",[12,25364,25365],{},"Este post não é sobre derrubar essa tese. É sobre o momento exato em que ela deixa de descrever a sua realidade. Em algum ponto entre o primeiro e o décimo cliente sério, a frase muda de \"você não precisa de orquestração\" pra \"você passou a precisar e não percebeu ainda\". O sintoma costuma ser um e-mail às três da manhã.",[19,25367,25369],{"id":25368},"a-filosofia-kamal-como-ela-merece-ser-descrita","A filosofia Kamal, como ela merece ser descrita",[12,25371,25372],{},"Antes de qualquer crítica, vale registrar o que o Kamal acerta — porque ele acerta muito.",[12,25374,25375],{},"Você tem uma aplicação dentro de um Dockerfile. Tem uma lista de servidores onde quer que ela rode. O Kamal pega essa lista, conecta em cada servidor por SSH, baixa a imagem nova, troca o contêiner velho pelo novo e atualiza o roteador interno. Não há plano de controle persistente. Não há agente residente em cada servidor com processo próprio. Não há banco de dados de estado fora do conjunto de servidores que você já tinha.",[12,25377,25378,25379,25382],{},"A configuração mora num único arquivo ",[231,25380,25381],{},"deploy.yml"," com talvez quarenta linhas. Você roda um comando, e o Kamal faz o trabalho em paralelo nos hosts. Quando ele termina, ele some — não há serviço escutando porta 8080 esperando comandos futuros. É deploy como uma transação SSH com checkpoints.",[12,25384,25385,25386,25388],{},"Essa minimização do estado externo é a virtude central. Pra times de uma a três pessoas que rodam uma aplicação monolítica num único servidor, é difícil bater. O ",[3337,25387,2771],{"href":16701}," e os outros painéis modernos pedem um banco de dados próprio, um agente próprio, uma interface web própria. O Kamal pede dois ingredientes: SSH e Docker. Você já tinha os dois.",[12,25390,25391],{},"Estimamos que setenta e cinco por cento dos times de aplicação web no Brasil em 2026 nunca precisam de mais do que isso. Se você é um deles, fecha esse post e instala Kamal. Sério.",[19,25393,25395],{"id":25394},"quando-voce-nao-precisa-de-orquestracao-e-verdade","Quando \"você não precisa de orquestração\" é verdade",[12,25397,25398],{},"Alguns marcadores são honestos. Se a sua operação cabe nesta lista, o Kamal vence qualquer comparação que se possa fazer com ele:",[2735,25400,25401,25404,25407,25410,25413,25416],{},[70,25402,25403],{},"Um servidor único com folga de recursos",[70,25405,25406],{},"Aplicação monolítica, sem dependências internas em rede privada entre serviços",[70,25408,25409],{},"Tráfego previsível, sem picos que exijam escalonamento horizontal de emergência",[70,25411,25412],{},"Janela de deploy ocasional, com até trinta segundos de degradação aceitável",[70,25414,25415],{},"Cliente final que não cobra contrato formal de disponibilidade",[70,25417,25418],{},"Uma a três pessoas tomando conta da infra, em meio expediente",[12,25420,25421],{},"Pra esse perfil, qualquer ferramenta com plano de controle persistente é overhead injustificado. O Kamal é, literalmente, um arquivo de configuração mais um binário cliente. Não há nada pra manter no servidor além do Docker que você ia instalar de qualquer jeito.",[12,25423,25424],{},"A elegância dessa abordagem é tal que muitos times com perfil ligeiramente maior que o descrito acima continuam felizes — e estão certos. Migrar pra um orquestrador antes que a dor apareça é gold-plating de infraestrutura. A pergunta correta não é \"tenho cluster?\", é \"qual dor não consigo mais ignorar?\".",[19,25426,25428],{"id":25427},"quando-voce-nao-precisa-de-orquestracao-comeca-a-doer","Quando \"você não precisa de orquestração\" começa a doer",[12,25430,25431],{},"A dor não chega de uma vez. Chega em quatro etapas, geralmente nessa ordem.",[368,25433,25435],{"id":25434},"primeira-etapa-o-cliente-exige-sla","Primeira etapa: o cliente exige SLA",[12,25437,25438],{},"Em algum momento entra um contrato de prestação de serviço com cláusula de disponibilidade. Os números mais comuns são 99% (3,65 dias de indisponibilidade permitida por ano), 99,9% (8,7 horas) e 99,95% (4,4 horas). O cliente quer ver o número no contrato.",[12,25440,25441],{},"Aqui o Kamal num único servidor já não cabe. Não porque o Kamal seja ruim — é porque um servidor único nunca dá 99,9% sem manobra externa. Manutenção do provedor de nuvem, falha de disco, atualização de kernel: cada um desses eventos consome integralmente o seu orçamento anual de indisponibilidade. Em 2026 nenhum provedor sério garante 99,9% de uptime para uma instância individual.",[12,25443,25444],{},"A resposta natural é \"vou colocar dois servidores\". E é aqui que o Kamal começa a precisar de andaimes externos.",[368,25446,25448],{"id":25447},"segunda-etapa-dois-servidores-e-a-ilusao-do-cluster","Segunda etapa: dois servidores e a ilusão do cluster",[12,25450,25451,25452,25454],{},"O Kamal aceita sem reclamar uma lista com dois IPs no ",[231,25453,25381],{},". Mas o que ele faz com essa lista não é orquestração — é repetição. Os dois servidores são destinos paralelos de deploy, não membros de um cluster.",[12,25456,25457],{},"Concretamente: se um dos dois cair, o Kamal não realoca o tráfego. O Kamal não tem opinião sobre tráfego entre deploys. Você precisa montar, por fora dele:",[2735,25459,25460,25463,25466,25469],{},[70,25461,25462],{},"Um balanceador de carga (do provedor de nuvem ou auto-hospedado)",[70,25464,25465],{},"Verificação de saúde periódica que retire o servidor inativo do balanço",[70,25467,25468],{},"Resolução de DNS configurada em cima do balanceador, não dos servidores diretos",[70,25470,25471],{},"Algum mecanismo de notificação quando algo sai do ar",[12,25473,25474],{},"São quatro produtos novos que você passa a operar. Cada um tem o seu próprio painel, a sua própria conta, a sua própria fatura, o seu próprio modo de quebrar às três da manhã. O ferramental que era um arquivo de configuração virou um diagrama.",[368,25476,25478],{"id":25477},"terceira-etapa-rolling-deploy-real-fica-fragil","Terceira etapa: rolling deploy real fica frágil",[12,25480,25481],{},"Com dois servidores, o Kamal oferece deploy em sequência: primeiro um, depois o outro. Bonito na descrição. O problema mora no caso de erro.",[12,25483,25484],{},"Imagine que o deploy no primeiro servidor sobe a versão nova com sucesso, o segundo trava no meio. O Kamal não tem visão consolidada do estado dos dois servidores depois do erro. Você fica com uma versão nova rodando num lado, versão velha rodando no outro, e nenhum sistema centralizado pra reconciliar a divergência. A reconciliação vira intervenção manual: você abre os dois servidores, decide qual versão fica, faz rollback ou avança no que falhou.",[12,25486,25487],{},"Pra um time de três pessoas, intervir manualmente uma vez por trimestre é tolerável. Pra um time que entrega quatro deploys por semana em três aplicações distintas, a divergência manual vira o trabalho principal de uma das três pessoas. Foi exatamente esse o gatilho que motivou orquestradores nascerem nos anos 2010.",[368,25489,25491],{"id":25490},"quarta-etapa-criptografia-e-roteamento-entre-servicos","Quarta etapa: criptografia e roteamento entre serviços",[12,25493,25494],{},"Cedo ou tarde a aplicação cresce e ganha um segundo serviço — talvez um worker de fila, talvez um serviço separado de processamento de imagens, talvez uma API auxiliar consumida pelo frontend principal. Esses serviços precisam conversar entre si, idealmente com tráfego cifrado e controle de quem pode chamar quem.",[12,25496,25497],{},"O Kamal não tem opinião sobre isso. É o seu trabalho montar — geralmente com proxy externo, certificados emitidos manualmente, regras de firewall escritas a mão. Em um servidor era trivial (todo mundo é localhost). Em três servidores rodando seis serviços, vira um projeto à parte de uma semana.",[12,25499,25500,25501,25504],{},"O roteador embutido no Kamal (o ",[231,25502,25503],{},"kamal-proxy",") resolve a parte de tráfego HTTP de entrada com elegância — terminação TLS, troca atômica entre versões, cabeçalhos sob controle. Mas o tráfego entre serviços, em rede privada, é problema seu.",[19,25506,25508],{"id":25507},"o-salto-necessario","O salto necessário",[12,25510,25511],{},"Olhando os quatro pontos acima em conjunto, fica claro que pra cobri-los você precisa, na prática, de:",[67,25513,25514,25517,25520,25523,25526,25529],{},[70,25515,25516],{},"Um plano de controle replicado entre múltiplos servidores — pra que a queda de um deles não derrube a capacidade de fazer deploy",[70,25518,25519],{},"Eleição automática do servidor que coordena, sem intervenção humana",[70,25521,25522],{},"Balanceamento e verificação de saúde integrados, sem depender de balanceador externo do provedor",[70,25524,25525],{},"Estado consolidado dos serviços, com reconciliação automática quando algo diverge",[70,25527,25528],{},"Roteador integrado com certificados automáticos",[70,25530,25531],{},"Criptografia entre serviços embutida, sem montar mais um produto",[12,25533,25534],{},"A tentação de muito time, ao chegar nessa lista, é cair no orquestrador planetário e acabar com o assunto. Daí instala o colosso, escreve trezentas linhas de manifesto pra subir o que estava em quarenta linhas no Kamal, contrata um especialista de salário sênior só pra manter aquilo respirando, e descobre que trocou o problema certo por um problema maior.",[12,25536,25537],{},"A resposta razoável é uma ferramenta que oferece os seis itens acima sem pedir um time dedicado. É exatamente onde o HeroCtl mora.",[19,25539,25541],{"id":25540},"heroctl-como-kamal-com-cluster-real","HeroCtl como Kamal com cluster real",[12,25543,25544],{},"A simplicidade conceitual é a mesma. Você descreve o serviço num arquivo de configuração curto — em torno de cinquenta linhas pra uma aplicação completa com regras de roteamento, segredos e certificado automático. Submete o serviço pelo cliente de linha de comando ou pelo painel web embutido. O cluster decide onde rodar.",[12,25546,25547],{},"A diferença está debaixo do capô. Em vez de SSH transacional, o HeroCtl mantém um plano de controle replicado entre três servidores. Esses três conversam o tempo todo pra manter uma visão consolidada de tudo que está rodando, em qual servidor, em qual versão, com qual saúde. Quando o servidor que coordena cai, em torno de sete segundos um dos outros dois assume — sem intervenção humana, sem alerta de pager pra ninguém. Os contêineres da aplicação que rodavam no servidor caído são realocados nos sobreviventes.",[12,25549,25550],{},"A operação diária parece exatamente com o Kamal: você muda a versão da imagem, submete, o cluster orquestra a substituição. A diferença aparece nos casos ruins. Se o deploy parcial falhar no meio, a reconciliação é automática — o estado desejado está gravado no plano de controle, e os agentes em cada servidor convergem pra ele sem você abrir terminal. Se um servidor cair durante o deploy, os outros assumem o trabalho dele. Se a porta que ia ser usada estiver presa por um contêiner zumbi, o cluster espera ou redireciona — não falha o deploy.",[12,25552,25553],{},"E o ferramental embutido cobre os outros itens da lista: roteador com certificados Let's Encrypt automáticos, criptografia entre serviços sem montar nada por fora, painel web pra ver o que está rodando, métricas e logs centralizados sem stack externa.",[12,25555,25556],{},"A instalação é o mesmo gesto que o Kamal pede: servidor Linux com Docker, um comando único de setup. Não há requisito novo de infraestrutura. Não há banco de dados externo. Não há serviço gerenciado de nuvem. O cluster mora nos servidores que você já tem.",[19,25558,4826],{"id":4825},[119,25560,25561,25571],{},[122,25562,25563],{},[125,25564,25565,25567,25569],{},[128,25566,2983],{},[128,25568,2998],{},[128,25570,2995],{},[141,25572,25573,25584,25595,25605,25614,25623,25632,25642,25651,25661],{},[125,25574,25575,25578,25581],{},[146,25576,25577],{},"Filosofia",[146,25579,25580],{},"Deploy SSH minimalista, sem estado externo",[146,25582,25583],{},"Cluster com plano de controle replicado",[125,25585,25586,25589,25592],{},[146,25587,25588],{},"Faixa ideal de servidores",[146,25590,25591],{},"1 (excelente), 2-3 (com andaimes externos)",[146,25593,25594],{},"3 a 500",[125,25596,25597,25599,25602],{},[146,25598,16334],{},[146,25600,25601],{},"Não nativa — requer balanceador externo",[146,25603,25604],{},"Embutida; eleição automática em ~7s",[125,25606,25607,25610,25612],{},[146,25608,25609],{},"Painel web",[146,25611,3059],{},[146,25613,23290],{},[125,25615,25616,25618,25621],{},[146,25617,3923],{},[146,25619,25620],{},"Sim, via roteador embutido",[146,25622,25620],{},[125,25624,25625,25627,25630],{},[146,25626,23305],{},[146,25628,25629],{},"Não nativa",[146,25631,23311],{},[125,25633,25634,25637,25639],{},[146,25635,25636],{},"Métricas persistentes",[146,25638,25629],{},[146,25640,25641],{},"Job interno",[125,25643,25644,25646,25649],{},[146,25645,22798],{},[146,25647,25648],{},"Não nativa — recolha por fora",[146,25650,22321],{},[125,25652,25653,25656,25659],{},[146,25654,25655],{},"Reconciliação automática após falha parcial",[146,25657,25658],{},"Não — requer intervenção manual",[146,25660,3065],{},[125,25662,25663,25665,25668],{},[146,25664,22831],{},[146,25666,25667],{},"Aberto, sem produto pago associado",[146,25669,25670],{},"Plano gratuito permanente + Business\u002FEnterprise pagos",[12,25672,25673],{},"A coluna do Kamal não é punição — é honestidade. O produto foi desenhado pra um caso de uso específico e o cumpre com elegância. Quando o seu caso de uso passa do que ele cobre, a resposta correta é trocar de ferramenta, não obrigar o Kamal a virar o que ele nunca quis ser.",[19,25675,25677],{"id":25676},"continue-no-kamal-se","Continue no Kamal se...",[12,25679,25680],{},"A virtude de uma ferramenta especializada é admitir onde ela vence. Quatro perfis em que recomendamos Kamal sem hesitação, mesmo que o HeroCtl exista.",[12,25682,25683,25686],{},[27,25684,25685],{},"Você roda um servidor, sem pressão de SLA formal."," O custo conceitual de um cluster — entender quórum, plano de controle replicado, eleição — é injustificado pra um servidor único. O Kamal te dá noventa e nove por cento do que importa com cinco por cento do conceito.",[12,25688,25689,25692,25693,25696],{},[27,25690,25691],{},"Você é um time de uma a três pessoas com forte cultura Rails e nenhum tempo disponível pra aprender ferramental novo."," O Kamal é, na prática, uma extensão natural do ",[231,25694,25695],{},"bin\u002Frails",". Adotá-lo custa uma tarde. Adotar qualquer outra coisa custa uma semana — e essa semana, no seu contexto, vale mais do que a melhoria de operação que viria depois.",[12,25698,25699,25702],{},[27,25700,25701],{},"As suas aplicações são internas ou de staging, onde cinco minutos de indisponibilidade mensal não causam dano real."," A operação do Kamal é tão direta que ele continua a melhor escolha mesmo pra times grandes que têm um conjunto de aplicações secundárias com tolerância alta a falha.",[12,25704,25705,25708],{},[27,25706,25707],{},"Você é o DHH."," Com respeito sincero. A tese de que orquestração é overkill foi defendida por alguém que opera produtos públicos com milhões de usuários e prova diariamente que dá pra fazer sem cluster, com apenas servidores dedicados bem configurados. Se você está num time em que essa filosofia é parte da identidade, o Kamal não é só ferramenta — é declaração. Não há razão técnica pra abandoná-lo.",[19,25710,25712],{"id":25711},"migracao-de-kamal-pra-heroctl-quando-faz-sentido","Migração de Kamal pra HeroCtl quando faz sentido",[12,25714,25715],{},"Pra quem chegou no momento em que a dor descrita acima virou rotina, a migração é mais leve do que parece, porque a maior parte do trabalho que o Kamal já fazia continua válido.",[12,25717,9010,25718,25721,25722,25725],{},[27,25719,25720],{},"Dockerfile que o Kamal usa pra empacotar a aplicação serve sem mudança nenhuma",". O HeroCtl consome a mesma imagem que o Kamal empurra pro registro. Não há requisito de adaptar ",[231,25723,25724],{},"ENTRYPOINT",", variáveis de ambiente esperadas, portas expostas — o contrato do contêiner é preservado.",[12,25727,25728,25731,25732,25734,25735,25737],{},[27,25729,25730],{},"Variáveis de ambiente migram com as mesmas chaves."," O HeroCtl tem um sistema de segredos próprio, mas o nome das variáveis que a aplicação consome continua o mesmo. Você importa o conteúdo do ",[231,25733,9376],{}," que estava no ",[231,25736,25381],{}," direto pro vault interno do cluster, e a aplicação não percebe a troca.",[12,25739,25740,25743,25744,25747,25748,25750],{},[27,25741,25742],{},"Volumes nomeados se mantêm",", porque Docker é Docker. Se você tinha um volume chamado ",[231,25745,25746],{},"app_storage"," no Kamal pra persistir uploads, no HeroCtl ele continua se chamando ",[231,25749,25746],{}," e mora no mesmo lugar do servidor. A diferença é que o cluster sabe onde ele está e respeita essa fixação ao decidir onde rodar a aplicação.",[12,25752,25753,25758],{},[27,25754,9010,25755,25757],{},[231,25756,25381],{}," não converte um pra um",", mas o mapeamento conceitual é quase mecânico:",[2735,25760,25761,25768,25774,25780],{},[70,25762,25763,25764,25767],{},"O bloco ",[231,25765,25766],{},"servers"," do Kamal vira a noção de cluster com N nós no HeroCtl. Você não lista IPs no arquivo de aplicação — o cluster já se conhece.",[70,25769,25763,25770,25773],{},[231,25771,25772],{},"proxy"," do Kamal vira a configuração de roteamento integrado. Em vez de descrever o proxy explicitamente, você descreve o nome de domínio e as regras; o roteador embutido aplica.",[70,25775,25763,25776,25779],{},[231,25777,25778],{},"accessories"," (Postgres, Redis e similares ao lado da aplicação) vira jobs auxiliares no mesmo cluster, gerenciados como qualquer outro serviço.",[70,25781,25763,25782,25785],{},[231,25783,25784],{},"env"," vira o sistema de segredos do HeroCtl, com as mesmas chaves.",[12,25787,25788,25791,25792,25794],{},[27,25789,25790],{},"Estimativa honesta:"," uma a três horas pra uma aplicação de complexidade média, contando tempo de leitura de documentação, conversão do arquivo, primeiro deploy de validação. Aplicações com muitos ",[231,25793,25778],{}," ou regras incomuns de roteamento podem chegar a meio dia. Acima disso, escreve pra gente — temos um conversor experimental que cobre os casos comuns.",[19,25796,16602],{"id":16601},[12,25798,25799,25806],{},[27,25800,25801,25802,25805],{},"O HeroCtl tem o equivalente do ",[231,25803,25804],{},"kamal accessories","?","\nSim. No HeroCtl você descreve Postgres, Redis ou qualquer outro serviço auxiliar como um job comum, gerenciado pelo mesmo cluster que roda a aplicação principal. A diferença prática é que esses serviços auxiliares ganham o mesmo tratamento que a aplicação: alta disponibilidade quando faz sentido, reconciliação automática, certificados se forem expostos publicamente, métricas e logs no painel central. Você não opera um conjunto separado de \"coisas ao lado\".",[12,25808,25809,25812],{},[27,25810,25811],{},"E se eu uso Kamal pra um app pequeno e HeroCtl pra outro maior, posso?","\nPode. Os dois mundos coexistem sem conflito. Inclusive recomendamos esse modelo durante a migração: você mantém o que funciona no Kamal exatamente como está, e usa o HeroCtl pras aplicações onde o cluster real importa. O único cuidado é não rodar o Kamal e o HeroCtl no mesmo servidor — eles disputam espaço no Docker e nas portas, e a confusão não compensa o ganho operacional. Servidores diferentes, mundos diferentes.",[12,25814,25815,25818],{},[27,25816,25817],{},"O HeroCtl roda em qualquer VPS Linux como o Kamal?","\nSim. A premissa é a mesma: servidor Linux com Docker. Provedor de nuvem grande, provedor menor, servidor dedicado, máquina virtual no escritório — onde o Kamal funciona, o HeroCtl funciona. Não há requisito de rede privada gerenciada, não há requisito de balanceador externo do provedor, não há requisito de sistema de arquivos especial. A condição mínima é três servidores que se enxerguem na rede e tenham Docker instalado.",[12,25820,25821,25824],{},[27,25822,25823],{},"Quanto consome a mais que o Kamal?","\nO plano de controle ocupa entre 200 e 400 MB por servidor. Em três servidores de configuração modesta, isso é menos de cinco por cento da memória total disponível. Comparado ao Kamal — que consome zero porque não tem processo residente — é mais. Comparado ao colosso, cuja versão gerenciada começa em torno de 700 MB por nó-mestre antes de qualquer aplicação subir, é metade. A pergunta correta não é \"quanto a mais\", é \"quanto isso me dá em troca\". Pra o nosso cluster público de demonstração, que roda quatro servidores, dezesseis contêineres e cinco sites com cinco vCPUs e dez gigabytes totais, a resposta é: alta disponibilidade real, sem precisar dobrar o hardware.",[12,25826,25827,25832,25833,25835],{},[27,25828,10949,25829,25831],{},[231,25830,25503],{},", que é roteador integrado por baixo?","\nO HeroCtl tem o próprio roteador integrado, com troca atômica entre versões, terminação TLS automática via Let's Encrypt e roteamento por nome de domínio. O conceito é o mesmo do ",[231,25834,25503],{},". A diferença é que o roteador do HeroCtl conhece o estado do cluster — ele sabe quando um servidor inteiro caiu, quando um contêiner está em rolling, quando uma versão nova ainda não passou na verificação de saúde. Roteador isolado faz roteamento; roteador integrado ao plano de controle faz roteamento informado.",[12,25837,25838,25841,25842,25844],{},[27,25839,25840],{},"Preciso aprender uma linguagem nova pra usar HeroCtl?","\nNão. O arquivo de configuração é texto simples, parecido com o ",[231,25843,25381],{}," do Kamal em estrutura e tamanho. Os comandos de linha de comando seguem o padrão verbo-substantivo que qualquer pessoa que rodou Docker conhece. O painel web cobre noventa por cento das operações sem você precisar abrir terminal. Não há linguagem de templating, não há sistema de pacotes paralelo, não há manifesto cerimonial. A regra interna é a mesma do Kamal: a configuração tem que caber numa tela.",[12,25846,25847,25850],{},[27,25848,25849],{},"Quando o HeroCtl não é a resposta certa?","\nQuando você opera um servidor único sem pressão de SLA, o Kamal é melhor — e dissemos isso acima. Quando você opera centenas de milhares de máquinas em escala planetária, o colosso é melhor — e dissemos isso noutro post. Quando o seu compliance officer precisa apontar pra um certificado existente com nome de produto na lista, hoje a resposta é o colosso ou um orquestrador comercial maduro. Nessas três condições, o HeroCtl não compete bem e a gente não tenta forçar. Pra a faixa entre três e quinhentos servidores, com pressão real de disponibilidade e tempo escasso pra montar stack, é onde a ferramenta foi desenhada pra brilhar.",[19,25852,3310],{"id":3309},[12,25854,25855],{},"A pergunta certa não é Kamal ou HeroCtl. É: o seu segundo cliente sério já apareceu? Se ainda não, fica no Kamal e seja feliz — qualquer coisa diferente disso é distração. Se já apareceu, e a noite mal dormida com o servidor caído já aconteceu pelo menos uma vez, a resposta começa a inclinar.",[12,25857,25858],{},"O caminho de teste é um comando único:",[224,25860,25862],{"className":25861,"code":5319,"language":2530},[2528],[231,25863,5319],{"__ignoreMap":229},[12,25865,25866],{},"Roda em três servidores, sobe a aplicação, mata um deles à força, vê o cluster realocar. Se a sensação de alívio for proporcional à dor que você teve no último incidente, está conversado. Se não for, volta pro Kamal sem culpa — significa que o seu momento ainda não chegou, e respeitar isso é tão importante quanto adotar a ferramenta certa quando o momento chega.",[12,25868,25869,25870,101],{},"A história mais longa do porquê construímos isso, e a leitura honesta dos três caminhos que existiam antes, está em ",[3337,25871,21739],{"href":6547},{"title":229,"searchDepth":244,"depth":244,"links":25873},[25874,25875,25876,25882,25883,25884,25885,25886,25887,25888],{"id":25368,"depth":244,"text":25369},{"id":25394,"depth":244,"text":25395},{"id":25427,"depth":244,"text":25428,"children":25877},[25878,25879,25880,25881],{"id":25434,"depth":271,"text":25435},{"id":25447,"depth":271,"text":25448},{"id":25477,"depth":271,"text":25478},{"id":25490,"depth":271,"text":25491},{"id":25507,"depth":244,"text":25508},{"id":25540,"depth":244,"text":25541},{"id":4825,"depth":244,"text":4826},{"id":25676,"depth":244,"text":25677},{"id":25711,"depth":244,"text":25712},{"id":16601,"depth":244,"text":16602},{"id":3309,"depth":244,"text":3310},"2026-01-29","Kamal é brilhante pra um VPS rodando Rails. Quando o segundo cliente sério pede redundância, a arquitetura precisa mudar. Onde Kamal para e o HeroCtl começa.",{},"\u002Fblog\u002Fheroctl-vs-kamal",{"title":25351,"description":25890},{"loc":25892},"blog\u002Fheroctl-vs-kamal",[25897,25898,25899,25900,8764],"kamal","rails","multi-server","37signals","9TtwUnF4HW5bZv4CUIshvdqyZO2X__ExREDbD1mIKn8",{"id":25903,"title":25904,"author":7,"body":25905,"category":8764,"cover":3380,"date":26414,"description":26415,"draft":3383,"extension":3384,"lastReviewed":3380,"meta":26416,"navigation":411,"path":16706,"readingTime":26417,"seo":26418,"sitemap":26419,"stem":26420,"tags":26421,"__hash__":26424},"blog_pt\u002Fblog\u002Fheroctl-vs-dokploy.md","HeroCtl vs Dokploy: comparativo honesto",{"type":9,"value":25906,"toc":26401},[25907,25913,25916,25919,25923,25926,25932,25938,25944,25950,25956,25959,25963,25970,25981,25984,25987,25990,25993,25997,26000,26003,26006,26010,26013,26022,26028,26034,26040,26046,26051,26060,26062,26065,26213,26216,26220,26223,26226,26229,26235,26238,26241,26245,26248,26251,26254,26257,26260,26263,26267,26270,26273,26276,26279,26282,26286,26289,26292,26295,26302,26308,26311,26314,26316,26322,26328,26334,26340,26346,26352,26357,26359,26362,26365,26374,26377,26393,26396,26399],[12,25908,25909,25910,25912],{},"Em sub-Reddits de DevOps em 2026, entre os auto-hospedados que apareceram depois da onda do ",[3337,25911,2771],{"href":16701},", o nome mais comentado é o Dokploy. Painel limpo. Instalação rápida. Comunidade que cresceu numa velocidade que a maioria dos projetos de orquestração da última década não viu.",[12,25914,25915],{},"E uma decisão técnica que define todo o resto: o Dokploy roda Docker Swarm como engine de cluster. Não é detalhe — é a fundação. Tudo que ele entrega de bom vem dessa escolha, e tudo que ele tem de limitação também.",[12,25917,25918],{},"Esse texto é a leitura honesta dessa escolha, e a comparação ponto a ponto com o caminho que o HeroCtl seguiu. Sem ataque ao Dokploy, sem pintura cor-de-rosa do HeroCtl. Os dois produtos resolvem problemas parecidos com filosofias diferentes, e a decisão entre eles é mais do que preferência de painel.",[19,25920,25922],{"id":25921},"onde-o-dokploy-acertou","Onde o Dokploy acertou",[12,25924,25925],{},"Antes do contraste, o crédito. Equipes que avaliam o Dokploy hoje encontram um produto que faz cinco coisas certas e faz bem.",[12,25927,25928,25931],{},[27,25929,25930],{},"A UX é coesa."," O painel tem identidade visual própria, fluxos lineares, e os botões fazem o que prometem. Pra quem vem do Heroku ou do antigo painel comercial que ficou caro nos últimos anos, o Dokploy passa a sensação familiar de \"abre, clica, deploya\". É o tipo de polimento que só aparece depois de muitas iterações em cima de feedback de usuário real.",[12,25933,25934,25937],{},[27,25935,25936],{},"A instalação é rápida."," Um comando, cinco minutos, painel no ar. Pra projetos individuais e times pequenos, esse atrito mínimo é o que separa \"vou tentar\" de \"vou desistir e continuar com a nuvem cara\".",[12,25939,25940,25943],{},[27,25941,25942],{},"O multi-server vem de fábrica."," Você adiciona um segundo e um terceiro servidor pelo painel e o Swarm por baixo cuida de distribuir contêineres. Pra quem nunca tinha pensado em alta disponibilidade, virar HA por configuração é um avanço grande sobre painéis que rodam só num servidor.",[12,25945,25946,25949],{},[27,25947,25948],{},"O roteador integrado funciona."," Há um roteador embutido que termina TLS, emite certificados Let's Encrypt automaticamente e encaminha tráfego pros contêineres. Você não precisa montar e manter um proxy reverso separado, não escreve configuração de virtual host à mão, não decora flags de renovação de certificado.",[12,25951,25952,25955],{},[27,25953,25954],{},"Bom suporte a stacks comuns."," Apps Node, Django, Rails, projetos com Dockerfile direto, projetos via docker compose — tudo gira sem ajustes. A comunidade publica plugins one-click pros bancos de dados mais comuns, pra ferramentas de filas, pra observabilidade básica.",[12,25957,25958],{},"Essa lista é honesta. Quem disser que o Dokploy é \"só mais um wrapper\" não está olhando direito. É um produto sério, com tração, e foi feito por gente que escutou usuário.",[19,25960,25962],{"id":25961},"a-escolha-tecnica-fundamental-docker-swarm","A escolha técnica fundamental — Docker Swarm",[12,25964,25965,25966,25969],{},"O ponto que muda a conversa é a engine. O Dokploy não inventou seu próprio plano de controle de cluster — ele consome o Swarm que já vem dentro do Docker. O painel fala com a API do Swarm, que coordena os agentes em cada servidor. Quando você adiciona um servidor pelo painel, é um ",[231,25967,25968],{},"swarm join"," por baixo.",[12,25971,25972,25973,25976,25977,25980],{},"Essa decisão tem virtudes reais. O Swarm é estável há quase uma década. A API é consistente com o ",[231,25974,25975],{},"docker compose"," que a maioria dos times já conhece — declarar serviços tem a mesma cara em ambos. A eleição de coordenador é embutida, vem de graça com o ",[231,25978,25979],{},"swarm init",". E porque é parte do Docker, qualquer servidor que já tem Docker instalado pode entrar no cluster com um comando.",[12,25982,25983],{},"O problema é o que aconteceu com o Swarm desde 2019. A Docker Inc decidiu naquele ano focar quase toda a engenharia de orquestração em outros produtos da empresa, e o Swarm entrou no que comunicados internos da época descreviam como \"modo manutenção\". Tradução prática: correções de segurança continuam, releases de bug fix continuam, mas features novas pararam. Não há roadmap público de evolução. Ninguém da equipe Docker apresentou em conferência, nos últimos cinco anos, melhorias de scheduling, de rede, de criptografia entre serviços, de integração com novos runtimes.",[12,25985,25986],{},"O Swarm não está abandonado — está em estase. E estase tem um custo composto.",[12,25988,25989],{},"Quando uma rede sobreposta entre nós tem um caso de borda em provedores cloud específicos, esse caso fica esperando alguém de fora propor patch. Quando um padrão novo de runtime de contêiner aparece — runtimes leves, contêineres confidenciais, melhorias de isolamento — o Swarm não absorve. Quando você quer criptografia entre serviços que vai além da overlay encrypted opcional do Swarm, a resposta é \"monta um produto separado por cima\".",[12,25991,25992],{},"O Dokploy herda esse perfil. Cada limitação do Swarm vira uma limitação do Dokploy sem caminho próprio de evolução. Não é culpa do Dokploy — é a consequência matemática de construir em cima de uma engine que parou de evoluir.",[19,25994,25996],{"id":25995},"a-escolha-tecnica-do-heroctl","A escolha técnica do HeroCtl",[12,25998,25999],{},"O HeroCtl tomou a decisão oposta: construir o plano de controle do zero, sem depender do Swarm nem do colosso de orquestração popular. Não é purismo de \"não inventado aqui\". É a constatação de que orquestração na faixa \"1 a 500 servidores\" é um problema diferente do que tanto o Swarm quanto o colosso resolvem, e nenhum dos dois vai voltar a focar nesse nicho.",[12,26001,26002],{},"A consequência prática é liberdade de roadmap. Quando o time decide que criptografia entre serviços precisa ser nativa — não plugin, não overlay opcional, não operador externo — basta implementar. Quando decidimos que métricas persistentes deveriam rodar como job interno do próprio cluster, sem montar três produtos externos, foi uma decisão de arquitetura sem condicionante. Quando precisamos otimizar o caminho de deploy pra que mil contêineres entrem em rotação em poucos minutos, não há fila atrás da Docker Inc nem da fundação que mantém o colosso.",[12,26004,26005],{},"A contrapartida é honesta: o HeroCtl é mais novo. Tem menos quilometragem que o Swarm. Tem comunidade menor. A pilha de plugins one-click é mais curta. Esse é o trade-off de construir o plano de controle inteiro em vez de consumir um pronto. Os primeiros seis meses de produção fechada — quatro servidores, cinco vCPUs totais, dez gigabytes de RAM, dezesseis contêineres ativos, cinco sites com TLS automático — mostraram que o núcleo aguenta. O painel ainda está em catch-up visual.",[19,26007,26009],{"id":26008},"comparacao-operacional","Comparação operacional",[12,26011,26012],{},"Lado a lado, em quesitos que importam pra quem vai operar.",[12,26014,26015,26018,26019,26021],{},[27,26016,26017],{},"Instalação."," Dokploy: cinco minutos pra painel no ar — instala Docker se não tem, faz ",[231,26020,25979],{},", sobe o painel. HeroCtl: cinco minutos também — baixa um arquivo executável, registra o serviço, sobe o agente. Empate operacional.",[12,26023,26024,26027],{},[27,26025,26026],{},"Multi-server real."," Dokploy depende do plano de controle do Swarm — três servidores coordenadores ou mais pra que a perda de um não derrube o cluster. HeroCtl tem plano de controle replicado próprio, também em três servidores ou mais. Os dois entregam HA real. A diferença é de quem você está dependendo: do estado atual do Swarm ou do estado atual do HeroCtl.",[12,26029,26030,26033],{},[27,26031,26032],{},"Painel."," Os dois têm. Em 2026, o do Dokploy está mais polido visualmente — anos a mais de iteração e uma comunidade maior dando feedback. O do HeroCtl cobre os mesmos casos de uso (deploy, métricas, logs, cluster topology, certificados, secrets, audit) mas em catch-up estético. Honestidade de produto: se a estética do painel é determinante na decisão e tem peso maior do que arquitetura, o Dokploy ganha hoje.",[12,26035,26036,26039],{},[27,26037,26038],{},"Plugins e marketplace."," O Dokploy tem mais plugins one-click hoje — Postgres, Redis, MinIO, observabilidade. O HeroCtl roda qualquer contêiner como job, com a mesma interface uniforme; o que falta é a vitrine de \"clica e tem\". Pra quem prefere descrever um job em arquivo de configuração e versionar no repositório, o HeroCtl chega no mesmo lugar. Pra quem prefere clicar e ter, o Dokploy chega mais rápido.",[12,26041,26042,26045],{},[27,26043,26044],{},"Métricas e logs."," Dokploy: stack via plugins externos — Prometheus, Grafana, Loki ou similares montados separadamente. HeroCtl: métricas e logs como jobs internos do próprio cluster, com escritor único embutido. A diferença é menos sobre quem entrega melhor dado, mais sobre quantos produtos você está mantendo. Time pequeno costuma valorizar a pilha mais curta; time com SRE costuma preferir a flexibilidade de plugar a stack que já conhece.",[12,26047,26048,26050],{},[27,26049,4789],{}," Dokploy não traz por padrão. O Swarm tem rede overlay com criptografia opcional, mas o Dokploy não promove esse caminho como primeira classe. Pra criptografia mútua de verdade entre todos os serviços, é mais um produto em cima. HeroCtl traz embutido — toda comunicação entre contêineres do cluster é cifrada por padrão, com PKI automática, sem operador externo. É a diferença entre \"tem opção\" e \"vem ligado\".",[12,26052,26053,26056,26057,26059],{},[27,26054,26055],{},"Observabilidade do plano de controle."," Dokploy: você inspeciona o estado do Swarm via comandos ",[231,26058,1118],{}," no servidor mais painel pra app. HeroCtl: API uniforme do plano de controle expõe estado de jobs, agentes, eleição, certificados, em endpoints próprios — auditados.",[19,26061,17385],{"id":17384},[12,26063,26064],{},"A versão honesta da decisão. Como sempre, todo orquestrador é um conjunto de tradeoffs.",[119,26066,26067,26077],{},[122,26068,26069],{},[125,26070,26071,26073,26075],{},[128,26072,2983],{},[128,26074,2777],{},[128,26076,2995],{},[141,26078,26079,26090,26100,26110,26120,26130,26140,26151,26162,26172,26181,26192,26202],{},[125,26080,26081,26084,26087],{},[146,26082,26083],{},"Engine de cluster",[146,26085,26086],{},"Docker Swarm (em manutenção desde 2019)",[146,26088,26089],{},"Plano de controle próprio, evolução ativa",[125,26091,26092,26095,26098],{},[146,26093,26094],{},"Instalação",[146,26096,26097],{},"~5 min",[146,26099,26097],{},[125,26101,26102,26104,26107],{},[146,26103,16334],{},[146,26105,26106],{},"Sim (3+ coordenadores Swarm)",[146,26108,26109],{},"Sim (3+ servidores com plano de controle replicado)",[125,26111,26112,26114,26117],{},[146,26113,25609],{},[146,26115,26116],{},"Sim, mais polido em 2026",[146,26118,26119],{},"Sim, em catch-up estético",[125,26121,26122,26125,26128],{},[146,26123,26124],{},"Roteador + TLS automático",[146,26126,26127],{},"Embutido (proxy reverso por baixo)",[146,26129,23290],{},[125,26131,26132,26134,26137],{},[146,26133,23305],{},[146,26135,26136],{},"Opcional via overlay encrypted",[146,26138,26139],{},"Embutida e padrão",[125,26141,26142,26145,26148],{},[146,26143,26144],{},"Métricas \u002F logs",[146,26146,26147],{},"Plugins externos",[146,26149,26150],{},"Jobs internos do cluster",[125,26152,26153,26156,26159],{},[146,26154,26155],{},"Marketplace de plugins",[146,26157,26158],{},"Mais maduro",[146,26160,26161],{},"Mais curto, qualquer contêiner como job",[125,26163,26164,26166,26169],{},[146,26165,22831],{},[146,26167,26168],{},"Open source",[146,26170,26171],{},"Community gratuito permanente + Business + Enterprise",[125,26173,26174,26176,26179],{},[146,26175,19696],{},[146,26177,26178],{},"Limitada",[146,26180,24650],{},[125,26182,26183,26186,26189],{},[146,26184,26185],{},"Escrow de código-fonte",[146,26187,26188],{},"Não aplicável",[146,26190,26191],{},"Sim (Enterprise)",[125,26193,26194,26196,26199],{},[146,26195,5015],{},[146,26197,26198],{},"1–50 servidores",[146,26200,26201],{},"1–500 servidores",[125,26203,26204,26207,26210],{},[146,26205,26206],{},"Roadmap de orquestração",[146,26208,26209],{},"Condicionado ao Swarm",[146,26211,26212],{},"Independente",[12,26214,26215],{},"A coluna que mais provoca a decisão é a primeira. Tudo o resto deriva dela.",[19,26217,26219],{"id":26218},"quando-o-dokploy-e-a-escolha-certa","Quando o Dokploy é a escolha certa",[12,26221,26222],{},"A honestidade exige a seção. Há cenários em que recomendar o Dokploy é a resposta correta.",[12,26224,26225],{},"Você gosta de Docker Swarm e ele atende ao que você precisa hoje. Apps web típicas, banco de dados gerenciado fora do cluster, baixa exigência de criptografia interna, time pequeno que prefere previsibilidade a evolução de plataforma. O Swarm vai aguentar isso por anos. Construir em cima dele significa construir em cima de algo testado e estável, mesmo que parado.",[12,26227,26228],{},"O painel mais polido do segmento self-hosted importa muito pro seu time. Se a interface visual é parte da venda interna pro resto da empresa, se o seu CTO vai mostrar pro CEO e a impressão importa, o Dokploy chega na frente em 2026. O HeroCtl está fechando essa distância, mas ainda não fechou.",[12,26230,26231,26232,26234],{},"Você já tem deploys via ",[231,26233,25975],{}," e quer caminho de migração mínimo. O Dokploy aceita compose com pouca fricção. Subir um time inteiro acostumado com compose pra um modelo novo de job spec é um custo organizacional que nem todo projeto justifica.",[12,26236,26237],{},"Você quer comunidade ativa de plugins one-click. Se o seu fluxo é \"preciso de Postgres com replicação, clica, pronto\", o Dokploy entrega isso hoje. O HeroCtl entrega o mesmo Postgres, mas você descreve o job e versiona em repositório.",[12,26239,26240],{},"Você não tem requisitos formais de criptografia entre serviços nativa nem auditoria detalhada. Pra time de cinco pessoas com SaaS que ainda não vendeu pro primeiro cliente Enterprise, o Dokploy é resposta suficiente. Sair dele depois é trabalho — mas é trabalho que talvez você nunca precise fazer.",[19,26242,26244],{"id":26243},"quando-o-heroctl-e-a-escolha-certa","Quando o HeroCtl é a escolha certa",[12,26246,26247],{},"Os perfis simétricos.",[12,26249,26250],{},"Você quer um plano de controle que evolui com decisões próprias. Pra projetos onde a plataforma de execução é parte do produto — não só infra acessória — depender de uma engine em manutenção é um risco estratégico. Construir em cima de algo que evolui é diferente de construir em cima de algo que mantém.",[12,26252,26253],{},"Criptografia entre serviços precisa ser nativa. Se a sua arquitetura tem dezenas de serviços conversando, dados sensíveis trafegando entre eles, e você não quer montar uma malha de serviço separada nem confiar em \"rede privada do provedor cloud\" como única camada, faz diferença ter cifragem por padrão.",[12,26255,26256],{},"Você precisa de auditoria detalhada. Quem assinou Business sabe quem fez o quê e quando — quem promoveu versão de qual job, quem rodou qual comando administrativo, quem rotacionou qual segredo. Pra times com requisitos de compliance crescentes, isso não é opcional.",[12,26258,26259],{},"Você quer escrow de código-fonte como seguro de continuidade. Enterprise inclui contrato com terceira parte custodiante: se a empresa por trás do HeroCtl encerrar operações, o código é entregue aos clientes pagantes com licença de continuidade interna. Pra organizações que não podem se dar ao luxo de \"e se a empresa quebrar\", essa estrutura é o que destrava a aprovação de procurement.",[12,26261,26262],{},"Faixa de aplicação 3 a 500 servidores com requisitos formais. É a faixa onde nem o Swarm em manutenção nem o colosso desenhado pra dezenas de milhares de máquinas servem bem. É exatamente onde o HeroCtl mira.",[19,26264,26266],{"id":26265},"a-questao-do-swarm-em-producao","A questão do Swarm em produção",[12,26268,26269],{},"Convém ser justo aqui — e ser específico.",[12,26271,26272],{},"O Swarm continua estável. Pra a maioria absoluta dos casos de uso, ele vai entregar o que promete por mais alguns anos. Apps web típicas, microsserviços de complexidade média, deploys rolling, healthchecks, descoberta de serviço básica — tudo isso roda. Histórias de cluster Swarm em produção há cinco ou seis anos sem incidente grave existem em volume.",[12,26274,26275],{},"O ponto não é \"Swarm vai quebrar\". É \"Swarm não vai melhorar\". Construir em cima dele em 2026 é assinar tacitamente que o conjunto de capacidades que ele tem hoje é o conjunto que você vai ter pra sempre. Pra projetos onde isso é um trade-off aceitável, sem problema. Pra projetos onde criptografia entre serviços, observabilidade nativa, integração com runtimes novos, ou extensibilidade do scheduler vão importar nos próximos três anos, vale considerar uma stack que continua evoluindo.",[12,26277,26278],{},"Tem outro ângulo. Quando o Swarm tem um caso de borda — rede sobreposta com perda intermitente em provedores cloud específicos, scheduling estranho quando um nó volta depois de partição longa, comportamento inesperado de health check em contêineres com inicialização lenta — esses casos hoje são debugados pela comunidade de fora. A Docker Inc não está de plantão. Resolver vira projeto da sua equipe. No HeroCtl, esses casos são tratados pelo time que escreveu o código — você abre relato, a gente sobe correção. É um modelo de suporte diferente porque o investimento de engenharia continua acontecendo.",[12,26280,26281],{},"Não é argumento ideológico de \"código novo é melhor\". O Swarm é estável precisamente porque é antigo. O argumento é prático: a evolução do produto que você vai usar nos próximos cinco anos depende de quem está investindo. No Dokploy, parte da evolução depende de gente que parou de mexer no Swarm em 2019. No HeroCtl, depende de gente que está mexendo no plano de controle hoje.",[19,26283,26285],{"id":26284},"migracao-entre-eles","Migração entre eles",[12,26287,26288],{},"Caminho conceitual, não receita. Cada projeto tem detalhes próprios — escreva pra gente se quiser ajuda específica.",[12,26290,26291],{},"Imagens Docker servem nos dois. Dockerfile que você usa no Dokploy é o mesmo que você usa no HeroCtl. Não há build especial, não há runtime customizado.",[12,26293,26294],{},"Variáveis de ambiente migram com mesmas chaves. Onde você tem um bloco de env vars no Dokploy, você tem um bloco equivalente no job spec do HeroCtl. Os nomes não mudam.",[12,26296,26297,26298,26301],{},"Volumes nomeados se mantêm. Volume montado em ",[231,26299,26300],{},"\u002Fvar\u002Flib\u002Fpostgresql\u002Fdata"," continua montado lá. O conceito de volume persistente entre reinícios é o mesmo.",[12,26303,9010,26304,26307],{},[231,26305,26306],{},"compose"," que o Dokploy aceita não converte 1:1 pro job spec do HeroCtl, mas o mapeamento é direto. Serviço vira task. Network vira política de rede. Deploy strategy vira estratégia de rolling update. A primeira migração leva uma tarde por aplicação; depois disso, copiar e colar com substituições.",[12,26309,26310],{},"Ingress: o roteador do Dokploy e o roteador integrado do HeroCtl ambos terminam em configuração-como-código. Você descreve host, redirect, certificado em pouquíssimas linhas em qualquer dos dois. A tradução é mecânica.",[12,26312,26313],{},"Pra times com até dez aplicações, migração manual numa tarde. Acima disso, conversor experimental cobre os casos comuns — escreve pra gente.",[19,26315,16602],{"id":16601},[12,26317,26318,26321],{},[27,26319,26320],{},"O HeroCtl é mais maduro que o Dokploy?","\nNão em todas as dimensões. O Dokploy tem mais tempo de comunidade, mais plugins, painel mais polido visualmente. O HeroCtl tem plano de controle próprio com evolução ativa, alta disponibilidade real testada em bateria de caos documentada, e roadmap independente de qualquer outro projeto. \"Maduro\" depende do eixo. Em estética de painel e marketplace, o Dokploy. Em arquitetura de plataforma e contrato comercial explícito, o HeroCtl.",[12,26323,26324,26327],{},[27,26325,26326],{},"E o painel, o do Dokploy é melhor?","\nEm 2026, sim — mais polido visualmente, mais anos de iteração, mais feedback de comunidade incorporado. O do HeroCtl cobre os mesmos casos de uso e está em catch-up estético. A pergunta importante é se a diferença visual é o critério decisivo pra você. Pra alguns times é. Pra outros, arquitetura pesa mais.",[12,26329,26330,26333],{},[27,26331,26332],{},"Qual consome menos recurso?","\nDokploy adiciona o overhead do painel mais o overhead do Swarm dentro do Docker — o Swarm em si é leve, mas o painel é uma aplicação web razoavelmente completa. HeroCtl tem plano de controle entre 200 e 400 MB por servidor, incluindo painel web embutido. Em cluster pequeno os dois cabem confortavelmente em servidores modestos. A diferença não é determinante na decisão.",[12,26335,26336,26339],{},[27,26337,26338],{},"E o backup de banco?","\nNos dois, banco de dados é uma responsabilidade explícita de quem opera. O Dokploy tem plugins one-click pra Postgres e similares, mas backup automático é configuração adicional — geralmente você monta cron job ou plugin de backup separado. HeroCtl trata banco como qualquer outro job, com volume persistente; backup é um job paralelo que você define. Business inclui backup gerenciado com janelas e retenção. Em nenhum dos dois \"ligar e esquecer\" é resposta honesta — banco merece atenção em ambos.",[12,26341,26342,26345],{},[27,26343,26344],{},"O Dokploy é open source, HeroCtl não é, isso me preocupa?","\nPergunta justa. O HeroCtl tem Community Edition gratuita pra sempre, sem limite de servidores, sem limite de jobs, sem feature gates artificiais. O binário não tem phone-home obrigatório nem kill-switch remoto — uma vez instalado, o cluster funciona offline indefinidamente. Enterprise inclui escrow de código-fonte com terceira parte custodiante, então se a empresa por trás do produto encerrar operações, o código é entregue aos clientes pagantes com licença de continuidade interna. Não é o mesmo que open source, mas resolve o que open source resolve nesse contexto: garantia contra desaparecimento do fornecedor. O contrato comercial está publicado desde o dia um e congelado pra quem assina hoje — não há cláusula de mudança retroativa.",[12,26347,26348,26351],{},[27,26349,26350],{},"Posso usar os dois, um pra dev e outro pra prod?","\nTecnicamente sim, mas raramente faz sentido. Imagens Docker são portáteis entre os dois, então o caminho funciona. Na prática, dois orquestradores diferentes em ambientes adjacentes dobra o conhecimento operacional do time. Recomendamos escolher um e ficar nele. Se a dúvida é a fundo qual escolher, escreva pra gente — discutir caso a caso é mais útil do que conselho genérico.",[12,26353,26354,26356],{},[27,26355,22965],{},"\nPra cima de mil servidores, nenhum dos dois é a escolha óbvia — essa faixa é território do colosso desenhado pra dezenas de milhares de máquinas. Na faixa de 1 a 500 servidores, o HeroCtl foi desenhado especificamente. O Dokploy escala bem dentro do que o Swarm escala — tipicamente até algumas dezenas de nós em produção sem ginástica. Acima disso, o Swarm passa a exigir cuidados que não estavam na proposta original do produto.",[19,26358,3310],{"id":3309},[12,26360,26361],{},"A escolha entre Dokploy e HeroCtl não é entre produto bom e produto ruim. Os dois são sérios. A escolha é entre filosofias diferentes de plataforma.",[12,26363,26364],{},"O Dokploy escolheu construir uma camada de UX e produto em cima de uma engine madura mas estática. O HeroCtl escolheu construir o plano de controle inteiro pra controlar a evolução. Trade-offs reais nas duas direções.",[12,26366,26367,26368,26370,26371,26373],{},"Se você está em Dokploy hoje e não está sentindo as limitações, fica. É um produto bom. Se você está avaliando os dois em greenfield, leia o post sobre ",[3337,26369,6548],{"href":6547}," pra entender a motivação por trás da decisão de construir o plano de controle do zero. Se você está vindo do Heroku ou de painéis comerciais que ficaram caros, vale também o post ",[3337,26372,19767],{"href":19766}," — o contexto de mercado ajuda.",[12,26375,26376],{},"Pra experimentar o HeroCtl em três minutos:",[224,26378,26379],{"className":226,"code":5319,"language":228,"meta":229,"style":229},[231,26380,26381],{"__ignoreMap":229},[234,26382,26383,26385,26387,26389,26391],{"class":236,"line":237},[234,26384,1220],{"class":247},[234,26386,2958],{"class":251},[234,26388,5330],{"class":255},[234,26390,2964],{"class":383},[234,26392,2967],{"class":247},[12,26394,26395],{},"Um arquivo executável, um servidor pra começar, dois mais quando você quiser HA real. Painel embutido, certificados automáticos, criptografia entre serviços por padrão. Sem phone-home, sem kill-switch, contrato comercial congelado.",[12,26397,26398],{},"A intenção é simples: orquestração de contêineres, sem cerimônia.",[3351,26400,4376],{},{"title":229,"searchDepth":244,"depth":244,"links":26402},[26403,26404,26405,26406,26407,26408,26409,26410,26411,26412,26413],{"id":25921,"depth":244,"text":25922},{"id":25961,"depth":244,"text":25962},{"id":25995,"depth":244,"text":25996},{"id":26008,"depth":244,"text":26009},{"id":17384,"depth":244,"text":17385},{"id":26218,"depth":244,"text":26219},{"id":26243,"depth":244,"text":26244},{"id":26265,"depth":244,"text":26266},{"id":26284,"depth":244,"text":26285},{"id":16601,"depth":244,"text":16602},{"id":3309,"depth":244,"text":3310},"2026-01-22","Dokploy é a aposta do segmento self-hosted depois do crescimento do Coolify. Comparativo honesto: onde se sobrepõem, onde divergem.",{},"12 min",{"title":25904,"description":26415},{"loc":16706},"blog\u002Fheroctl-vs-dokploy",[26422,8764,7514,26423],"dokploy","docker-swarm","rxcT3b2hOrD_p6FK7ojEuTVFAS7AWW83yd1llaVHC8c",{"id":26426,"title":26427,"author":7,"body":26428,"category":8764,"cover":3380,"date":27060,"description":27061,"draft":3383,"extension":3384,"lastReviewed":3380,"meta":27062,"navigation":411,"path":27063,"readingTime":8769,"seo":27064,"sitemap":27065,"stem":27066,"tags":27067,"__hash__":27070},"blog_pt\u002Fblog\u002Fcaprover-vs-coolify-vs-dokploy-segmento-simples.md","CapRover vs Coolify vs Dokploy: o segmento simples comparado em 2026",{"type":9,"value":26429,"toc":27047},[26430,26439,26442,26449,26456,26463,26466,26470,26473,26476,26482,26492,26498,26502,26505,26508,26513,26522,26528,26532,26535,26538,26543,26548,26554,26558,26561,26740,26747,26751,26757,26760,26763,26774,26791,26794,26797,26829,26832,26836,26839,26842,26845,26857,26860,26864,26867,26899,26902,26906,26909,26915,26928,26937,26943,26946,26950,26953,26970,26973,26976,26978,26984,26990,26996,27002,27008,27014,27020,27022,27025,27028,27031,27036],[12,26431,26432,26433,5840,26435,26438],{},"Três produtos disputam hoje o mesmo nicho: o desenvolvedor que quer um Heroku rodando em uma VPS própria, sem aprender orquestrador de cluster e sem pagar US$25 por dyno. CapRover, Coolify e Dokploy. Os três fazem a mesma promessa — ",[231,26434,16110],{},[231,26436,26437],{},"docker pull",", painel web, certificado automático, deploy em minutos. Os três entregam essa promessa. E mesmo assim, escolher errado entre eles vai te custar três meses do seu próximo trimestre.",[12,26440,26441],{},"A diferença não está no que cada um faz. Está no que cada um aposta.",[12,26443,26444,26445,26448],{},"CapRover apostou em ",[27,26446,26447],{},"estabilidade",". Existe desde 2017, atravessou três ondas de hype sem perder identidade, e prefere envelhecer a se reinventar.",[12,26450,26451,26452,26455],{},"Coolify apostou em ",[27,26453,26454],{},"riqueza de features",". Marketplace de templates, suporte nativo a docker-compose, multi-server, dezenas de integrações prontas. É o painel mais popular do segmento em janeiro de 2026.",[12,26457,26458,26459,26462],{},"Dokploy apostou em ",[27,26460,26461],{},"peso leve com UX moderna",". Usa Docker Swarm por baixo pra ganhar multi-server fora da caixa, copia o que funcionou em Coolify e descarta o que pesou.",[12,26464,26465],{},"A escolha entre os três define a próxima dor que você vai ter — e não é a dor de instalação. É a dor que aparece no oitavo mês, quando o painel já está rodando seus dois ou três SaaS de produção e você precisa decidir se confia nele em uma quinta-feira à noite. Este post é o mapa pra escolher sabendo qual dor vem.",[19,26467,26469],{"id":26468},"caprover-o-veterano","CapRover, o veterano",[12,26471,26472],{},"CapRover saiu em 2017, antes de Coolify existir, antes do hype de self-hosting voltar à moda, antes de docker-compose ser sinônimo de \"dev local\". Foi escrito em Node, usa Docker Swarm internamente (sim, antes de Dokploy fazer isso virar bandeira), e nunca tentou ser bonito.",[12,26474,26475],{},"A filosofia do projeto é visível em cada decisão: faça uma coisa bem, mantenha o código simples, prefira release semestral a release semanal. O resultado é uma das ferramentas mais confiáveis desse segmento. Pessoas que instalaram CapRover em 2019 ainda rodam aquela mesma instalação em 2026 com upgrades incrementais e zero reinstalação completa.",[12,26477,26478,26481],{},[27,26479,26480],{},"O que ele faz bem."," Idle de aproximadamente 150 MB de RAM — o mais leve dos três por uma margem confortável. Instalação em uma VPS de US$5\u002Fmês roda tranquilo, com 600 MB livres pra workload real. Painel funcional sem firulas, abstração de \"App\" simples (uma imagem Docker, variáveis de ambiente, domínio, certificado), suporte a deploy via CLI, via push de tarball, via Dockerfile. Comunidade pequena mas leal — o fórum tem respostas de 2018 que ainda fazem sentido em 2026.",[12,26483,26484,26487,26488,26491],{},[27,26485,26486],{},"Onde ele perde."," O modelo \"App\" é primariamente single-container. Você consegue rodar serviços auxiliares (Postgres, Redis) como Apps separados, mas a integração entre eles é via DNS interno e variáveis manuais. docker-compose tem suporte limitado — funciona pra casos simples, quebra em casos com volumes nomeados complexos ou healthchecks elaborados. O ecossistema de plugins\u002Ftemplates (\"one-click apps\") existe e funciona, mas a curadoria estagnou; muitos templates apontam pra versões de imagem de 2022. UI tem o estilo visual de quando foi escrita — funcional, mas data o produto. E o ponto mais crítico: ",[27,26489,26490],{},"não existe multi-server real",". Você roda em uma VPS. Quer redundância? CapRover não te ajuda.",[12,26493,26494,26497],{},[27,26495,26496],{},"Quando CapRover é a escolha certa."," Solo dev com uma VPS. Aplicação monolítica sem dezenas de microsserviços. Orçamento apertado (a leveza dele te economiza um upgrade de plano). Time de uma a três pessoas que já tomou todas as decisões importantes e quer um painel que simplesmente não morra. Você valoriza estabilidade acima de feature nova. CapRover envelhece bem; em janeiro de 2026 ele continua sendo a escolha pragmática pra esse perfil específico.",[19,26499,26501],{"id":26500},"coolify-o-feature-rich-popular","Coolify, o feature-rich popular",[12,26503,26504],{},"Coolify entrou no mercado tarde — primeira release relevante em 2021 — e ganhou tração estonteante nos últimos três anos. Em janeiro de 2026 acumula dezenas de milhares de estrelas no repositório público, comunidade ativa, releases mensais, presença em conferências, criador conhecido pessoalmente pelo público. É o painel que indie hacker no Twitter recomenda primeiro.",[12,26506,26507],{},"A filosofia é clara: faça o painel mais completo do mercado. Suporte tudo. Marketplace, multi-server, monitoring integrado, suporte a destinos múltiplos (provedor cloud A, provedor cloud B, sua VPS), notificações em vários canais, integração com vários git providers, deploys preview, branch-per-environment, revisão de pull request. Se um competidor tem feature, Coolify quer ter também — e geralmente tem.",[12,26509,26510,26512],{},[27,26511,26480],{}," UI moderna e agradável. Suporte nativo e robusto a docker-compose — você cola o seu compose existente, ajusta domínios, deploya. Templates de banco de dados em um clique pra Postgres, MySQL, MariaDB, MongoDB, Redis, e mais uma dezena. Multi-server: você cadastra um destino remoto e Coolify provisiona apps lá. Backup automático integrado pra os bancos provisionados. Suporte a múltiplos provedores git. Comunidade ativa que responde rápido — Discord ativo, releases que incorporam pedidos.",[12,26514,26515,26517,26518,26521],{},[27,26516,26486],{}," Pesado. Idle entre 500 e 700 MB de RAM, dependendo da versão e do número de serviços auxiliares ativos. Em uma VPS de 1 GB você está apertado antes de subir um único container de aplicação. A complexidade cresceu nos últimos dois anos mais rápido do que a documentação acompanhou — features novas estreiam com tutorial em vídeo no Twitter e demoram pra virar página estática consultável. Mas o ponto mais grave é o que ",[27,26519,26520],{},"multi-server não significa em Coolify",": não é alta disponibilidade. É \"um painel central deploya em N hosts remotos\". Se o servidor que hospeda o painel cai, você perde a capacidade de fazer deploy, ver logs, revisar status — os apps remotos continuam rodando, mas você está cego. O painel é ponto único de falha por desenho.",[12,26523,26524,26527],{},[27,26525,26526],{},"Quando Coolify é a escolha certa."," Indie hacker com 2 a 5 aplicações. Quer painel maduro, com features prontas que economizam tempo de configuração. Valoriza marketplace de templates e setup rápido de banco de dados. Tem latitude orçamentária pra hardware — uma VPS de 2 a 4 GB de RAM dedicada ao painel não é problema. Não tem requisito formal de SLA. É o \"Heroku self-hosted\" mais completo que você consegue hoje, e pra esse perfil ele entrega exatamente.",[19,26529,26531],{"id":26530},"dokploy-o-desafiante-leve","Dokploy, o desafiante leve",[12,26533,26534],{},"Dokploy é o mais novo dos três. Lançamento público em 2024, ganhou tração rápido em 2025, em janeiro de 2026 acumula algo em torno de dez mil estrelas no repositório público. Foi explicitamente posicionado como \"o que Coolify deveria ser, sem o peso\".",[12,26536,26537],{},"A filosofia: copiar o que Coolify acertou em UX e descartar o que pesou. Usa Docker Swarm como camada de orquestração — decisão polêmica e fundadora do projeto. Swarm te dá multi-server fora da caixa: você adiciona um nó worker e ele entra no pool sem configuração de rede manual. Em troca, você herda o destino do Swarm como produto.",[12,26539,26540,26542],{},[27,26541,26480],{}," Idle aproximadamente 350 MB de RAM — significativamente mais leve que Coolify, mais pesado que CapRover. UI clean e moderna, claramente inspirada em Coolify mas com escolhas mais econômicas (menos abas, menos config inicial). Multi-server real via Swarm: cadastra um worker, ele aparece no pool, jobs se distribuem. Suporte nativo a Docker Compose (Dokploy chama de \"stacks\"). Crescimento da comunidade: Discord ativo, releases frequentes, projeto incorporou pedidos importantes em meses, não anos.",[12,26544,26545,26547],{},[27,26546,26486],{}," Mais novo significa menos battle-tested. Bugs aparecem em casos de borda que Coolify e CapRover já documentaram. Acoplado a Swarm — e Swarm é uma tecnologia em manutenção lenta pela mantenedora original. Recebe correções de segurança e estabilidade, mas não há indicação clara de que ganhe novas features. Pra projeto de 2024 escolher Swarm é uma aposta defensável (estável, simples, embutido no Docker), mas você está construindo em cima de uma camada que não evolui mais. Ecossistema de plugins\u002Ftemplates ainda raso comparado a Coolify — você ganha o básico, não a biblioteca curada de templates específicos. Documentação em português brasileiro praticamente inexistente.",[12,26549,26550,26553],{},[27,26551,26552],{},"Quando Dokploy é a escolha certa."," Time pequeno (3 a 6 pessoas) que valoriza UX moderna mas não quer pagar o preço do Coolify em RAM. Multi-server real fora da caixa é requisito (você quer rodar em 2 a 4 VPS desde o início). Projeto novo sem dependência histórica em templates ou plugins específicos. Você não tem aversão a Docker Swarm como tecnologia subjacente. Pra esse perfil, em janeiro de 2026, Dokploy é a escolha que envelhece melhor entre os três.",[19,26555,26557],{"id":26556},"os-tres-lado-a-lado","Os três lado a lado",[12,26559,26560],{},"A tabela abaixo é a versão comprimida da decisão. Cada linha é uma dimensão que costuma virar argumento de fórum; lado a lado, vira critério.",[119,26562,26563,26576],{},[122,26564,26565],{},[125,26566,26567,26569,26572,26574],{},[128,26568,2983],{},[128,26570,26571],{},"CapRover",[128,26573,2771],{},[128,26575,2777],{},[141,26577,26578,26592,26606,26620,26634,26647,26659,26673,26687,26700,26713,26727],{},[125,26579,26580,26583,26586,26589],{},[146,26581,26582],{},"Idle RAM (média observada)",[146,26584,26585],{},"~150 MB",[146,26587,26588],{},"500 a 700 MB",[146,26590,26591],{},"~350 MB",[125,26593,26594,26597,26600,26603],{},[146,26595,26596],{},"Idle CPU em VPS ociosa",[146,26598,26599],{},"\u003C 1%",[146,26601,26602],{},"1 a 3%",[146,26604,26605],{},"1 a 2%",[125,26607,26608,26611,26614,26617],{},[146,26609,26610],{},"Tempo de instalação típico",[146,26612,26613],{},"5 a 8 minutos",[146,26615,26616],{},"8 a 15 minutos",[146,26618,26619],{},"5 a 10 minutos",[125,26621,26622,26625,26628,26631],{},[146,26623,26624],{},"UI (impressão subjetiva)",[146,26626,26627],{},"datada, funcional",[146,26629,26630],{},"moderna, densa",[146,26632,26633],{},"moderna, enxuta",[125,26635,26636,26639,26641,26644],{},[146,26637,26638],{},"docker-compose nativo",[146,26640,17485],{},[146,26642,26643],{},"sim, robusto",[146,26645,26646],{},"sim, \"stacks\"",[125,26648,26649,26652,26654,26657],{},[146,26650,26651],{},"Multi-server real",[146,26653,100],{},[146,26655,26656],{},"sim, sem HA do painel",[146,26658,26656],{},[125,26660,26661,26664,26667,26670],{},[146,26662,26663],{},"Marketplace de templates",[146,26665,26666],{},"existente, estagnado",[146,26668,26669],{},"grande, ativo",[146,26671,26672],{},"básico, em crescimento",[125,26674,26675,26678,26681,26684],{},[146,26676,26677],{},"Comunidade (estrelas em janeiro de 2026)",[146,26679,26680],{},"~13 mil",[146,26682,26683],{},"~40 mil",[146,26685,26686],{},"~10 mil",[125,26688,26689,26692,26695,26698],{},[146,26690,26691],{},"Releases nos últimos 6 meses",[146,26693,26694],{},"~3",[146,26696,26697],{},"mensais",[146,26699,26697],{},[125,26701,26702,26705,26708,26710],{},[146,26703,26704],{},"Documentação em português",[146,26706,26707],{},"rara",[146,26709,17485],{},[146,26711,26712],{},"praticamente nenhuma",[125,26714,26715,26718,26721,26724],{},[146,26716,26717],{},"Maturidade em produção (anos)",[146,26719,26720],{},"8+",[146,26722,26723],{},"4+",[146,26725,26726],{},"1+",[125,26728,26729,26731,26734,26737],{},[146,26730,5015],{},[146,26732,26733],{},"1 VPS, 1 a 3 apps",[146,26735,26736],{},"1 a 2 VPS, 2 a 5 apps",[146,26738,26739],{},"2 a 4 VPS, time pequeno",[12,26741,26742,26743,26746],{},"A coluna que mais informa não está visível nessa tabela: ",[27,26744,26745],{},"qual dor vem em terceiro lugar",". CapRover te dá estabilidade imediata e a dor vem quando você cresce e precisa de multi-server. Coolify te dá features ricas e a dor vem na conta da VPS e na complexidade crescente. Dokploy te dá multi-server moderno e a dor vem no acoplamento ao Swarm de longo prazo. Escolher é responder honestamente: qual dessas três dores é a que mais cabe na sua próxima ano?",[19,26748,26750],{"id":26749},"a-dor-que-os-tres-compartilham","A dor que os três compartilham",[12,26752,26753,26754,101],{},"Há uma dor comum aos três que merece nome próprio, porque é onde a transição honesta acontece: ",[27,26755,26756],{},"nenhum dos três tem alta disponibilidade real",[12,26758,26759],{},"Vou ser preciso sobre o que isso significa.",[12,26761,26762],{},"CapRover é single-server por desenho. Não tenta. Você instala, roda em uma VPS, ponto. Cair o servidor é cair o produto.",[12,26764,26765,26766,26769,26770,26773],{},"Coolify e Dokploy oferecem multi-server, mas a expressão usada por ambos confunde. Multi-server, no vocabulário deles, significa que um ",[27,26767,26768],{},"painel central"," deploya containers em ",[27,26771,26772],{},"N hosts remotos",". O painel mora em uma máquina; os hosts são alvos de deploy. Quando o servidor do painel cai:",[2735,26775,26776,26779,26782,26785,26788],{},[70,26777,26778],{},"Os apps remotos continuam rodando (Docker neles segue funcionando).",[70,26780,26781],{},"Você perde acesso a logs centralizados, métricas, deploys, edição de variáveis de ambiente.",[70,26783,26784],{},"Update do painel? Esperar.",[70,26786,26787],{},"Redeploy de um app travado? Esperar.",[70,26789,26790],{},"Ver por que o serviço de checkout começou a retornar 500? Esperar.",[12,26792,26793],{},"Pra um hobby project, \"esperar\" é tolerável. Pra startup com primeiro cliente B2B exigindo uplink contratual de 99,5%, \"esperar\" é violação de SLA. Os três produtos compartilham essa parede.",[12,26795,26796],{},"A parede está sinalizada quando:",[2735,26798,26799,26805,26811,26817,26823],{},[70,26800,26801,26804],{},[27,26802,26803],{},"Cliente exige SLA explícito."," Algo como ≥ 99,5% no contrato. Best-effort não passa pelo jurídico do cliente.",[70,26806,26807,26810],{},[27,26808,26809],{},"O painel já caiu uma vez por semana ininterruptamente."," Pode ser update mal-sucedido, kernel panic, OOM kill em pico de tráfego — a causa importa menos que a frequência.",[70,26812,26813,26816],{},[27,26814,26815],{},"Você tem 2 ou mais aplicações importantes em produção."," Backup centralizado vira requisito; coordenação entre apps vira requisito; observabilidade unificada vira requisito.",[70,26818,26819,26822],{},[27,26820,26821],{},"Time cresceu pra 3 ou mais pessoas e o painel virou gargalo."," Um deploy bloqueia o outro. Acesso simultâneo confunde estado.",[70,26824,26825,26828],{},[27,26826,26827],{},"Backup do painel é manual e não foi testado em meses."," Você consegue restaurar a VPS toda em 30 minutos? Já testou esse procedimento em prod?",[12,26830,26831],{},"Quando dois ou mais desses pontos se confirmam ao mesmo tempo, você passou da fase em que CapRover, Coolify e Dokploy resolvem o problema. A próxima decisão é estrutural.",[19,26833,26835],{"id":26834},"heroctl-como-passo-seguinte-natural","HeroCtl como passo seguinte natural",[12,26837,26838],{},"HeroCtl é um arquivo executável único que você instala em N servidores Linux com Docker. Os três primeiros servidores formam o plano de controle replicado — não há \"servidor central\" que possa cair. A coordenação entre eles sobrevive à perda de qualquer um, com eleição automática em torno de sete segundos sem ação humana.",[12,26840,26841],{},"A experiência de uso pra subir aplicação é a mesma que você já conhece dos três painéis: você descreve o serviço, submete via CLI ou painel web, o cluster decide onde rodar, abre a porta, registra no roteador integrado, emite certificado Let's Encrypt automático e começa a servir tráfego. Atualizar é mudar a versão da imagem e submeter de novo — rolling deploy sem janela de manutenção.",[12,26843,26844],{},"A diferença está no que acontece quando algo dá errado. Servidor cai? Workload migra. Painel \"central\" não existe — qualquer um dos servidores serve a UI e a API. Você nunca está cego.",[12,26846,26847,26848,26850,26851,26853,26854,26856],{},"O modelo comercial é explícito desde o dia um. ",[27,26849,4351],{}," é gratuito permanente, sem limite de servidores, sem feature gates artificiais — roda toda a stack acima incluindo alta disponibilidade, roteador, certificados, métricas e logs. Indie hackers e times pequenos nunca precisam sair daqui. ",[27,26852,4355],{}," adiciona SSO\u002FSAML, controle de acesso granular, auditoria detalhada, backup gerenciado e suporte com SLA — pra quando o seu cliente passa a exigir os controles formais. ",[27,26855,4359],{}," adiciona escrow de código-fonte, contrato de continuidade e suporte 24×7. Os preços de Business e Enterprise estão publicados — sem \"fale com vendas\" obrigatório.",[12,26858,26859],{},"HeroCtl não tenta substituir CapRover, Coolify ou Dokploy nas faixas em que eles brilham. Tenta ser o passo lógico depois deles, quando a parede da alta disponibilidade aparece. Os três continuam excelentes pra os perfis que descrevemos acima — não há razão pra trocar antes da hora.",[19,26861,26863],{"id":26862},"decisao-por-perfil","Decisão por perfil",[12,26865,26866],{},"Pra resolver a indecisão em uma frase por perfil:",[2735,26868,26869,26875,26881,26887,26893],{},[70,26870,26871,26874],{},[27,26872,26873],{},"Solo dev, 1 VPS, projeto hobby ou produto cedo."," CapRover. Mais leve, mais maduro, menos abandonável.",[70,26876,26877,26880],{},[27,26878,26879],{},"Indie hacker com 2 a 5 apps em 1 ou 2 VPS, sem requisito formal de SLA."," Coolify. Marketplace e features prontas economizam tempo.",[70,26882,26883,26886],{},[27,26884,26885],{},"Time pequeno valorizando UX moderna, multi-server, projeto novo sem legado de templates, 3 ou mais VPS."," Dokploy. Aposta na leveza moderna.",[70,26888,26889,26892],{},[27,26890,26891],{},"Startup com primeiro cliente B2B exigindo SLA contratual, 3 ou mais servidores, requisito de alta disponibilidade real."," HeroCtl. O painel deixa de ser ponto único de falha.",[70,26894,26895,26898],{},[27,26896,26897],{},"Solo dev sem tempo nenhum pra cuidar de servidor."," Hospedado: Render, Railway, Vercel, Fly.io. Self-hosting é compromisso — se você não tem tempo, paga.",[12,26900,26901],{},"Não há vergonha em mudar de categoria. Começar em CapRover, migrar pra Coolify quando a complexidade pede mais features, eventualmente sair pra HeroCtl quando o cliente pede SLA — isso é caminho saudável, não falha de planejamento inicial.",[19,26903,26905],{"id":26904},"migracao-entre-os-tres","Migração entre os três",[12,26907,26908],{},"A boa notícia: o que sobrevive entre os três é o que importa.",[12,26910,26911,26914],{},[27,26912,26913],{},"Imagens Docker (Dockerfile) servem nos três."," Se você buildou pra CapRover, builda igual pra Coolify e Dokploy. Não há lock-in de runtime.",[12,26916,26917,26920,26921,26923,26924,26927],{},[27,26918,26919],{},"Volumes nomeados sobrevivem."," Você consegue copiar o conteúdo de um volume pra um host novo via ",[231,26922,2406],{}," com bind mount, ou via ",[231,26925,26926],{},"docker cp",". Postgres dump e restore vale o de sempre.",[12,26929,26930,26933,26934,26936],{},[27,26931,26932],{},"Variáveis de ambiente migram literalmente."," Os três aceitam as mesmas chaves. Copiar um ",[231,26935,9376],{}," é trivial.",[12,26938,26939,26942],{},[27,26940,26941],{},"O que precisa de adaptação manual:"," templates one-click do Coolify (a config interna é específica, você reinstala o serviço a partir do zero no destino), stacks Swarm do Dokploy (similar, você reescreve), Apps single-container do CapRover (você fragmenta em compose se for pra Coolify\u002FDokploy). Configurações de domínio, certificado e ingress migram conceitualmente mas a UI de cada painel é específica — refazer leva uma tarde, não uma semana.",[12,26944,26945],{},"Pra migrar dos três pro HeroCtl, o caminho é o mesmo: imagens iguais, variáveis iguais, configuração de ingress reescrita uma vez no formato do HeroCtl (que é um arquivo de configuração de cinquenta linhas, não trezentas).",[19,26947,26949],{"id":26948},"a-pergunta-inevitavel-qual-o-mais-popular","A pergunta inevitável: \"qual o mais popular?\"",[12,26951,26952],{},"Em janeiro de 2026, em estrelas no repositório público (que é proxy fraco de uso real, mas é o único proxy mensurável):",[2735,26954,26955,26960,26965],{},[70,26956,26957,26959],{},[27,26958,2771],{},": aproximadamente 40 mil estrelas.",[70,26961,26962,26964],{},[27,26963,26571],{},": aproximadamente 13 mil estrelas.",[70,26966,26967,26969],{},[27,26968,2777],{},": aproximadamente 10 mil estrelas, em crescimento acelerado.",[12,26971,26972],{},"Em uso real em produção, é difícil medir. Coolify tem a discussão pública mais ativa — Twitter, Discord, conferências. CapRover tem a base instalada mais antiga e silenciosa: gente que instalou em 2018 e não fala disso porque não tem o que reclamar. Dokploy tem o crescimento mais rápido em percentual.",[12,26974,26975],{},"Popular não é proxy direto de \"certo pra você\". CapRover atende meio milhão de devs em silêncio sem sair na manchete. A escolha por popularidade leva você pro Coolify por inércia — e Coolify pode até ser certo, mas que seja por análise, não por quantidade de tweets.",[19,26977,16602],{"id":16601},[12,26979,26980,26983],{},[27,26981,26982],{},"Posso migrar de CapRover pra Coolify sem refazer tudo?","\nVocê refaz a configuração no painel novo (uma tarde de trabalho pra dois ou três apps), mas as imagens Docker e os volumes sobrevivem. Não é refatoração de código — é re-cadastro no painel.",[12,26985,26986,26989],{},[27,26987,26988],{},"Dokploy depende de Docker Swarm. Isso é problema?","\nDepende do horizonte. Pra os próximos dois anos, não. Swarm é estável e funcional. Pra horizonte de cinco anos, é apostar em uma camada que não recebe novas features há tempos. Se o seu projeto é pra durar, vale considerar.",[12,26991,26992,26995],{},[27,26993,26994],{},"Qual usa menos disco?","\nCapRover instala em torno de 1,5 GB. Dokploy em torno de 2 a 3 GB. Coolify em torno de 3 a 5 GB dependendo de quantos serviços auxiliares você habilita. Numa VPS de 25 GB, qualquer um cabe; numa de 10 GB, CapRover é mais confortável.",[12,26997,26998,27001],{},[27,26999,27000],{},"Tem suporte em português brasileiro em algum?","\nCapRover tem alguma tradução parcial e tutoriais em português espalhados. Coolify tem tradução parcial da UI mas documentação majoritariamente em inglês. Dokploy é predominantemente em inglês. Pra time brasileiro que prefere material em português, o desempate fica entre CapRover e Coolify; HeroCtl é nativamente em PT-BR.",[12,27003,27004,27007],{},[27,27005,27006],{},"HeroCtl substitui um desses ou é diferente?","\nDiferente em proposta. CapRover, Coolify e Dokploy resolvem \"Heroku em 1 VPS\" (ou múltiplas VPS sem alta disponibilidade do painel). HeroCtl resolve \"Heroku em cluster com plano de controle replicado\". A faixa em que faz sentido é depois de você superar os três — não antes.",[12,27009,27010,27013],{},[27,27011,27012],{},"Vale rodar painel + cluster orquestrador junto?","\nNão. Vai dar conflito de portas, conflito de proxy reverso e dor de cabeça operacional. Escolha um. Se você está em CapRover\u002FCoolify\u002FDokploy hoje e quer migrar pra HeroCtl, despeça-se do anterior antes — não rode em paralelo na mesma máquina.",[12,27015,27016,27019],{},[27,27017,27018],{},"E pra agência que hospeda 30 sites de cliente?","\nCoolify é a escolha popular nesse perfil hoje, pelo isolamento por projeto e pelas features de billing-adjacent (multi-tenancy parcial, usuários separados). Dokploy começa a competir nesse nicho. HeroCtl é a escolha quando a agência cresce pro ponto em que cair o painel deixa 30 clientes sem deploy ao mesmo tempo — aí o ponto único de falha vira inaceitável.",[19,27021,3310],{"id":3309},[12,27023,27024],{},"Os três produtos do segmento simples são bons no que prometem. CapRover envelhece bem se você não cresce demais. Coolify entrega o pacote mais completo se você tem RAM sobrando. Dokploy faz a aposta mais moderna se você aceita Docker Swarm como base. Não há escolha errada pros perfis que descrevemos — há escolha cara, que é não escolher pelas razões certas.",[12,27026,27027],{},"O dia em que os três deixam de bastar é específico e identificável: cliente exigindo SLA, painel virando gargalo, time crescendo, backup virando obrigação. Quando esse dia chega, a próxima ferramenta na sequência é o que estamos construindo.",[12,27029,27030],{},"Se você está escolhendo agora entre os três e o cluster ainda está distante, escolhe pelo perfil acima e segue. Se o cluster está virando exigência, instala em três VPS:",[224,27032,27034],{"className":27033,"code":5319,"language":2530},[2528],[231,27035,5319],{"__ignoreMap":229},[12,27037,27038,27039,27041,27042,27044,27045,101],{},"Pra leitura adicional: o comparativo direto ",[3337,27040,16702],{"href":16701},", o comparativo ",[3337,27043,16707],{"href":16706},", e o panorama ",[3337,27046,19767],{"href":19766},{"title":229,"searchDepth":244,"depth":244,"links":27048},[27049,27050,27051,27052,27053,27054,27055,27056,27057,27058,27059],{"id":26468,"depth":244,"text":26469},{"id":26500,"depth":244,"text":26501},{"id":26530,"depth":244,"text":26531},{"id":26556,"depth":244,"text":26557},{"id":26749,"depth":244,"text":26750},{"id":26834,"depth":244,"text":26835},{"id":26862,"depth":244,"text":26863},{"id":26904,"depth":244,"text":26905},{"id":26948,"depth":244,"text":26949},{"id":16601,"depth":244,"text":16602},{"id":3309,"depth":244,"text":3310},"2026-01-19","Os três painéis dominantes pra rodar 'Heroku em 1 VPS'. Cada um aposta numa filosofia diferente — maturidade, riqueza de features, ou peso leve. Comparativo honesto pra escolher sem arrependimento.",{},"\u002Fblog\u002Fcaprover-vs-coolify-vs-dokploy-segmento-simples",{"title":26427,"description":27061},{"loc":27063},"blog\u002Fcaprover-vs-coolify-vs-dokploy-segmento-simples",[27068,27069,26422,7514,24185,8764],"caprover","coolify","fpDCnoqvMYAFLhbbXa7VXzBE7Z42lscsrbjZiURoVFU",{"id":27072,"title":27073,"author":7,"body":27074,"category":8764,"cover":3380,"date":27518,"description":27519,"draft":3383,"extension":3384,"lastReviewed":3380,"meta":27520,"navigation":411,"path":16701,"readingTime":4401,"seo":27521,"sitemap":27522,"stem":27523,"tags":27524,"__hash__":27526},"blog_pt\u002Fblog\u002Fheroctl-vs-coolify.md","HeroCtl vs Coolify: quando o painel de um servidor não basta",{"type":9,"value":27075,"toc":27507},[27076,27079,27082,27086,27089,27092,27097,27107,27110,27114,27117,27120,27123,27137,27140,27143,27147,27150,27153,27156,27159,27176,27179,27182,27186,27189,27192,27195,27198,27201,27203,27206,27333,27336,27339,27343,27346,27352,27358,27364,27370,27376,27379,27383,27386,27392,27398,27404,27410,27413,27416,27418,27424,27430,27436,27442,27448,27454,27460,27466,27468,27471,27474,27477,27480,27496,27502,27505],[12,27077,27078],{},"A pergunta nunca foi \"Coolify é bom?\". É bom mesmo. A pergunta é \"até quando o Coolify é o suficiente?\".",[12,27080,27081],{},"Esse post não é sobre desbancar nada. É sobre desenhar uma linha — onde o painel num servidor único deixa de ser a resposta certa e começa a ser uma armadilha silenciosa que aparece no pior momento possível: na primeira reunião com o primeiro cliente que pergunta o número do SLA.",[19,27083,27085],{"id":27084},"por-que-o-coolify-ganhou-o-segmento","Por que o Coolify ganhou o segmento",[12,27087,27088],{},"Vale começar reconhecendo o que o Coolify acertou, sem ironia.",[12,27090,27091],{},"Instalação de cinco minutos numa VPS de US$10 por mês. Painel limpo, com um vocabulário familiar pra qualquer pessoa que já mexeu com Heroku ou Vercel. Plugin ecosystem ativo, comunidade engajada, lançamentos frequentes. O contrato gratuito pra self-hosting nunca mudou.",[12,27093,27094,27095,101],{},"Pra um indie hacker em abril de 2026, com um servidor de 4 GB de RAM rodando um SaaS de US$5 mil de MRR, o Coolify é a melhor opção que existe no mercado. Melhor que o Dokku, melhor que o Caprover, melhor que o Dokploy em maturidade — e infinitamente melhor que orquestrar a mesma carga no Kubernetes gerenciado, que cobraria US$73 por mês só pelo plano de controle, antes de NAT, balanceador e qualquer coisa que entregue valor — assunto que destrinchamos em ",[3337,27096,15790],{"href":15789},[12,27098,27099,27100,27103,27104,27106],{},"A categoria \"",[3337,27101,27102],{"href":19766},"Heroku auto-hospedado simples","\" foi inventada por essa geração de ferramentas. Coolify, ",[3337,27105,2777],{"href":16706},", Caprover dividem esse pódio. O Coolify lidera em adoção, em comunidade e em ritmo de release. Não é por acaso.",[12,27108,27109],{},"O ponto deste artigo é específico: existe uma parede que aparece quando o seu produto cresce, e essa parede não tem solução elegante dentro do Coolify. É um limite arquitetural, não um bug a ser consertado.",[19,27111,27113],{"id":27112},"a-parede-invisivel-o-servidor-unico","A parede invisível: o servidor único",[12,27115,27116],{},"Coolify foi desenhado em torno de um servidor central. O painel mora ali. O banco de configuração mora ali. As decisões de deploy partem dali.",[12,27118,27119],{},"Isso é uma escolha de design coerente — pra quem está numa VPS só, essa centralização é exatamente o que torna o produto tão simples. Não tem rede de cluster pra debugar, não tem certificado entre nós, não tem replicação de estado pra entender. Você liga uma máquina, instala, deploya. Cinco minutos.",[12,27121,27122],{},"A questão é o que acontece nos cenários abaixo:",[2735,27124,27125,27128,27131,27134],{},[70,27126,27127],{},"O disco da VPS começa a apresentar erros de I\u002FO. O provedor agenda manutenção pra \"remediar\". A máquina fica indisponível por três horas numa madrugada de quarta-feira. Tudo que rodava nela está fora.",[70,27129,27130],{},"Um update do kernel é empurrado pelo provedor e a máquina reinicia sozinha. O painel do Coolify volta — mas três contêineres entram em loop de restart porque dependem de uma volume mount que ainda está sendo remontado. Você descobre isso quarenta minutos depois, pelo Twitter de um cliente.",[70,27132,27133],{},"O datacenter inteiro do provedor tem um incidente de rede regional. Acontece em janeiro de 2024 com um grande provedor europeu, em outubro de 2024 com um provedor americano, em fevereiro de 2026 com um provedor latino-americano. Sua máquina sequer está com defeito — só ficou inalcançável.",[70,27135,27136],{},"Um deploy ruim consome toda a memória da máquina, o OOM killer começa a derrubar processos, e o próprio painel do Coolify entra em loop. Você não tem onde clicar pra reverter porque a interface que controla o cluster está dentro da máquina que precisa ser controlada.",[12,27138,27139],{},"Em todos esses cenários, a resposta operacional é a mesma: torcer pra máquina voltar, ou abrir um chamado, ou subir uma nova máquina e restaurar backup. Não há failover automático. Não há outra réplica do painel pra assumir. Não há eleição de coordenador entre servidores sobreviventes — porque só existe um servidor.",[12,27141,27142],{},"Quando o seu primeiro cliente sério pergunta \"qual o SLA?\", a resposta honesta é \"best-effort, nossa máquina principal tem três noves de uptime histórico do provedor\". É uma resposta que funciona pra alguns clientes. Não funciona pra clientes que têm o próprio SLA pra honrar. E são justamente esses clientes que pagam contratos anuais.",[19,27144,27146],{"id":27145},"multi-servidor-no-coolify-nao-e-alta-disponibilidade-real","Multi-servidor no Coolify não é alta disponibilidade real",[12,27148,27149],{},"A confusão mais comum nessa conversa é o feature \"remote servers\" do Coolify.",[12,27151,27152],{},"O Coolify permite, sim, conectar máquinas adicionais como destinos de deploy. Você cadastra um IP, configura uma chave SSH, e o painel passa a saber que pode subir contêineres naquela máquina remota. Pra quem precisa separar staging de produção, ou colocar workers numa máquina mais barata, é útil de verdade.",[12,27154,27155],{},"Mas isso não é alta disponibilidade. É distribuição de carga.",[12,27157,27158],{},"A diferença está em onde o cérebro do sistema mora. No Coolify, o cérebro é a máquina principal — onde o painel roda, onde o banco SQLite ou Postgres do Coolify vive, onde as filas internas estão. As máquinas remotas são braços. Se o cérebro cai, os braços continuam segurando o que tinham nas mãos no momento da queda — os contêineres já em execução não morrem. Mas você perde:",[2735,27160,27161,27164,27167,27170,27173],{},[70,27162,27163],{},"O painel web, integralmente.",[70,27165,27166],{},"A capacidade de fazer deploys, reverter, mudar variável de ambiente, ler log centralizado.",[70,27168,27169],{},"A capacidade de redirecionar tráfego entre réplicas se uma cair.",[70,27171,27172],{},"Renovação automática de certificados (se a máquina principal era a que respondia ao desafio ACME).",[70,27174,27175],{},"Health checks que reiniciariam contêineres com problema.",[12,27177,27178],{},"Você fica num estado zumbi: o site do cliente até pode continuar respondendo por algumas horas, mas você perdeu o controle do orquestrador. Religar a máquina principal vira a única operação útil — e se a razão da queda foi disco corrompido, você está restaurando backup às quatro da manhã.",[12,27180,27181],{},"Isso não é falha do Coolify. É uma consequência direta do desenho arquitetural — desenho que faz total sentido pra quem nunca vai precisar de nada além disso. O problema é quando a sua empresa cresce e as expectativas do cliente mudam. A ferramenta não cresce junto.",[19,27183,27185],{"id":27184},"o-passo-seguinte-natural","O passo seguinte natural",[12,27187,27188],{},"HeroCtl começa exatamente onde o Coolify pára. Mesma promessa de instalação simples — um comando, cinco minutos, painel web pronto. Mas o cérebro do sistema é replicado entre três ou mais servidores desde o primeiro momento.",[12,27190,27191],{},"Em termos práticos: você instala o mesmo binário em três máquinas Linux com Docker. Os três servidores combinam estado entre si por consenso entre servidores. Decisões importantes (qual contêiner vai pra qual nó, qual versão está ativa, qual certificado está renovado) são gravadas no log replicado e confirmadas só depois que a maioria concordou. Se um dos três cai — kill -9, queda de energia, partição de rede — os dois que sobraram elegem um novo coordenador em cerca de sete segundos e seguem servindo tráfego.",[12,27193,27194],{},"Não é mágica. É uma técnica conhecida há vinte anos, usada em produção por bancos, por sistemas de mensageria, por bancos de dados distribuídos. A novidade do HeroCtl é embalar isso num pacote que você instala em cinco minutos, com painel web embutido e sem exigir um operador especializado.",[12,27196,27197],{},"O roteador integrado distribui o tráfego entrante entre as réplicas saudáveis automaticamente. Se um servidor está fora, ele para de receber requisições — sem você precisar mexer em DNS, sem você precisar acordar de madrugada. Os certificados Let's Encrypt vivem no log replicado, então qualquer servidor sobrevivente pode renová-los e servi-los; não há \"máquina principal\" responsável pelo TLS.",[12,27199,27200],{},"A bateria de testes de caos cobre os cenários reais: kill -9 do coordenador (eleição em sete segundos, sem perda de requisição de leitura), partição de rede de 30 segundos (cluster reconverge sozinho), perda momentânea de quórum (sistema entra em modo somente-leitura preservando o tráfego existente, retoma escritas quando o quórum volta), wipe de disco em um nó (rejoina o cluster e baixa o estado do log replicado), drain forçado (workloads migram pros nós sobreviventes em segundos). Todos os cinco cenários sobrevividos no cluster público que serve este blog.",[19,27202,4826],{"id":4825},[12,27204,27205],{},"A tabela abaixo é a versão honesta. Não tem coluna sem ressalva — toda ferramenta de orquestração é um conjunto de tradeoffs, e o HeroCtl também.",[119,27207,27208,27218],{},[122,27209,27210],{},[125,27211,27212,27214,27216],{},[128,27213,2983],{},[128,27215,2771],{},[128,27217,2995],{},[141,27219,27220,27230,27240,27250,27261,27271,27280,27289,27298,27306,27315,27323],{},[125,27221,27222,27225,27228],{},[146,27223,27224],{},"Tempo de instalação",[146,27226,27227],{},"5 minutos",[146,27229,27227],{},[125,27231,27232,27234,27237],{},[146,27233,25609],{},[146,27235,27236],{},"Sim, central",[146,27238,27239],{},"Sim, embutido em todos os servidores",[125,27241,27242,27244,27247],{},[146,27243,3923],{},[146,27245,27246],{},"Sim (na máquina principal)",[146,27248,27249],{},"Sim, replicados entre servidores",[125,27251,27252,27255,27258],{},[146,27253,27254],{},"Multi-servidor",[146,27256,27257],{},"Sim, como destinos de deploy",[146,27259,27260],{},"Sim, como cluster de plano de controle",[125,27262,27263,27265,27268],{},[146,27264,16334],{},[146,27266,27267],{},"Não — painel é ponto único de falha",[146,27269,27270],{},"Sim — sobrevive à perda de servidores",[125,27272,27273,27275,27277],{},[146,27274,23271],{},[146,27276,26188],{},[146,27278,27279],{},"Sim, ~7s após queda",[125,27281,27282,27284,27287],{},[146,27283,23305],{},[146,27285,27286],{},"Não embutida",[146,27288,23311],{},[125,27290,27291,27293,27296],{},[146,27292,25636],{},[146,27294,27295],{},"Plugin\u002Fintegração externa",[146,27297,25641],{},[125,27299,27300,27302,27304],{},[146,27301,22798],{},[146,27303,27295],{},[146,27305,22321],{},[125,27307,27308,27310,27313],{},[146,27309,22831],{},[146,27311,27312],{},"Open-source com nuvem paga opcional",[146,27314,25670],{},[125,27316,27317,27319,27321],{},[146,27318,16408],{},[146,27320,22206],{},[146,27322,22206],{},[125,27324,27325,27327,27330],{},[146,27326,5015],{},[146,27328,27329],{},"1 servidor (até 3 com remote servers)",[146,27331,27332],{},"3 a 500 servidores",[12,27334,27335],{},"A linha que mais importa pra esta conversa é a quinta — alta disponibilidade real. As outras são consequências dela. Sem consenso entre servidores, não dá pra ter painel resiliente. Sem painel resiliente, não dá pra prometer SLA. Sem SLA, alguns clientes não fecham contrato.",[12,27337,27338],{},"A última linha também merece atenção. Coolify é incrível com um servidor. HeroCtl é incrível com três a quinhentos. Não são produtos da mesma faixa — são produtos que cobrem faixas adjacentes do mesmo problema.",[19,27340,27342],{"id":27341},"quando-ficar-no-coolify","Quando ficar no Coolify",[12,27344,27345],{},"Esta seção existe porque a honestidade é o mecanismo de defesa de uma ferramenta nova. Se a gente disser \"todo mundo deveria usar HeroCtl\", a gente está errando. Há cinco perfis em que recomendamos firmemente continuar no Coolify.",[12,27347,27348,27351],{},[27,27349,27350],{},"Você tem um servidor só e não pretende ter mais.","\nSe a sua arquitetura cabe inteira numa VPS de 4 ou 8 GB de RAM, e o seu modelo de negócio não exige SLA contratual, o Coolify é a resposta correta. HeroCtl rodando num servidor único funciona, mas você está pagando o overhead de uma camada de coordenação que nunca vai precisar coordenar com ninguém. É como comprar um carro de cinco lugares pra fazer apenas viagens solo — não é errado, é só desnecessário.",[12,27353,27354,27357],{},[27,27355,27356],{},"Você está rodando aplicações internas ou de desenvolvimento.","\nAmbientes de staging, dashboards internos, ferramentas que só o seu time usa, side-projects experimentais — todos esses casos não justificam multiplicar servidores. Uma queda de duas horas num staging não custa nada além do incômodo. Coolify entrega o melhor custo-benefício pra esse tipo de workload, e a gente recomenda abertamente.",[12,27359,27360,27363],{},[27,27361,27362],{},"Você é hobby developer.","\nProjetos pessoais, blogs, portfolios, experimentos com APIs novas — fica no Coolify. O custo mental de operar um cluster de três servidores é maior do que o ganho percebido. Você quer publicar coisa, não administrar infraestrutura. O Coolify foi desenhado pra esse perfil. A gente não vai tentar empurrar uma ferramenta com mais cerimônia operacional do que o caso pede.",[12,27365,27366,27369],{},[27,27367,27368],{},"Você tem dependência forte de plugins do ecossistema Coolify.","\nSe o seu fluxo depende de três plugins específicos do Coolify pra integrar com serviços terceiros que ainda não temos integração nativa, migrar agora é prematuro. Espere o HeroCtl maturecer essas integrações ou avalie se a integração específica vale o trabalho de reescrever. A gente prefere que você espere a integração existir do que migrar e descobrir um buraco no meio do caminho.",[12,27371,27372,27375],{},[27,27373,27374],{},"Você não está sentindo dor.","\nEsse é o critério mais importante e o mais subestimado. Se o Coolify nunca falhou pra você, se a sua máquina principal tem três anos de uptime, se nenhum cliente seu já cobrou SLA — não migre por moda. Migração de ferramenta de orquestração tem custo real (uma a duas semanas de um engenheiro sênior, mais ajustes). Pague esse custo só quando a dor justificar. Migrar antes de sentir dor é uma forma elegante de queimar tempo de engenharia que poderia estar virando produto.",[12,27377,27378],{},"A regra mental simples: se a frase \"se essa máquina cair às três da manhã, tenho problema sério com cliente\" descreve a sua situação, é hora de avaliar. Se a frase \"se essa máquina cair às três da manhã, eu acordo amanhã, religo, e tudo segue\" descreve, fique onde está.",[19,27380,27382],{"id":27381},"como-migrar-quando-faz-sentido","Como migrar quando faz sentido",[12,27384,27385],{},"A migração não precisa ser um big bang. O caminho que recomendamos é gradual, em quatro etapas, e mantém o Coolify funcionando o tempo todo.",[12,27387,27388,27391],{},[27,27389,27390],{},"Etapa 1 — Subir o cluster HeroCtl em paralelo."," Três servidores novos, na mesma região, sem tocar no Coolify existente. Roda o instalador em cada um, junta no cluster, abre o painel. Validação básica: o painel responde nos três IPs, certificado de teste é emitido, um contêiner \"hello world\" sobe e responde. Tempo médio: uma tarde.",[12,27393,27394,27397],{},[27,27395,27396],{},"Etapa 2 — Migrar uma aplicação de baixo risco."," Escolha uma aplicação interna ou de baixíssimo tráfego. Algo que, se ficar fora por dez minutos, não causa pânico. Reescreve o arquivo de configuração no formato do HeroCtl (em geral, cinquenta linhas substituem o que era um conjunto de campos no painel do Coolify). Sobe no cluster novo. Aponta um subdomínio de teste. Valida por uma semana.",[12,27399,27400,27403],{},[27,27401,27402],{},"Etapa 3 — Migrar workloads com tráfego real, uma de cada vez."," Pra cada aplicação migrada, faz blue-green: sobe a versão no HeroCtl, aponta o DNS pra HeroCtl, mantém o Coolify rodando a versão antiga por 24 a 72 horas como fallback. Se algo der errado, rollback é trocar o DNS de volta. Quando tudo estabilizar, desliga a aplicação no Coolify.",[12,27405,27406,27409],{},[27,27407,27408],{},"Etapa 4 — Desligar o Coolify."," Quando todas as aplicações migraram e ficaram estáveis por uma semana ou duas, desliga a máquina do Coolify. Mantém o backup do banco do Coolify por mais um trimestre, por garantia. Aí sim, encerra a VPS.",[12,27411,27412],{},"O ponto alto desse caminho é que em nenhum momento você fica sem opção de rollback. O Coolify continua rodando até o último dia. Se a migração der errado em alguma etapa, você volta um passo, ajusta, tenta de novo. Não há \"ponto de não-retorno\" forçado por arquitetura.",[12,27414,27415],{},"Tempo total típico, pra um portfolio de dez a vinte aplicações: duas a três semanas, com um engenheiro dedicando metade do tempo. Pra portfolios maiores, escala linearmente.",[19,27417,16602],{"id":16601},[12,27419,27420,27423],{},[27,27421,27422],{},"O Coolify deploya em N servidores também. Qual é a diferença real?","\nCoolify deploya contêineres em N servidores. HeroCtl roda o orquestrador em N servidores. A diferença é onde o cérebro vive. No Coolify, o cérebro vive na máquina principal — máquinas remotas são braços. No HeroCtl, o cérebro é distribuído: três ou mais servidores combinam estado por consenso, e qualquer um pode assumir o papel de coordenador se o atual cair. É a mesma diferença entre \"ter cópias de um documento em vários computadores\" e \"ter um documento colaborativo em tempo real\". Os dois têm múltiplas máquinas; só o segundo sobrevive à perda de uma delas sem perder controle.",[12,27425,27426,27429],{},[27,27427,27428],{},"Posso usar Coolify e HeroCtl juntos?","\nSim, e durante uma migração é a recomendação. Os dois rodam Docker como runtime, então não disputam recursos no nível do contêiner. O que muda é qual orquestrador olha pra qual conjunto de máquinas. Tecnicamente, dá pra manter aplicações antigas no Coolify pra sempre e usar o HeroCtl só pra workloads novos com requisito de HA — alguns times escolhem essa abordagem e nunca chegam a desligar o Coolify. Não há acoplamento forçado.",[12,27431,27432,27435],{},[27,27433,27434],{},"Quanto custa migrar?","\nO custo direto é tempo de engenharia: duas a três semanas de meio-período pra um portfolio típico. O custo indireto é a curva de aprendizado do arquivo de configuração novo — geralmente meio dia pra um engenheiro sênior pegar o jeito. Não há custo de licença pra migrar (HeroCtl Community é gratuito permanente, sem limite de servidores ou de jobs), nem custo de saída do Coolify (você simplesmente para de usar). O custo de oportunidade é o engenheiro não estar fazendo outra coisa naquelas duas semanas.",[12,27437,27438,27441],{},[27,27439,27440],{},"O que eu perco do Coolify?","\nA interface visual do Coolify é mais amigável pra quem nunca viu nada de orquestração — é um trade real. Alguns plugins do ecossistema Coolify ainda não têm equivalente no HeroCtl, especialmente integrações com serviços de nicho. A comunidade do Coolify é maior em volume — fóruns têm mais respostas pra perguntas específicas. E certas conveniências de UI (templates pré-configurados pra aplicações famosas) ainda não estão na mesma paridade. Esses pontos são reais e a gente reconhece.",[12,27443,27444,27447],{},[27,27445,27446],{},"E os plugins do Coolify que eu uso?","\nCada um vira uma análise individual. Pra integrações com bancos gerenciados (Postgres, Redis), o HeroCtl roda esses serviços como jobs comuns — sem necessidade de plugin específico. Pra integrações com serviços externos (envio de email, observabilidade SaaS), em geral é uma variável de ambiente apontando pra API do fornecedor — replicável em qualquer orquestrador. Pra plugins muito específicos, vale escrever pra gente — em alguns casos, equivalente nativo já está no roadmap.",[12,27449,27450,27453],{},[27,27451,27452],{},"Eu só tenho um servidor agora. Vale a pena já começar com HeroCtl?","\nHonestamente: não. Se você tem um servidor só e nenhuma intenção de adicionar mais nos próximos seis meses, o Coolify é melhor pro seu caso. HeroCtl rodando num único servidor funciona, mas você está pagando overhead de coordenação que não tem com quem coordenar. A hora certa de começar com HeroCtl é quando você sabe que vai ter três ou mais servidores — seja porque o tráfego cresceu, seja porque o cliente pediu SLA, seja porque você quer dormir melhor. Antes disso, fica no Coolify.",[12,27455,27456,27459],{},[27,27457,27458],{},"Quando os preços de Business e Enterprise saem?","\nJá estão publicados na página de planos, sem \"fale com vendas\". Business adiciona SSO\u002FSAML, RBAC granular, auditoria detalhada, backup gerenciado e suporte com SLA — pra times com requisitos formais de plataforma. Enterprise adiciona escrow de código-fonte, contrato de continuidade e suporte 24×7. O contrato é congelado pra clientes existentes — não há cláusula de mudança retroativa. Community segue gratuita permanente, sem limite de servidores, sem limite de jobs, sem feature gates artificiais. Indivíduos e times pequenos nunca precisam sair do Community.",[12,27461,27462,27465],{},[27,27463,27464],{},"E se eu quiser voltar pro Coolify depois de migrar?","\nPossível. Os contêineres rodam Docker em ambos os casos — as imagens são as mesmas. O que muda é o arquivo de configuração e o painel. Voltar significa recriar as configurações no Coolify e reapontar o DNS. A gente nunca trancou ninguém: o binário do HeroCtl não tem phone-home obrigatório, não há kill-switch remoto, e o cluster instalado continua funcionando offline pra sempre. Se a sua decisão é desligar e voltar, é só desligar e voltar. A liberdade de saída é o que torna a confiança honesta.",[19,27467,3310],{"id":3309},[12,27469,27470],{},"A escolha entre Coolify e HeroCtl não é técnica, é situacional.",[12,27472,27473],{},"Coolify é a resposta certa pra uma fase específica do crescimento de um produto: solo dev, MRR inicial, um servidor, sem pressão de SLA. HeroCtl é a resposta certa pra fase seguinte: time pequeno, MRR crescente, três ou mais servidores, primeiros contratos com SLA, primeiros clientes que cobram disponibilidade. As duas ferramentas atendem perfis adjacentes do mesmo problema.",[12,27475,27476],{},"Se você está na primeira fase, instala Coolify e fica feliz. Se você está entrando na segunda fase e sente a parede chegando, HeroCtl te encontra do outro lado.",[12,27478,27479],{},"Pra começar, em qualquer um dos três servidores Linux com Docker:",[224,27481,27482],{"className":226,"code":2949,"language":228,"meta":229,"style":229},[231,27483,27484],{"__ignoreMap":229},[234,27485,27486,27488,27490,27492,27494],{"class":236,"line":237},[234,27487,1220],{"class":247},[234,27489,2958],{"class":251},[234,27491,2961],{"class":255},[234,27493,2964],{"class":383},[234,27495,2967],{"class":247},[12,27497,27498,27499,101],{},"A instalação roda em cinco minutos, o painel sobe em cada um dos servidores, e o cluster está pronto pra receber jobs. Pra mais sobre por que o HeroCtl existe e que problema ele tenta resolver, ",[3337,27500,27501],{"href":6547},"leia o post de fundação",[12,27503,27504],{},"A intenção é simples: orquestração de contêineres, sem cerimônia — agora com cluster.",[3351,27506,4376],{},{"title":229,"searchDepth":244,"depth":244,"links":27508},[27509,27510,27511,27512,27513,27514,27515,27516,27517],{"id":27084,"depth":244,"text":27085},{"id":27112,"depth":244,"text":27113},{"id":27145,"depth":244,"text":27146},{"id":27184,"depth":244,"text":27185},{"id":4825,"depth":244,"text":4826},{"id":27341,"depth":244,"text":27342},{"id":27381,"depth":244,"text":27382},{"id":16601,"depth":244,"text":16602},{"id":3309,"depth":244,"text":3310},"2026-01-13","Coolify resolve solo dev brilhantemente. Quando o cliente pede SLA e o servidor único vira ponto único de falha, a história muda. Comparativo honesto.",{},{"title":27073,"description":27519},{"loc":16701},"blog\u002Fheroctl-vs-coolify",[27069,27525,8764,7514],"alta-disponibilidade","gmRJECP0a3D5qoYFcv3B6UlBkOXllngy4Vk0Bd_-Wv4",{"id":27528,"title":27529,"author":7,"body":27530,"category":3379,"cover":3380,"date":28308,"description":28309,"draft":3383,"extension":3384,"lastReviewed":3380,"meta":28310,"navigation":411,"path":11732,"readingTime":8769,"seo":28311,"sitemap":28312,"stem":28313,"tags":28314,"__hash__":28318},"blog_pt\u002Fblog\u002Fbackup-banco-em-cluster-estrategias-3-da-manha.md","Backup de banco em cluster: as estratégias que sobrevivem 3 da manhã",{"type":9,"value":27531,"toc":28293},[27532,27539,27545,27548,27551,27555,27561,27564,27567,27571,27574,27580,27589,27592,27598,27602,27609,27615,27624,27630,27649,27652,27658,27662,27665,27675,27680,27685,27690,27709,27712,27715,27720,27724,27727,27737,27743,27749,27755,27760,27769,27774,27792,27795,27800,27804,27807,27810,27815,27820,27825,27830,27837,27840,27845,27849,27852,27857,27862,27867,27872,27875,27880,27882,27885,28086,28089,28093,28096,28102,28108,28114,28120,28126,28130,28133,28142,28148,28154,28160,28166,28170,28173,28176,28179,28182,28185,28188,28190,28201,28207,28213,28227,28236,28242,28252,28254,28257,28260,28263,28280,28288,28291],[12,27533,27534,27535,27538],{},"Três da manhã. O alerta acorda você porque o endpoint de health check tá voltando 500 há doze minutos. Você abre o terminal sonado, conecta no banco de produção, e a primeira query retorna ",[231,27536,27537],{},"ERROR: invalid page in block 4421 of relation base\u002F16384\u002F24576",". Corrupção física. O Postgres ainda responde algumas requisições mas tá entregando dados podres pra metade dos clientes que cabem na parte sã das páginas.",[12,27540,27541,27542,27544],{},"Você lembra do cron de ",[231,27543,5737],{}," que roda às 3 da manhã. Olha o relógio: 3h12. O cron começou há doze minutos. Ou seja, o backup que tá sendo gravado agora mesmo no S3 é a fotografia da corrupção. O backup anterior tem 24 horas. Você tem 24 horas de pedidos, pagamentos, mensagens e uploads pra perder, ou um banco corrompido pra restaurar.",[12,27546,27547],{},"Esse é o cenário em que toda decisão sobre backup é cobrada. Não é em reunião de arquitetura. Não é em retro de sprint. É às três da manhã, com você sozinho num terminal, decidindo entre dois ruins.",[12,27549,27550],{},"Esse post abre os cinco modelos de backup que existem pra banco em cluster, com os números honestos de quanto cada um perde e quanto cada um demora pra voltar. Cada estratégia tem um faixa de SaaS onde ela é a escolha certa — e uma faixa onde ela é negligência. A diferença é o estágio em que sua empresa tá, não o estilo de quem configurou.",[19,27552,27554],{"id":27553},"a-frase-que-define-tudo-backup-que-nunca-foi-restaurado-e-placebo","A frase que define tudo: backup que nunca foi restaurado é placebo",[12,27556,27557,27558,27560],{},"A maioria dos times tem opinião confiante sobre backup e prática frágil. \"Tem cron de ",[231,27559,5737],{}," pra S3\" é o equivalente operacional de \"tem extintor mas nunca testou que funciona\". A confiança vem de ter o arquivo lá no bucket. A fragilidade vem de nunca ter realmente puxado esse arquivo, restaurado num ambiente isolado, validado contagem de linhas, conferido checksums.",[12,27562,27563],{},"Backup é o tipo de sistema em que a versão \"funciona até parar de funcionar\" é indistinguível da versão \"funciona de verdade\" — até o momento exato em que você precisa. Os dois primeiros anos de uma SaaS são vividos no estado de Schrödinger: o backup tá vivo e morto ao mesmo tempo, e ninguém abriu a caixa.",[12,27565,27566],{},"Esse texto é o exercício de abrir a caixa antes do incidente. As cinco estratégias abaixo são organizadas de forma crescente em complexidade e em garantia. Pra cada uma, a pergunta é: quanto de dado perco? quanto de tempo fico fora? quanto custa? e — o critério que ninguém leva a sério até precisar — quanto de competência interna isso exige?",[19,27568,27570],{"id":27569},"rpo-e-rto-sem-buzzword","RPO e RTO sem buzzword",[12,27572,27573],{},"Antes de comparar estratégias, dois números precisam estar na mesa. Eles têm siglas chatas mas o conceito é simples.",[12,27575,27576,27579],{},[27,27577,27578],{},"RPO — Recovery Point Objective."," Quanto de dado você aceita perder. É a distância entre o \"agora\" do incidente e o último ponto consistente que você consegue restaurar. Backup diário às 3 da manhã significa RPO de até 24 horas — se a corrupção acontece às 2 da manhã do dia seguinte, você perde 23 horas de transações. Backup contínuo significa RPO de segundos.",[12,27581,27582,27585,27586,27588],{},[27,27583,27584],{},"RTO — Recovery Time Objective."," Quanto tempo você aceita estar offline. É a distância entre o \"começou o incidente\" e o \"tá servindo tráfego de novo\". Restore de ",[231,27587,5737],{}," num banco de 50 GB leva entre 30 e 60 minutos numa máquina decente. Failover pra réplica streaming leva 30 segundos.",[12,27590,27591],{},"Ambos custam dinheiro de jeitos diferentes. RPO baixo custa storage e largura de banda contínua (cada commit precisa virar bytes durados em algum lugar antes de ser confirmado pro cliente). RTO baixo custa hardware redundante — uma réplica quente é literalmente outro banco rodando, consumindo CPU, RAM e disco em paralelo, sem servir tráfego em momento normal.",[12,27593,27594,27595,27597],{},"Definir RPO e RTO antes de implementar evita o erro mais comum: gastar muito pra resolver o lado errado. Time que paga US$300 por mês de read replica e ainda perde 24 horas de dado quando o disco corrompe gastou mal — comprou RTO baixo e ignorou RPO. Time que faz ",[231,27596,5737],{}," quinzenal num bucket cross-region cifrado também gastou mal — comprou durabilidade extrema e aceitou RTO de horas que o cliente B2B não tolera.",[19,27599,27601],{"id":27600},"estrategia-1-cron-pg_dump-pra-s3","Estratégia 1 — Cron + pg_dump pra S3",[12,27603,27604,27605,27608],{},"A versão MVP. Um cron job no servidor de banco, executa ",[231,27606,27607],{},"pg_dump | gzip | aws s3 cp"," às três da manhã. Bucket cross-region com lifecycle policy: arquivos com mais de 30 dias migram pra storage frio, com mais de 90 dias são apagados.",[12,27610,27611,27614],{},[27,27612,27613],{},"RPO real:"," 24 horas no caminho normal. Pode chegar a 48 se o cron falhar uma noite e ninguém reparar.",[12,27616,27617,27620,27621,27623],{},[27,27618,27619],{},"RTO real:"," 30 a 60 minutos pra banco até 50 GB. O ",[231,27622,21211],{}," de um dump comprimido roda perto da velocidade de I\u002FO do disco — uma máquina com SSD decente faz 1 a 2 GB por minuto, contando o tempo de criar índices.",[12,27625,27626,27629],{},[27,27627,27628],{},"Funciona pra:"," projeto pessoal, MVP, ferramenta interna, app onde 24 horas de dado é recuperável humanamente. Plataforma de cadastro onde o cliente refaz o que perdeu. Ferramenta de cache que reidrata do upstream. SaaS B2C nos primeiros 100 usuários, onde \"perdemos um dia, desculpa\" é resposta aceitável.",[12,27631,27632,27635,27636,6835,27638,27641,27642,27644,27645,27648],{},[27,27633,27634],{},"Onde dói:"," backup quente em banco transacional pode capturar estado inconsistente entre tabelas relacionadas se você não usa as flags certas. ",[231,27637,5737],{},[231,27639,27640],{},"--serializable-deferrable"," resolve consistência transacional mas pode bloquear writes pesados. A versão paralela com ",[231,27643,21667],{}," é mais rápida mas exige ",[231,27646,27647],{},"--format=directory",", o que complica o pipe direto pro S3 — você acaba precisando de disco temporário local.",[12,27650,27651],{},"E o restore é lento de um jeito que surpreende. Banco de 200 GB que parecia \"só um pouco grande\" vira três horas de restore com índices sendo reconstruídos. Três horas em que sua plataforma tá fora.",[12,27653,27654,27657],{},[27,27655,27656],{},"Custo:"," R$5 a R$30 por mês de storage S3-compatível pra retenção razoável. Tempo humano: zero depois do setup, dez minutos por mês pra checar log do cron.",[19,27659,27661],{"id":27660},"estrategia-2-pg_basebackup-wal-archiving","Estratégia 2 — pg_basebackup + WAL archiving",[12,27663,27664],{},"A primeira vez que o RPO baixa de \"um dia\" pra \"alguns minutos\". A ideia é separar duas coisas: a fotografia completa do banco (basebackup) e o histórico de mudanças desde a última fotografia (WAL — Write-Ahead Log, o arquivo onde o Postgres escreve cada commit antes de aplicar nos dados).",[12,27666,27667,27668,27670,27671,27674],{},"Setup: ",[231,27669,17242],{}," semanal grava um snapshot completo do diretório de dados. Em paralelo, o ",[231,27672,27673],{},"archive_command"," do Postgres copia cada arquivo WAL fechado (16 MB cada) pro S3 conforme são produzidos. Em condições normais, o WAL é fechado em segundos sob carga média.",[12,27676,27677,27679],{},[27,27678,27613],{}," 1 a 5 minutos. É o intervalo entre o último WAL ter sido enviado e o disco ter morrido.",[12,27681,27682,27684],{},[27,27683,27619],{}," 15 a 45 minutos. Restaurar o basebackup, replay dos WALs até o ponto desejado.",[12,27686,27687,27689],{},[27,27688,27628],{}," SaaS com 10 a 100 GB de banco, primeira centena de clientes pagantes. Etapa em que perder 24 horas é catastrófico mas o time ainda não tem DBA dedicado.",[12,27691,27692,27694,27695,27697,27698,27700,27701,27704,27705,27708],{},[27,27693,27634],{}," o ",[231,27696,27673],{}," precisa ser tratado como código de produção, não script de fim de semana. Se ele falhar e ninguém reparar, o WAL acumula no disco do banco até estourar, e quando estoura o banco para de aceitar writes. Já vi cluster cair às quatro da manhã porque o ",[231,27699,27673],{}," chamava ",[231,27702,27703],{},"aws s3 cp"," sem ",[231,27706,27707],{},"--no-progress"," e a saída do progresso bloqueava o stdout em ambiente sem TTY.",[12,27710,27711],{},"O volume de WAL surpreende. Banco com tráfego médio gera 5 a 50 GB de WAL por dia, dependendo do que escreve. Multiplicado por retenção de 30 dias, vira terabytes. Storage barato continua sendo barato, mas o lifecycle policy do bucket tem que estar afiado.",[12,27713,27714],{},"E o restore exige replay sequencial. Você não pode pular WALs. Se um arquivo intermediário foi perdido (bug no archive, bucket apagado por engano, qualquer coisa), o restore para naquele ponto e o que veio depois é ilegível. Verificação periódica é obrigatória.",[12,27716,27717,27719],{},[27,27718,27656],{}," R$50 a R$200 por mês de storage dependendo de retenção. Tempo humano: 2 a 4 horas pra setup inicial bem feito, mais a primeira meia hora de cada incidente entendendo qual WAL precisa.",[19,27721,27723],{"id":27722},"estrategia-3-pgbackrest-wal-e-restic-xtrabackup","Estratégia 3 — pgBackRest, WAL-E, restic, xtrabackup",[12,27725,27726],{},"Quando a estratégia 2 é boa demais pra ser feita à mão. Ferramentas dedicadas que combinam basebackup, WAL archiving, retenção, compressão, cifragem e — crucialmente — verificação automática.",[12,27728,27729,27732,27733,27736],{},[231,27730,27731],{},"pgBackRest"," é o nome mais maduro pro Postgres. Faz tudo que a estratégia 2 faz, mas com paralelização (vários processos enviando WAL em simultâneo), validação de checksum em cada arquivo, point-in-time recovery (PITR) sem dor, e — o ganho operacional grande — um comando único ",[231,27734,27735],{},"pgbackrest restore"," que sabe achar o backup mais recente, baixar o que precisa, e replay até o instante que você pede.",[12,27738,27739,27742],{},[231,27740,27741],{},"WAL-E"," é mais antigo mas mais simples se você só quer mandar pra S3 e voltar.",[12,27744,27745,27748],{},[231,27746,27747],{},"restic"," é genérico (não é específico de Postgres), mas tem deduplicação que é especialmente útil quando você faz dump completo várias vezes ao dia — o segundo dump só envia os blocos que mudaram.",[12,27750,27751,27754],{},[231,27752,27753],{},"xtrabackup"," é o equivalente pra MySQL, com a mesma filosofia: backup quente sem lock, incremental, PITR.",[12,27756,27757,27759],{},[27,27758,27613],{}," minutos, igual estratégia 2. A diferença é que aqui o \"5 minutos\" é mais confiável porque a ferramenta verifica continuamente que o pipeline tá funcionando.",[12,27761,27762,27764,27765,27768],{},[27,27763,27619],{}," 10 a 30 minutos com PITR direto. O comando ",[231,27766,27767],{},"pgbackrest restore --type=time --target='2025-12-11 03:42:00'"," resolve o que na estratégia 2 exige meia hora de scripts.",[12,27770,27771,27773],{},[27,27772,27628],{}," SaaS sério, banco de 100 GB a 1 TB, time que assume responsabilidade formal por testes mensais de restore.",[12,27775,27776,27778,27779,27781,27782,571,27785,571,27788,27791],{},[27,27777,27634],{}," aprender a ferramenta. ",[231,27780,27731],{}," tem documentação decente mas o vocabulário é específico — ",[231,27783,27784],{},"stanza",[231,27786,27787],{},"repo",[231,27789,27790],{},"archive-async",". A configuração inicial bem feita leva 2 a 4 horas, e mais um dia pra rodar o primeiro full + incrementais e ter certeza de que tudo bate.",[12,27793,27794],{},"A trapaça aqui é que a ferramenta esconde a complexidade do mecanismo, não a remove. Quando algo dá errado, você precisa entender que por baixo continua sendo basebackup + WAL. A diferença é que os bugs comuns da estratégia 2 (archive falhando silenciosamente, WAL faltando) são detectados e alertados pela ferramenta antes do incidente.",[12,27796,27797,27799],{},[27,27798,27656],{}," storage proporcional ao volume + tempo de DBA part-time. Falo em \"DBA part-time\" mesmo que ninguém com esse título exista no time — é o tempo que alguém de plantão precisa investir mensalmente pra rodar o restore-test.",[19,27801,27803],{"id":27802},"estrategia-4-streaming-replication-com-failover-automatico","Estratégia 4 — Streaming replication com failover automático",[12,27805,27806],{},"A primeira estratégia em que o RTO baixa abaixo de um minuto. Em vez de copiar o banco depois que ele terminou de escrever, você mantém uma réplica recebendo o stream do WAL em tempo real. Quando o primário morre, um orquestrador promove a réplica a primário, atualiza o roteamento, e o serviço volta sem intervenção humana.",[12,27808,27809],{},"Patroni é o nome mais comum pra orquestrar isso no Postgres. Ele resolve eleição de líder entre nós, gerencia replication slots, faz fencing do nó morto pra evitar duas escritas simultâneas, e expõe um endpoint que o seu balanceador de carga consulta pra saber qual nó é o primário corrente.",[12,27811,27812,27814],{},[27,27813,27613],{}," segundos. Replicação síncrona pode chegar a zero (commit no primário só confirma depois da cópia chegar na réplica) mas custa latência em cada write — escolha que se faz transação a transação na maioria dos sistemas.",[12,27816,27817,27819],{},[27,27818,27619],{}," 30 segundos a 5 minutos. Os 30 segundos é o failover automático sem human-in-the-loop. Os 5 minutos é o cenário em que o orquestrador detecta o problema, decide que não é falso positivo, promove a réplica, e o cache de DNS dos clientes expira.",[12,27821,27822,27824],{},[27,27823,27628],{}," SaaS com primeiro cliente B2B sério, SLA contratual igual ou maior que 99,5%. Plataforma onde 5 minutos de janela equivale a uma pena contratual.",[12,27826,27827,27829],{},[27,27828,27634],{}," split-brain durante particionamento de rede. Se o primário fica isolado mas continua aceitando escritas, e a réplica é promovida pelo orquestrador no outro lado da partição, você acaba com duas verdades divergentes que precisam ser reconciliadas manualmente quando a rede volta. Os orquestradores sérios usam um terceiro nó de testemunha pra evitar isso, mas a configuração é exigente.",[12,27831,27832,27833,27836],{},"Pior ainda: a réplica copia corrupção. Se o primário escreveu uma página podre, a réplica recebeu o WAL idêntico e tá igualmente podre. Streaming replication te protege contra falha de hardware do primário; não protege contra bug de aplicação que escreveu lixo, contra ",[231,27834,27835],{},"DROP TABLE"," errado, contra ransomware.",[12,27838,27839],{},"Por isso essa estratégia nunca substitui as três anteriores — ela soma. RTO baixíssimo pra falha de hardware, mais backup tradicional pra falha lógica.",[12,27841,27842,27844],{},[27,27843,27656],{}," dois ou três bancos rodando o tempo todo (um primário ativo, um ou dois standbys). Storage e CPU dobrados ou triplicados em relação ao banco único. Tempo humano: setup inicial de uma semana, mais bateria de testes de failover trimestral.",[19,27846,27848],{"id":27847},"estrategia-5-backup-gerenciado-por-terceiro","Estratégia 5 — Backup gerenciado por terceiro",[12,27850,27851],{},"A estratégia em que você compra o problema fora. RDS na AWS, Cloud SQL no Google, Neon, Crunchy Bridge, ou um provedor brasileiro que entrega backup automático com PITR. Você define a janela de retenção, eles cuidam do resto.",[12,27853,27854,27856],{},[27,27855,27613],{}," 5 minutos é o número típico publicado.",[12,27858,27859,27861],{},[27,27860,27619],{}," 30 segundos a 5 minutos pro failover dentro da mesma região. Restore cross-region é outro animal — pode ser uma hora, dependendo do provedor.",[12,27863,27864,27866],{},[27,27865,27628],{}," time sem expertise interna OU compliance que exige vendor com SOC 2 \u002F ISO 27001 emitido. Empresa que preferiria pagar caro pra não pensar no assunto.",[12,27868,27869,27871],{},[27,27870,27634],{}," custo. Banco que custaria R$300\u002Fmês em hardware vira R$1500 a R$3000\u002Fmês em RDS equivalente, dependendo da configuração de réplica. Lock-in de provedor — sair de RDS é uma migração complicada porque a forma de fazer backup é específica do produto. E o restore cross-region (que é a parte que o cliente B2B exige no contrato) frequentemente é mais difícil do que parece nos slides comerciais.",[12,27873,27874],{},"A vantagem real é zero ops em condições normais. A desvantagem real é que quando você tá em incidente, o caminho pra escalar com o suporte do provedor pode levar mais tempo do que você teria pra resolver com self-hosted bem configurado.",[12,27876,27877,27879],{},[27,27878,27656],{}," US$50 a US$500 por mês pra bancos pequenos e médios. Acima disso é cobrança proporcional ao tamanho.",[19,27881,17385],{"id":17384},[12,27883,27884],{},"A versão honesta lado a lado. Cada coluna é uma das estratégias acima.",[119,27886,27887,27908],{},[122,27888,27889],{},[125,27890,27891,27893,27896,27899,27902,27905],{},[128,27892,2983],{},[128,27894,27895],{},"1: Cron + pg_dump",[128,27897,27898],{},"2: basebackup + WAL",[128,27900,27901],{},"3: pgBackRest",[128,27903,27904],{},"4: Streaming + failover",[128,27906,27907],{},"5: Gerenciado",[141,27909,27910,27927,27946,27963,27980,27996,28013,28031,28049,28067],{},[125,27911,27912,27915,27917,27919,27922,27925],{},[146,27913,27914],{},"RPO típico",[146,27916,12002],{},[146,27918,3020],{},[146,27920,27921],{},"1-5 min",[146,27923,27924],{},"segundos",[146,27926,3020],{},[125,27928,27929,27932,27935,27938,27941,27944],{},[146,27930,27931],{},"RTO típico",[146,27933,27934],{},"30-60 min",[146,27936,27937],{},"15-45 min",[146,27939,27940],{},"10-30 min",[146,27942,27943],{},"30s-5 min",[146,27945,27943],{},[125,27947,27948,27951,27953,27956,27959,27961],{},[146,27949,27950],{},"Tamanho ideal de banco",[146,27952,17621],{},[146,27954,27955],{},"10-100 GB",[146,27957,27958],{},"100 GB - 1 TB",[146,27960,17616],{},[146,27962,17616],{},[125,27964,27965,27968,27971,27973,27975,27978],{},[146,27966,27967],{},"Custo de storage",[146,27969,27970],{},"baixíssimo",[146,27972,17522],{},[146,27974,17522],{},[146,27976,27977],{},"alto (réplica)",[146,27979,17517],{},[125,27981,27982,27985,27988,27990,27992,27994],{},[146,27983,27984],{},"Custo de tempo humano",[146,27986,27987],{},"~zero",[146,27989,17522],{},[146,27991,17522],{},[146,27993,17517],{},[146,27995,27987],{},[125,27997,27998,28000,28003,28006,28008,28011],{},[146,27999,4881],{},[146,28001,28002],{},"trivial",[146,28004,28005],{},"moderada",[146,28007,28005],{},[146,28009,28010],{},"alta",[146,28012,28002],{},[125,28014,28015,28018,28021,28023,28026,28029],{},[146,28016,28017],{},"Complexidade de restore",[146,28019,28020],{},"baixa",[146,28022,28005],{},[146,28024,28025],{},"baixa (PITR)",[146,28027,28028],{},"n\u002Fa (failover)",[146,28030,28020],{},[125,28032,28033,28035,28038,28040,28043,28046],{},[146,28034,7106],{},[146,28036,28037],{},"manual",[146,28039,28037],{},[146,28041,28042],{},"nativo",[146,28044,28045],{},"requer config",[146,28047,28048],{},"depende do provedor",[125,28050,28051,28054,28056,28059,28062,28065],{},[146,28052,28053],{},"Point-in-time recovery",[146,28055,100],{},[146,28057,28058],{},"sim, manual",[146,28060,28061],{},"sim, comando único",[146,28063,28064],{},"n\u002Fa",[146,28066,17443],{},[125,28068,28069,28072,28075,28077,28080,28083],{},[146,28070,28071],{},"Faixa de SaaS BR",[146,28073,28074],{},"MVP",[146,28076,17627],{},[146,28078,28079],{},"early\u002Fmid",[146,28081,28082],{},"startup com SLA",[146,28084,28085],{},"enterprise \u002F sem expertise",[12,28087,28088],{},"Repare que nenhuma linha tem um vencedor absoluto. A estratégia 5 ganha em \"tempo humano\" e perde em \"custo de storage\". A estratégia 4 ganha em RPO e perde em \"complexidade de setup\". A escolha é sempre sobre qual coluna você prioriza, dado o estágio da empresa.",[19,28090,28092],{"id":28091},"os-cinco-erros-que-matam-o-backup-do-colega","Os cinco erros que matam o backup do colega",[12,28094,28095],{},"A partir daqui é folclore operacional. Cada um desses erros foi cometido por um time que tinha confiança no backup que tinha. Cada um virou pós-mortem.",[12,28097,28098,28101],{},[27,28099,28100],{},"Nunca restaurou."," Backup que nunca foi restaurado em ambiente isolado é hipótese. Cron mensal que pega o backup mais recente do bucket, sobe num banco efêmero (uma máquina temporária que você desliga em seguida), valida contagem de linhas das tabelas críticas, confere checksum de algumas amostras, e manda email pro time confirmando sucesso. O backup do mês em que esse cron falhou é o único backup em que você tem certeza que vai funcionar. Tudo antes é fé.",[12,28103,28104,28107],{},[27,28105,28106],{},"Backup no mesmo disco ou mesma região."," Disco morre, backup vai junto. Região inteira de provedor cloud cai (já aconteceu várias vezes nos últimos cinco anos), backup vai junto. Cross-region é o mínimo. Cross-provider — backup principal num provedor, cópia secundária noutro — é o que separa \"preparado\" de \"torcedor\".",[12,28109,28110,28113],{},[27,28111,28112],{},"Sem retenção lógica longa."," Sete dias de retenção parece confortável até você descobrir que a corrupção começou há oito dias e ninguém reparou. Bug sutil de aplicação que escreve dado inválido em uma linha por minuto não dispara alerta, mas em duas semanas envenenou meio milhão de registros. Retenção curta é negligência travestida de economia. Política mínima razoável: 7 dias de backup horário, 30 dias de diário, 12 meses de mensal.",[12,28115,28116,28119],{},[27,28117,28118],{},"Sem alerta de falha."," O cron silencioso é o assassino mais comum. Falhou há trinta dias por uma mudança de credencial no S3, ninguém olhou o log, todo mundo dormiu tranquilo. Alerta integrado ao sistema de notificação do time (não email perdido na caixa, mas Slack ou equivalente que alguém vai ler) é obrigatório. E o alerta tem que ser duplo — alerta quando falha, e alerta quando não há sucesso há mais de N horas (pra detectar o caso em que o cron nem rodou).",[12,28121,28122,28125],{},[27,28123,28124],{},"Backup sem cifragem."," Vazamento de bucket S3 público vira vazamento do banco inteiro. Os incidentes de imprensa dos últimos anos são todos compostos por \"bucket ficou público por dois dias e tinha o backup completo\". Cifragem em repouso (server-side encryption no bucket é o mínimo, cifragem cliente-side com chave gerenciada por você é o adequado), cifragem em trânsito, e — separado disso — controle de acesso ao bucket que segue o princípio do menor privilégio.",[19,28127,28129],{"id":28128},"a-trilha-de-maturidade-saas-br","A trilha de maturidade SaaS BR",[12,28131,28132],{},"A pergunta prática: qual estratégia pra qual estágio. Tomando como referência métricas brasileiras de receita mensal recorrente.",[12,28134,28135,28138,28139,28141],{},[27,28136,28137],{},"MVP até R$5 mil de MRR."," Estratégia 1. Cron de ",[231,28140,5737],{}," pra S3-compatível, retenção de 30 dias, alerta básico de falha. Custa praticamente nada e protege contra o risco principal nessa fase, que é \"o servidor sumiu\". RPO de 24 horas é aceitável porque o cliente nessa fase tem expectativa de produto que tá começando.",[12,28143,28144,28147],{},[27,28145,28146],{},"Indie de R$5 mil a R$30 mil."," Estratégia 2. Adiciona WAL archiving, derruba RPO de 24 horas pra 5 minutos. O salto de complexidade é compensado pelo salto de garantia. Cliente que paga R$500 por mês de assinatura B2B começa a fazer pergunta de SLA — você precisa de resposta melhor que \"diário\".",[12,28149,28150,28153],{},[27,28151,28152],{},"Startup early de R$30 mil a R$200 mil."," Estratégia 3. pgBackRest configurado com restore-test mensal automático. Aqui não é mais opcional — você tem cliente sério, contrato sério, e a fragilidade da estratégia 2 feita à mão é risco operacional concreto. O setup de meio dia se paga em três meses pelo primeiro incidente que não vira pós-mortem público.",[12,28155,28156,28159],{},[27,28157,28158],{},"Startup com SLA contratual."," Estratégia 4 somada à 3. Streaming replication com failover automático cuida do hardware; pgBackRest cuida do dado lógico. As duas juntas resolvem os dois modos de falha que os contratos B2B sérios cobram: indisponibilidade momentânea e perda de dado.",[12,28161,28162,28165],{},[27,28163,28164],{},"Enterprise ou compliance pesado."," Estratégia 5 OU estratégia 4 com auditoria detalhada. Aqui a decisão é menos técnica e mais regulatória. Se a auditoria exige fornecedor com certificação X, você compra gerenciado. Se a auditoria aceita self-hosted com runbook documentado, você opera as estratégias 3 e 4 e investe na trilha de auditoria.",[19,28167,28169],{"id":28168},"como-o-heroctl-simplifica-isso","Como o HeroCtl simplifica isso",[12,28171,28172],{},"A motivação do produto é justamente esse esquema acima — são camadas que aparecem repetidamente em todo SaaS, e cada time gasta uma estação inteira reconstruindo o mesmo encanamento. O HeroCtl resolve o transporte, a orquestração e a observação dessas camadas. Mantém o que é específico do banco com o time, automatiza o que é genérico.",[12,28174,28175],{},"Concretamente, no plano Community (gratuito), você roda Postgres como job comum no cluster, com persistência cifrada em repouso. O cron de backup vira outro job, com retry automático, alerta integrado de falha (sem precisar montar Alertmanager por fora), e métricas que aparecem no painel — duração do dump, tamanho do arquivo, tempo desde o último sucesso.",[12,28177,28178],{},"No Business, entra backup gerenciado de Postgres e MySQL. A diferença em relação a \"fazer você mesmo\" é que a verificação de integridade, o restore-test mensal, a cifragem cliente-side com chave gerenciada por você, e a política de retenção em três tiers (horário\u002Fdiário\u002Fmensal) já vêm configuradas. Você define a janela e o resto é problema nosso.",[12,28180,28181],{},"No Enterprise, entra orquestração de streaming replication entre nós do cluster — um job descreve a topologia (primário aqui, standby ali, quem promove quem), e o cluster cuida do failover quando o primário morre. Bateria de testes de chaos roda contra o seu cluster mensalmente, com relatório.",[12,28183,28184],{},"Em todos os planos, o restore-test pode ser configurado como cron job interno: o cluster sobe um banco efêmero, restaura o backup mais recente, valida o que você definir como \"saudável\" (uma query de checksum, uma contagem de linhas, o que faça sentido), reporta sucesso ou falha, e desliga o banco efêmero. O custo é os minutos de CPU do teste, não dia de trabalho de engenheiro.",[12,28186,28187],{},"A filosofia é a mesma do resto do produto: o que é genérico pra todo SaaS já tá pronto; o que é específico do seu domínio fica com você. Backup é genérico. O conteúdo do banco é seu.",[19,28189,3226],{"id":3225},[12,28191,28192,28197,28198,28200],{},[27,28193,28194,28196],{},[231,28195,5737],{}," basta pra começar?","\nSim, pra MVP até primeiros clientes pagantes. A regra prática: se perder 24 horas de dado custa menos do que três horas de tempo de engenheiro, ",[231,28199,5737],{}," é a escolha certa. Quando inverter (perder dado custa mais que migrar pra estratégia 2), migre.",[12,28202,28203,28206],{},[27,28204,28205],{},"Quanto custa storage S3-compatível no Brasil em 2026?","\nFaixa atual entre R$0,15 e R$0,40 por GB-mês dependendo do provedor e do tier. Backup de banco de 50 GB com retenção de 30 dias mais alguns dumps semanais antigos = ~3 TB-mês equivalente comprimido = R$50 a R$120\u002Fmês. Cross-region praticamente dobra. Tier frio pra retenção mensal longa derruba pra metade.",[12,28208,28209,28212],{},[27,28210,28211],{},"Como testo restore sem afetar produção?","\nCron job no cluster que: 1) baixa o backup mais recente do bucket; 2) sobe um Postgres temporário em outro nó (ou contêiner efêmero) sem expor porta pública; 3) restaura o dump; 4) roda queries de validação (contagem por tabela, checksum de amostras, query crítica do domínio); 5) compara com baselines esperados; 6) reporta resultado no canal de alertas; 7) destrói o ambiente. Roda mensal, no mínimo. Nunca toca o banco de produção em momento nenhum.",[12,28214,28215,28218,28219,28222,28223,28226],{},[27,28216,28217],{},"Backup cifrado no S3 — qual a forma certa?","\nTrês camadas. Server-side encryption do bucket (",[231,28220,28221],{},"AES256"," ou KMS) é a base e é grátis. Cifragem cliente-side com chave gerenciada por você (você criptografa o arquivo antes de subir, com chave que vive fora do provedor cloud) protege contra cenário de comprometimento de credencial. Política de bucket com ",[231,28224,28225],{},"aws:SecureTransport=true"," e bloqueio de acesso público explícito. As três juntas, sem exceção. Uma só não basta.",[12,28228,28229,28232,28233,28235],{},[27,28230,28231],{},"Read replica conta como backup?","\nNão. Read replica protege contra falha de hardware do primário. Não protege contra ",[231,28234,27835],{}," errado, contra bug que escreve dado inválido, contra corrupção lógica que se replica. Toda corrupção lógica que entra no primário entra na réplica em segundos. Read replica é alta disponibilidade, não backup. As duas coisas coexistem; nenhuma substitui a outra.",[12,28237,28238,28241],{},[27,28239,28240],{},"Cross-region replication é necessário?","\nPra cliente B2B sério, sim. Pra MVP, não. A fronteira prática: se um único provedor cloud caindo por 4 horas é suficiente pra você quebrar contrato, cross-region é mínimo. Se 4 horas de fora ainda dá pra explicar pelo email, cross-region pode esperar.",[12,28243,28244,28247,28248,28251],{},[27,28245,28246],{},"Quanto tempo leva restaurar 100 GB de Postgres?","\nDepende muito do disco. SSD NVMe local: 20 a 40 minutos contando criação de índices. SSD remoto (volume de provedor cloud): 40 a 90 minutos. HDD: você não quer saber. Compressão do dump tipicamente derruba pra metade do tamanho original; banco de 100 GB vira dump de 30 a 50 GB. Crie índices em paralelo (",[231,28249,28250],{},"pg_restore -j",") pra acelerar 30 a 50%.",[19,28253,3310],{"id":3309},[12,28255,28256],{},"Backup é menos sobre estratégia técnica e mais sobre disciplina de teste. As cinco estratégias acima são todas decentes em algum estágio. A diferença entre o time que sobrevive ao incidente e o time que perde cliente não tá em qual delas escolheu — tá em ter restaurado um backup recentemente o suficiente pra confiar.",[12,28258,28259],{},"Se a sua resposta pra \"quando foi o último restore-test?\" começa com \"deixa eu ver\", você tem trabalho pra essa semana. Não é a próxima sprint. É essa semana. O cenário das três da manhã não tá agendado.",[12,28261,28262],{},"O HeroCtl roda em qualquer servidor Linux com Docker. Você instala num laboratório, sobe um Postgres como job, configura backup automático, agenda restore-test mensal, e em uma tarde tem o esquema da estratégia 3 inteiro funcionando. Sem montar cinco produtos diferentes, sem aprender vocabulário de orquestrador especializado.",[224,28264,28266],{"className":28265,"code":5319,"language":1531,"meta":229,"style":229},"language-sh shiki shiki-themes github-dark-default",[231,28267,28268],{"__ignoreMap":229},[234,28269,28270,28272,28274,28276,28278],{"class":236,"line":237},[234,28271,1220],{"class":247},[234,28273,2958],{"class":251},[234,28275,5330],{"class":255},[234,28277,2964],{"class":383},[234,28279,2967],{"class":247},[12,28281,28282,28283,28285,28286,101],{},"Pra contexto sobre quando faz sentido rodar Postgres no próprio cluster vs. comprar gerenciado, leia ",[3337,28284,18350],{"href":7468},". Pra entender por que a janela de deploy é o outro lado moeda do backup (porque o deploy ruim é a forma mais comum de gerar o incidente que vai exigir restore), leia ",[3337,28287,3340],{"href":3339},[12,28289,28290],{},"Backup que nunca foi restaurado é placebo. A diferença entre placebo e remédio aparece exatamente uma vez, exatamente quando você não pode escolher.",[3351,28292,4376],{},{"title":229,"searchDepth":244,"depth":244,"links":28294},[28295,28296,28297,28298,28299,28300,28301,28302,28303,28304,28305,28306,28307],{"id":27553,"depth":244,"text":27554},{"id":27569,"depth":244,"text":27570},{"id":27600,"depth":244,"text":27601},{"id":27660,"depth":244,"text":27661},{"id":27722,"depth":244,"text":27723},{"id":27802,"depth":244,"text":27803},{"id":27847,"depth":244,"text":27848},{"id":17384,"depth":244,"text":17385},{"id":28091,"depth":244,"text":28092},{"id":28128,"depth":244,"text":28129},{"id":28168,"depth":244,"text":28169},{"id":3225,"depth":244,"text":3226},{"id":3309,"depth":244,"text":3310},"2025-12-11","Backup que nunca foi restaurado é placebo. Cinco estratégias com tempo de recuperação real (RTO) e perda de dados aceitável (RPO) honesto, pra cada estágio de SaaS brasileiro.",{},{"title":27529,"description":28309},{"loc":11732},"blog\u002Fbackup-banco-em-cluster-estrategias-3-da-manha",[28315,13023,28316,3379,28317],"backup","disaster-recovery","rpo-rto","-L9skeqx7sjuj-UUp-e6n-MSKoE8CfEbNUWqZramRJc",{"id":28320,"title":28321,"author":7,"body":28322,"category":3379,"cover":3380,"date":29007,"description":29008,"draft":3383,"extension":3384,"lastReviewed":3380,"meta":29009,"navigation":411,"path":3339,"readingTime":4401,"seo":29010,"sitemap":29011,"stem":29012,"tags":29013,"__hash__":29015},"blog_pt\u002Fblog\u002Frolling-deploy-seguro-por-que-o-seu-talvez-nao-seja.md","Rolling deploy seguro: por que o seu provavelmente não é",{"type":9,"value":28323,"toc":28992},[28324,28327,28330,28333,28337,28347,28350,28363,28368,28371,28375,28378,28385,28388,28391,28395,28402,28405,28408,28412,28418,28425,28431,28434,28442,28445,28454,28457,28464,28468,28471,28474,28484,28487,28491,28494,28678,28684,28688,28691,28726,28746,28767,28785,28791,28797,28807,28811,28814,28819,28824,28830,28836,28840,28843,28849,28855,28872,28878,28880,28886,28901,28911,28921,28927,28933,28945,28947,28950,28953,28956,28958,28974,28986,28989],[12,28325,28326],{},"Toda equipe de engenharia que opera contêiner em produção, mais cedo ou mais tarde, escreve uma frase parecida no canal de status: \"deploy concluído, sem downtime\". A frase é otimista. Em pelo menos metade dos casos que a gente já auditou — em scripts caseiros, em painéis self-hosted populares, em tutoriais oficiais que viraram referência —, o que aconteceu de fato foi uma janela de 5 a 30 segundos em que o balanceador retornou 502, alguns uploads cortaram pela metade, e ninguém percebeu porque o monitoramento amostra a cada minuto.",[12,28328,28329],{},"Rolling deploy parece o problema mais simples de orquestração: você tem N contêineres rodando uma versão antiga, quer ter N contêineres rodando uma versão nova, e quer que o app continue respondendo durante a troca. A receita conceitual cabe em três linhas. Substituir um contêiner velho por um novo, um a um, mantendo o tráfego sempre direcionado a quem está vivo. O que torna isso difícil não é a estratégia — é o conjunto de seis detalhes que precisam estar certos ao mesmo tempo. Cada um sozinho parece detalhe de implementação. Os seis juntos são a diferença entre \"deploy sem downtime de verdade\" e \"deploy que parece sem downtime na sexta-feira de manhã, mas tem trinta segundos de erro no meio do dia 17h\".",[12,28331,28332],{},"Esse post mapeia os seis. No final tem uma receita em formato de spec, uma comparação honesta de quem implementa o quê, e uma seção de testes que você pode rodar no seu sistema atual pra descobrir se está mal — antes que seu cliente descubra primeiro.",[19,28334,28336],{"id":28335},"detalhe-1-health-check-antes-de-promover-o-novo-conteiner","Detalhe 1 — Health check antes de promover o novo contêiner",[12,28338,28339,28340,28343,28344,28346],{},"O erro mais comum em rolling deploy caseiro é confiar no estado ",[231,28341,28342],{},"running"," que o runtime de contêiner reporta. Você sobe um contêiner novo, o Docker (ou equivalente) marca ele como ",[231,28345,28342],{}," em milissegundos, e o seu script considera isso prova de que pode matar o velho. Mata o velho. O novo, internamente, ainda está iniciando — esperando conexão com banco, carregando cache em memória, baixando configuração de feature flag, abrindo pool de threads. Durante esse intervalo, o balanceador roteia tráfego pra um processo que ainda não está pronto a receber e devolve 502 ou 503.",[12,28348,28349],{},"A janela é curta — geralmente entre 5 e 30 segundos por contêiner —, e por isso ela engana monitoramento. Se sua métrica de erro é amostrada a cada minuto e você troca cinco contêineres em sequência, cada um com 10 segundos de \"está running mas não está pronto\", o pico nem sempre cai exatamente sobre uma janela de coleta. Você fica com a impressão estatística de que tudo correu bem.",[12,28351,28352,28353,571,28355,28358,28359,28362],{},"O que rolling deve fazer, em vez disso, é separar dois conceitos: \"o processo está rodando\" e \"o processo está pronto a servir tráfego\". Rodando é estado de runtime; pronto é resposta afirmativa de um endpoint que o próprio app expõe — ",[231,28354,355],{},[231,28356,28357],{},"\u002Freadyz",", ou equivalente. O orquestrador faz HTTP GET nesse endpoint do contêiner novo, espera receber 200, espera essa resposta sustentada por um período (",[231,28360,28361],{},"min_healthy_time",", tipicamente 10 segundos), e só então remove o contêiner velho do balanceador.",[12,28364,9010,28365,28367],{},[231,28366,28361],{}," é o detalhe que muita gente pula. Ele existe porque um único 200 não significa nada — pode ser que o app respondeu antes de fechar uma conexão crítica, e vai começar a falhar no segundo seguinte. Esperar 10 segundos consecutivos de respostas saudáveis filtra esses falsos positivos sem alongar o deploy de forma absurda.",[12,28369,28370],{},"O Watchtower clássico — script popular pra atualizar contêineres a partir de novas tags de imagem — não faz nada disso. Ele faz pull, para o velho, sobe o novo. Coolify e Dokploy implementam parcialmente, dependendo da configuração da aplicação e do tipo de health check que você habilitou. Um orquestrador de cluster sério trata isso como requisito mínimo.",[19,28372,28374],{"id":28373},"detalhe-2-connection-draining-e-graceful-shutdown","Detalhe 2 — Connection draining e graceful shutdown",[12,28376,28377],{},"Mesmo quando você ordena o roteador a parar de mandar conexões novas pro contêiner velho, ainda existem conexões em curso — uploads de arquivo, downloads grandes, requests longos que aguardam resposta de banco, websocket aberto, streaming de evento. Se você simplesmente envia SIGKILL (ou deixa o runtime mandar, depois de um timeout curto demais), todas essas conexões cortam pela metade. O usuário vê erro de rede no momento exato do deploy.",[12,28379,28380,28381,28384],{},"O fluxo correto tem quatro passos ordenados. Primeiro, você sinaliza ao roteador que o contêiner velho não deve mais receber conexões novas — isso geralmente é uma remoção do balanceador ou um ",[231,28382,28383],{},"drain"," do nó. Segundo, você envia SIGTERM ao processo. SIGTERM é um sinal capturável; o app pode tratar e iniciar shutdown gracioso. Terceiro, você espera. O timeout depende do perfil da aplicação — 30 a 60 segundos cobre a vasta maioria dos web apps; APIs com upload de arquivo grande podem precisar de 120 ou mais. Quarto, e só depois desse timeout, você manda SIGKILL pra o que ainda não terminou.",[12,28386,28387],{},"Existe uma armadilha conhecida nesse passo: o app precisa, ele mesmo, lidar com SIGTERM. Node, Rails, Django, Go HTTP server — todos têm middleware ou helpers pra isso, mas nenhum deles vem ligado por padrão em template básico. Se sua aplicação não captura SIGTERM, o sinal vira no-op e o orquestrador vai esperar o timeout cheio antes de matar com SIGKILL. O resultado é deploy lento e, ainda assim, conexões cortadas — porque o app só percebeu que ia morrer no instante do KILL.",[12,28389,28390],{},"Verifique o seu app. Especificamente: quando ele recebe SIGTERM, ele para de aceitar conexões novas, espera as conexões em curso terminarem, e só então fecha? Se a resposta é \"não sei\", o seu rolling deploy está quebrado nesse detalhe.",[19,28392,28394],{"id":28393},"detalhe-3-imagem-anterior-pre-puxada-pra-rollback-rapido","Detalhe 3 — Imagem anterior pré-puxada pra rollback rápido",[12,28396,28397,28398,28401],{},"Bug crítico em produção, três minutos depois do deploy. Você precisa voltar pra versão anterior agora. O comando ",[231,28399,28400],{},"pull"," da imagem antiga toma 30 a 60 segundos por nó — porque, claro, você \"limpou\" a velha pra economizar disco, ou o cache de imagem do nó já foi rotacionado. Multiplique por número de réplicas, some o tempo de orquestração da própria troca, e o seu incidente de cinco minutos virou quinze. Quinze minutos é a diferença entre \"instabilidade momentânea\" no postmortem e \"incidente reportado pra cliente\".",[12,28403,28404],{},"A correção é trivial e quase ninguém implementa: manter a imagem N-1 pré-puxada nos nós que rodavam ela. Rollback vira mudar a tag pointed-to e reiniciar — operação de aproximadamente 10 segundos por contêiner, dominada pelo health check do contêiner antigo voltando à vida.",[12,28406,28407],{},"A versão mais sofisticada é manter snapshot do estado completo do job — não só imagem, mas variáveis de ambiente, configurações de rede, secrets associados, recursos alocados. Rollback parcial (só imagem) cobre a maioria dos casos, mas não cobre regressão introduzida em uma feature flag ou em uma string de conexão. Snapshot total é o que separa rollback rápido de rollback completo.",[19,28409,28411],{"id":28410},"detalhe-4-deteccao-automatica-de-falha-e-auto-revert","Detalhe 4 — Detecção automática de falha e auto-revert",[12,28413,28414,28415,28417],{},"Cenário comum em script caseiro: o deploy sobe, o contêiner novo entra em crash-loop (volta a ",[231,28416,28342],{},", morre em 5 segundos, volta de novo, morre de novo). O sistema fica esperando alguém ver o problema e abortar manualmente. Se isso acontece às quatro da manhã e o alerta vai pra Slack que ninguém tá olhando, o downtime se prolonga até alguém acordar.",[12,28419,28420,28421,28424],{},"O que rolling deve fazer é definir um ",[231,28422,28423],{},"healthy_deadline"," — um teto absoluto de tempo dentro do qual o contêiner novo precisa entrar e permanecer em estado saudável. O nosso default é 300 segundos; cinco minutos cobre apps que demoram pra inicializar (apps Java pesados, apps com warm-up de cache) sem dar margem indefinida. Se passou o deadline e o contêiner não está saudável, o orquestrador reverte automaticamente pra versão anterior. Alerta o time depois, sem urgência — porque o sistema já se protegeu sozinho.",[12,28426,28427,28428,28430],{},"A implementação prática conta dois sinais combinados: contagem de restarts no contêiner novo (se passou de 3 em 60 segundos, é crash-loop) e tempo total decorrido sem health check positivo sustentado. Qualquer um dos dois disparando antes do ",[231,28429,28361],{}," ser atingido aborta o deploy daquela réplica e dispara o revert.",[12,28432,28433],{},"Um detalhe sutil: auto-revert só faz sentido se o detalhe 3 (imagem anterior pré-puxada) está implementado. Reverter pra uma imagem que precisa ser baixada de novo durante o auto-revert anula o ganho.",[19,28435,28437,28438,28441],{"id":28436},"detalhe-5-max_parallel-1-em-cluster-multi-instance","Detalhe 5 — ",[231,28439,28440],{},"max_parallel: 1"," em cluster multi-instance",[12,28443,28444],{},"Você tem cinco réplicas do mesmo serviço. Tentado de trocar todas as cinco ao mesmo tempo: deploy paralelo, espera todas ficarem saudáveis, pronto. Esse caminho tem três problemas. Primeiro, durante a janela em que todas estão sendo trocadas, todo o tráfego passa pela versão nova — se ela tem bug, 100% dos usuários sentem, sem fallback. Segundo, o pico de uso de recursos durante a troca é 2× (porque velhas e novas coexistem por instantes), o que pode estourar memória do nó e gerar OOM em cascata. Terceiro, você perde a oportunidade barata de detectar regressão antes de propagar.",[12,28446,28447,28448,28450,28451,28453],{},"Rolling deve trocar uma réplica por vez (",[231,28449,28440],{},") — ou, em clusters muito grandes, uma fração pequena (10-25%). Troca a primeira, espera ficar saudável, espera o ",[231,28452,28361],{},", troca a segunda, e assim por diante. A capacidade total do serviço fica mantida durante toda a janela de deploy: se cinco réplicas aguentavam o tráfego antes, quatro novas + uma velha (ou vice-versa) também aguentam.",[12,28455,28456],{},"O trade-off é tempo. Dez réplicas com 30 segundos cada de troca + min_healthy_time = cinco minutos de janela total de deploy. Não é rápido. Em troca, você ganha rollback barato: se a primeira réplica nova falhar, o orquestrador para de trocar as outras. Você fica com nove velhas + uma nova fracassada, descarta a fracassada, voltou ao estado anterior sem nenhum impacto em capacidade. O custo de deploy lento é pago pela segurança de não ter cluster inteiro com bug rodando antes que alguém perceba.",[12,28458,28459,28460,28463],{},"Existe um knob extra que ajuda: ",[231,28461,28462],{},"stagger",", o intervalo entre trocas consecutivas. Default razoável é 30 segundos. Esse atraso permite que métricas e logs do contêiner recém-trocado sejam coletados e avaliados antes de partir pra próxima — janela mínima pra detectar bug que só aparece sob tráfego real.",[19,28465,28467],{"id":28466},"detalhe-6-pre-stop-hooks-pra-long-running-jobs","Detalhe 6 — Pre-stop hooks pra long-running jobs",[12,28469,28470],{},"Esse detalhe afeta especificamente apps que têm worker assíncrono — Sidekiq, Celery, Resque, RQ, BullMQ, qualquer fila de job em background. O contêiner do worker pegou um job que demora 30 minutos pra processar (envio de e-mail em lote, geração de relatório, processamento de pagamento). No meio do processamento, vem o SIGTERM do deploy. Se o worker não tiver tratamento adequado, o job é perdido — fica em estado intermediário, ou volta pra fila e é processado em duplicata, ou simplesmente some.",[12,28472,28473],{},"O fluxo correto é mais elaborado que o do detalhe 2. Antes mesmo do SIGTERM, o orquestrador precisa executar um pre-stop hook que sinalize ao worker pra entrar em modo de drenagem: parar de aceitar jobs novos, mas terminar os que já pegou. O orquestrador então espera (com timeout configurável — 60 a 300 segundos é faixa normal) pela fila local drenar. Só depois manda SIGTERM pro processo.",[12,28475,28476,28477,5840,28480,28483],{},"A implementação varia. Apps mais sofisticados expõem um endpoint ",[231,28478,28479],{},"\u002Fpause",[231,28481,28482],{},"\u002Fdrain"," que coloca o worker em modo gracioso. Apps mais simples usam um arquivo de sentinela — pre-stop cria um arquivo, worker checa o arquivo a cada loop e para de pegar job novo se ele existir. Em ambos os casos, a chave é que o orquestrador precisa esperar a confirmação de que a fila local drenou antes de mandar SIGTERM.",[12,28485,28486],{},"Sem isso, sua taxa de falha de jobs assíncronos durante deploy é diretamente proporcional ao tempo médio de processamento de job × número de workers trocados. Em apps que processam pagamento ou envio de e-mail, essa taxa de falha vira problema sério rápido.",[19,28488,28490],{"id":28489},"a-receita-completa","A receita completa",[12,28492,28493],{},"Os seis detalhes se compõem numa especificação reconhecível. Em formato spec:",[224,28495,28497],{"className":9017,"code":28496,"language":9019,"meta":229,"style":229},"update:\n  max_parallel: 1\n  min_healthy_time: 10    # 10s sustentados saudável\n  healthy_deadline: 300   # 5 min máx pra ficar saudável\n  auto_revert: true       # se passar deadline, reverte\n  stagger: 30             # 30s entre réplicas trocadas\ntasks:\n  - name: web\n    healthcheck:\n      path: \u002Fhealthz\n      interval: 5s\n      timeout: 2s\n      retries: 3\n    lifecycle:\n      pre_stop:\n        timeout: 60         # 60s pra worker drenar\n        command: [\"\u002Fbin\u002Fsh\", \"-c\", \"kill -TERM 1; sleep 30\"]\n",[231,28498,28499,28506,28515,28527,28539,28552,28564,28571,28582,28589,28599,28609,28619,28629,28636,28643,28656],{"__ignoreMap":229},[234,28500,28501,28504],{"class":236,"line":237},[234,28502,28503],{"class":9026},"update",[234,28505,9030],{"class":387},[234,28507,28508,28511,28513],{"class":236,"line":244},[234,28509,28510],{"class":9026},"  max_parallel",[234,28512,6564],{"class":387},[234,28514,10050],{"class":251},[234,28516,28517,28520,28522,28524],{"class":236,"line":271},[234,28518,28519],{"class":9026},"  min_healthy_time",[234,28521,6564],{"class":387},[234,28523,1589],{"class":251},[234,28525,28526],{"class":240},"    # 10s sustentados saudável\n",[234,28528,28529,28532,28534,28536],{"class":236,"line":415},[234,28530,28531],{"class":9026},"  healthy_deadline",[234,28533,6564],{"class":387},[234,28535,1576],{"class":251},[234,28537,28538],{"class":240},"   # 5 min máx pra ficar saudável\n",[234,28540,28541,28544,28546,28549],{"class":236,"line":434},[234,28542,28543],{"class":9026},"  auto_revert",[234,28545,6564],{"class":387},[234,28547,28548],{"class":251},"true",[234,28550,28551],{"class":240},"       # se passar deadline, reverte\n",[234,28553,28554,28557,28559,28561],{"class":236,"line":459},[234,28555,28556],{"class":9026},"  stagger",[234,28558,6564],{"class":387},[234,28560,5580],{"class":251},[234,28562,28563],{"class":240},"             # 30s entre réplicas trocadas\n",[234,28565,28566,28569],{"class":236,"line":464},[234,28567,28568],{"class":9026},"tasks",[234,28570,9030],{"class":387},[234,28572,28573,28575,28577,28579],{"class":236,"line":479},[234,28574,9552],{"class":387},[234,28576,10465],{"class":9026},[234,28578,6564],{"class":387},[234,28580,28581],{"class":255},"web\n",[234,28583,28584,28587],{"class":236,"line":484},[234,28585,28586],{"class":9026},"    healthcheck",[234,28588,9030],{"class":387},[234,28590,28591,28594,28596],{"class":236,"line":490},[234,28592,28593],{"class":9026},"      path",[234,28595,6564],{"class":387},[234,28597,28598],{"class":255},"\u002Fhealthz\n",[234,28600,28601,28604,28606],{"class":236,"line":508},[234,28602,28603],{"class":9026},"      interval",[234,28605,6564],{"class":387},[234,28607,28608],{"class":255},"5s\n",[234,28610,28611,28614,28616],{"class":236,"line":529},[234,28612,28613],{"class":9026},"      timeout",[234,28615,6564],{"class":387},[234,28617,28618],{"class":255},"2s\n",[234,28620,28621,28624,28626],{"class":236,"line":535},[234,28622,28623],{"class":9026},"      retries",[234,28625,6564],{"class":387},[234,28627,28628],{"class":251},"3\n",[234,28630,28631,28634],{"class":236,"line":546},[234,28632,28633],{"class":9026},"    lifecycle",[234,28635,9030],{"class":387},[234,28637,28638,28641],{"class":236,"line":552},[234,28639,28640],{"class":9026},"      pre_stop",[234,28642,9030],{"class":387},[234,28644,28645,28648,28650,28653],{"class":236,"line":557},[234,28646,28647],{"class":9026},"        timeout",[234,28649,6564],{"class":387},[234,28651,28652],{"class":251},"60",[234,28654,28655],{"class":240},"         # 60s pra worker drenar\n",[234,28657,28658,28661,28663,28666,28668,28671,28673,28676],{"class":236,"line":594},[234,28659,28660],{"class":9026},"        command",[234,28662,9530],{"class":387},[234,28664,28665],{"class":255},"\"\u002Fbin\u002Fsh\"",[234,28667,571],{"class":387},[234,28669,28670],{"class":255},"\"-c\"",[234,28672,571],{"class":387},[234,28674,28675],{"class":255},"\"kill -TERM 1; sleep 30\"",[234,28677,9536],{"class":387},[12,28679,28680,28681,28683],{},"Essa configuração — em texto, em arquivo de configuração de orquestrador, ou implícita em código de deploy — é o mínimo viável de rolling deploy seguro. Cobrir os seis detalhes é o que diferencia uma orquestração séria de uma série de comandos ",[231,28682,1118],{}," enfileirados.",[19,28685,28687],{"id":28686},"quem-implementa-o-que-a-versao-honesta","Quem implementa o quê (a versão honesta)",[12,28689,28690],{},"A grade abaixo cobre o ecossistema mais comum no nicho self-hosted\u002Fcluster pequeno. Não é exaustiva — há ferramentas excelentes que ficaram de fora —, mas é honesta sobre as que aparecem nas decisões de arquitetura típicas.",[12,28692,28693,28696,28697,28700,28701,21696,28704,28707,28708,28711,28712,21696,28715,28718,28719,21696,28722,28725],{},[27,28694,28695],{},"Kubernetes."," Implementa todos os seis quando o manifesto está completo: ",[231,28698,28699],{},"readinessProbe"," cobre o detalhe 1, ",[231,28702,28703],{},"terminationGracePeriodSeconds",[231,28705,28706],{},"preStop"," cobre o 2 e o 6, ",[231,28709,28710],{},"imagePullPolicy"," + cache local cobre o 3, ",[231,28713,28714],{},"progressDeadlineSeconds",[231,28716,28717],{},"revisionHistoryLimit"," cobre o 4, ",[231,28720,28721],{},"maxUnavailable",[231,28723,28724],{},"maxSurge"," cobre o 5. O problema não é o que ele faz; é o tamanho do manifesto necessário pra fazer isso, e o número de campos cuja default não é o que você precisa.",[12,28727,28728,28731,28732,28735,28736,571,28739,571,28742,28745],{},[27,28729,28730],{},"Docker Swarm."," Implementa rolling via ",[231,28733,28734],{},"docker service update",". As primitivas existem (",[231,28737,28738],{},"--update-parallelism",[231,28740,28741],{},"--update-delay",[231,28743,28744],{},"--update-failure-action","), mas as defaults são agressivas demais — paralelismo padrão alto, sem health check obrigatório, e o comportamento de auto-revert é opt-in com um flag específico. Precisa ser tunado pra cada serviço; raramente é tunado.",[12,28747,28748,28751,28752,28754,28755,571,28757,571,28759,571,28761,571,28764,28766],{},[27,28749,28750],{},"Nomad."," Implementa nativamente, com defaults sensatos. ",[231,28753,28503],{}," block tem ",[231,28756,3303],{},[231,28758,28361],{},[231,28760,28423],{},[231,28762,28763],{},"auto_revert",[231,28765,28462],{}," — basicamente os mesmos campos da spec acima, porque essa nomenclatura não é coincidência: ela é a herança de boas práticas que os principais orquestradores convergiram.",[12,28768,28769,28772,28773,571,28775,571,28778,571,28781,28784],{},[27,28770,28771],{},"HeroCtl."," Implementa todos os seis detalhes nativamente, com a configuração praticamente idêntica à spec acima. A eleição de coordenador do plano de controle leva cerca de 7 segundos quando o nó líder cai, então mesmo um deploy executado em pleno momento de troca de coordenador é resiliente — o novo coordenador retoma o ciclo de health check do ponto onde estava. As defaults são ",[231,28774,28440],{},[231,28776,28777],{},"min_healthy_time: 10",[231,28779,28780],{},"healthy_deadline: 300",[231,28782,28783],{},"auto_revert: true",". Se você submete um job sem configurar nada, é isso que pega.",[12,28786,28787,28790],{},[27,28788,28789],{},"Watchtower."," Não. O Watchtower é uma ferramenta útil pra um caso específico — atualização automática de contêineres em ambiente onde você aceita downtime curto e perda de conexão como custo de não ter pipeline de deploy. Em produção séria, ele falha em cinco dos seis detalhes. Não é crítica ao projeto; é crítica ao uso dele em contexto errado.",[12,28792,28793,28796],{},[27,28794,28795],{},"Coolify e Dokploy."," Implementam parcialmente. Health check existe mas precisa ser configurado por aplicação. Connection draining depende do app capturar SIGTERM (responsabilidade compartilhada). Auto-revert é manual em ambos. Pre-stop hook genérico não é primitivo de primeira classe. Pra single-server, é suficiente; pra cluster, é frágil.",[12,28798,28799,28802,28803,28806],{},[27,28800,28801],{},"Scripts caseiros."," Aquela combinação de ",[231,28804,28805],{},"docker pull && docker stop && docker run"," em um shell script gerenciado por cron ou disparado por webhook do GitHub. Zero dos seis. Cobertura honesta do que isso é: um deploy com downtime curto, não um rolling deploy.",[19,28808,28810],{"id":28809},"os-quatro-padroes-alem-de-rolling","Os quatro padrões além de rolling",[12,28812,28813],{},"Rolling não é a única estratégia. Conforme o requisito e o orçamento, três outras fazem sentido em contextos específicos.",[12,28815,28816,28818],{},[27,28817,2741],{}," Dois ambientes paralelos completos, cada um com a stack inteira. Deploy é subir o ambiente alternativo (verde) com a versão nova, validar em paralelo, e fazer switch via DNS ou balanceador — um único momento atômico em que o tráfego inteiro muda. Mais seguro que rolling porque você pode validar a versão nova com tráfego sintético antes de qualquer usuário real. Custa, em capacidade, 2× durante a janela de deploy. Recomendado pra apps onde o custo de bug em produção é alto e o custo de capacidade extra é baixo.",[12,28820,28821,28823],{},[27,28822,2747],{}," Manda 5% (ou 1%, ou qualquer fração pequena) do tráfego pra versão nova, monitora métricas chave por um período de observação (15 minutos a algumas horas), e escala gradualmente — 5%, 25%, 50%, 100%. Detecta regressão antes de afetar o usuário principal. Pré-requisito é ter métricas confiáveis com sensibilidade alta; sem isso, canary só atrasa o deploy sem ganhar segurança. Combina bem com rolling: rolling é o mecanismo, canary é a estratégia de promoção.",[12,28825,28826,28829],{},[27,28827,28828],{},"Rainbow."," Várias versões coexistindo simultaneamente em produção, com tráfego roteado por chave de cliente ou tipo de tenant. Caso de uso raro, geralmente em B2B com requisitos de versão por contrato. Não é a primeira opção quase nunca.",[12,28831,28832,28835],{},[27,28833,28834],{},"Recreate."," Para tudo, sobe novo. Downtime explícito e aceito. Aceitável pra apps internos com janela de manutenção ou pra ambientes de desenvolvimento. Surpreendentemente apropriado em casos específicos: deploy que envolve migração de banco que rompe schema, ou deploy de app cuja arquitetura não suporta duas versões coexistindo. Quando recreate é a escolha certa, é a escolha certa — não tem prêmio por fazer rolling de tudo.",[19,28837,28839],{"id":28838},"como-detectar-que-o-seu-rolling-esta-mal","Como detectar que o seu rolling está mal",[12,28841,28842],{},"Quatro testes diretos. Os dois primeiros são métricas que você pode olhar no monitoramento que já tem; os dois seguintes são experimentos que precisam ser feitos com intenção.",[12,28844,28845,28848],{},[27,28846,28847],{},"Taxa de 5xx durante a janela de deploy."," Se sua taxa de 5xx em produção é estatisticamente diferente de zero durante a janela do deploy, está mal. \"Estatisticamente diferente\" significa: pega 30 deploys consecutivos, mede a taxa de 5xx no minuto que precede o deploy e no minuto do deploy. Se a média do segundo é maior, há erro real, e a janela está cortando conexão.",[12,28850,28851,28854],{},[27,28852,28853],{},"Latência p99 durante o deploy."," Se p99 sobe 3× ou mais durante a janela de deploy, está mal. Spike de latência indica que requests estão sendo reiniciados internamente, ou que o balanceador está reaceitando conexões pra contêineres lentos pra responder.",[12,28856,28857,28860,28861,28864,28865,28868,28869,28871],{},[27,28858,28859],{},"Teste de crash forçado."," Antes de um deploy programado, force o app no contêiner novo a falhar — ",[231,28862,28863],{},"chmod 000"," no binário, ou variável de ambiente que faz ",[231,28866,28867],{},"process.exit(1)"," no startup. O sistema reverte automaticamente dentro do ",[231,28870,28423],{},"? Se ficar travado esperando intervenção humana, o detalhe 4 está quebrado.",[12,28873,28874,28877],{},[27,28875,28876],{},"Deploy de sexta 17h com tráfego real."," O teste social. Faça um deploy não-trivial em horário de pico, num dia em que ninguém da equipe está olhando ativamente. Se a métrica do seu app durante essa janela for indistinguível de uma janela aleatória, seu rolling deploy é seguro. Se foi necessária intervenção, ou se o canal de status registrou algo, não é.",[19,28879,3226],{"id":3225},[12,28881,28882,28885],{},[27,28883,28884],{},"Watchtower é seguro pra produção?","\nPra produção pequena com tolerância explícita a downtime curto e ferramenta de fallback (rollback manual rápido), sim. Pra produção que tem cliente pagante com expectativa de SLA, não. Watchtower foi feito pra um problema diferente.",[12,28887,28888,28894,28895,28897,28898,28900],{},[27,28889,3181,28890,5840,28892,25805],{},[231,28891,355],{},[231,28893,28357],{},"\nA convenção que mais ajuda na prática: ",[231,28896,355],{}," indica \"o processo está vivo\" (liveness — usado por orquestrador pra decidir se reinicia o contêiner) e ",[231,28899,28357],{}," indica \"estou pronto a servir tráfego\" (readiness — usado pelo orquestrador pra decidir se inclui o contêiner no balanceador). Pra rolling deploy, o que importa é o readiness; o orquestrador só promove um contêiner pro pool de tráfego quando o readiness retorna 200. Se você tem só um endpoint e ele responde 200 imediatamente após o processo subir, sua readiness não está medindo o que devia.",[12,28902,28903,28908,28909,101],{},[27,28904,28905,28907],{},[231,28906,28361],{}," deve ser quanto?","\nFaixa típica é 10 a 30 segundos. Mais curto que isso (3 segundos, 5 segundos) deixa passar falsos positivos — apps que respondem 200 logo no início mas começam a falhar quando o tráfego real chega. Mais longo que 60 segundos vira impedimento operacional sem ganho proporcional. Se sua aplicação tem warm-up complexo (cache em memória, conexão com terceiros lentos), o lugar pra cobrir isso é no health check em si — fazer ele só responder 200 depois do warm-up —, não inflar o ",[231,28910,28361],{},[12,28912,28913,28916,28917,28920],{},[27,28914,28915],{},"Como faço pre-stop em app Rails?","\nRails responde nativamente a SIGTERM com graceful shutdown desde a 5.x — o servidor para de aceitar conexão nova e termina as em curso. Pra Sidekiq, o sinal correto é SIGTSTP (pause workers), seguido por SIGTERM depois que ",[231,28918,28919],{},"Sidekiq.redis { |c| c.llen(\"queue:default\") }"," zerar. Em prática, o pre-stop hook executa um script pequeno que manda SIGTSTP, faz polling de fila por até N segundos, e retorna — o orquestrador então faz o SIGTERM convencional.",[12,28922,28923,28926],{},[27,28924,28925],{},"Sticky sessions e rolling deploy se dão bem?","\nMal. Sticky session significa que sua arquitetura está delegando estado pro balanceador, e durante rolling esse estado é descartado quando a réplica que segurava a sessão é trocada. Resultado: usuário é deslogado, perde formulário pela metade, ou tem comportamento inconsistente. Se você precisa de sticky, isso é sintoma — refatore pra estado externo (Redis, banco) e o rolling deploy fica trivial.",[12,28928,28929,28932],{},[27,28930,28931],{},"Migração de banco no rolling deploy?","\nA regra prática que evita 90% das dores: toda migração precisa ser compatível com a versão anterior do app durante a janela de deploy. Adicionar coluna nullable: tranquilo. Remover coluna: faça em duas releases (release N para de usar a coluna; release N+1 remove ela). Renomear coluna: idem, com coluna nova como cópia. Isso permite que velhas e novas réplicas coexistam, que é exatamente o que rolling pressupõe.",[12,28934,28935,28938,28939,5840,28941,28944],{},[27,28936,28937],{},"Posso testar rolling deploy localmente?","\nPode. Sobe três réplicas locais com docker-compose, simula um balanceador (nginx ou caddy) na frente, dispara ",[231,28940,2491],{},[231,28942,28943],{},"wrk"," com tráfego sustentado, e executa um script de troca como o seu pipeline executaria em produção. Mede 5xx durante a janela. É um teste imperfeito (o tráfego é sintético, o nó é único, não há rede real entre nós), mas pega os bugs grosseiros nos detalhes 1, 2 e 3 antes deles vazarem pra produção.",[19,28946,3310],{"id":3309},[12,28948,28949],{},"Rolling deploy seguro não é um botão; é um conjunto de seis comportamentos coordenados, e a maioria das ferramentas que prometem \"zero downtime\" cobre três ou quatro deles. A diferença prática vira visível na sexta 17h, ou no incidente de quarta de manhã, ou no postmortem em que alguém pergunta por que três usuários reportaram erro durante o último deploy.",[12,28951,28952],{},"A receita está acima. Se a sua ferramenta atual cobre os seis, ótimo. Se não, ou você assume o custo de cobrir manualmente os faltantes, ou troca por algo que cobre nativamente.",[12,28954,28955],{},"HeroCtl cobre nativamente. Plano Community é gratuito permanente, sem limite de servidores ou jobs, com a configuração de rolling deploy descrita aqui como default. Plano Business adiciona SSO, RBAC, auditoria e suporte com SLA pra times com requisitos formais de plataforma. Plano Enterprise adiciona escrow de código-fonte e contrato de continuidade.",[12,28957,22426],{},[224,28959,28960],{"className":226,"code":2949,"language":228,"meta":229,"style":229},[231,28961,28962],{"__ignoreMap":229},[234,28963,28964,28966,28968,28970,28972],{"class":236,"line":237},[234,28965,1220],{"class":247},[234,28967,2958],{"class":251},[234,28969,2961],{"class":255},[234,28971,2964],{"class":383},[234,28973,2967],{"class":247},[12,28975,28976,28977,28979,28980,2403,28983,101],{},"Se você quer ver os outros lados do assunto, leia ",[3337,28978,21739],{"href":6547}," pro contexto de produto, e nos próximos posts vamos cobrir ",[3337,28981,28982],{"href":3344},"deploy de Docker em produção, do compose ao cluster",[3337,28984,28985],{"href":11732},"estratégias de backup de banco em cluster pras três da manhã",[12,28987,28988],{},"A intenção continua a mesma: orquestração de contêineres, sem cerimônia — e sem teatro.",[3351,28990,28991],{},"html pre.shiki code .sPWt5, html code.shiki .sPWt5{--shiki-default:#7EE787}html pre.shiki code .sZEs4, html code.shiki .sZEs4{--shiki-default:#E6EDF3}html pre.shiki code .sFSAA, html code.shiki .sFSAA{--shiki-default:#79C0FF}html pre.shiki code .sH3jZ, html code.shiki .sH3jZ{--shiki-default:#8B949E}html pre.shiki code .s9uIt, html code.shiki .s9uIt{--shiki-default:#A5D6FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .sQhOw, html code.shiki .sQhOw{--shiki-default:#FFA657}html pre.shiki code .suJrU, html code.shiki .suJrU{--shiki-default:#FF7B72}",{"title":229,"searchDepth":244,"depth":244,"links":28993},[28994,28995,28996,28997,28998,29000,29001,29002,29003,29004,29005,29006],{"id":28335,"depth":244,"text":28336},{"id":28373,"depth":244,"text":28374},{"id":28393,"depth":244,"text":28394},{"id":28410,"depth":244,"text":28411},{"id":28436,"depth":244,"text":28999},"Detalhe 5 — max_parallel: 1 em cluster multi-instance",{"id":28466,"depth":244,"text":28467},{"id":28489,"depth":244,"text":28490},{"id":28686,"depth":244,"text":28687},{"id":28809,"depth":244,"text":28810},{"id":28838,"depth":244,"text":28839},{"id":3225,"depth":244,"text":3226},{"id":3309,"depth":244,"text":3310},"2025-12-04","Trocar contêiner sem downtime parece simples — pull nova imagem, mata velho, sobe novo. Funciona até a primeira sexta-feira 17h. Os 6 detalhes que separam rolling deploy real de teatro.",{},{"title":28321,"description":29008},{"loc":3339},"blog\u002Frolling-deploy-seguro-por-que-o-seu-talvez-nao-seja",[29014,1526,3379,3392,16736],"rolling-deploy","ZJ1Hkqsv2P2p7czr5tm4RIQk5Kp7c_lXiv09IsvmboA",{"id":29017,"title":29018,"author":7,"body":29019,"category":6383,"cover":3380,"date":29769,"description":29770,"draft":3383,"extension":3384,"lastReviewed":3380,"meta":29771,"navigation":411,"path":14883,"readingTime":3387,"seo":29772,"sitemap":29773,"stem":29774,"tags":29775,"__hash__":29777},"blog_pt\u002Fblog\u002Falternativa-kubernetes-paas-brasil.md","Alternativa ao Kubernetes em 2026: PaaS auto-hospedado pra times brasileiros",{"type":9,"value":29020,"toc":29749},[29021,29024,29027,29030,29033,29037,29040,29066,29069,29094,29097,29101,29104,29107,29130,29137,29147,29153,29156,29160,29163,29190,29196,29199,29202,29206,29209,29212,29215,29218,29221,29223,29226,29229,29232,29235,29239,29242,29245,29248,29251,29255,29258,29261,29264,29267,29271,29274,29277,29280,29283,29286,29290,29293,29296,29310,29313,29316,29319,29323,29326,29332,29338,29344,29350,29353,29357,29360,29402,29405,29409,29412,29590,29593,29597,29600,29606,29612,29618,29622,29625,29631,29637,29642,29648,29653,29659,29663,29669,29675,29681,29687,29693,29699,29705,29707,29710,29713,29716,29732,29735,29744,29747],[12,29022,29023],{},"A literatura técnica sobre orquestração de contêineres é majoritariamente americana. E majoritariamente assume um conjunto de premissas que não vale pro Brasil em 2026.",[12,29025,29026],{},"Salário mediano de SRE americano gira em torno de US$150 mil por ano. Pro CFO em São Francisco, é \"uma pessoa cara\". Em São Paulo, no câmbio de hoje, é o equivalente a três pessoas inteiras. A conta dá outra. A conclusão também.",[12,29028,29029],{},"Custo de US$140 por mês de plataforma gerenciada vira ruído pro CFO de Mountain View. Pro fundador em Belo Horizonte, é o décimo do salário do dev pleno que ele acabou de contratar. A mesma decisão arquitetural — \"vamos só pagar o gerenciado e seguir\" — tem peso financeiro completamente diferente nos dois lados do hemisfério.",[12,29031,29032],{},"Esse post recalibra a decisão pra realidade brasileira. Não é um manifesto contra Kubernetes. É uma planilha.",[19,29034,29036],{"id":29035},"a-realidade-de-orcamento-brasileira-sem-rodeios","A realidade de orçamento brasileira, sem rodeios",[12,29038,29039],{},"Antes de comparar plataformas, vale alinhar números atuais. As faixas abaixo são medianas do mercado brasileiro em abril de 2026, considerando time de SaaS B2B remoto em região metropolitana.",[2735,29041,29042,29048,29054,29060],{},[70,29043,29044,29047],{},[27,29045,29046],{},"Dev pleno full-stack",": R$10 mil a R$15 mil em CLT (com encargos, custo total ~1,8× pra empresa). PJ na faixa R$15 mil a R$20 mil mensais.",[70,29049,29050,29053],{},[27,29051,29052],{},"Dev sênior full-stack",": R$18 mil a R$28 mil PJ.",[70,29055,29056,29059],{},[27,29057,29058],{},"SRE com Kubernetes em produção sério",": R$25 mil a R$40 mil PJ. Raro encontrar abaixo de R$20 mil — quem tem Kubernetes no currículo aprendeu rápido a cobrar pelo que aprendeu.",[70,29061,29062,29065],{},[27,29063,29064],{},"Plantão 24×7",": dois SREs no mínimo, ou você queima a única pessoa em três meses. A matemática de plantão sustentável não muda com país: ninguém aguenta ser o único pager por mais que isso.",[12,29067,29068],{},"Hospedagem cloud comum no Brasil em 2026 segue quatro padrões principais:",[2735,29070,29071,29076,29082,29088],{},[70,29072,29073,29075],{},[27,29074,14363],{},": sem região no Brasil, datacenter mais próximo é Nova York. Latência de São Paulo na faixa de 120 ms. Preços em dólar, simples e previsíveis. Popular pra times pequenos.",[70,29077,29078,29081],{},[27,29079,29080],{},"AWS São Paulo (sa-east-1)",": latência boa pra cliente brasileiro, mas preços 30 a 40% acima de us-east-1. Menos serviços disponíveis que regiões americanas.",[70,29083,29084,29087],{},[27,29085,29086],{},"Hetzner (Alemanha)",": 30 a 50% mais barato que AWS. Latência ~200 ms pra São Paulo. Bom pra workloads que não são latência-críticas.",[70,29089,29090,29093],{},[27,29091,29092],{},"Provedor brasileiro (Locaweb, UOL Host, KingHost, Magalu Cloud)",": faturamento em real, atendimento em português, fatura nacional pra contabilidade brasileira. Preços por GB e por vCPU geralmente piores que cloud internacional, mas zero exposição cambial.",[12,29095,29096],{},"Acima de tudo isso, paira o câmbio. O dólar em 2026 oscila ao redor de R$5 com volatilidade anual de aproximadamente 10%. Isso significa que um custo de US$200 por mês em janeiro pode virar US$220 equivalentes em outubro sem você ter aumentado nada. Quem orça em real e paga em dólar carrega risco cambial silencioso, e esse risco é proporcional ao tamanho da fatura.",[19,29098,29100],{"id":29099},"a-conta-do-kubernetes-gerenciado-pra-time-pequeno-brasileiro","A conta do Kubernetes gerenciado pra time pequeno brasileiro",[12,29102,29103],{},"Vamos colocar o cenário mais comum em cima da mesa. Startup B2B em São Paulo, 4 devs, primeiro produto em produção, 50 clientes pagantes, receita mensal recorrente em real.",[12,29105,29106],{},"A escolha \"padrão da indústria\" é EKS na região São Paulo. A conta mínima:",[2735,29108,29109,29112,29115,29118,29121],{},[70,29110,29111],{},"Cluster EKS: US$73\u002Fmês.",[70,29113,29114],{},"Gateway de saída (NAT): ~US$40\u002Fmês.",[70,29116,29117],{},"Balanceador de carga (ALB): ~US$25\u002Fmês.",[70,29119,29120],{},"Tráfego de saída: variável, conservador US$30\u002Fmês.",[70,29122,29123,29125,29126,29129],{},[27,29124,16926],{},": ~US$170\u002Fmês = ",[27,29127,29128],{},"~R$850\u002Fmês"," ao câmbio de R$5\u002FUSD.",[12,29131,29132,29133,29136],{},"Isso é só plataforma. As máquinas onde a aplicação roda são extras. Em 4 nós m5.large na região São Paulo, mais ~US$400\u002Fmês. Total realista pra produção pequena: ~US$570\u002Fmês = ",[27,29134,29135],{},"R$2.850\u002Fmês"," apenas em infra.",[12,29138,29139,29140,29143,29144,101],{},"E ainda falta o custo verdadeiro: o time. Dois SREs juniores-pleno em CLT, R$30 mil\u002Fmês cada com encargos, multiplicado por 13 (incluindo férias e décimo): ",[27,29141,29142],{},"R$780 mil\u002Fano"," só em folha de plataforma. Em PJ, dois sêniores na mesma faixa: ",[27,29145,29146],{},"R$600 mil\u002Fano",[12,29148,29149,29150,101],{},"Total ano 1 conservador, plataforma + folha: ",[27,29151,29152],{},"R$650 mil a R$820 mil antes do primeiro cliente Enterprise pagar",[12,29154,29155],{},"Como referência: 4 devs full-stack a R$15 mil PJ entregam produto por R$780 mil\u002Fano. A escolha \"Kubernetes gerenciado + 2 SREs\" custa quase a mesma coisa que ter o time inteiro de produto duplicado. Só que entregando plataforma — não entregando feature pro cliente.",[19,29157,29159],{"id":29158},"a-conta-do-auto-hospedado-em-brasil","A conta do auto-hospedado em Brasil",[12,29161,29162],{},"Mesmo cenário, decisão diferente. 3 a 4 VPS Linux com Docker, plano de controle replicado, roteador integrado, certificados automáticos.",[2735,29164,29165,29171,29177,29184,29187],{},[70,29166,29167,29168,101],{},"4 VPS DigitalOcean (4 vCPU, 8 GB RAM cada): US$48\u002Fmês × 4 = US$192\u002Fmês = ",[27,29169,29170],{},"R$960\u002Fmês",[70,29172,29173,29174,101],{},"Alternativa Hetzner: US$32\u002Fmês × 4 = US$128\u002Fmês = ",[27,29175,29176],{},"R$640\u002Fmês",[70,29178,29179,29180,29183],{},"Alternativa Magalu Cloud (BR): R$200\u002Fmês × 4 = ",[27,29181,29182],{},"R$800\u002Fmês",", em real, sem volatilidade cambial.",[70,29185,29186],{},"Backup S3 região São Paulo: ~US$15\u002Fmês = R$75\u002Fmês.",[70,29188,29189],{},"Tempo de dev full-stack que cuida da plataforma: 20% de uma pessoa de R$15 mil PJ = R$3 mil\u002Fmês alocados.",[12,29191,29192,29193,101],{},"Total ano 1: ",[27,29194,29195],{},"R$50 mil a R$72 mil",[12,29197,29198],{},"Diferença pro cenário Kubernetes gerenciado: 9 a 13 vezes menos. Esse delta — algo entre R$580 mil e R$770 mil por ano — vira dois devs full-stack adicionais, ou um designer sênior, ou três meses de pista. É a margem entre fechar o ano com lucro e fechar com prejuízo.",[12,29200,29201],{},"A objeção honesta a essa conta é: \"mas vai dar trabalho operar\". A resposta também precisa ser honesta. Sim, vai dar algum trabalho. A pergunta certa é se o trabalho extra cabe em 20% do tempo de uma pessoa do time. Se a resposta é sim — e na faixa de 4 servidores e 16 contêineres geralmente é — o ROI é direto.",[19,29203,29205],{"id":29204},"hospedagem-brasileira-na-pratica-panorama-em-abril-de-2026","Hospedagem brasileira na prática: panorama em abril de 2026",[12,29207,29208],{},"Cada provedor que importa pro contexto brasileiro tem trade-offs específicos. Resumo curto pra cada um.",[368,29210,29080],{"id":29211},"aws-sao-paulo-sa-east-1",[12,29213,29214],{},"A região mais antiga em território brasileiro, ativa desde 2011. Latência ótima pra cliente em São Paulo (1 a 5 ms intra-região, 30 a 50 ms pro Sul e Centro-Oeste). Preços 30 a 40% acima de us-east-1 — instância m5.large que custa US$70\u002Fmês em Virgínia custa US$95\u002Fmês em São Paulo. Nem todo serviço da AWS está disponível: alguns produtos novos demoram 6 a 18 meses pra chegar em sa-east-1.",[12,29216,29217],{},"Bom pra: produto B2B brasileiro com clientes exigindo data residency em contrato, time grande o suficiente pra absorver complexidade da AWS, empresa com receita predominante em real.",[12,29219,29220],{},"Cuidado com: custos de transferência de dados entre regiões (caro). Quem replica banco entre sa-east-1 e us-east-1 paga caro pelo egress.",[368,29222,14363],{"id":14945},[12,29224,29225],{},"Sem região no Brasil. Datacenter mais próximo é Nova York (NYC1, NYC3) ou Toronto. Latência média pra São Paulo na faixa de 110 a 130 ms — perceptível em aplicação interativa, irrelevante pra API JSON com 200 ms de processamento próprio.",[12,29227,29228],{},"Preços simples, em USD, previsíveis. VPS de 4 vCPU + 8 GB RAM por US$48\u002Fmês. Sem surpresa de billing — você sabe no dia 1 quanto vai gastar no dia 30.",[12,29230,29231],{},"Bom pra: time pequeno com latência tolerável (B2B SaaS, dashboards, APIs), startup que prioriza simplicidade de billing, projeto pessoal que vira produto.",[12,29233,29234],{},"Cuidado com: aplicações user-facing onde 120 ms extra de latência custa conversão (e-commerce, jogos, video chat). Câmbio: tudo em dólar.",[368,29236,29238],{"id":29237},"hetzner-alemanha-finlandia","Hetzner (Alemanha, Finlândia)",[12,29240,29241],{},"Provedor europeu com a melhor relação custo-benefício do mercado em 2026. VPS de 4 vCPU + 8 GB por ~US$15\u002Fmês — metade do preço da DigitalOcean. Servidores dedicados por US$50\u002Fmês com 64 GB de RAM.",[12,29243,29244],{},"Latência pra São Paulo na faixa de 200 a 230 ms. Inviável pra qualquer interação síncrona com usuário brasileiro — perceptível como lentidão. Viável pra workloads de fundo, processamento batch, análise de dados, ambientes de staging que ninguém usa em tempo real.",[12,29246,29247],{},"Bom pra: workloads non-customer-facing, infraestrutura de build, banco de dados secundário pra analytics, arquivamento.",[12,29249,29250],{},"Cuidado com: tudo que tem um humano esperando do outro lado.",[368,29252,29254],{"id":29253},"provedores-brasileiros-locaweb-uol-host-kinghost","Provedores brasileiros (Locaweb, UOL Host, KingHost)",[12,29256,29257],{},"Faturamento em real, NF-e brasileira, atendimento em português comercial. Pra contabilidade brasileira, simplifica o registro. Pra empresa que precisa demonstrar fornecedor nacional pra auditoria pública ou contrato público, é exigência.",[12,29259,29260],{},"Preços por vCPU e GB tendem a ser 20 a 50% piores que cloud internacional. A oferta de produto também é mais limitada — mais ênfase em hospedagem tradicional, menos em primitivas modernas tipo block storage, snapshot e API programática consistente.",[12,29262,29263],{},"Bom pra: empresa com obrigação contratual de fornecedor nacional, time que valoriza atendimento em português durante incidentes, projeto público com regras de fornecedor brasileiro.",[12,29265,29266],{},"Cuidado com: API e ferramental geralmente menos polidos. Documentação em português é vantagem; documentação em português incompleta vira armadilha quando o problema é específico.",[368,29268,29270],{"id":29269},"cloud-nacional-emergente-magalu-cloud-dloud-similares","Cloud nacional emergente (Magalu Cloud, dloud, similares)",[12,29272,29273],{},"A categoria mais nova, em maturação ao longo de 2025 e 2026. Operadores brasileiros oferecendo VPS, object storage e gerenciados básicos com preço em real e datacenter em território nacional.",[12,29275,29276],{},"Atrativo principal: LGPD com dados ficando explicitamente no Brasil, sem transferência internacional pra demonstrar em auditoria. Faturamento em real elimina exposição cambial.",[12,29278,29279],{},"Maturidade ainda em construção. Catálogo de serviços bem mais limitado que AWS São Paulo. Documentação às vezes incompleta. Latência intra-Brasil é boa por construção.",[12,29281,29282],{},"Bom pra: empresa onde LGPD com data residency local é diferencial competitivo, projetos públicos brasileiros, times que querem zero exposição cambial.",[12,29284,29285],{},"Cuidado com: imaturidade do catálogo. Faltam recursos avançados que existem na AWS há cinco anos.",[19,29287,29289],{"id":29288},"lgpd-e-auto-hospedado","LGPD e auto-hospedado",[12,29291,29292],{},"A Lei Geral de Proteção de Dados (Lei 13.709\u002F2018) está em vigor desde setembro de 2020 e a fase de fiscalização ativa pela ANPD começou em 2022. Em 2026 já existem multas substanciais aplicadas e jurisprudência inicial.",[12,29294,29295],{},"A LGPD não exige residência nacional explícita dos dados. Mas exige:",[2735,29297,29298,29301,29304,29307],{},[70,29299,29300],{},"Tratamento adequado de dados pessoais (base legal documentada, propósito claro, retenção justificada).",[70,29302,29303],{},"Em caso de transferência internacional, salvaguarda contratual com a entidade destinatária.",[70,29305,29306],{},"Capacidade de demonstrar a auditoria interna em incident response: quem acessou o quê, quando, com qual finalidade.",[70,29308,29309],{},"Registro de incidentes e notificação à ANPD em prazo razoável (interpretação atual: 48 a 72 horas pra incidentes graves).",[12,29311,29312],{},"Auto-hospedado num provedor com região no Brasil simplifica três coisas. Primeira: sem transferência internacional pra demonstrar — os dados nunca saíram do território nacional. Segunda: o cluster é seu, então o registro de quem acessou o quê é controlável internamente, sem depender de terceiros. Terceira: backup gerenciado dentro do próprio cluster reduz superfície de exposição com fornecedores adicionais.",[12,29314,29315],{},"Edição Business do HeroCtl inclui auditoria detalhada que registra cada ação administrativa por usuário, com timestamp e contexto. Em incident response, esse registro vira evidência de boa-fé operacional.",[12,29317,29318],{},"LGPD não é argumento universal pra auto-hospedado — empresa global com receita em dólar e clientes nos EUA já tem que se preocupar com GDPR, com framework americano, e com salvaguarda contratual em vários sentidos. Pra essas, a complexidade já existe. Pra empresa brasileira atendendo cliente brasileiro, simplificar a topologia jurídica de dados é um ganho concreto.",[19,29320,29322],{"id":29321},"quando-kubernetes-gerenciado-faz-sentido-pra-time-brasileiro","Quando Kubernetes gerenciado faz sentido pra time brasileiro",[12,29324,29325],{},"Não é nunca. Tem cenários onde a conta inverte.",[12,29327,29328,29331],{},[27,29329,29330],{},"Empresa com receita predominante em dólar e clientes globais",": o custo em USD da plataforma é despesa em moeda forte, não risco cambial. A volatilidade vira hedge natural, não exposição.",[12,29333,29334,29337],{},[27,29335,29336],{},"Compliance internacional já mapeado em Kubernetes",": empresas em processo de SOC 2 Type II ou ISO 27001 frequentemente têm consultorias e auditores que conhecem Kubernetes. O caminho é mais curto que apresentar uma stack alternativa pra cada auditor — mesmo quando a stack alternativa é tecnicamente equivalente ou superior.",[12,29339,29340,29343],{},[27,29341,29342],{},"Time de plataforma com 3 ou mais pessoas dedicadas",": o ecossistema Kubernetes premia escala de operação. Com 3+ engenheiros dedicados, você tem capacidade de extrair valor real de operadores especializados, malha de serviço, observabilidade avançada. Abaixo disso, tudo isso vira peso.",[12,29345,29346,29349],{},[27,29347,29348],{},"Workload acima de 50 servidores",": nessa faixa, as primitivas do colosso começam a render. Multi-tenancy real, isolamento de namespace, federação entre clusters — coisas que ninguém precisa em 4 servidores, mas que importam em 50.",[12,29351,29352],{},"Caso contrário: provavelmente overkill pro contexto brasileiro. A pergunta correta não é \"Kubernetes é bom?\" — é \"Kubernetes é bom pro tamanho de problema que eu tenho hoje, e pelos próximos 18 meses?\". Pra startup brasileira pré-Série A, a resposta honesta costuma ser não.",[19,29354,29356],{"id":29355},"stack-tipica-recomendada-pra-time-brasileiro-pequeno","Stack típica recomendada pra time brasileiro pequeno",[12,29358,29359],{},"Receita prática pra quem está começando do zero ou migrando de uma plataforma cara.",[2735,29361,29362,29368,29374,29380,29385,29391,29397],{},[70,29363,29364,29367],{},[27,29365,29366],{},"3 a 4 VPS Linux com Docker",": DigitalOcean, Hetzner ou provedor brasileiro, dependendo do trade-off de latência e câmbio que faz sentido. Faixa de R$500 a R$1.000\u002Fmês.",[70,29369,29370,29373],{},[27,29371,29372],{},"HeroCtl Community",": gratuito, sem limite de servidores. Configura o cluster com plano de controle replicado em 3 ou mais servidores, então perda de qualquer servidor único não derruba o cluster.",[70,29375,29376,29379],{},[27,29377,29378],{},"Banco de dados",": Postgres como job no próprio cluster pra projetos onde compliance permite. Para casos com exigência regulatória forte, RDS São Paulo gerenciado, conectado via VPN ou IP autorizado.",[70,29381,29382,29384],{},[27,29383,11372],{},": certificados Let's Encrypt automáticos, ingress sem montagem extra de operadores.",[70,29386,29387,29390],{},[27,29388,29389],{},"Métricas e logs",": jobs internos do próprio sistema. Sem Datadog, sem New Relic externo — esses cobram em USD na escala de US$15 a US$31 por host por mês, o que pra 4 hosts já passa de R$600\u002Fmês só em observabilidade.",[70,29392,29393,29396],{},[27,29394,29395],{},"Backup",": rotação semanal pra bucket S3 em São Paulo ou CloudFlare R2 (R2 tem egress gratuito, o que pra restore é diferencial).",[70,29398,29399,29401],{},[27,29400,12134],{},": Cloudflare grátis ou Hostinger DNS pro caso brasileiro. Ambos têm API programática estável.",[12,29403,29404],{},"Total operacional dessa stack na faixa de R$600 a R$1.100\u002Fmês de infra, mais 10 a 20% do tempo de uma pessoa do time. Suporta de zero a algumas centenas de milhares de requests por dia sem precisar repensar arquitetura.",[19,29406,29408],{"id":29407},"tabela-comparativa-adaptada-ao-brasil","Tabela comparativa adaptada ao Brasil",[12,29410,29411],{},"Quatro caminhos, dez critérios. Sem coluna sem ressalva.",[119,29413,29414,29432],{},[122,29415,29416],{},[125,29417,29418,29420,29423,29426,29429],{},[128,29419,2983],{},[128,29421,29422],{},"K8s gerenciado (EKS-SP)",[128,29424,29425],{},"PaaS gerenciada externa (Render\u002FRailway)",[128,29427,29428],{},"Auto-hospedado simples (Coolify)",[128,29430,29431],{},"Auto-hospedado HA (HeroCtl)",[141,29433,29434,29451,29465,29480,29494,29508,29524,29538,29555,29571],{},[125,29435,29436,29439,29442,29445,29448],{},[146,29437,29438],{},"Custo mínimo de plataforma\u002Fmês",[146,29440,29441],{},"~R$850",[146,29443,29444],{},"R$0 a R$200 (free tier + first apps)",[146,29446,29447],{},"R$200 a R$500 (1 VPS)",[146,29449,29450],{},"R$500 a R$1.000 (3-4 VPS)",[125,29452,29453,29456,29458,29460,29463],{},[146,29454,29455],{},"Câmbio",[146,29457,15175],{},[146,29459,15175],{},[146,29461,29462],{},"Misto (VPS USD ou BRL)",[146,29464,29462],{},[125,29466,29467,29469,29472,29475,29478],{},[146,29468,23856],{},[146,29470,29471],{},"1-5 ms",[146,29473,29474],{},"100-200 ms (servidores nos EUA)",[146,29476,29477],{},"depende do VPS",[146,29479,29477],{},[125,29481,29482,29484,29487,29490,29492],{},[146,29483,16408],{},[146,29485,29486],{},"1-2 SREs dedicados",[146,29488,29489],{},"0,1 dev part-time",[146,29491,22206],{},[146,29493,22206],{},[125,29495,29496,29498,29500,29503,29506],{},[146,29497,16334],{},[146,29499,3065],{},[146,29501,29502],{},"Sim (gerenciado pelo provedor)",[146,29504,29505],{},"Não — single-server",[146,29507,3065],{},[125,29509,29510,29513,29516,29519,29522],{},[146,29511,29512],{},"LGPD com dados em território BR",[146,29514,29515],{},"Sim (sa-east-1)",[146,29517,29518],{},"Não nativo",[146,29520,29521],{},"Sim, se VPS for BR",[146,29523,29521],{},[125,29525,29526,29529,29531,29533,29535],{},[146,29527,29528],{},"Atendimento em português",[146,29530,3062],{},[146,29532,3059],{},[146,29534,7230],{},[146,29536,29537],{},"Sim (Business\u002FEnterprise)",[125,29539,29540,29543,29546,29549,29552],{},[146,29541,29542],{},"Risco de mudança de termos",[146,29544,29545],{},"Médio (provedor já mudou política antes)",[146,29547,29548],{},"Alto (provedor pode encerrar tier free)",[146,29550,29551],{},"Baixo (open-source)",[146,29553,29554],{},"Baixo (preço congelado contratualmente)",[125,29556,29557,29560,29562,29565,29568],{},[146,29558,29559],{},"Linhas de configuração pra app+TLS+ingress",[146,29561,3048],{},[146,29563,29564],{},"5 a 10 (UI)",[146,29566,29567],{},"20 a 30 (UI)",[146,29569,29570],{},"~50 (arquivo)",[125,29572,29573,29576,29579,29582,29588],{},[146,29574,29575],{},"Caminho pra crescer pra 50 servidores",[146,29577,29578],{},"Direto",[146,29580,29581],{},"Custoso (preço cresce linear)",[146,29583,29584,29585,16056],{},"Refazer arquitetura (",[3337,29586,29587],{"href":16701},"sair de Coolify single-server",[146,29589,29578],{},[12,29591,29592],{},"A linha de custo mínimo de plataforma por si só não decide. A linha que mais costuma decidir é a de time mínimo pra operar — porque time custa, em média, 100 vezes mais que plataforma pro tamanho de operação que estamos discutindo.",[19,29594,29596],{"id":29595},"quando-nao-ir-de-auto-hospedado","Quando NÃO ir de auto-hospedado",[12,29598,29599],{},"A tese desse post é direta, mas tem três cenários onde a recomendação inverte.",[12,29601,29602,29605],{},[27,29603,29604],{},"Time de 1 a 2 devs sem nenhum tempo pra cuidar de servidor",": nesse caso, Render, Railway ou Heroku são a resposta certa. Você paga em USD, mas troca tempo (que você não tem) por dinheiro (que você tem o suficiente pra cobrir nessa fase). Quando o time crescer pra 4+ devs e a fatura virar incômodo, migrar é viável. Por enquanto, foco no produto.",[12,29607,29608,29611],{},[27,29609,29610],{},"Aplicação cujo custo de plataforma é trivial vs receita",": SaaS B2B com R$200 mil de MRR e fatura de plataforma de R$3 mil\u002Fmês. Não otimize prematuramente. Use o tempo do time pra construir feature que aumenta MRR, não pra economizar 0,5% da receita em infra.",[12,29613,29614,29617],{},[27,29615,29616],{},"Compliance que exige fornecedor nominalmente listado e auditado por terceira parte",": alguns frameworks específicos (governo, saúde regulada) exigem que o fornecedor esteja em lista pré-aprovada. Essas listas mudam devagar. Se você precisa do nome AWS ou Microsoft no contrato, auto-hospedado em VPS genérico não atende. Espera HeroCtl chegar em listas formais ou usa a stack que já está listada.",[19,29619,29621],{"id":29620},"heroctl-no-contexto-brasileiro-especificamente","HeroCtl no contexto brasileiro especificamente",[12,29623,29624],{},"A discussão até aqui foi sobre arquitetura. Vale fechar com o que o HeroCtl faz especificamente pelo contexto brasileiro.",[12,29626,29627,29630],{},[27,29628,29629],{},"Plano Community gratuito permanente",", sem licença em USD pra orçar, sem assinatura, sem limite de servidores ou de jobs. Roda toda a stack descrita acima — alta disponibilidade real, roteador, certificados automáticos, métricas, logs.",[12,29632,29633,29636],{},[27,29634,29635],{},"Roda em qualquer VPS Linux com Docker."," Qualquer provedor brasileiro ou internacional serve. O cluster não sabe nem se importa se está em DigitalOcean Nova York, AWS São Paulo, Hetzner Alemanha, Magalu Cloud Brasil ou misturando providers. A primitiva é sistema operacional Linux + Docker, e isso roda em todo lugar.",[12,29638,29639,29641],{},[27,29640,14302],{}," nas edições Business e Enterprise. Time de produto e suporte alinhado com fuso horário brasileiro — o seu incidente das 14h não vira \"vamos olhar amanhã de manhã\".",[12,29643,29644,29647],{},[27,29645,29646],{},"Preços de Business e Enterprise publicados em real",", congelados contratualmente pra clientes existentes. Sem cláusula de aumento retroativo, sem mudança de licença mid-flight como aconteceu com fornecedor concorrente em 2023. O contrato que você assina hoje é o contrato que vale.",[12,29649,29650,29652],{},[27,29651,4896],{}," desde o início, não como tradução posterior. Erros, mensagens de log, painel administrativo, tudo em português brasileiro como primeira língua.",[12,29654,29655,29658],{},[27,29656,29657],{},"Sem phone-home obrigatório",", sem kill-switch remoto. Uma vez instalado, o seu cluster funciona offline indefinidamente. Edições Enterprise incluem escrow de código-fonte: se a empresa por trás do produto encerrar operações, o código é entregue aos clientes pagantes via terceira parte custodiante.",[19,29660,29662],{"id":29661},"perguntas-que-a-gente-recebe-de-times-brasileiros","Perguntas que a gente recebe de times brasileiros",[12,29664,29665,29668],{},[27,29666,29667],{},"Kubernetes gerenciado em São Paulo é bom o suficiente pra LGPD?","\nTecnicamente sim — a região sa-east-1 mantém os dados em território nacional. Operacionalmente, depende. Quem usa serviços gerenciados (RDS, S3, CloudWatch) precisa configurar cada um pra ficar exclusivamente em sa-east-1, e demonstrar isso em auditoria. Auto-hospedado em VPS brasileiro simplifica a demonstração: o cluster inteiro tem um endereço IP, num datacenter conhecido, e ponto.",[12,29670,29671,29674],{},[27,29672,29673],{},"Posso rodar HeroCtl em VPS brasileiro pequeno (Hostinger, KingHost, Locaweb)?","\nSim. O requisito mínimo é Linux com Docker e 1 GB de RAM por servidor (recomendado 2 GB+). Funciona em VPS de R$50\u002Fmês de provedor brasileiro pra cluster de teste, ou pra ambiente de desenvolvimento. Pra produção sustentável, recomenda-se 4 GB+ por servidor.",[12,29676,29677,29680],{},[27,29678,29679],{},"Quanto consome em RAM e CPU em servidor de R$50\u002Fmês?","\nO plano de controle ocupa entre 200 e 400 MB de RAM por servidor. Em VPS de 1 GB, sobra ~600 MB pra workload. Em VPS de 2 GB, sobra ~1,6 GB. Como referência, o plano de controle de uma versão gerenciada do Kubernetes começa em ~700 MB por nó-mestre antes de qualquer aplicação subir, e raramente roda em VPS de menos de 4 GB.",[12,29682,29683,29686],{},[27,29684,29685],{},"Atendimento em português tem?","\nSim, em Business e Enterprise. Community usa documentação e fórum em português, sem SLA de resposta. Business tem suporte direto em português comercial com SLA de resposta. Enterprise adiciona horário estendido e canal dedicado.",[12,29688,29689,29692],{},[27,29690,29691],{},"E pra escalar pra 50+ servidores no futuro?","\nA faixa de aplicação testada é de 1 a 500 servidores. Acima de 500, o ecossistema do Kubernetes oferece ferramentas que ainda não temos. Entre 50 e 500, HeroCtl roda confortavelmente — não exige refazer arquitetura como acontece quando você sai de Coolify single-server pra HA real. A migração é continuação, não recomeço.",[12,29694,29695,29698],{},[27,29696,29697],{},"E o suporte 24×7 em horário comercial brasileiro?","\nEnterprise inclui suporte 24×7 com pessoa real respondendo em português. Pra time brasileiro que tem incidente às 23h de quarta, é o equivalente operacional ao suporte que clientes americanos recebem em horário americano — só que pra fuso de Brasília.",[12,29700,29701,29704],{},[27,29702,29703],{},"Posso usar real pra pagar?","\nSim. Business e Enterprise são faturados em real, com NF-e brasileira. Sem exposição cambial, sem conversão de cartão internacional, sem IOF na fatura. A contabilidade brasileira processa como qualquer outro fornecedor nacional.",[19,29706,3310],{"id":3309},[12,29708,29709],{},"A pergunta certa pra time brasileiro em 2026 não é \"qual o melhor orquestrador?\". É \"qual orquestrador faz sentido na minha planilha de custo, no meu fuso horário, com o meu time, atendendo o meu cliente, sob a lei que regula os meus dados?\".",[12,29711,29712],{},"A resposta varia. Pra algumas empresas, é Kubernetes gerenciado em sa-east-1. Pra outras, é Render ou Railway pagando em USD enquanto MRR justifica. Pra a maioria das startups brasileiras pré-Série A — orçamento em real, time enxuto, cliente brasileiro — a resposta é auto-hospedado em VPS, com plano de controle replicado de verdade.",[12,29714,29715],{},"Pra esse caso, construímos o HeroCtl. Instalação:",[224,29717,29718],{"className":226,"code":2949,"language":228,"meta":229,"style":229},[231,29719,29720],{"__ignoreMap":229},[234,29721,29722,29724,29726,29728,29730],{"class":236,"line":237},[234,29723,1220],{"class":247},[234,29725,2958],{"class":251},[234,29727,2961],{"class":255},[234,29729,2964],{"class":383},[234,29731,2967],{"class":247},[12,29733,29734],{},"Em 5 minutos você tem cluster com 3 servidores, plano de controle replicado, roteador integrado e certificados Let's Encrypt automáticos. A partir daí, é só submeter aplicações.",[12,29736,29737,29738,29740,29741,29743],{},"Pra contexto adicional, leia ",[3337,29739,6548],{"href":6547}," (a história da lacuna que nenhuma das três alternativas existentes preenchia) e ",[3337,29742,15790],{"href":15789}," (a versão geral, não específica do Brasil, do mesmo argumento).",[12,29745,29746],{},"Orquestração de contêineres, sem cerimônia. Em real.",[3351,29748,4376],{},{"title":229,"searchDepth":244,"depth":244,"links":29750},[29751,29752,29753,29754,29761,29762,29763,29764,29765,29766,29767,29768],{"id":29035,"depth":244,"text":29036},{"id":29099,"depth":244,"text":29100},{"id":29158,"depth":244,"text":29159},{"id":29204,"depth":244,"text":29205,"children":29755},[29756,29757,29758,29759,29760],{"id":29211,"depth":271,"text":29080},{"id":14945,"depth":271,"text":14363},{"id":29237,"depth":271,"text":29238},{"id":29253,"depth":271,"text":29254},{"id":29269,"depth":271,"text":29270},{"id":29288,"depth":244,"text":29289},{"id":29321,"depth":244,"text":29322},{"id":29355,"depth":244,"text":29356},{"id":29407,"depth":244,"text":29408},{"id":29595,"depth":244,"text":29596},{"id":29620,"depth":244,"text":29621},{"id":29661,"depth":244,"text":29662},{"id":3309,"depth":244,"text":3310},"2025-11-25","Times brasileiros operam com restrições diferentes: orçamento em real, hospedagem em DigitalOcean ou AWS São Paulo, LGPD em vez de GDPR. Como isso muda a escolha de orquestrador.",{},{"title":29018,"description":29770},{"loc":14883},"blog\u002Falternativa-kubernetes-paas-brasil",[14948,20399,24185,29776,6395,15816],"lgpd","DqHOmfE0rtfb1FlL1uaSgZ29z_oKWdsEUJg7vO2_teU",{"id":29779,"title":29780,"author":7,"body":29781,"category":8764,"cover":3380,"date":30379,"description":30380,"draft":3383,"extension":3384,"lastReviewed":3380,"meta":30381,"navigation":411,"path":19766,"readingTime":3387,"seo":30382,"sitemap":30383,"stem":30384,"tags":30385,"__hash__":30387},"blog_pt\u002Fblog\u002Fheroku-auto-hospedado-2026.md","Heroku auto-hospedado em 2026: o estado do segmento",{"type":9,"value":29782,"toc":30358},[29783,29786,29789,29792,29796,29802,29805,29808,29814,29820,29826,29829,29832,29836,29840,29843,29849,29855,29860,29863,29867,29870,29882,29885,29888,29892,29899,29902,29906,29909,29914,29919,29924,29927,29931,29934,29939,29942,29944,30159,30162,30166,30169,30175,30181,30187,30193,30197,30201,30204,30207,30210,30213,30217,30220,30223,30226,30230,30233,30236,30239,30243,30246,30252,30258,30264,30267,30271,30274,30277,30280,30283,30286,30288,30294,30300,30306,30312,30318,30324,30330,30332,30335,30338,30341,30346,30355],[12,29784,29785],{},"Em 28 de novembro de 2022, a Salesforce desligou o plano gratuito do Heroku. A empresa que comprou a Heroku em 2010 cumpriu o aviso publicado três meses antes — todas as dynos free, todos os bancos hobby, todos os redises gratuitos foram terminados na mesma janela. Centenas de milhares de hobby projects, MVPs, demos de portfólio e protótipos universitários sumiram do ar de uma só vez.",[12,29787,29788],{},"A reação foi previsível. Quem tinha cobrança no cartão migrou pro plano pago e seguiu. Quem não tinha procurou outro lugar. E nas semanas seguintes, um movimento que existia em estado adormecido desde 2013 explodiu: \"Heroku auto-hospedado\".",[12,29790,29791],{},"Em 2026, três anos e meio depois, o segmento amadureceu. Há pelo menos seis produtos sérios disputando atenção, mais um punhado de projetos hospedados que se vendem como \"Heroku-like\" sem o auto. Esse post é o mapa.",[19,29793,29795],{"id":29794},"por-que-heroku-auto-hospedado-virou-uma-categoria","Por que \"Heroku auto-hospedado\" virou uma categoria",[12,29797,29798,29799,29801],{},"A primeira coisa que precisa ser dita é que o Heroku resolveu o problema certo. Em 2010, deploy de aplicação web tinha duas formas: subir tarball pra um servidor que você administrava, ou pagar caro pra alguém administrar pra você. O Heroku inventou o terceiro caminho — ",[231,29800,23657],{},", slider de escala, banco gerenciado embutido, certificado emitido automaticamente, sub-domínio funcional em segundos.",[12,29803,29804],{},"Esse padrão ficou. O conceito de \"deploy é um push, escala é um slider, TLS é automático\" virou a expectativa-base de qualquer desenvolvedor formado depois de 2012. Tudo que veio depois — Render, Railway, Fly.io, Vercel pra frontend, Cloud Run, App Runner — é variação em cima desse modelo.",[12,29806,29807],{},"Mas três coisas mudaram entre 2010 e 2022.",[12,29809,29810,29813],{},[27,29811,29812],{},"Cloud bare-metal ficou barato."," Em 2010, um servidor virtual decente custava US$40\u002Fmês. Em 2026, US$5\u002Fmês compra um VPS com 1 vCPU, 2 GB de RAM, 50 GB de disco e 2 TB de tráfego — mais do que suficiente pra rodar cinco aplicações pequenas. A economia de fechar dynos pra rodar containers próprios se inverteu.",[12,29815,29816,29819],{},[27,29817,29818],{},"Docker virou padrão."," A grande virtude do Heroku original eram os \"buildpacks\" — receitas que pegavam seu código Ruby ou Node e produziam um artefato isolado pronto pra rodar. Docker tornou esse encapsulamento commodity. Hoje qualquer um produz uma imagem reproduzível em três linhas de Dockerfile, e qualquer servidor com 100 MB de RAM livre pode hospedá-la.",[12,29821,29822,29825],{},[27,29823,29824],{},"A comunidade aprendeu a operar."," Em 2010, \"rodar um servidor Linux\" era ofício de SRE. Em 2026, qualquer desenvolvedor full-stack já configurou nginx, lidou com certbot, montou systemd unit, debugou OOM-killer pelo dmesg. O nível médio subiu. Aquilo que justificava pagar US$25\u002Fmês pra Heroku cuidar virou um exercício de uma tarde.",[12,29827,29828],{},"Quando o gratuito morreu, montar \"seu próprio Heroku\" deixou de ser exercício de orgulho de hacker e virou conta de padaria. US$10\u002Fmês de VPS contra US$25\u002Fmês mínimo no Heroku-pago — e isso por aplicação. Cinco aplicações no Heroku custam US$125\u002Fmês. Cinco aplicações num VPS de US$10\u002Fmês continuam custando US$10\u002Fmês.",[12,29830,29831],{},"A categoria que respondeu a essa conta tem cinco subgêneros distintos hoje. Vale separar.",[19,29833,29835],{"id":29834},"o-segmento-em-2026","O segmento em 2026",[368,29837,29839],{"id":29838},"single-server-simples-instalo-num-vps-e-esqueco","Single-server simples — \"instalo num VPS e esqueço\"",[12,29841,29842],{},"O subgênero mais antigo e mais habitado. A premissa é direta: um único servidor, um instalador, um painel ou CLI, e você tem dynos. Sem cluster, sem alta disponibilidade, sem complicação.",[12,29844,29845,29848],{},[27,29846,29847],{},"Dokku"," é o vovô do segmento, ativo desde 2013. O motor é Bash mais Docker. UX é majoritariamente CLI — você empurra código via git remoto, ele constrói com buildpacks Heroku-compatíveis, sobe o container, registra no roteador interno. A comunidade é pequena mas leal, o produto é estável, e a curva de aprendizado é íngreme nos primeiros dias e plana depois disso. Quem passou desses primeiros dias raramente troca. Está fora de moda no sentido de que a comunidade nova prefere painéis web — mas o produto continua sólido, com mais de doze anos de operação real em produção em milhares de instalações pelo mundo.",[12,29850,29851,29854],{},[27,29852,29853],{},"Caprover"," ocupa o meio do espectro. Painel web, sistema de plugins, instalação razoavelmente fácil. O produto tem cerca de treze mil estrelas em repositórios públicos e uma comunidade ativa, ainda que menor que a dos concorrentes mais novos. A evolução é mais lenta — releases vêm em cadência mensal ou bimestral, e features grandes demoram. Pra quem prioriza estabilidade sobre novidades, é uma escolha defensável.",[12,29856,29857,29859],{},[27,29858,2771],{}," é o líder atual de mindshare. Por volta de quarenta mil estrelas, painel web moderno, ecossistema de plugins ativo, comunidade ruidosa em fóruns e em chat. O produto evoluiu rápido entre 2023 e 2025, agregando suporte a banco gerenciado embutido, deploy via git, certificados automáticos, monitoramento de containers. É a recomendação default que circula em fóruns de indie hackers hoje.",[12,29861,29862],{},"O defeito principal do Coolify, e a razão de ele aparecer também na seção sobre armadilhas mais abaixo, é arquitetural: foi desenhado single-server first. Multi-server foi adicionado depois, mas o painel central continua sendo um único processo num único servidor. Se esse servidor cai, você perde acesso a todos os outros.",[368,29864,29866],{"id":29865},"single-server-moderno-deploy-sem-painel","Single-server moderno — \"deploy sem painel\"",[12,29868,29869],{},"Subgênero mais novo, com filosofia oposta à anterior. Em vez de painel web, ferramenta de linha de comando que opera por SSH.",[12,29871,29872,29874,29875,29878,29879,101],{},[27,29873,2998],{}," é o representante quase exclusivo. Saiu do time da 37signals em 2024, escrito por gente próxima ao DHH. A premissa é radical: nenhum painel, nenhum control plane, nenhum agente residente nos servidores. Você escreve um arquivo de configuração, roda ",[231,29876,29877],{},"kamal deploy",", ele faz SSH em cada servidor, faz pull da imagem, troca o container e segue. O DHH publicou em 2024 que economizou cerca de três milhões de dólares por ano migrando os apps próprios da Basecamp e do HEY do cloud pra hardware próprio com Kamal. Onde a tese do \"sem orquestração\" começa a doer está em ",[3337,29880,29881],{"href":25892},"HeroCtl vs Kamal",[12,29883,29884],{},"A virtude é a transparência absoluta — não há nada acontecendo que você não veja no terminal. O defeito é que multi-server não é orquestração, é deploy paralelo. Não há eleição de líder, não há rebalanceamento, não há failover. Cada servidor é um destino independente. Se um cair, você notifica seu monitoramento e refaz o deploy excluindo aquele host.",[12,29886,29887],{},"Pra um time pequeno operando duas ou três aplicações em três a cinco servidores, com hábitos disciplinados de deploy, Kamal é elegante. Pra qualquer coisa que precise de \"se um servidor cai, o cluster decide o que fazer sozinho\", não é a ferramenta certa.",[368,29889,29891],{"id":29890},"cloud-native-moderno-heroku-reembrulhado","Cloud-native moderno — \"Heroku reembrulhado\"",[12,29893,29894,29896,29897,101],{},[27,29895,2777],{}," é o produto mais recente que entrou na conversa. Por volta de dez mil estrelas, em crescimento rápido, UX visualmente parecida com Coolify mas arquitetura subjacente sobre Docker Swarm. Atrativo principal: multi-server real \"fora da caixa\", sem precisar montar à mão. A leitura ponto a ponto da escolha técnica que o Dokploy fez está em ",[3337,29898,16707],{"href":16706},[12,29900,29901],{},"O defeito estrutural é a fundação. Docker Swarm está em modo de manutenção há anos — a Docker Inc. não investe em features novas desde 2019, e o roadmap público é essencialmente \"manter funcionando\". Construir produto novo em cima de tecnologia em manutenção é uma aposta. Se a Swarm for descontinuada formalmente, o Dokploy precisa migrar de fundação inteira ou reescrever — e o usuário paga essa conta no meio do caminho. O ecossistema de plugins ainda é menor que o do Coolify, mas vem subindo rápido.",[368,29903,29905],{"id":29904},"hospedado-mas-prefiro-self-hosted-vercelrender-mas-no-meu-servidor","Hospedado-mas-prefiro-self-hosted — \"Vercel\u002FRender mas no meu servidor\"",[12,29907,29908],{},"Tecnicamente fora da categoria do título do post, mas vale mencionar porque muito time compara. Quem busca \"alternativa ao Heroku\" frequentemente acaba não no auto-hospedado, e sim em outro hospedado.",[12,29910,29911,29913],{},[27,29912,15023],{}," é o sucessor mais direto do Heroku no espírito. UX limpa, preços previsíveis, free tier generoso (mas não infinito — tem suspensão automática por inatividade). Banco Postgres e Redis gerenciados, deploy via git, build logs no painel. O preço sobe de forma linear com uso real, sem armadilhas grandes. É a escolha óbvia pra quem quer \"Heroku que funciona em 2026\" sem se preocupar com servidor.",[12,29915,29916,29918],{},[27,29917,15026],{}," é hospedado, foco mais forte em devs solo, preço por uso de recursos (CPU\u002FRAM\u002Ftráfego) em vez de tier fixo. Funciona bem pra hobby project que não vai escalar; pode ficar caro rápido se você esquecer um worker rodando.",[12,29920,29921,29923],{},[27,29922,23807],{}," tem proposta diferente: hospedagem distribuída em múltiplas regiões, primitivas mais cruas, próxima de \"VM como serviço com TLS automático\" do que de \"PaaS no estilo Heroku\". É a escolha de quem quer baixa latência mundial sem montar isso à mão. A curva de aprendizado é maior que Render ou Railway.",[12,29925,29926],{},"Os três são opções legítimas. A nota importante é o que vem na seção de armadilhas: free tier de hospedado pisa mais a cada ano, e o caminho histórico do Heroku — começou gratuito, virou US$25\u002Fmês mínimo — é a previsão default pra qualquer plano gratuito de empresa privada.",[368,29928,29930],{"id":29929},"cluster-real-preciso-de-alta-disponibilidade","Cluster real — \"preciso de alta disponibilidade\"",[12,29932,29933],{},"Categoria curta, com poucos produtos sérios. Aqui a premissa não é \"rodar deploy em mais de um servidor\", é \"se um servidor cair, o cluster continua funcionando sozinho sem intervenção humana\". A diferença é grande, e a maioria do segmento não atravessa essa linha.",[12,29935,29936,29938],{},[27,29937,2995],{}," é o produto que estamos construindo. Plano de controle replicado entre três ou mais servidores desde o primeiro dia. Eleição automática de coordenador em cerca de sete segundos quando o servidor que coordena cai. Roteador integrado, certificados automáticos, métricas e logs embutidos no próprio binário. Modelo comercial com Community gratuito permanente, Business e Enterprise pagos com preço publicado. Faixa ideal: de um a quinhentos servidores.",[12,29940,29941],{},"A diferença operacional importa quando o cliente entra. Enquanto o painel central de um Coolify multi-server é um ponto único de falha, em HeroCtl não há central — qualquer um dos três primeiros servidores pode coordenar, e a transição entre eles é automática.",[19,29943,17385],{"id":17384},[119,29945,29946,29966],{},[122,29947,29948],{},[125,29949,29950,29952,29954,29956,29958,29960,29962,29964],{},[128,29951,2983],{},[128,29953,29847],{},[128,29955,29853],{},[128,29957,2771],{},[128,29959,2998],{},[128,29961,2777],{},[128,29963,15023],{},[128,29965,2995],{},[141,29967,29968,29988,30006,30024,30042,30060,30078,30096,30115,30137],{},[125,29969,29970,29972,29974,29977,29979,29981,29983,29986],{},[146,29971,27224],{},[146,29973,3014],{},[146,29975,29976],{},"10 min",[146,29978,3020],{},[146,29980,3020],{},[146,29982,29976],{},[146,29984,29985],{},"n\u002Fa (hospedado)",[146,29987,3020],{},[125,29989,29990,29992,29994,29996,29998,30000,30002,30004],{},[146,29991,25609],{},[146,29993,3059],{},[146,29995,3065],{},[146,29997,3065],{},[146,29999,3059],{},[146,30001,3065],{},[146,30003,3065],{},[146,30005,3065],{},[125,30007,30008,30010,30012,30014,30016,30018,30020,30022],{},[146,30009,26651],{},[146,30011,3059],{},[146,30013,3140],{},[146,30015,3140],{},[146,30017,3140],{},[146,30019,3065],{},[146,30021,28064],{},[146,30023,3065],{},[125,30025,30026,30028,30030,30032,30034,30036,30038,30040],{},[146,30027,16334],{},[146,30029,3059],{},[146,30031,3059],{},[146,30033,3059],{},[146,30035,3059],{},[146,30037,3140],{},[146,30039,3065],{},[146,30041,3065],{},[125,30043,30044,30046,30048,30050,30052,30054,30056,30058],{},[146,30045,3923],{},[146,30047,3065],{},[146,30049,3065],{},[146,30051,3065],{},[146,30053,3065],{},[146,30055,3065],{},[146,30057,3065],{},[146,30059,3065],{},[125,30061,30062,30064,30066,30068,30070,30072,30074,30076],{},[146,30063,23305],{},[146,30065,3059],{},[146,30067,3059],{},[146,30069,3059],{},[146,30071,3059],{},[146,30073,3059],{},[146,30075,3065],{},[146,30077,3065],{},[125,30079,30080,30082,30084,30086,30088,30090,30092,30094],{},[146,30081,22787],{},[146,30083,3059],{},[146,30085,19361],{},[146,30087,3065],{},[146,30089,3059],{},[146,30091,3065],{},[146,30093,3065],{},[146,30095,3065],{},[125,30097,30098,30101,30103,30105,30107,30109,30111,30113],{},[146,30099,30100],{},"Logs embutidos",[146,30102,3059],{},[146,30104,19361],{},[146,30106,3065],{},[146,30108,3059],{},[146,30110,3065],{},[146,30112,3065],{},[146,30114,3065],{},[125,30116,30117,30119,30122,30124,30127,30129,30131,30134],{},[146,30118,22831],{},[146,30120,30121],{},"Open-source",[146,30123,30121],{},[146,30125,30126],{},"Open-source + cloud paga",[146,30128,30121],{},[146,30130,30121],{},[146,30132,30133],{},"Hospedado pago",[146,30135,30136],{},"Community gratuito + Business\u002FEnterprise",[125,30138,30139,30141,30144,30147,30149,30152,30155,30157],{},[146,30140,13540],{},[146,30142,30143],{},"1 servidor",[146,30145,30146],{},"1–3 servidores",[146,30148,30146],{},[146,30150,30151],{},"1–10 servidores",[146,30153,30154],{},"3–10 servidores",[146,30156,28064],{},[146,30158,26201],{},[12,30160,30161],{},"A coluna que separa o segmento em duas metades é \"alta disponibilidade real\". À esquerda dela, todos os produtos compartilham a mesma premissa: multi-server é destino de deploy, não cluster com consenso. À direita, o painel\u002Fcontrol plane é replicado e sobrevive à perda de qualquer servidor.",[19,30163,30165],{"id":30164},"decisao-por-perfil-de-uso","Decisão por perfil de uso",[12,30167,30168],{},"Quatro perfis cobrem a maioria dos casos.",[12,30170,30171,30174],{},[27,30172,30173],{},"Solo dev, hobby project, um VPS."," Dokku se você gosta de CLI e quer estabilidade. Coolify se você prefere painel web. Kamal se você está num stack Rails ou Node e já trabalha bem com SSH e arquivos de configuração. Qualquer um dos três resolve. A escolha é mais de gosto do que de capacidade técnica.",[12,30176,30177,30180],{},[27,30178,30179],{},"Indie hacker com um a três SaaS pequenos, ainda um servidor."," Coolify ou Dokploy. A diferença prática é o ecossistema de plugins (Coolify tem mais) e a fundação técnica (Dokploy aposta em Swarm). Pros próximos doze meses, qualquer um dos dois funciona; a migração entre eles é factível porque ambos rodam containers Docker padrão. A decisão arquitetural importante é diferente: quando você passar de um servidor pra dois, vai sentir o ponto único de falha do painel — e essa é a hora de avaliar se a próxima migração é Dokploy multi-server ou um cluster de verdade.",[12,30182,30183,30186],{},[27,30184,30185],{},"Startup com primeiro cliente sério, SLA contratual entrando em vigor."," HeroCtl. Aqui o painel single-server vira passivo legal — qualquer SLA escrito em contrato comercial assume que a infraestrutura sobrevive à perda de um nó, e nenhum painel single-server faz isso. Você pode tentar montar redundância manual em cima de Coolify ou Dokploy, mas o resultado vai ser frágil e custoso de operar. A regra simples é: na hora que o contrato com cliente menciona \"uptime\", o cluster com consenso deixa de ser luxo.",[12,30188,30189,30192],{},[27,30190,30191],{},"Empresa estabelecida, cinquenta servidores ou mais, time de plataforma com três pessoas dedicadas."," Aqui a conversa muda. K8s gerenciado em provedor cloud passa a ser a opção sensata, porque o ecossistema de operadores é maior e o time tem competência pra absorver a complexidade. HeroCtl roda nessa faixa também — testamos centenas de nós em laboratório, dezenas em produção de clientes — mas acima de cem servidores o teto da nossa biblioteca de operadores especializados começa a aparecer.",[19,30194,30196],{"id":30195},"as-tres-armadilhas-do-segmento","As três armadilhas do segmento",[368,30198,30200],{"id":30199},"multi-server-nao-significa-alta-disponibilidade-real","\"Multi-server\" não significa \"alta disponibilidade real\"",[12,30202,30203],{},"A confusão mais cara. A maioria dos painéis lista \"multi-server\" como feature, e o leitor casual interpreta isso como \"se um servidor cair, o sistema continua funcionando\". Não é o que está sendo oferecido. Multi-server na maioria dos painéis significa: o painel central, rodando num servidor único, é capaz de fazer deploy em vários servidores remotos.",[12,30205,30206],{},"Quando o servidor do painel cai, você perde controle. Os containers em produção continuam rodando — Docker não para por causa disso — mas você não consegue mais fazer deploy, ler logs centralizados, reiniciar serviço, escalar. Fica esperando voltar.",[12,30208,30209],{},"Alta disponibilidade real exige consenso entre múltiplos servidores: pelo menos três processos do painel rodando, eleição automática de coordenador, replicação do estado entre eles. Se o coordenador cai, outro assume em segundos. Essa é uma arquitetura diferente, mais cara de construir e mais cara de operar. Por isso poucos produtos do segmento entregam.",[12,30211,30212],{},"A pergunta concreta pra fazer ao avaliar qualquer produto: \"se o servidor onde roda o painel for desligado agora, em quanto tempo o sistema volta a aceitar deploys, e essa volta é automática ou manual?\". Se a resposta envolve um humano abrindo SSH em algum lugar, não é alta disponibilidade.",[368,30214,30216],{"id":30215},"plugin-ecosystem-pode-ser-dependencia-disfarcada","\"Plugin ecosystem\" pode ser dependência disfarçada",[12,30218,30219],{},"Os painéis com loja de plugins parecem completos: você instala um plugin pra ter Postgres gerenciado, outro pra Redis, outro pra Sentry-like, outro pra backup automático, outro pra monitoramento. Cada um resolve um pedaço, e o conjunto soma um Heroku.",[12,30221,30222],{},"O problema aparece dois anos depois. O plugin de backup foi escrito por um voluntário em 2024 e parou de receber commits em 2025. A versão nova do painel quebrou compatibilidade com ele e ninguém atualizou. Você descobre na hora que precisa restaurar um backup — e a restauração nunca foi testada com a versão atual.",[12,30224,30225],{},"Esse padrão se repete pra cada plugin. Quanto mais funcionalidades dependem do ecossistema externo, maior a superfície de risco. A defesa estrutural é simples: dê preferência a produtos com bateria incluída — onde Postgres, métricas, logs, certificados, roteamento são parte do produto principal e mantidos pelo mesmo time que mantém o resto. Plugin é cômodo no curto prazo e custoso no médio.",[368,30227,30229],{"id":30228},"free-tier-do-hospedado-nao-e-gratuito-longo-prazo","\"Free tier\" do hospedado não é gratuito longo prazo",[12,30231,30232],{},"Render, Railway, Fly.io têm planos gratuitos generosos hoje. O Heroku tinha em 2021. A história do segmento mostra um padrão consistente: free tiers de empresas privadas pisam mais a cada rodada de levantamento de capital. Primeiro suspende por inatividade, depois reduz cota, depois adiciona limite de horas, depois transforma em trial de trinta dias, depois encerra.",[12,30234,30235],{},"Não é maldade — é matemática de negócio. Hospedar workload custa dinheiro, e o investidor cobra retorno. A única exceção estrutural é hospedagem subsidiada por outro produto da mesma empresa (cloud cobrindo PaaS gratuita pra atrair desenvolvedores ao cloud principal), e mesmo essas mudam quando muda o CFO.",[12,30237,30238],{},"Auto-hospedado é a única defesa estrutural. Você paga a conta do VPS direto pro provedor de infraestrutura, sem intermediário. Quando o intermediário some, sua aplicação não some junto.",[19,30240,30242],{"id":30241},"quando-ficar-no-heroku-render-ou-railway-sem-ironia","Quando ficar no Heroku, Render ou Railway sem ironia",[12,30244,30245],{},"Vale dizer com clareza: nem todo time precisa sair de hospedagem gerenciada. Há três situações em que ficar é a decisão correta.",[12,30247,30248,30251],{},[27,30249,30250],{},"Time pequeno sem competência operacional disponível pra cuidar de servidor."," Se a equipe inteira é dois desenvolvedores de produto, nenhum com experiência prévia em Linux\u002FDocker\u002Fnetworking, o custo cognitivo de operar infraestrutura é maior do que a economia mensal. Pague os US$200\u002Fmês de Render e mantenha foco em produto.",[12,30253,30254,30257],{},[27,30255,30256],{},"Aplicação cujo custo de plataforma é desprezível comparado ao revenue."," Se a empresa fatura US$50k\u002Fmês e a conta do Heroku é US$300, otimizar essa conta é trabalho mal alocado. O retorno marginal de migrar é baixo, e o risco operacional não compensa.",[12,30259,30260,30263],{},[27,30261,30262],{},"Equipe alocada em produto, não em infra."," Algumas startups são tão dependentes de iteração rápida em produto que qualquer hora gasta em infra é hora roubada do diferencial competitivo. Pra essas, o trade-off de pagar a mais pra não pensar em servidor é valor real, não desperdício.",[12,30265,30266],{},"A regra simples: se a infra é commodity invisível pro seu negócio, deixe alguém cobrar pra ser invisível pra você. Se a infra é capacidade que diferencia o produto (latência baixa, regiões específicas, compliance específico, uptime contratual), o controle compensa o trabalho.",[19,30268,30270],{"id":30269},"heroctl-no-segmento","HeroCtl no segmento",[12,30272,30273],{},"Posicionamento honesto: HeroCtl não compete com Dokku ou Coolify no caso de hobby project em um VPS. Pra esse caso, é mais máquina do que precisa. Um indie hacker com uma aplicação Django num servidor de US$5\u002Fmês deve usar Dokku ou Coolify e seguir o dia.",[12,30275,30276],{},"Onde HeroCtl compete é onde Coolify multi-server, Dokploy e Nomad também competem: o caso de cliente sério com SLA, em que single-server vira passivo legal. Aqui a diferença que oferecemos é cluster com consenso desde o primeiro dia, bateria incluída em vez de cinco produtos pra montar (roteador, certificados, métricas, logs e criptografia entre serviços já no binário), e contrato comercial publicado e congelado — sem mudança retroativa de termos.",[12,30278,30279],{},"O cluster de demonstração roda quatro servidores totalizando cinco vCPUs e dez gigabytes de RAM, com dezesseis containers ativos servindo cinco sites. O plano de controle ocupa entre 200 e 400 MB por servidor. Comparativamente, o plano de controle de uma versão gerenciada do orquestrador grande começa em cerca de 700 MB por nó-mestre antes de qualquer aplicação subir.",[12,30281,30282],{},"O job spec típico tem cerca de cinquenta linhas — descreve serviço, ingress, secrets, recursos. O equivalente no orquestrador grande passa de trezentas linhas pra cobrir a mesma funcionalidade.",[12,30284,30285],{},"HeroCtl não compete com cloud gerenciado em escala de cem nós ou mais. A faixa ideal é um a quinhentos servidores. Acima disso, o ecossistema externo de operadores especializados ainda dá vantagem ao orquestrador grande, e ser honesto sobre isso é parte do contrato.",[19,30287,7354],{"id":7353},[12,30289,30290,30293],{},[27,30291,30292],{},"Posso migrar do Heroku direto pro HeroCtl?","\nSim, com algumas adaptações. Aplicação web stateless com Postgres separado migra fácil — você containeriza com Dockerfile, descreve o job em cinquenta linhas, sobe. Workers separados (Sidekiq, Celery) viram jobs adicionais no mesmo cluster. O que precisa ser repensado é o que dependia de add-ons gerenciados.",[12,30295,30296,30299],{},[27,30297,30298],{},"E os add-ons (Postgres, Redis, Sentry)?","\nPostgres você roda como job no próprio cluster, com volume persistente, e cuida de backup como humano cuida — não há operador automático que faça isso melhor do que você fazendo direito. Redis idem. Sentry self-hosted existe e roda em qualquer cluster Docker — e há produto comercial hospedado se preferir não operar. A regra geral: dados críticos rodam no cluster, observabilidade pode rodar fora.",[12,30301,30302,30305],{},[27,30303,30304],{},"Quanto custa em comparação?","\nTomando como base uma startup com cinco aplicações pequenas: Heroku-pago sai em torno de US$125\u002Fmês mínimo, sem add-ons. Render sai entre US$50 e US$150 dependendo do uso. Cluster próprio em VPS de três nós sai US$30 a US$60\u002Fmês total no provedor de infraestrutura. A economia direta é real, e fica mais expressiva conforme as aplicações crescem.",[12,30307,30308,30311],{},[27,30309,30310],{},"E se eu já estou no Coolify?","\nNão há urgência de migrar enquanto você opera com um único servidor. A hora de considerar é quando o painel single-server vira ponto único de falha contratual — primeiro cliente sério com SLA escrito. Até lá, Coolify funciona bem.",[12,30313,30314,30317],{},[27,30315,30316],{},"E pra um app Django com Celery, ou Rails com Sidekiq?","\nFunciona naturalmente. Você define um job pro processo web e outro job pro processo de worker, ambos compartilhando a mesma imagem mas com comandos diferentes. O cluster orquestra os dois independentemente, e o broker (Redis ou similar) é mais um job no mesmo cluster.",[12,30319,30320,30323],{},[27,30321,30322],{},"E pra um app Node.js com workers separados?","\nMesma história. Worker é só outro processo, definido como outro job. Não há distinção arquitetural entre \"web\" e \"worker\" no nível do orquestrador — são containers que rodam código.",[12,30325,30326,30329],{},[27,30327,30328],{},"Os preços do Business saem quando?","\nA página de planos publica os valores. A linha de corte é desenhada pra que você só pague Business quando a empresa for grande o suficiente pra que SSO, RBAC granular e auditoria detalhada sejam exigências reais — não preferência. Pra todo o resto, Community resolve, e Community é gratuito permanente sem feature gate artificial.",[19,30331,3310],{"id":3309},[12,30333,30334],{},"O segmento de \"Heroku auto-hospedado\" amadureceu. Em 2026, há produtos sérios pra cada perfil de uso, e a decisão depende menos de \"qual é o melhor\" e mais de \"qual cabe no meu caso\". Hobby project não precisa de cluster com consenso. Cliente sério com SLA não cabe em painel single-server.",[12,30336,30337],{},"Pra quem está decidindo agora, três recomendações finais. Primeiro, leia o contrato comercial antes de adotar — fuja de termos que permitam mudança retroativa. Segundo, prefira bateria incluída a ecossistemas de plugins onde possível — superfície de risco menor. Terceiro, teste o caminho de falha antes do incidente real — desligue um servidor e veja o que acontece, com calma, durante o dia.",[12,30339,30340],{},"Pra começar com HeroCtl em três servidores Linux:",[224,30342,30344],{"className":30343,"code":5319,"language":2530},[2528],[231,30345,5319],{"__ignoreMap":229},[12,30347,30348,30349,30351,30352,30354],{},"Se quiser ler mais antes, há dois posts adjacentes: ",[3337,30350,16702],{"href":16701}," explica a comparação direta com o líder de mindshare do segmento single-server, e ",[3337,30353,21739],{"href":6547}," explica o raciocínio que levou à existência do produto.",[12,30356,30357],{},"Orquestração de containers, sem cerimônia.",{"title":229,"searchDepth":244,"depth":244,"links":30359},[30360,30361,30368,30369,30370,30375,30376,30377,30378],{"id":29794,"depth":244,"text":29795},{"id":29834,"depth":244,"text":29835,"children":30362},[30363,30364,30365,30366,30367],{"id":29838,"depth":271,"text":29839},{"id":29865,"depth":271,"text":29866},{"id":29890,"depth":271,"text":29891},{"id":29904,"depth":271,"text":29905},{"id":29929,"depth":271,"text":29930},{"id":17384,"depth":244,"text":17385},{"id":30164,"depth":244,"text":30165},{"id":30195,"depth":244,"text":30196,"children":30371},[30372,30373,30374],{"id":30199,"depth":271,"text":30200},{"id":30215,"depth":271,"text":30216},{"id":30228,"depth":271,"text":30229},{"id":30241,"depth":244,"text":30242},{"id":30269,"depth":244,"text":30270},{"id":7353,"depth":244,"text":7354},{"id":3309,"depth":244,"text":3310},"2025-11-19","Desde que a Salesforce matou o plano gratuito do Heroku em novembro\u002F2022, surgiram dezenas de alternativas auto-hospedadas. Mapa honesto do segmento e como escolher.",{},{"title":29780,"description":30380},{"loc":19766},"blog\u002Fheroku-auto-hospedado-2026",[20505,7514,24185,8764,30386],"segmento","3rQx1d4AWPQTqmkY188c4xWB8RxcO3xmGFe73-ejSrE",{"id":30389,"title":30390,"author":7,"body":30391,"category":3379,"cover":3380,"date":31053,"description":31054,"draft":3383,"extension":3384,"lastReviewed":3380,"meta":31055,"navigation":411,"path":15789,"readingTime":3387,"seo":31056,"sitemap":31057,"stem":31058,"tags":31059,"__hash__":31062},"blog_pt\u002Fblog\u002Fkubernetes-overkill-quando-voce-nao-precisa.md","Kubernetes é overkill: quando você não precisa do colosso",{"type":9,"value":30392,"toc":31040},[30393,30396,30399,30402,30406,30409,30416,30419,30422,30425,30427,30432,30443,30446,30451,30454,30461,30464,30471,30478,30481,30484,30486,30489,30496,30503,30519,30526,30529,30532,30536,30539,30577,30580,30583,30587,30590,30628,30635,30641,30647,30651,30654,30671,30677,30680,30683,30690,30693,30697,30700,30846,30849,30853,30856,30859,30869,30876,30882,30905,30909,30912,30944,30947,30949,30955,30961,30967,30973,30979,30993,30999,31001,31004,31007,31010,31026,31029,31035,31038],[12,30394,30395],{},"A pergunta certa em 2026 não é \"Kubernetes é bom?\". Esse debate acabou — sim, é. A pergunta certa é outra, e quase nenhum CTO de startup faz em voz alta: \"preciso disso pra o que estou construindo?\".",[12,30397,30398],{},"Pra a maioria dos times que estão decidindo arquitetura agora, a resposta honesta é não. Mas o sistema de incentivos da indústria empurra na direção contrária. Recrutadores filtram currículo por palavra-chave. Conferências premiam quem mostra YAML em projetor. Investidor de Série A pergunta \"vocês estão em K8s?\" como se fosse selo de seriedade. O resultado coletivo é uma camada gigante de complexidade adotada por times que não tinham o problema que essa complexidade resolve.",[12,30400,30401],{},"Esse post é a defesa explícita do \"não precisa\", com a conta na mão. Não é sobre Kubernetes ser ruim — é sobre escolher a ferramenta certa pra o tamanho real do problema que você tem hoje, e não pra a foto que você quer projetar.",[19,30403,30405],{"id":30404},"a-seducao-e-real-e-tem-nome","A sedução é real (e tem nome)",[12,30407,30408],{},"A primeira coisa a admitir é que a adoção excessiva de Kubernetes não é irracional. Faz todo sentido — pra o indivíduo. O nome da força que opera aqui é resume-driven development.",[12,30410,30411,30412,30415],{},"Engenheiro de plataforma que aprende Kubernetes ganha, em média, ",[27,30413,30414],{},"30% a mais"," no próximo emprego. É a habilidade técnica com maior prêmio salarial em listagens de vaga em 2026 entre tudo que envolve operação. Quem coloca \"operou cluster multi-region em produção\" no LinkedIn tem trinta recrutadores na semana. Quem coloca \"operou painel auto-hospedado em três servidores\" tem dois.",[12,30417,30418],{},"Pra o engenheiro, é racional aprender Kubernetes mesmo quando o trabalho não pede. Pra o CTO, é racional adotar Kubernetes mesmo quando o produto não pede — sinaliza pro mercado que a empresa \"está pronta pra escalar\", que é o vocabulário que investidor entende. Pra o time de plataforma, é racional sugerir Kubernetes em qualquer projeto novo — garante relevância nos próximos cinco anos.",[12,30420,30421],{},"Cada um desses cálculos individuais é defensável. O agregado é desastroso. A empresa paga a conta de uma decisão que ninguém tomou pensando na empresa.",[12,30423,30424],{},"O ponto de partida deste post é assumir essa tensão. Você, lendo, talvez esteja sendo pressionado por uma das três forças acima. Reconhecer a pressão é o primeiro passo pra decidir com base no problema real, não no incentivo de quem está te aconselhando.",[19,30426,16849],{"id":16848},[12,30428,30429,30430,101],{},"Vamos colocar números. Reais, brasileiros, em 2026. Pra a versão dessa conta com a lente brasileira completa — câmbio, LGPD, hospedagem nacional — há um post específico em ",[3337,30431,29018],{"href":14883},[12,30433,30434,30435,30438,30439,30442],{},"Engenheiro de plataforma sênior em São Paulo ou Florianópolis, capaz de operar Kubernetes em produção sem supervisão, custa hoje entre ",[27,30436,30437],{},"R$25 mil e R$40 mil por mês em CLT",", ou entre ",[27,30440,30441],{},"US$8 mil e US$12 mil por mês em PJ",". Vamos usar R$30 mil como média conservadora — é o salário que você consegue fechar com alguém competente que ainda não atingiu o teto de mercado.",[12,30444,30445],{},"Mas R$30 mil é só uma pessoa. Cluster em produção precisa de plantão 24×7. A lei trabalhista brasileira não permite que uma única pessoa carregue plantão indefinido — e mesmo se permitisse, a saúde mental do operador único colapsa em seis meses. Você precisa de no mínimo duas pessoas se revezando, com folga real entre escalas.",[12,30447,30448],{},[27,30449,30450],{},"R$30 mil × 2 pessoas × 12 meses = R$720 mil por ano só em folha de pagamento.",[12,30452,30453],{},"Sobre essa folha, adicione encargos (CLT roda em torno de 70-100% acima do salário base; PJ varia mas em geral fica em 30-40% se você quiser tratar a pessoa decentemente). E sobre isso, custos reais de uma equipe de plataforma: licenças de ferramentas auxiliares, treinamento, certificações que o mercado pede, conferências, eventual contratação de consultoria pontual quando algo quebra de um jeito que ninguém da casa viu antes.",[12,30455,30456,30457,30460],{},"Na infraestrutura propriamente, a conta também não é barata. Versão gerenciada do colosso (EKS, GKE, AKS) cobra cerca de ",[27,30458,30459],{},"US$73 por mês por cluster"," só pelo plano de controle — isso são uns R$370 ao mês. Sobre isso entra NAT Gateway (US$40 ao mês mínimo), Application Load Balancer (US$25 ao mês mínimo), tráfego de saída cobrado por gigabyte, snapshots de disco, custos de observabilidade que crescem com o número de pods e métricas exportadas.",[12,30462,30463],{},"Empresas sérias rodam pelo menos dois ambientes (staging e produção), e muitas têm um terceiro ambiente de desenvolvimento ou homologação dedicado. Multiplica.",[12,30465,30466,30467,30470],{},"Estimativa total ano 1, com dois engenheiros de plataforma e dois ambientes gerenciados: ",[27,30468,30469],{},"entre R$770 mil e R$800 mil",". Isso antes do primeiro cliente sério, antes do primeiro real de receita recorrente, antes da segunda contratação de produto.",[12,30472,30473,30474,30477],{},"Faz a comparação inversa. Uma equipe de três desenvolvedores full-stack a R$15 mil cada: ",[27,30475,30476],{},"R$540 mil por ano",". Com encargos, vamos dizer R$720 mil. É exatamente a mesma faixa.",[12,30479,30480],{},"A pergunta concreta é essa: você prefere ter mais três pessoas shippando código que o cliente vai usar, ou prefere ter duas pessoas mantendo plataforma que o cliente nunca vai ver?",[12,30482,30483],{},"Não há resposta universal. Mas quase sempre, no estágio em que essa decisão é tomada — empresa pré-Série A, time de cinco a quinze pessoas, produto procurando product-market fit — a resposta correta é shippar produto.",[19,30485,17173],{"id":17172},[12,30487,30488],{},"Dinheiro você captura ou economiza. Tempo você não recupera. A conta de tempo pesa mais que a conta de R$.",[12,30490,30491,30492,30495],{},"Setup de Kubernetes gerenciado pra produção minimamente decente leva ",[27,30493,30494],{},"2 a 4 semanas",". Não é instalar o cluster — isso são minutos. É configurar o ingress controller, o emissor de certificados, a stack de monitoramento (em geral três produtos coordenados), o sistema de logs centralizado, backup automático dos volumes persistentes, alertas, política de rede entre pods, segregação de namespaces. Cada componente tem cinco escolhas legítimas e três armadilhas conhecidas.",[12,30497,30498,30499,30502],{},"Primeiro deploy de aplicação real depois disso: mais ",[27,30500,30501],{},"uma semana",". Manifestos pra a aplicação, manifestos pra os componentes auxiliares, definição de probes de saúde (liveness, readiness, startup), ajuste de recursos solicitados versus limites, testes de carga pra calibrar autoscaling, testes de falha pra calibrar política de reinício.",[12,30504,30505,30506,30509,30510,30512,30513,30516,30517,101],{},"Cada feature nova de plataforma depois disso vira projeto. Segredos rotacionados automaticamente: ",[27,30507,30508],{},"uma a duas semanas",". Métricas customizadas integradas ao painel: ",[27,30511,30501],{},". Malha de comunicação entre serviços com observabilidade ponta-a-ponta: ",[27,30514,30515],{},"duas a três semanas",", e isso se você escolher uma das opções estáveis logo de cara. Política de rede granular por namespace com auditoria: ",[27,30518,30501],{},[12,30520,30521,30522,30525],{},"Você gasta os primeiros ",[27,30523,30524],{},"seis meses"," montando plataforma. Esse é o cenário otimista, com gente competente e sem grandes incidentes.",[12,30527,30528],{},"Enquanto isso, o concorrente menor que escolheu uma stack mais simples está shippando features. Quando você termina a \"plataforma minimamente decente\", ele já tem três features que você não tem, oito clientes que tomaram decisão de compra com base nessas features, e um ciclo de feedback rodando que vai compor as próximas features dele com mais precisão.",[12,30530,30531],{},"Em mercados onde o vencedor é decidido nos primeiros doze meses — quase todo mercado de SaaS B2B — esse atraso é fatal. Você pode ter a infraestrutura mais robusta do segmento e perder o segmento inteiro porque chegou três meses tarde com a feature que importa.",[19,30533,30535],{"id":30534},"o-perfil-que-nao-precisa-de-kubernetes","O perfil que NÃO precisa de Kubernetes",[12,30537,30538],{},"Aqui mora a maioria dos times que estão decidindo isso em 2026. Se você se encaixa em todos os critérios abaixo, Kubernetes é overkill — quase com certeza:",[2735,30540,30541,30547,30553,30559,30565,30571],{},[70,30542,30543,30546],{},[27,30544,30545],{},"Time de 1 a 15 engenheiros."," Você não tem como dedicar duas pessoas só pra plataforma sem comprometer 15-30% da capacidade de entrega.",[70,30548,30549,30552],{},[27,30550,30551],{},"1 a 50 servidores totais em produção."," Nesse tamanho, abstrações simples ainda funcionam. Você consegue listar todos os servidores em uma página.",[70,30554,30555,30558],{},[27,30556,30557],{},"1 a 100 serviços ou aplicações distintas."," O ecossistema do colosso brilha quando você tem milhares de microsserviços com dependências cruzadas. Abaixo de 100, a complexidade do orquestrador é maior que a complexidade do sistema que ele orquestra.",[70,30560,30561,30564],{},[27,30562,30563],{},"Tráfego previsível."," Não tem pico de 100× em 30 segundos. Se sua carga oscila duas ou três vezes entre o vale e o pico ao longo do dia, você não precisa de autoscaling milimétrico.",[70,30566,30567,30570],{},[27,30568,30569],{},"Workloads HTTP\u002Fweb típicos."," Aplicação web, API REST, worker de fila, banco gerenciado. Sem necessidades exóticas como GPU sharding, ML inference em larga escala, processamento batch petabyte por noite.",[70,30572,30573,30576],{},[27,30574,30575],{},"Operação em 1 a 3 regiões cloud."," Você atende um país, ou no máximo dois continentes próximos. Não está orquestrando workloads que migram entre cinco datacenters em tempo real.",[12,30578,30579],{},"Essa é a esmagadora maioria dos times que adotam Kubernetes hoje. Eles encaixam em todos os seis critérios e ainda assim escolheram a ferramenta desenhada pra resolver o oposto de cada critério.",[12,30581,30582],{},"Se você se reconhece aqui, a próxima seção pode ser desconfortável — mas leia até o fim antes de descartar.",[19,30584,30586],{"id":30585},"o-perfil-que-precisa-de-kubernetes","O perfil que PRECISA de Kubernetes",[12,30588,30589],{},"Pra não cair em \"Kubernetes nunca presta\", aqui está o lado honesto. Esses são os perfis em que adotar o colosso é a escolha certa, não overkill:",[2735,30591,30592,30598,30604,30610,30616,30622],{},[70,30593,30594,30597],{},[27,30595,30596],{},"SaaS multi-tenant com isolamento por namespace, com requisitos de quota de recursos, política de rede granular, e auditoria por inquilino."," Bancos, fintechs reguladas, plataformas que vendem hosting pra outros desenvolvedores. O modelo de namespaces do colosso é o melhor primitivo disponível pra esse problema.",[70,30599,30600,30603],{},[27,30601,30602],{},"Operação real multi-region com workloads se movendo entre datacenters em resposta a falha ou demanda."," Não é \"tenho réplicas em duas regiões pra DR\". É \"movo cargas de trabalho ativas entre quatro regiões com gerenciamento automático de estado e latência\". Empresa muito grande, com muito dinheiro.",[70,30605,30606,30609],{},[27,30607,30608],{},"Dependência de operadores especializados maduros que valem o overhead."," Postgres com replicação automática, Kafka com balanceamento contínuo, Cassandra com bootstrap orquestrado, Spark em batch. Se a sua arquitetura tem três ou mais desses componentes operados por automação especializada, o ecossistema do colosso é o lugar onde essa automação amadureceu.",[70,30611,30612,30615],{},[27,30613,30614],{},"Time de plataforma de cinco ou mais pessoas dedicadas."," Você tem capacidade humana real pra manter o sistema sem comprometer entrega de produto. Não é uma pessoa fazendo \"também\" plataforma; é um departamento.",[70,30617,30618,30621],{},[27,30619,30620],{},"Compliance que exige nomes de ferramentas pré-aprovadas."," FedRAMP, ITAR, alguns contratos de governo, alguns frameworks de saúde nos EUA. Se o seu auditor precisa apontar pra um certificado existente em uma lista, o colosso está nessa lista. Outras alternativas, em geral, ainda não.",[70,30623,30624,30627],{},[27,30625,30626],{},"Escala de centenas a milhares de nós."," Acima de 500 servidores você sai da faixa onde alternativas mais simples brilham e entra na faixa onde o colosso foi projetado pra trabalhar. Não há substituto sério aqui.",[12,30629,30630,30631,30634],{},"Se você tem ",[27,30632,30633],{},"três ou mais"," desses, Kubernetes é a escolha certa, não overkill. Adote sem culpa, contrate o time, gaste o dinheiro — está alinhado.",[12,30636,30630,30637,30640],{},[27,30638,30639],{},"um ou dois",", fique atento: provavelmente dá pra resolver com algo mais simples e migrar depois, se de fato escalar até precisar de mais. Avalie com calma.",[12,30642,30630,30643,30646],{},[27,30644,30645],{},"zero",", qualquer adoção de Kubernetes é decisão de currículo, não de produto. Seja honesto com a equipe e com você mesmo.",[19,30648,30650],{"id":30649},"a-zona-cinzenta-onde-o-erro-mais-comum-mora","A zona cinzenta — onde o erro mais comum mora",[12,30652,30653],{},"Existe uma faixa intermediária onde a decisão é mais difícil, e é onde o erro mais comum acontece. Vamos descrever ela com precisão:",[2735,30655,30656,30659,30662,30665,30668],{},[70,30657,30658],{},"Time de 5 a 15 engenheiros",[70,30660,30661],{},"5 a 20 servidores",[70,30663,30664],{},"10 a 50 serviços ou aplicações",[70,30666,30667],{},"1 ou 2 regiões cloud",[70,30669,30670],{},"Crescimento esperado mas não explosivo (vamos dizer, dobrar de tamanho em 18 meses)",[12,30672,30673,30674,101],{},"Aqui mora 70% dos times de SaaS pré-Série B no Brasil em 2026. E aqui mora a frase fatal: ",[27,30675,30676],{},"\"vamos crescer rápido então melhor já começar com Kubernetes\"",[12,30678,30679],{},"A falácia é dupla. Primeira: você não vai crescer 100× em seis meses. Crescimento real de SaaS bem-sucedido fica entre 2× e 5× ao ano nos primeiros três anos. Você tem tempo de migrar se de fato precisar.",[12,30681,30682],{},"Segunda, e mais importante: a stack que você escolhe pra um time de cinco pessoas raramente é a stack que você vai rodar com cinquenta. As prioridades mudam, os requisitos mudam, os trade-offs mudam. Empresas que escalaram de cinco pra cinquenta pessoas e mantiveram a mesma stack são exceção, não regra. Você vai migrar de qualquer jeito — só a pergunta é quando, e o que você vai ter shippado até lá.",[12,30684,30685,30686,30689],{},"A heurística certa é: ",[27,30687,30688],{},"otimize pra hoje + 18 meses, não pra hipótese de 5 anos",". Se nos próximos 18 meses sua infra não vai exigir Kubernetes, não adote agora. Quando o problema aparecer, você terá receita pra contratar a equipe que opera, e clareza sobre os requisitos reais (que serão diferentes do que você imagina hoje).",[12,30691,30692],{},"A engenharia que envelhece bem é a que resolve o problema atual com folga, não a que tenta antecipar todos os problemas hipotéticos.",[19,30694,30696],{"id":30695},"o-que-voce-ganha-em-cada-caminho","O que você ganha em cada caminho",[12,30698,30699],{},"Pra organizar a decisão, três caminhos lado a lado em dez critérios. As notas são honestas — todo caminho tem ressalvas.",[119,30701,30702,30716],{},[122,30703,30704],{},[125,30705,30706,30708,30711,30714],{},[128,30707,2983],{},[128,30709,30710],{},"K8s gerenciado",[128,30712,30713],{},"Painel auto-hospedado simples",[128,30715,2995],{},[141,30717,30718,30732,30746,30758,30771,30783,30795,30808,30819,30833],{},[125,30719,30720,30723,30726,30729],{},[146,30721,30722],{},"Custo de plataforma ano 1 (R$)",[146,30724,30725],{},"700-800k",[146,30727,30728],{},"40-80k (1 dev part-time)",[146,30730,30731],{},"60-120k (1 dev part-time + plano)",[125,30733,30734,30737,30740,30743],{},[146,30735,30736],{},"Tempo até primeira app em produção",[146,30738,30739],{},"2-4 semanas",[146,30741,30742],{},"5 minutos a 1 dia",[146,30744,30745],{},"5 minutos a 1 hora",[125,30747,30748,30751,30754,30756],{},[146,30749,30750],{},"Time mínimo dedicado",[146,30752,30753],{},"2 SREs em plantão",[146,30755,22206],{},[146,30757,22206],{},[125,30759,30760,30763,30766,30769],{},[146,30761,30762],{},"Alta disponibilidade real (sobrevive a queda de servidor)",[146,30764,30765],{},"Sim, com 5+ componentes coordenados",[146,30767,30768],{},"Não (servidor único)",[146,30770,16385],{},[125,30772,30773,30776,30778,30780],{},[146,30774,30775],{},"Escala máxima validada em produção",[146,30777,23363],{},[146,30779,30143],{},[146,30781,30782],{},"Centenas de nós",[125,30784,30785,30788,30791,30793],{},[146,30786,30787],{},"Roteador HTTP + certificados automáticos",[146,30789,30790],{},"Operador externo (instala separado)",[146,30792,23290],{},[146,30794,23290],{},[125,30796,30797,30800,30803,30806],{},[146,30798,30799],{},"Métricas com retenção razoável",[146,30801,30802],{},"Stack externa (3+ produtos)",[146,30804,30805],{},"Plugin opcional",[146,30807,25641],{},[125,30809,30810,30812,30815,30817],{},[146,30811,22798],{},[146,30813,30814],{},"Stack externa (2+ produtos)",[146,30816,30805],{},[146,30818,22321],{},[125,30820,30821,30824,30827,30830],{},[146,30822,30823],{},"Segredos criptografados em repouso",[146,30825,30826],{},"Componente externo ou cofre dedicado",[146,30828,30829],{},"Variável de ambiente",[146,30831,30832],{},"Embutido no plano de controle",[125,30834,30835,30838,30841,30843],{},[146,30836,30837],{},"Rolling deploy seguro",[146,30839,30840],{},"Sim (configura você mesmo)",[146,30842,3062],{},[146,30844,30845],{},"Embutido com health check",[12,30847,30848],{},"A coluna do meio resolve o caso \"um servidor, sem pressão de SLA\" — e resolve bem. A coluna da esquerda resolve \"centenas de nós, time dedicado, requisitos complexos\" — e resolve bem. A coluna da direita resolve a faixa entre os dois extremos, que é onde a maioria dos times de SaaS mora hoje no Brasil.",[19,30850,30852],{"id":30851},"heroctl-como-o-meio-termo-honesto","HeroCtl como o meio termo honesto",[12,30854,30855],{},"Pra ser direto com você: este blog é do HeroCtl, e o pitch existe. Mas só faz sentido pra quem se encaixa.",[12,30857,30858],{},"O HeroCtl preserva o modelo operacional dos painéis auto-hospedados simples — um arquivo executável, instala em servidores Linux, gerencia tudo a partir de um painel embutido. A curva de aprendizagem é de horas, não de semanas. Você não precisa aprender vocabulário novo, conceitos abstratos, ferramentas adjacentes obrigatórias. Sobe a aplicação, abre o painel, vê o que está rodando.",[12,30860,30861,30862,30865,30866,30868],{},"Mas, diferente dos painéis simples, o HeroCtl roda como cluster replicado de verdade desde o dia um. Três servidores ou mais e o plano de controle sobrevive à queda de qualquer um deles, sem intervenção manual. A eleição de coordenador acontece em ",[27,30863,30864],{},"cerca de 7 segundos"," após uma queda dura — testado em laboratório com ",[231,30867,23209],{}," repetido. Você responde \"qual o SLA?\" pro primeiro cliente sério com cara limpa.",[12,30870,30871,30872,30875],{},"E sem a complexidade do colosso. Sem manifestos de 300 linhas — o equivalente no HeroCtl roda em ",[27,30873,30874],{},"cerca de 50 linhas",". Sem operadores especializados pra cada subsistema — roteador, certificados, métricas e logs vêm embutidos. Sem montar três produtos de observabilidade — a stack pública vive dentro do próprio cluster.",[12,30877,30878,30879,30881],{},"Faixa de aplicação prática: ",[27,30880,22826],{},". Acima disso, o ecossistema do colosso te dá ferramentas que ainda não temos, e somos honestos sobre isso. Abaixo disso, a economia operacional é grande — em geral troca dois engenheiros de plataforma em plantão por um desenvolvedor part-time gerenciando a stack inteira.",[12,30883,30884,30885,30888,30889,30892,30893,30896,30897,30900,30901,30904],{},"Os números do cluster público pra calibrar expectativa: ",[27,30886,30887],{},"4 servidores totalizando 5 vCPUs e 10 GB de RAM",", rodando ",[27,30890,30891],{},"16 contêineres"," que servem ",[27,30894,30895],{},"5 sites distintos"," com TLS automático. O plano de controle ocupa ",[27,30898,30899],{},"entre 200 e 400 MB por servidor",". Comparativamente, o plano de controle de uma versão gerenciada do colosso parte de cerca de ",[27,30902,30903],{},"700 MB por nó-mestre"," antes de qualquer aplicação subir.",[19,30906,30908],{"id":30907},"decisao-pratica-arvore-de-decisao","Decisão prática (árvore de decisão)",[12,30910,30911],{},"Pra quem precisa de uma resposta hoje, sem ler o post inteiro de novo:",[67,30913,30914,30920,30926,30932,30938],{},[70,30915,30916,30919],{},[27,30917,30918],{},"Você tem time de plataforma dedicado de 3 ou mais pessoas, hoje, contratadas?"," Se sim → Kubernetes é viável. Se não → siga.",[70,30921,30922,30925],{},[27,30923,30924],{},"Você tem requisito formal de compliance que lista Kubernetes nominalmente?"," Se sim → Kubernetes é obrigatório. Se não → siga.",[70,30927,30928,30931],{},[27,30929,30930],{},"Você opera 100 ou mais servidores em produção, hoje?"," Se sim → Kubernetes ou um orquestrador equivalente é a escolha certa. Se não → siga.",[70,30933,30934,30937],{},[27,30935,30936],{},"Você tem um único servidor e zero pressão de SLA?"," Se sim → painel auto-hospedado simples resolve. Se não → siga.",[70,30939,30940,30943],{},[27,30941,30942],{},"Você está entre 2 e 500 servidores, com requisito de SLA real, e quer evitar a conta da plataforma do colosso?"," → HeroCtl é o meio termo honesto.",[12,30945,30946],{},"Quase todo time de SaaS pré-Série B no Brasil em 2026 cai no caso 5. Quem cai no caso 1 ou 3 já sabe disso e provavelmente não está lendo este post. Quem cai no caso 2 tem regulação ditando.",[19,30948,7354],{"id":7353},[12,30950,30951,30954],{},[27,30952,30953],{},"Mas e se eu crescer e precisar do colosso depois?","\nCresce primeiro. Migra depois. Migração de 50 servidores rodando HeroCtl pra Kubernetes é um projeto de um trimestre com equipe pequena — bem mais barato que carregar plataforma do colosso por dois anos sem precisar. E quando você de fato precisar, vai ter receita pra contratar quem opera.",[12,30956,30957,30960],{},[27,30958,30959],{},"Posso usar Kubernetes só pra parte da stack?","\nPode, e às vezes faz sentido. Workload específico que se beneficia de operador especializado maduro (Spark batch, ML inference de grande escala) pode rodar em cluster do colosso dedicado, enquanto o resto do produto roda em algo mais simples. O custo é manter dois modelos operacionais — vale se o subconjunto isolado realmente compensa.",[12,30962,30963,30966],{},[27,30964,30965],{},"E se meu cliente exige Kubernetes contratualmente?","\nAí Kubernetes vira requisito de venda, não decisão de arquitetura. Se a receita justifica, adote pro contrato em questão. Mas exija o item por escrito — muitas vezes o cliente \"exige Kubernetes\" porque o time técnico dele assumiu, sem que ninguém tenha escrito numa cláusula. Vale checar.",[12,30968,30969,30972],{},[27,30970,30971],{},"E se eu já investi 2 anos aprendendo Kubernetes?","\nO conhecimento não se perde. Kubernetes vai continuar relevante por décadas — é a infraestrutura padrão de empresas grandes, e empresas grandes não somem. Você tem capital intelectual aplicável quando a empresa crescer, ou quando trocar de emprego pra uma que de fato precisa. A escolha de não usar agora não invalida o aprendizado; só atrasa o uso.",[12,30974,30975,30978],{},[27,30976,30977],{},"Tem caso de migração de Kubernetes pra algo mais simples?","\nSim, mais comum do que se discute publicamente. Empresas que adotaram cedo, perceberam que os requisitos não justificavam, e migraram pra reduzir custo operacional e reganhar velocidade de entrega. Em geral fica fora de blog post porque admitir \"voltamos atrás\" é desconfortável. Mas acontece, e quase sempre o time relata produtividade maior depois.",[12,30980,30981,30984,30985,30988,30989,30992],{},[27,30982,30983],{},"Quanto tempo leva pra um time aprender HeroCtl versus Kubernetes?","\nHeroCtl: um desenvolvedor competente roda a stack toda em produção em ",[27,30986,30987],{},"um dia",". Documentação cabe num post longo, conceitos somam a uns cinco. Kubernetes: o tutorial oficial leva uma semana, e o tempo até \"operar com confiança em produção\" varia de ",[27,30990,30991],{},"três a doze meses",", dependendo da complexidade da stack adjacente. Não é a mesma escala.",[12,30994,30995,30998],{},[27,30996,30997],{},"E pra quem não pode pagar nada de plataforma?","\nO plano Community do HeroCtl é gratuito permanente. Sem limite artificial de servidores, sem feature gate em alta disponibilidade, sem expiração. Você roda toda a stack descrita aqui — coordenação, roteador, certificados, métricas e logs — sem pagar nada. Os planos pagos (Business e Enterprise) adicionam coisas que só importam quando a empresa cresce: SSO corporativo, auditoria detalhada, escrow de código-fonte, suporte com SLA. O contrato de preço atual é congelado pra quem assina hoje — sem cláusula que permita mudança retroativa.",[19,31000,3310],{"id":3309},[12,31002,31003],{},"A pergunta com que abrimos não é retórica. \"Preciso disso pra o que estou construindo?\" merece resposta honesta, do tamanho do seu problema real, sem o filtro da pressão de currículo, da reunião com investidor, ou da palestra de conferência da semana passada.",[12,31005,31006],{},"Pra a maioria dos times de SaaS pré-Série B no Brasil em 2026, a resposta honesta é não. Não porque Kubernetes é ruim — é excelente pra o que foi desenhado. Mas porque o que ele foi desenhado pra resolver não é o seu problema atual. Você está plantando muda; ele é uma escavadeira.",[12,31008,31009],{},"Tem caminho do meio. Se quiser experimentar:",[224,31011,31012],{"className":226,"code":5319,"language":228,"meta":229,"style":229},[231,31013,31014],{"__ignoreMap":229},[234,31015,31016,31018,31020,31022,31024],{"class":236,"line":237},[234,31017,1220],{"class":247},[234,31019,2958],{"class":251},[234,31021,5330],{"class":255},[234,31023,2964],{"class":383},[234,31025,2967],{"class":247},[12,31027,31028],{},"Roda em um servidor Linux qualquer com Docker. Sem cadastro, sem cartão, sem phone-home. Se gostar, escala pra três servidores e ganha alta disponibilidade real. Se não gostar, desinstala e volta pro que estava usando — sem dado preso, sem dependência embutida.",[12,31030,31031,31032,31034],{},"A história longa de por que escolhemos construir isso, em vez de apontar pra uma das alternativas existentes, está em ",[3337,31033,6547],{"href":6547},". É a leitura complementar pra quem quer entender o raciocínio antes da ferramenta.",[12,31036,31037],{},"A intenção é simples: orquestração de contêineres, sem cerimônia. E sem o custo do colosso quando você não precisa dele.",[3351,31039,4376],{},{"title":229,"searchDepth":244,"depth":244,"links":31041},[31042,31043,31044,31045,31046,31047,31048,31049,31050,31051,31052],{"id":30404,"depth":244,"text":30405},{"id":16848,"depth":244,"text":16849},{"id":17172,"depth":244,"text":17173},{"id":30534,"depth":244,"text":30535},{"id":30585,"depth":244,"text":30586},{"id":30649,"depth":244,"text":30650},{"id":30695,"depth":244,"text":30696},{"id":30851,"depth":244,"text":30852},{"id":30907,"depth":244,"text":30908},{"id":7353,"depth":244,"text":7354},{"id":3309,"depth":244,"text":3310},"2025-11-17","80% dos times que adotam Kubernetes não precisam. A conta é direta: salário de SRE × tempo até a primeira feature shippada. Quando vale a pena pular o colosso.",{},{"title":30390,"description":31054},{"loc":15789},"blog\u002Fkubernetes-overkill-quando-voce-nao-precisa",[20399,31060,31061,6395],"complexidade","decisao-arquitetural","UOyJ-FoHj8jz65M54uB4vRXFSoK92gQVHkecqpf-hic",{"id":31064,"title":21739,"author":7,"body":31065,"category":31508,"cover":3380,"date":31509,"description":31510,"draft":3383,"extension":3384,"lastReviewed":3380,"meta":31511,"navigation":411,"path":6547,"readingTime":26417,"seo":31512,"sitemap":31513,"stem":31514,"tags":31515,"__hash__":31517},"blog_pt\u002Fblog\u002Fpor-que-criamos-o-heroctl.md",{"type":9,"value":31066,"toc":31497},[31067,31070,31074,31077,31082,31091,31094,31098,31104,31107,31110,31114,31117,31128,31131,31134,31138,31141,31172,31175,31177,31180,31337,31344,31348,31351,31354,31357,31360,31363,31367,31370,31376,31382,31388,31394,31396,31402,31408,31414,31420,31435,31438,31444,31450,31454,31457,31492,31495],[12,31068,31069],{},"Cada cluster que opera em produção hoje precisa decidir entre três caminhos, e nenhum deles é bom o suficiente para o time de cinco pessoas tentando shippar uma SaaS.",[19,31071,31073],{"id":31072},"o-caminho-doloroso-kubernetes","O caminho doloroso: Kubernetes",[12,31075,31076],{},"Você abre um manifesto de \"hello world\" e tem 300 linhas. Adiciona um templating manager pra organizar — agora são 300 linhas mais 200 linhas de templates. Decide usar uma versão gerenciada na nuvem pra evitar manter o plano de controle — paga US$73\u002Fmês por cluster, mais NAT, mais Application Load Balancer. Precisa de TLS automático? Instala um operador especializado. Métricas? Outro operador. Roteamento entre serviços com criptografia? Mais dois operadores e dois dias estudando malha de serviço. Logs centralizados? Mais um stack.",[12,31078,31079,31080,101],{},"A complexidade não é acidental. O sistema é uma plataforma para construir plataformas — feita por um time que precisava orquestrar 100 mil máquinas. Quando uma startup com quatro servidores adota a mesma ferramenta, está usando uma escavadeira pra plantar uma muda. Tratamos a tese geral em ",[3337,31081,15790],{"href":15789},[31083,31084,31085],"blockquote",{},[12,31086,31087,31088],{},"\"Most development teams find Kubernetes overkill for dev environments.\"\n— ",[179,31089,31090],{},"Top 13 Kubernetes Alternatives 2026",[12,31092,31093],{},"O custo real não é a infra, é o time. Operadores sérios desse sistema cobram salários de seis dígitos. Você precisa de pelo menos um na equipe — preferencialmente dois pra plantão. É o seu primeiro engenheiro contratado depois do CTO. Antes do designer, antes do segundo dev de produto, antes de qualquer coisa que entregue valor pro usuário.",[19,31095,31097],{"id":31096},"o-caminho-facil-paineis-self-hosted-modernos","O caminho fácil: painéis self-hosted modernos",[12,31099,31100,31101,101],{},"Um comando de instalação num único servidor, abre o painel, deploya em cinco minutos. Funciona. Os dois líderes desse segmento somam 80 mil estrelas em repositórios públicos. A comunidade explodiu nos últimos dois anos porque resolveu o problema certo: a maioria dos times não precisa do colosso, precisa de ",[3337,31102,31103],{"href":19766},"Heroku auto-hospedado",[12,31105,31106],{},"O problema só aparece depois. Você cresce, cliente pede SLA, o servidor único vira ponto único de falha. Tenta replicar pra dois ou três servidores — esses painéis não têm consenso distribuído, não têm eleição de líder. São aplicações web em cima do Docker. Elegantes pra um servidor; frágeis pra três.",[12,31108,31109],{},"Quando o seu primeiro cliente sério perguntar \"qual o SLA?\", você terá que responder \"best-effort\" ou começar a migrar — provavelmente pro colosso. Recomeçar do zero no segundo ano da empresa.",[19,31111,31113],{"id":31112},"o-caminho-tecnico-que-existia","O caminho técnico que existia",[12,31115,31116],{},"Há um orquestrador que é tecnicamente o que você quer. Binário único, consenso distribuído de verdade, multi-tenant, escala pra milhares de nós. O fornecedor gastou oito anos polindo isso, e quem rodou em produção não tem o que reclamar do core.",[12,31118,31119,31120,31123,31124,31127],{},"Mas em ",[27,31121,31122],{},"agosto de 2023"," o fornecedor trocou a licença de uma OSS legítima para uma licença \"source available\" que restringe uso comercial. Em ",[27,31125,31126],{},"fevereiro de 2025",", a empresa foi comprada por um conglomerado historicamente conhecido por contratos de cinco anos e amarração de plataforma. Hoje aquele orquestrador faz parte da carteira do conglomerado — e a licença te impede de oferecer a tecnologia como serviço ou embeddar em produto sem licenciamento comercial.",[12,31129,31130],{},"Pra empresas que já tinham aquilo em produção, é um problema gerenciável. Pra você adotando hoje em 2026, é um asterisco grande: a próxima feature crítica pode subir só pra versão paga, ou a licença pode mudar de novo numa próxima reorganização.",[12,31132,31133],{},"A lição que tiramos disso não é \"open source ou nada\" — é \"publique o contrato comercial desde o dia um, sem mudança retroativa\". Software comercial honesto é melhor do que software aberto que vira comercial no meio do caminho. O problema do orquestrador técnico não foi virar pago; foi mudar as regras pra quem já tinha apostado.",[19,31135,31137],{"id":31136},"a-lacuna","A lacuna",[12,31139,31140],{},"Nenhum dos três caminhos combina:",[2735,31142,31143,31149,31154,31160,31166],{},[70,31144,31145,31148],{},[27,31146,31147],{},"Binário único"," (operacional simples)",[70,31150,31151,31153],{},[27,31152,16334],{}," (consenso entre múltiplos servidores, eleição de líder, durabilidade)",[70,31155,31156,31159],{},[27,31157,31158],{},"Experiência tipo Heroku"," (zero arquivo de orquestração extenso, painel web, certificados automáticos)",[70,31161,31162,31165],{},[27,31163,31164],{},"Contrato comercial explícito desde o dia um"," (plano gratuito permanente, planos pagos publicados — sem mudança retroativa de termos)",[70,31167,31168,31171],{},[27,31169,31170],{},"Bateria incluída"," (roteamento, malha entre serviços, métricas — sem montar cinco produtos)",[12,31173,31174],{},"Os painéis modernos têm a experiência e o contrato gratuito, mas perdem em alta disponibilidade. O orquestrador técnico tem a HA mas mudou o contrato com quem já tinha adotado e nunca priorizou experiência. O colosso tem tudo isso só se você montar manualmente — e o \"manualmente\" custa um time.",[19,31176,4826],{"id":4825},[12,31178,31179],{},"A tabela abaixo é a versão honesta da decisão. Não tem coluna sem ressalva — todo orquestrador é um conjunto de tradeoffs, e o nosso também.",[119,31181,31182,31199],{},[122,31183,31184],{},[125,31185,31186,31188,31191,31194,31197],{},[128,31187,2983],{},[128,31189,31190],{},"Colosso (K8s)",[128,31192,31193],{},"Painel self-hosted",[128,31195,31196],{},"Orquestrador ex-OSS",[128,31198,2995],{},[141,31200,31201,31214,31228,31242,31255,31268,31280,31292,31307,31321],{},[125,31202,31203,31205,31208,31210,31212],{},[146,31204,27224],{},[146,31206,31207],{},"4 horas a 4 dias",[146,31209,27227],{},[146,31211,16324],{},[146,31213,27227],{},[125,31215,31216,31218,31220,31223,31226],{},[146,31217,29559],{},[146,31219,3048],{},[146,31221,31222],{},"30 (UI)",[146,31224,31225],{},"80–120",[146,31227,3042],{},[125,31229,31230,31232,31235,31238,31240],{},[146,31231,16334],{},[146,31233,31234],{},"Sim, com 5+ componentes",[146,31236,31237],{},"Não (single-server)",[146,31239,3065],{},[146,31241,3065],{},[125,31243,31244,31246,31249,31251,31253],{},[146,31245,26124],{},[146,31247,31248],{},"Operador externo",[146,31250,23290],{},[146,31252,31248],{},[146,31254,23290],{},[125,31256,31257,31259,31262,31264,31266],{},[146,31258,23305],{},[146,31260,31261],{},"Operador especializado",[146,31263,3059],{},[146,31265,31261],{},[146,31267,23311],{},[125,31269,31270,31272,31274,31276,31278],{},[146,31271,25636],{},[146,31273,30802],{},[146,31275,19361],{},[146,31277,23330],{},[146,31279,25641],{},[125,31281,31282,31284,31286,31288,31290],{},[146,31283,22798],{},[146,31285,30814],{},[146,31287,19361],{},[146,31289,23330],{},[146,31291,22321],{},[125,31293,31294,31296,31299,31302,31305],{},[146,31295,22831],{},[146,31297,31298],{},"Gratuito + custo operacional alto",[146,31300,31301],{},"Gratuito (single-server)",[146,31303,31304],{},"Comercial restrito (foi gratuito até 2023)",[146,31306,25670],{},[125,31308,31309,31311,31314,31316,31319],{},[146,31310,16408],{},[146,31312,31313],{},"1–2 SREs dedicados",[146,31315,22206],{},[146,31317,31318],{},"1 SRE dedicado",[146,31320,22206],{},[125,31322,31323,31325,31328,31331,31334],{},[146,31324,5015],{},[146,31326,31327],{},"50+ máquinas",[146,31329,31330],{},"1 máquina",[146,31332,31333],{},"5–500 máquinas",[146,31335,31336],{},"1–500 máquinas",[12,31338,31339,31340,31343],{},"A coluna que importa é a penúltima: ",[27,31341,31342],{},"time mínimo pra operar",". É ali que o custo verdadeiro mora. Os outros critérios são a explicação do porquê.",[19,31345,31347],{"id":31346},"o-que-estamos-construindo","O que estamos construindo",[12,31349,31350],{},"HeroCtl é um único arquivo executável que você instala em N servidores Linux com Docker. Os primeiros três viram quórum pro plano de controle replicado. Você submete jobs via CLI, API ou painel web embutido — o cluster decide onde rodar, faz health check, gerencia rolling deploys, emite certificados Let's Encrypt automaticamente via roteador integrado.",[12,31352,31353],{},"Sem CRDs, sem operadores especializados, sem charts. O job spec é um arquivo de configuração simples (50 linhas pra app+ingress+secrets, não 300). Criptografia entre serviços e PKI automática vêm embutidas. Métricas persistentes rodam como job do próprio sistema. Logs com arquitetura de escritor único (sem montar Fluentd, sem montar Loki).",[12,31355,31356],{},"Hoje a stack pública roda em produção: quatro nós em provedor cloud, cinco sites com TLS automático, dezesseis contêineres, downtime zero em rolling deploys. O cluster sobreviveu a uma bateria completa de caos: kill -9 do servidor que coordena (eleição em sete segundos), partição de rede de 30 segundos, perda de quórum, wipe de disco, drain forçado. Cada um desses cenários vira um post próprio.",[12,31358,31359],{},"O resultado prático é um modelo operacional radicalmente mais curto. Subir uma aplicação nova é três passos: você descreve o serviço num arquivo de configuração de cinquenta linhas, submete via CLI, e o cluster decide onde rodar, abre porta, registra no roteador, emite certificado Let's Encrypt e começa a servir tráfego. Atualizar é um quarto passo: muda a versão da imagem no arquivo, submete de novo, e o cluster orquestra a substituição em rolling — sem janela de manutenção, sem flag de feature, sem migração manual de tráfego.",[12,31361,31362],{},"Depurar é o teste real de qualquer orquestrador. Quando algo dá errado às três da manhã, você precisa de um caminho curto entre \"o site caiu\" e \"sei exatamente o que aconteceu\". No HeroCtl, esse caminho é único: o painel mostra qual contêiner falhou, em qual servidor estava rodando, último log antes de morrer, métricas dos últimos minutos, histórico de versões. Sem grep em três produtos diferentes, sem reconstituir contexto a partir de cinco dashboards, sem alternar entre ferramentas de fornecedores diferentes só pra entender uma falha.",[19,31364,31366],{"id":31365},"quando-o-heroctl-nao-e-pra-voce","Quando o HeroCtl não é pra você",[12,31368,31369],{},"A honestidade é o mecanismo de defesa de uma ferramenta nova: contar onde ela não cabe é o que mantém o produto focado. Quatro perfis em que recomendamos outro caminho.",[12,31371,31372,31375],{},[27,31373,31374],{},"Você opera no nível de centenas de milhares de máquinas.","\nEmpresas que rodam dez mil nós ou mais escolheram o colosso por uma razão real: ele foi desenhado pra esse tamanho. HeroCtl é honesto sobre o teto: testamos até centenas de nós em laboratório, validamos algumas dezenas em produção de clientes, e o roadmap mira a faixa \"1 a 500 servidores\". Acima disso, o ecossistema do colosso te dá ferramentas que ainda não temos — e construí-las só pra atender 0,1% dos casos não é prioridade.",[12,31377,31378,31381],{},[27,31379,31380],{},"Você tem requisitos de compliance que listam ferramentas nominalmente.","\nAlguns frameworks de auditoria (FedRAMP, ITAR, certos contratos de governo) exigem que a stack rode sobre componentes específicos pré-aprovados. HeroCtl é jovem demais pra estar nessas listas. Se o seu compliance officer precisa apontar pra um certificado existente, hoje a resposta correta é o colosso ou o orquestrador ex-OSS. Mas se você precisa do nome de uma ferramenta na lista de auditoria, não é HeroCtl ainda.",[12,31383,31384,31387],{},[27,31385,31386],{},"Você precisa de uma biblioteca profunda de operadores especializados.","\nO ecossistema do colosso tem centenas de operadores prontos — Postgres com replicação automática, Kafka com balanceamento, Cassandra com bootstrap. Se a sua arquitetura depende de quatro desses operadores rodando em produção desde o dia um, HeroCtl não substitui. A nossa proposta é diferente: você roda o seu Postgres como um job comum, cuidando de backup e replicação como um humano cuida — não delegando pra um operador que tomou três anos pra estabilizar.",[12,31389,31390,31393],{},[27,31391,31392],{},"Você quer multi-cloud com workloads se movendo entre provedores em tempo real.","\nHeroCtl roda em qualquer servidor Linux com Docker, então tecnicamente você pode misturar provedores. Mas as primitivas pra mover storage cifrado entre regiões, replicar bancos pra outro provedor com failover automático, ou orquestrar redes virtuais entre nuvens — isso o ecossistema do colosso resolve melhor hoje. Está no nosso roadmap, não na versão atual.",[19,31395,16602],{"id":16601},[12,31397,31398,31401],{},[27,31399,31400],{},"O HeroCtl é mais um wrapper do Docker?","\nNão. Wrappers de Docker não fazem consenso entre servidores, não elegem coordenador, não sobrevivem à perda de um nó com automática redistribuição de trabalho. HeroCtl é um plano de controle replicado que coordena agentes em cada servidor. O Docker fica como runtime de contêiner — uma escolha de implementação, não a substância do produto.",[12,31403,31404,31407],{},[27,31405,31406],{},"E se a empresa por trás do HeroCtl quebrar?","\nTrês proteções contratuais. Primeiro, o binário não tem phone-home obrigatório — uma vez instalado, o seu cluster continua funcionando sem nunca falar com servidor nosso. Não há kill-switch remoto, não há ativação periódica que expira. Segundo, contratos Enterprise incluem escrow de código-fonte: se a empresa encerrar operações, o código é entregue aos clientes pagantes via terceira parte custodiante, com licença pra continuidade interna. Terceiro, o contrato de preço atual está congelado pra quem assina hoje — não há cláusula que permita mudança retroativa de termos. O que aconteceu com o orquestrador técnico em 2023 e em 2025 está estruturalmente impedido aqui.",[12,31409,31410,31413],{},[27,31411,31412],{},"Quanto consome de RAM e CPU em cluster pequeno?","\nO cluster público de demonstração roda em quatro servidores totalizando cinco vCPUs e dez gigabytes de RAM, com dezesseis contêineres ativos servindo cinco sites. O plano de controle ocupa entre 200 e 400 MB por servidor — sobra pra workload real. Comparativamente, o plano de controle de uma versão gerenciada do colosso começa em cerca de 700 MB por nó-mestre antes de qualquer aplicação subir.",[12,31415,31416,31419],{},[27,31417,31418],{},"Posso migrar do orquestrador ex-OSS pro HeroCtl?","\nSim. As primitivas são similares (job, group, task; cluster com plano de controle replicado; agentes em cada servidor). A diferença grande está no arquivo de configuração — o nosso é mais curto e tem menos abstrações. Pra times com poucas dezenas de jobs, a migração é manual e leva uma tarde. Acima disso temos um conversor experimental que cobre os casos comuns. Escreve pra gente se for o seu caso.",[12,31421,31422,31425,31426,31428,31429,31431,31432,31434],{},[27,31423,31424],{},"Como funciona o pagamento?","\nTrês planos com linha clara entre eles. ",[27,31427,4351],{}," é gratuito pra sempre, sem limite de servidores, sem limite de jobs, sem feature gates artificiais — roda toda a stack descrita acima, incluindo HA, roteador, certificados automáticos, métricas e logs. Indivíduos e times pequenos nunca precisam sair daqui. ",[27,31430,4355],{}," adiciona SSO\u002FSAML, RBAC granular, auditoria detalhada, backup gerenciado e suporte com SLA — pra times que têm requisitos formais de plataforma. ",[27,31433,4359],{}," adiciona escrow de código-fonte, contrato de continuidade, suporte 24×7 e desenvolvimento dedicado.",[12,31436,31437],{},"Os preços de Business e Enterprise são publicados na página de planos — sem \"fale com vendas\" obrigatório. A linha de corte é desenhada pra você só pagar quando a empresa for grande o suficiente pra que SSO e auditoria sejam exigências reais, não preferência.",[12,31439,31440,31443],{},[27,31441,31442],{},"Está pronto pra produção?","\nEstá rodando a stack pública há seis meses, sobreviveu a uma bateria documentada de cenários de caos, e suporta o blog que você está lendo agora. \"Pronto\" depende do seu apetite a risco e do tamanho do seu time. Pra um indie hacker, três servidores e um SaaS de US$10k MRR, é mais do que pronto. Pra um banco regulado por três órgãos, espere mais alguns trimestres e converse com a gente sobre Business Edition primeiro.",[12,31445,31446,31449],{},[27,31447,31448],{},"Onde rodam os dados sensíveis (segredos, certificados, configurações)?","\nNo próprio cluster, criptografados em repouso. O cluster é o cofre — não há serviço externo de cofre obrigatório. Se você quer integrar com um cofre externo da sua nuvem (KMS de provedor cloud), há ponto de extensão; mas a configuração padrão é auto-suficiente.",[19,31451,31453],{"id":31452},"o-que-vem-nos-proximos-posts","O que vem nos próximos posts",[12,31455,31456],{},"A intenção do blog é técnica e direta: sem fluff de marketing.",[2735,31458,31459,31465,31480,31486],{},[70,31460,31461,31464],{},[27,31462,31463],{},"Engenharia",": como o consenso é configurado, como funciona a defesa contra contêineres-zumbi segurando portas, por que escolhemos snapshot em memória em vez de bitmap persistido pra alocação de portas",[70,31466,31467,6564,31470,571,31472,571,31475,571,31477,31479],{},[27,31468,31469],{},"Comparativos",[3337,31471,16702],{"href":16701},[3337,31473,31474],{"href":23621},"HeroCtl vs Nomad",[3337,31476,29881],{"href":25892},[3337,31478,16707],{"href":16706}," — números reais, não opinião",[70,31481,31482,31485],{},[27,31483,31484],{},"Casos de uso",": setup com 1 servidor (substituir painel simples), 3 servidores (HA real), 10+ servidores (escala)",[70,31487,31488,31491],{},[27,31489,31490],{},"Novidades",": changelog narrativo das features que shipam",[12,31493,31494],{},"Se você é desenvolvedor sentindo que o colosso é demais e o painel auto-hospedado é pouco, fique por aqui. Se você opera o orquestrador técnico e está incerto sobre o futuro pós-aquisição, escreva pra gente — tem caminho de migração.",[12,31496,26398],{},{"title":229,"searchDepth":244,"depth":244,"links":31498},[31499,31500,31501,31502,31503,31504,31505,31506,31507],{"id":31072,"depth":244,"text":31073},{"id":31096,"depth":244,"text":31097},{"id":31112,"depth":244,"text":31113},{"id":31136,"depth":244,"text":31137},{"id":4825,"depth":244,"text":4826},{"id":31346,"depth":244,"text":31347},{"id":31365,"depth":244,"text":31366},{"id":16601,"depth":244,"text":16602},{"id":31452,"depth":244,"text":31453},"novidades","2025-11-12","Kubernetes pede um time de SRE. Painéis simples não têm alta disponibilidade real. O concorrente técnico mais próximo mudou de licença e foi adquirido. Faltava uma alternativa — então construímos.",{},{"title":21739,"description":31510},{"loc":6547},"blog\u002Fpor-que-criamos-o-heroctl",[31516,20399,7514,27525],"manifesto","bYoUpna-wKFs0h8EtVtfWJQJcCcE7-U35UIZKU8G5eI",1777362197777]