[{"data":1,"prerenderedAt":1014},["ShallowReactive",2],{"doc-\u002Fdocs\u002Fobservabilidade\u002Fbackup-restore":3,"docs-all":945},{"id":4,"title":5,"body":6,"category":929,"description":930,"draft":931,"extension":932,"icon":933,"lastReviewed":934,"meta":935,"navigation":158,"order":140,"path":936,"prerequisites":937,"readingTime":938,"seo":939,"stem":940,"tags":941,"__hash__":944},"docs_pt\u002Fdocs\u002Fobservabilidade\u002Fbackup-restore.md","Backup e restore do estado do cluster",{"type":7,"value":8,"toc":911},"minimark",[9,13,18,26,29,32,46,50,53,81,84,92,95,117,120,124,127,228,236,240,243,246,371,374,434,439,442,459,462,466,480,483,509,512,516,519,540,543,579,586,590,593,597,600,603,606,630,633,637,643,646,664,667,671,674,687,690,694,697,700,750,753,764,767,771,774,794,797,808,811,815,880,883,907],[10,11,12],"p",{},"Backup do cluster não é a mesma coisa que backup dos seus dados. São dois universos. Este guia trata só do primeiro.",[14,15,17],"h2",{"id":16},"o-que-e-o-estado-do-cluster","O que é o estado do cluster",[10,19,20,21,25],{},"O HeroCtl mantém um catálogo do que existe: jobs declarados, secrets armazenados, regras de ACL, histórico recente de métricas, ingress configurado, nós conhecidos. Tudo isso é o ",[22,23,24],"strong",{},"estado do plano de controle",".",[10,27,28],{},"Se você perder esse estado, o cluster esquece o que devia rodar. Os contêineres podem continuar de pé, mas ninguém mais sabe gerenciá-los. É o tipo de situação que termina em rebuild manual.",[10,30,31],{},"Backup desse estado é barato. Não fazer é caro.",[33,34,35],"blockquote",{},[10,36,37,40,41,45],{},[22,38,39],{},"O que NÃO entra no snapshot:"," os dados que vivem dentro dos seus contêineres. Banco Postgres, volumes, uploads de usuário. Esses precisam de backup próprio (",[42,43,44],"code",{},"pg_dump",", snapshots do storage, etc).",[14,47,49],{"id":48},"snapshot-manual","Snapshot manual",[10,51,52],{},"O comando é uma linha:",[54,55,60],"pre",{"className":56,"code":57,"language":58,"meta":59,"style":59},"language-bash shiki shiki-themes github-dark-default","heroctl snapshot save \u002Ftmp\u002Fsnap-2026-04-26.tar.gz\n","bash","",[42,61,62],{"__ignoreMap":59},[63,64,67,71,75,78],"span",{"class":65,"line":66},"line",1,[63,68,70],{"class":69},"sQhOw","heroctl",[63,72,74],{"class":73},"s9uIt"," snapshot",[63,76,77],{"class":73}," save",[63,79,80],{"class":73}," \u002Ftmp\u002Fsnap-2026-04-26.tar.gz\n",[10,82,83],{},"A saída:",[54,85,90],{"className":86,"code":88,"language":89},[87],"language-text","snapshot saved: 4.2 MB\nincluded: 47 jobs, 23 secrets, 12 acl rules, 4 nodes\nduration: 1.3s\n","text",[42,91,88],{"__ignoreMap":59},[10,93,94],{},"Por dentro o arquivo é um tarball comprimido com:",[96,97,98,102,105,108,111,114],"ul",{},[99,100,101],"li",{},"Definições de jobs",[99,103,104],{},"Secrets (criptografados)",[99,106,107],{},"Políticas de ACL e tokens",[99,109,110],{},"Configuração de ingress",[99,112,113],{},"Lista de nós conhecidos",[99,115,116],{},"Histórico de métricas dos últimos 7 dias",[10,118,119],{},"Não inclui logs antigos nem imagens de contêiner.",[14,121,123],{"id":122},"restore","Restore",[10,125,126],{},"Restaurar é mais delicado. O cluster precisa estar parado:",[54,128,130],{"className":56,"code":129,"language":58,"meta":59,"style":59},"# Para o cluster em todos os nós\nsudo systemctl stop heroctl-server\n\n# Em UM nó, restaura o snapshot\nheroctl snapshot restore \u002Fbackups\u002Fsnap-2026-04-26.tar.gz\n\n# Sobe o nó restaurado\nsudo systemctl start heroctl-server\n\n# Os demais nós sincronizam automaticamente ao subir\nsudo systemctl start heroctl-server  # nos outros\n",[42,131,132,138,153,160,166,179,184,190,202,207,213],{"__ignoreMap":59},[63,133,134],{"class":65,"line":66},[63,135,137],{"class":136},"sH3jZ","# Para o cluster em todos os nós\n",[63,139,141,144,147,150],{"class":65,"line":140},2,[63,142,143],{"class":69},"sudo",[63,145,146],{"class":73}," systemctl",[63,148,149],{"class":73}," stop",[63,151,152],{"class":73}," heroctl-server\n",[63,154,156],{"class":65,"line":155},3,[63,157,159],{"emptyLinePlaceholder":158},true,"\n",[63,161,163],{"class":65,"line":162},4,[63,164,165],{"class":136},"# Em UM nó, restaura o snapshot\n",[63,167,169,171,173,176],{"class":65,"line":168},5,[63,170,70],{"class":69},[63,172,74],{"class":73},[63,174,175],{"class":73}," restore",[63,177,178],{"class":73}," \u002Fbackups\u002Fsnap-2026-04-26.tar.gz\n",[63,180,182],{"class":65,"line":181},6,[63,183,159],{"emptyLinePlaceholder":158},[63,185,187],{"class":65,"line":186},7,[63,188,189],{"class":136},"# Sobe o nó restaurado\n",[63,191,193,195,197,200],{"class":65,"line":192},8,[63,194,143],{"class":69},[63,196,146],{"class":73},[63,198,199],{"class":73}," start",[63,201,152],{"class":73},[63,203,205],{"class":65,"line":204},9,[63,206,159],{"emptyLinePlaceholder":158},[63,208,210],{"class":65,"line":209},10,[63,211,212],{"class":136},"# Os demais nós sincronizam automaticamente ao subir\n",[63,214,216,218,220,222,225],{"class":65,"line":215},11,[63,217,143],{"class":69},[63,219,146],{"class":73},[63,221,199],{"class":73},[63,223,224],{"class":73}," heroctl-server",[63,226,227],{"class":136},"  # nos outros\n",[33,229,230],{},[10,231,232,235],{},[22,233,234],{},"Atenção:"," restore sobrescreve o estado atual. Se o snapshot é de ontem, você perde tudo que aconteceu desde então. Faça um snapshot do estado atual antes, mesmo que esteja quebrado — pode salvar evidências.",[14,237,239],{"id":238},"backup-automatico-plano-business","Backup automático (Plano Business)",[10,241,242],{},"Snapshots manuais funcionam. Snapshots agendados funcionam mais.",[10,244,245],{},"Configuração:",[54,247,251],{"className":248,"code":249,"language":250,"meta":59,"style":59},"language-yaml shiki shiki-themes github-dark-default","# \u002Fetc\u002Fheroctl\u002Fserver.yaml\nbackup:\n  enabled: true\n  schedule: \"0 3 * * *\"        # 3h da manhã, todo dia\n  retention_days: 30\n  storage:\n    type: s3\n    bucket: heroctl-backups\n    region: us-east-2\n    prefix: cluster-prod\u002F\n    access_key_id: AKIA...\n    secret_access_key: \u003Cem segredo>\n","yaml",[42,252,253,258,268,280,293,303,310,320,330,340,350,360],{"__ignoreMap":59},[63,254,255],{"class":65,"line":66},[63,256,257],{"class":136},"# \u002Fetc\u002Fheroctl\u002Fserver.yaml\n",[63,259,260,264],{"class":65,"line":140},[63,261,263],{"class":262},"sPWt5","backup",[63,265,267],{"class":266},"sZEs4",":\n",[63,269,270,273,276],{"class":65,"line":155},[63,271,272],{"class":262},"  enabled",[63,274,275],{"class":266},": ",[63,277,279],{"class":278},"sFSAA","true\n",[63,281,282,285,287,290],{"class":65,"line":162},[63,283,284],{"class":262},"  schedule",[63,286,275],{"class":266},[63,288,289],{"class":73},"\"0 3 * * *\"",[63,291,292],{"class":136},"        # 3h da manhã, todo dia\n",[63,294,295,298,300],{"class":65,"line":168},[63,296,297],{"class":262},"  retention_days",[63,299,275],{"class":266},[63,301,302],{"class":278},"30\n",[63,304,305,308],{"class":65,"line":181},[63,306,307],{"class":262},"  storage",[63,309,267],{"class":266},[63,311,312,315,317],{"class":65,"line":186},[63,313,314],{"class":262},"    type",[63,316,275],{"class":266},[63,318,319],{"class":73},"s3\n",[63,321,322,325,327],{"class":65,"line":192},[63,323,324],{"class":262},"    bucket",[63,326,275],{"class":266},[63,328,329],{"class":73},"heroctl-backups\n",[63,331,332,335,337],{"class":65,"line":204},[63,333,334],{"class":262},"    region",[63,336,275],{"class":266},[63,338,339],{"class":73},"us-east-2\n",[63,341,342,345,347],{"class":65,"line":209},[63,343,344],{"class":262},"    prefix",[63,346,275],{"class":266},[63,348,349],{"class":73},"cluster-prod\u002F\n",[63,351,352,355,357],{"class":65,"line":215},[63,353,354],{"class":262},"    access_key_id",[63,356,275],{"class":266},[63,358,359],{"class":73},"AKIA...\n",[63,361,363,366,368],{"class":65,"line":362},12,[63,364,365],{"class":262},"    secret_access_key",[63,367,275],{"class":266},[63,369,370],{"class":73},"\u003Cem segredo>\n",[10,372,373],{},"O schedule é cron-like. Exemplos:",[375,376,377,390],"table",{},[378,379,380],"thead",{},[381,382,383,387],"tr",{},[384,385,386],"th",{},"Expressão",[384,388,389],{},"Quando",[391,392,393,404,414,424],"tbody",{},[381,394,395,401],{},[396,397,398],"td",{},[42,399,400],{},"0 3 * * *",[396,402,403],{},"3h da manhã todo dia",[381,405,406,411],{},[396,407,408],{},[42,409,410],{},"0 *\u002F6 * * *",[396,412,413],{},"A cada 6 horas",[381,415,416,421],{},[396,417,418],{},[42,419,420],{},"0 3 * * 0",[396,422,423],{},"Domingos às 3h",[381,425,426,431],{},[396,427,428],{},[42,429,430],{},"30 2 1 * *",[396,432,433],{},"Dia 1 de cada mês, 2h30",[435,436,438],"h3",{"id":437},"storage-compativel","Storage compatível",[10,440,441],{},"Qualquer storage S3-compatible serve:",[96,443,444,447,450,453,456],{},[99,445,446],{},"AWS S3",[99,448,449],{},"Cloudflare R2",[99,451,452],{},"Backblaze B2",[99,454,455],{},"Wasabi",[99,457,458],{},"MinIO (self-hosted)",[10,460,461],{},"A escolha é sua. R2 e B2 são geralmente os mais baratos para retenção longa.",[435,463,465],{"id":464},"retencao","Retenção",[54,467,469],{"className":248,"code":468,"language":250,"meta":59,"style":59},"retention_days: 30\n",[42,470,471],{"__ignoreMap":59},[63,472,473,476,478],{"class":65,"line":66},[63,474,475],{"class":262},"retention_days",[63,477,275],{"class":266},[63,479,302],{"class":278},[10,481,482],{},"Snapshots mais antigos que 30 dias são apagados automaticamente. Você pode usar valores diferentes:",[96,484,485,491,497,503],{},[99,486,487,490],{},[42,488,489],{},"7"," — equipes pequenas, apenas operacional",[99,492,493,496],{},[42,494,495],{},"30"," — padrão recomendado",[99,498,499,502],{},[42,500,501],{},"90"," — auditoria, ambientes regulados",[99,504,505,508],{},[42,506,507],{},"365"," — compliance forte",[10,510,511],{},"Cada snapshot pesa entre 2 MB e algumas dezenas de MB. Mesmo 365 cópias ocupam pouco.",[14,513,515],{"id":514},"encryption","Encryption",[10,517,518],{},"Todo snapshot é criptografado em repouso com AES-256. A chave fica configurada no servidor:",[54,520,522],{"className":248,"code":521,"language":250,"meta":59,"style":59},"backup:\n  encryption_key_file: \u002Fetc\u002Fheroctl\u002Fbackup.key\n",[42,523,524,530],{"__ignoreMap":59},[63,525,526,528],{"class":65,"line":66},[63,527,263],{"class":262},[63,529,267],{"class":266},[63,531,532,535,537],{"class":65,"line":140},[63,533,534],{"class":262},"  encryption_key_file",[63,536,275],{"class":266},[63,538,539],{"class":73},"\u002Fetc\u002Fheroctl\u002Fbackup.key\n",[10,541,542],{},"Gere a chave uma vez:",[54,544,546],{"className":56,"code":545,"language":58,"meta":59,"style":59},"openssl rand -base64 32 > \u002Fetc\u002Fheroctl\u002Fbackup.key\nchmod 600 \u002Fetc\u002Fheroctl\u002Fbackup.key\n",[42,547,548,569],{"__ignoreMap":59},[63,549,550,553,556,559,562,566],{"class":65,"line":66},[63,551,552],{"class":69},"openssl",[63,554,555],{"class":73}," rand",[63,557,558],{"class":278}," -base64",[63,560,561],{"class":278}," 32",[63,563,565],{"class":564},"suJrU"," >",[63,567,568],{"class":73}," \u002Fetc\u002Fheroctl\u002Fbackup.key\n",[63,570,571,574,577],{"class":65,"line":140},[63,572,573],{"class":69},"chmod",[63,575,576],{"class":278}," 600",[63,578,568],{"class":73},[33,580,581],{},[10,582,583,585],{},[22,584,234],{}," sem essa chave o snapshot vira lixo. Guarde uma cópia fora do cluster. Em cofre de senhas. Em papel num envelope. Onde fizer sentido — mas guarde.",[14,587,589],{"id":588},"disaster-recovery","Disaster recovery",[10,591,592],{},"Três cenários, três respostas.",[435,594,596],{"id":595},"cenario-1-cluster-perdeu-coordenacao","Cenário 1: cluster perdeu coordenação",[10,598,599],{},"Mais nós caíram do que sobraram. O cluster trava em modo somente-leitura.",[10,601,602],{},"Solução normal: trazer os nós caídos de volta. Eles re-sincronizam e tudo volta.",[10,604,605],{},"Solução de emergência (último recurso): bootstrap forçado a partir do snapshot mais recente.",[54,607,609],{"className":56,"code":608,"language":58,"meta":59,"style":59},"# Em um nó saudável\nheroctl snapshot restore \u002Fbackups\u002Fsnap-mais-recente.tar.gz --force-bootstrap\n",[42,610,611,616],{"__ignoreMap":59},[63,612,613],{"class":65,"line":66},[63,614,615],{"class":136},"# Em um nó saudável\n",[63,617,618,620,622,624,627],{"class":65,"line":140},[63,619,70],{"class":69},[63,621,74],{"class":73},[63,623,175],{"class":73},[63,625,626],{"class":73}," \u002Fbackups\u002Fsnap-mais-recente.tar.gz",[63,628,629],{"class":278}," --force-bootstrap\n",[10,631,632],{},"Você perde mudanças feitas depois do último snapshot.",[435,634,636],{"id":635},"cenario-2-storage-do-cluster-corrompido","Cenário 2: storage do cluster corrompido",[10,638,639,640,25],{},"Disco morreu. Datacenter incendiou. Operador deletou ",[42,641,642],{},"\u002Fvar\u002Flib\u002Fheroctl",[10,644,645],{},"Mesmo procedimento:",[647,648,649,652,655,661],"ol",{},[99,650,651],{},"Provisione nós novos.",[99,653,654],{},"Instale o HeroCtl.",[99,656,657,660],{},[42,658,659],{},"heroctl snapshot restore"," num deles.",[99,662,663],{},"Faça os outros entrarem como pares.",[10,665,666],{},"Se você tinha snapshot off-site, recupera em minutos. Se não tinha, recupera em dias (refazendo tudo do zero).",[435,668,670],{"id":669},"cenario-3-dados-das-aplicacoes-se-perderam","Cenário 3: dados das aplicações se perderam",[10,672,673],{},"Snapshot do cluster não te ajuda aqui. Você precisa de:",[96,675,676,681,684],{},[99,677,678,680],{},[42,679,44],{}," agendado para Postgres",[99,682,683],{},"Snapshot do volume para storage de arquivos",[99,685,686],{},"Replicação para Redis (se persistente)",[10,688,689],{},"Cada workload é responsável pelo próprio backup de dados. O HeroCtl orquestra; ele não substitui sua estratégia de backup de aplicação.",[14,691,693],{"id":692},"testes-de-restore","Testes de restore",[10,695,696],{},"Backup que ninguém testou não é backup. É arquivo.",[10,698,699],{},"O HeroCtl Business agenda testes automáticos:",[54,701,703],{"className":248,"code":702,"language":250,"meta":59,"style":59},"backup:\n  test_restore:\n    enabled: true\n    schedule: \"0 4 1 * *\"     # dia 1 de cada mês, 4h\n    target: staging-cluster\n",[42,704,705,711,718,727,740],{"__ignoreMap":59},[63,706,707,709],{"class":65,"line":66},[63,708,263],{"class":262},[63,710,267],{"class":266},[63,712,713,716],{"class":65,"line":140},[63,714,715],{"class":262},"  test_restore",[63,717,267],{"class":266},[63,719,720,723,725],{"class":65,"line":155},[63,721,722],{"class":262},"    enabled",[63,724,275],{"class":266},[63,726,279],{"class":278},[63,728,729,732,734,737],{"class":65,"line":162},[63,730,731],{"class":262},"    schedule",[63,733,275],{"class":266},[63,735,736],{"class":73},"\"0 4 1 * *\"",[63,738,739],{"class":136},"     # dia 1 de cada mês, 4h\n",[63,741,742,745,747],{"class":65,"line":168},[63,743,744],{"class":262},"    target",[63,746,275],{"class":266},[63,748,749],{"class":73},"staging-cluster\n",[10,751,752],{},"Mensalmente o cluster de staging derruba seu estado, restaura o último snapshot de produção e roda um conjunto de verificações:",[96,754,755,758,761],{},[99,756,757],{},"Todos os jobs voltaram?",[99,759,760],{},"Secrets descriptografam corretamente?",[99,762,763],{},"ACL está consistente?",[10,765,766],{},"Se algo falha, alerta no canal configurado.",[14,768,770],{"id":769},"boas-praticas","Boas práticas",[10,772,773],{},"A regra 3-2-1 do backup tradicional vale aqui também:",[96,775,776,782,788],{},[99,777,778,781],{},[22,779,780],{},"3 cópias"," do snapshot",[99,783,784,787],{},[22,785,786],{},"2 mídias"," diferentes (disco local + nuvem)",[99,789,790,793],{},[22,791,792],{},"1 off-site"," (provedor diferente do cluster)",[10,795,796],{},"Aplicado:",[96,798,799,802,805],{},[99,800,801],{},"Cópia 1: gerada no nó coordenador.",[99,803,804],{},"Cópia 2: replicada para um bucket S3 na mesma região.",[99,806,807],{},"Cópia 3: replicada para um bucket em outra região ou outro provedor.",[10,809,810],{},"Quando o datacenter inteiro cair, é a cópia 3 que te salva.",[14,812,814],{"id":813},"resumo","Resumo",[375,816,817,830],{},[378,818,819],{},[381,820,821,824,827],{},[384,822,823],{},"Ação",[384,825,826],{},"Comando",[384,828,829],{},"Frequência",[391,831,832,844,858,869],{},[381,833,834,836,841],{},[396,835,49],{},[396,837,838],{},[42,839,840],{},"heroctl snapshot save",[396,842,843],{},"Antes de mudanças grandes",[381,845,846,849,855],{},[396,847,848],{},"Snapshot agendado",[396,850,851,852],{},"configurado em ",[42,853,854],{},"server.yaml",[396,856,857],{},"Diário",[381,859,860,862,866],{},[396,861,123],{},[396,863,864],{},[42,865,659],{},[396,867,868],{},"Em emergência",[381,870,871,874,877],{},[396,872,873],{},"Teste de restore",[396,875,876],{},"automático",[396,878,879],{},"Mensal",[10,881,882],{},"Próximos passos:",[96,884,885,893,900],{},[99,886,887,892],{},[888,889,891],"a",{"href":890},"\u002Fdocs\u002Fobservabilidade\u002Fmetricas-logs","Métricas e alertas"," — saiba quando o backup falhou.",[99,894,895,899],{},[888,896,898],{"href":897},"\u002Fdocs\u002Fseguranca\u002Frbac","ACL"," — quem pode disparar restore.",[99,901,902,906],{},[888,903,905],{"href":904},"\u002Fdocs\u002Ftroubleshooting\u002Fproblemas-comuns","Troubleshooting"," — quando o restore não funciona.",[908,909,910],"style",{},"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 .sH3jZ, html code.shiki .sH3jZ{--shiki-default:#8B949E}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 .suJrU, html code.shiki .suJrU{--shiki-default:#FF7B72}",{"title":59,"searchDepth":140,"depth":140,"links":912},[913,914,915,916,920,921,926,927,928],{"id":16,"depth":140,"text":17},{"id":48,"depth":140,"text":49},{"id":122,"depth":140,"text":123},{"id":238,"depth":140,"text":239,"children":917},[918,919],{"id":437,"depth":155,"text":438},{"id":464,"depth":155,"text":465},{"id":514,"depth":140,"text":515},{"id":588,"depth":140,"text":589,"children":922},[923,924,925],{"id":595,"depth":155,"text":596},{"id":635,"depth":155,"text":636},{"id":669,"depth":155,"text":670},{"id":692,"depth":140,"text":693},{"id":769,"depth":140,"text":770},{"id":813,"depth":140,"text":814},"observabilidade","Como salvar, agendar e restaurar snapshots do plano de controle do HeroCtl. Estratégia de disaster recovery.",false,"md","i-lucide-archive","2026-04-26",{},"\u002Fdocs\u002Fobservabilidade\u002Fbackup-restore",[],"7 min",{"title":5,"description":930},"docs\u002Fobservabilidade\u002Fbackup-restore",[263,122,942,588,943],"snapshot","s3","rd0aOvENlOyxjduYZ8Ffg11bf_0CasFHK16eswDs-T4",[946,952,958,963,964,968,974,979,984,989,995,999,1004,1009],{"path":947,"title":948,"description":949,"category":950,"order":66,"icon":951},"\u002Fdocs\u002Fapi\u002Freferencia-api","Referência da API REST","Endpoints, autenticação JWT, exemplos com curl e padrões de erro da API do HeroCtl.","api","i-lucide-code",{"path":953,"title":954,"description":955,"category":956,"order":66,"icon":957},"\u002Fdocs\u002Fdeploy\u002Fprimeiro-deploy","Deploy do primeiro app","Suba uma aplicação Node.js com banco Postgres em 50 linhas de YAML. Inclui health check, rolling deploy e rollback.","deploy","i-lucide-rocket",{"path":959,"title":960,"description":961,"category":956,"order":140,"icon":962},"\u002Fdocs\u002Fdeploy\u002Frolling-canary-bluegreen","Rolling, canary, blue-green e rainbow","Quatro estratégias de deploy. Quando usar cada uma, com exemplos completos e trade-offs honestos.","i-lucide-git-branch",{"path":936,"title":5,"description":930,"category":929,"order":140,"icon":933},{"path":890,"title":965,"description":966,"category":929,"order":66,"icon":967},"Métricas e logs","Coleta de métricas, logs e traces sem montar uma pilha de observabilidade externa. Quando vale, e quando integrar com ferramenta de fora.","i-lucide-activity",{"path":969,"title":970,"description":971,"category":972,"order":155,"icon":973},"\u002Fdocs\u002Foperacoes\u002Fcomandos-cli","Referência completa do CLI","Todos os comandos heroctl com sinopse, flags e exemplo. Use como cola de mesa.","operacoes","i-lucide-terminal",{"path":975,"title":976,"description":977,"category":972,"order":66,"icon":978},"\u002Fdocs\u002Foperacoes\u002Finstalacao","Instalação","Instale o HeroCtl em qualquer servidor Linux com Docker em um único comando. Cobre pré-requisitos, bootstrap e verificação.","i-lucide-download",{"path":980,"title":981,"description":982,"category":972,"order":162,"icon":983},"\u002Fdocs\u002Foperacoes\u002Fmulti-region","Multi-region (em planejamento Q4 2026)","O que esperar de multi-region no HeroCtl, como rodar em várias regiões hoje e o roadmap até 2027.","i-lucide-globe",{"path":985,"title":986,"description":987,"category":972,"order":140,"icon":988},"\u002Fdocs\u002Foperacoes\u002Fprimeiro-cluster","Subir cluster de 3 nós","Forme um cluster com 3 servidores em menos de 10 minutos. Tolera falha de 1 nó sem indisponibilidade.","i-lucide-network",{"path":990,"title":991,"description":992,"category":993,"order":140,"icon":994},"\u002Fdocs\u002Frede\u002Ffirewall","Configuração de firewall","Quais portas o HeroCtl usa, quais precisam ficar abertas, e quais nunca deveriam ser expostas à internet.","rede","i-lucide-shield",{"path":996,"title":997,"description":998,"category":993,"order":66,"icon":983},"\u002Fdocs\u002Frede\u002Fingress-tls","Ingress e TLS automático","Como expor aplicações pela porta 443 com certificados emitidos e renovados automaticamente, sem operar um roteador externo.",{"path":897,"title":1000,"description":1001,"category":1002,"order":140,"icon":1003},"RBAC e controle de acesso (Business+)","Modelo de papéis, políticas e tokens para limitar quem pode submeter, ler e operar o cluster.","seguranca","i-lucide-users",{"path":1005,"title":1006,"description":1007,"category":1002,"order":66,"icon":1008},"\u002Fdocs\u002Fseguranca\u002Fsecrets","Gerenciamento de segredos","Como guardar senhas, tokens e chaves fora do spec do job, com criptografia em repouso e rotação versionada.","i-lucide-key",{"path":904,"title":1010,"description":1011,"category":1012,"order":66,"icon":1013},"Troubleshooting de problemas comuns","Os 12 problemas mais frequentes em clusters HeroCtl, com sintoma, diagnóstico e correção passo a passo.","troubleshooting","i-lucide-alert-triangle",1777362179461]