[{"data":1,"prerenderedAt":1014},["ShallowReactive",2],{"doc-es-\u002Fes\u002Fdocs\u002Fobservabilidad\u002Fbackup-restauracion":3,"docs-es-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_es\u002Fes\u002Fdocs\u002Fobservabilidad\u002Fbackup-restauracion.md","Backup y restauración del estado del 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 del cluster no es lo mismo que backup de tus datos. Son dos universos. Esta guía trata solo del primero.",[14,15,17],"h2",{"id":16},"que-es-el-estado-del-cluster","Qué es el estado del cluster",[10,19,20,21,25],{},"HeroCtl mantiene un catálogo de lo que existe: jobs declarados, secretos almacenados, reglas de ACL, historial reciente de métricas, ingress configurado, nodos conocidos. Todo eso es el ",[22,23,24],"strong",{},"estado del plano de control",".",[10,27,28],{},"Si pierdes ese estado, el cluster olvida lo que debía correr. Los contenedores pueden seguir de pie, pero nadie sabe ya gestionarlos. Es el tipo de situación que termina en rebuild manual.",[10,30,31],{},"Backup de ese estado es barato. No hacerlo es caro.",[33,34,35],"blockquote",{},[10,36,37,40,41,45],{},[22,38,39],{},"Lo que NO entra en el snapshot:"," los datos que viven dentro de tus contenedores. Base Postgres, volúmenes, uploads de usuario. Esos necesitan backup propio (",[42,43,44],"code",{},"pg_dump",", snapshots del storage, etc).",[14,47,49],{"id":48},"snapshot-manual","Snapshot manual",[10,51,52],{},"El comando es una línea:",[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],{},"La salida:",[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 el archivo es un tarball comprimido con:",[96,97,98,102,105,108,111,114],"ul",{},[99,100,101],"li",{},"Definiciones de jobs",[99,103,104],{},"Secretos (cifrados)",[99,106,107],{},"Políticas de ACL y tokens",[99,109,110],{},"Configuración de ingress",[99,112,113],{},"Lista de nodos conocidos",[99,115,116],{},"Historial de métricas de los últimos 7 días",[10,118,119],{},"No incluye logs antiguos ni imágenes de contenedor.",[14,121,123],{"id":122},"restauracion","Restauración",[10,125,126],{},"Restaurar es más delicado. El cluster necesita 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],{},"Atención:"," la restauración sobreescribe el estado actual. Si el snapshot es de ayer, pierdes todo lo que sucedió desde entonces. Haz un snapshot del estado actual antes, aunque esté roto — puede salvar evidencias.",[14,237,239],{"id":238},"backup-automatico-plan-business","Backup automático (Plan Business)",[10,241,242],{},"Los snapshots manuales funcionan. Los snapshots programados funcionan más.",[10,244,245],{},"Configuración:",[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],{},"El schedule es cron-like. Ejemplos:",[375,376,377,390],"table",{},[378,379,380],"thead",{},[381,382,383,387],"tr",{},[384,385,386],"th",{},"Expresión",[384,388,389],{},"Cuándo",[391,392,393,404,414,424],"tbody",{},[381,394,395,401],{},[396,397,398],"td",{},[42,399,400],{},"0 3 * * *",[396,402,403],{},"3h de la mañana todos los días",[381,405,406,411],{},[396,407,408],{},[42,409,410],{},"0 *\u002F6 * * *",[396,412,413],{},"Cada 6 horas",[381,415,416,421],{},[396,417,418],{},[42,419,420],{},"0 3 * * 0",[396,422,423],{},"Domingos a las 3h",[381,425,426,431],{},[396,427,428],{},[42,429,430],{},"30 2 1 * *",[396,432,433],{},"Día 1 de cada mes, 2h30",[435,436,438],"h3",{"id":437},"storage-compatible","Storage compatible",[10,440,441],{},"Cualquier storage S3-compatible sirve:",[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],{},"La elección es tuya. R2 y B2 son generalmente los más baratos para retención larga.",[435,463,465],{"id":464},"retencion","Retención",[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 más antiguos que 30 días se borran automáticamente. Puedes usar valores diferentes:",[96,484,485,491,497,503],{},[99,486,487,490],{},[42,488,489],{},"7"," — equipos pequeños, solo operacional",[99,492,493,496],{},[42,494,495],{},"30"," — estándar recomendado",[99,498,499,502],{},[42,500,501],{},"90"," — auditoría, ambientes regulados",[99,504,505,508],{},[42,506,507],{},"365"," — compliance fuerte",[10,510,511],{},"Cada snapshot pesa entre 2 MB y algunas decenas de MB. Incluso 365 copias ocupan poco.",[14,513,515],{"id":514},"encryption","Encryption",[10,517,518],{},"Todo snapshot se cifra en reposo con AES-256. La clave queda configurada en el 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],{},"Genera la clave una 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],{}," sin esa clave el snapshot se vuelve basura. Guarda una copia fuera del cluster. En cofre de contraseñas. En papel en un sobre. Donde tenga sentido — pero guárdala.",[14,587,589],{"id":588},"disaster-recovery","Disaster recovery",[10,591,592],{},"Tres escenarios, tres respuestas.",[435,594,596],{"id":595},"escenario-1-cluster-perdio-coordinacion","Escenario 1: cluster perdió coordinación",[10,598,599],{},"Más nodos cayeron de los que sobraron. El cluster se traba en modo solo-lectura.",[10,601,602],{},"Solución normal: traer los nodos caídos de vuelta. Re-sincronizan y todo vuelve.",[10,604,605],{},"Solución de emergencia (último recurso): bootstrap forzado a partir del snapshot más reciente.",[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],{},"Pierdes cambios hechos después del último snapshot.",[435,634,636],{"id":635},"escenario-2-storage-del-cluster-corrupto","Escenario 2: storage del cluster corrupto",[10,638,639,640,25],{},"Disco murió. Datacenter incendiado. Operador borró ",[42,641,642],{},"\u002Fvar\u002Flib\u002Fheroctl",[10,644,645],{},"Mismo procedimiento:",[647,648,649,652,655,661],"ol",{},[99,650,651],{},"Provisiona nodos nuevos.",[99,653,654],{},"Instala HeroCtl.",[99,656,657,660],{},[42,658,659],{},"heroctl snapshot restore"," en uno de ellos.",[99,662,663],{},"Haz que los demás entren como pares.",[10,665,666],{},"Si tenías snapshot off-site, recuperas en minutos. Si no, recuperas en días (rehaciendo todo desde cero).",[435,668,670],{"id":669},"escenario-3-datos-de-las-aplicaciones-se-perdieron","Escenario 3: datos de las aplicaciones se perdieron",[10,672,673],{},"El snapshot del cluster no te ayuda aquí. Necesitas:",[96,675,676,681,684],{},[99,677,678,680],{},[42,679,44],{}," programado para Postgres",[99,682,683],{},"Snapshot del volumen para storage de archivos",[99,685,686],{},"Replicación para Redis (si es persistente)",[10,688,689],{},"Cada workload es responsable de su propio backup de datos. HeroCtl orquesta; no sustituye tu estrategia de backup de aplicación.",[14,691,693],{"id":692},"pruebas-de-restauracion","Pruebas de restauración",[10,695,696],{},"Backup que nadie probó no es backup. Es archivo.",[10,698,699],{},"HeroCtl Business programa pruebas automáticas:",[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],{},"Mensualmente el cluster de staging tira su estado, restaura el último snapshot de producción y corre un conjunto de verificaciones:",[96,754,755,758,761],{},[99,756,757],{},"¿Volvieron todos los jobs?",[99,759,760],{},"¿Los secretos descifran correctamente?",[99,762,763],{},"¿La ACL es consistente?",[10,765,766],{},"Si algo falla, alerta en el canal configurado.",[14,768,770],{"id":769},"buenas-practicas","Buenas prácticas",[10,772,773],{},"La regla 3-2-1 del backup tradicional vale aquí también:",[96,775,776,782,788],{},[99,777,778,781],{},[22,779,780],{},"3 copias"," del snapshot",[99,783,784,787],{},[22,785,786],{},"2 medios"," diferentes (disco local + nube)",[99,789,790,793],{},[22,791,792],{},"1 off-site"," (proveedor diferente del cluster)",[10,795,796],{},"Aplicado:",[96,798,799,802,805],{},[99,800,801],{},"Copia 1: generada en el nodo coordinador.",[99,803,804],{},"Copia 2: replicada a un bucket S3 en la misma región.",[99,806,807],{},"Copia 3: replicada a un bucket en otra región u otro proveedor.",[10,809,810],{},"Cuando el datacenter entero caiga, es la copia 3 la que te salva.",[14,812,814],{"id":813},"resumen","Resumen",[375,816,817,830],{},[378,818,819],{},[381,820,821,824,827],{},[384,822,823],{},"Acción",[384,825,826],{},"Comando",[384,828,829],{},"Frecuencia",[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 cambios grandes",[381,845,846,849,855],{},[396,847,848],{},"Snapshot programado",[396,850,851,852],{},"configurado en ",[42,853,854],{},"server.yaml",[396,856,857],{},"Diario",[381,859,860,862,866],{},[396,861,123],{},[396,863,864],{},[42,865,659],{},[396,867,868],{},"En emergencia",[381,870,871,874,877],{},[396,872,873],{},"Prueba de restauración",[396,875,876],{},"automática",[396,878,879],{},"Mensual",[10,881,882],{},"Próximos pasos:",[96,884,885,893,900],{},[99,886,887,892],{},[888,889,891],"a",{"href":890},"\u002Fes\u002Fdocs\u002Fobservabilidad\u002Fmetricas-logs","Métricas y alertas"," — sabe cuándo el backup falló.",[99,894,895,899],{},[888,896,898],{"href":897},"\u002Fes\u002Fdocs\u002Fseguridad\u002Frbac","ACL"," — quién puede disparar la restauración.",[99,901,902,906],{},[888,903,905],{"href":904},"\u002Fes\u002Fdocs\u002Ftroubleshooting\u002Fproblemas-comunes","Troubleshooting"," — cuando la restauración no 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","Cómo guardar, programar y restaurar snapshots del plano de control de HeroCtl. Estrategia de disaster recovery.",false,"md","i-lucide-archive","2026-04-26",{},"\u002Fes\u002Fdocs\u002Fobservabilidad\u002Fbackup-restauracion",[],"7 min de lectura",{"title":5,"description":930},"es\u002Fdocs\u002Fobservabilidad\u002Fbackup-restauracion",[263,122,942,588,943],"snapshot","s3","8pYlpCeUbYL7dNCaaElpz-PhJBGlCqMs7DKf5j4fT1c",[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},"\u002Fes\u002Fdocs\u002Fapi\u002Freferencia-api","Referencia de la API REST","Endpoints, autenticación JWT, ejemplos con curl y patrones de error de la API de HeroCtl.","api","i-lucide-code",{"path":953,"title":954,"description":955,"category":956,"order":66,"icon":957},"\u002Fes\u002Fdocs\u002Fdeploy\u002Fprimer-deploy","Deploy de la primera app","Levanta una aplicación Node.js con base Postgres en 50 líneas de YAML. Incluye health check, rolling update y rollback.","deploy","i-lucide-rocket",{"path":959,"title":960,"description":961,"category":956,"order":140,"icon":962},"\u002Fes\u002Fdocs\u002Fdeploy\u002Frolling-canary-blue-green","Rolling, canary, blue-green y rainbow","Cuatro estrategias de deploy. Cuándo usar cada una, con ejemplos completos y 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 y logs","Recolección de métricas, logs y traces sin montar una pila de observabilidad externa. Cuándo vale, y cuándo integrar con herramienta de fuera.","i-lucide-activity",{"path":969,"title":970,"description":971,"category":972,"order":66,"icon":973},"\u002Fes\u002Fdocs\u002Foperaciones\u002Finstalacion","Instalación","Instala HeroCtl en cualquier servidor Linux con Docker en un solo comando. Cubre prerrequisitos, bootstrap y verificación.","operacoes","i-lucide-download",{"path":975,"title":976,"description":977,"category":972,"order":162,"icon":978},"\u002Fes\u002Fdocs\u002Foperaciones\u002Fmulti-region","Multi-region (en planificación Q4 2026)","Qué esperar de multi-region en HeroCtl, cómo correr en varias regiones hoy y la hoja de ruta hasta 2027.","i-lucide-globe",{"path":980,"title":981,"description":982,"category":972,"order":140,"icon":983},"\u002Fes\u002Fdocs\u002Foperaciones\u002Fprimer-cluster","Levantar cluster de 3 nodos","Forma un cluster con 3 servidores en menos de 10 minutos. Tolera falla de 1 nodo sin indisponibilidad.","i-lucide-network",{"path":985,"title":986,"description":987,"category":972,"order":155,"icon":988},"\u002Fes\u002Fdocs\u002Foperaciones\u002Freferencia-cli","Referencia completa del CLI","Todos los comandos heroctl con sinopsis, flags y ejemplo. Úsalo como chuleta de mesa.","i-lucide-terminal",{"path":990,"title":991,"description":992,"category":993,"order":140,"icon":994},"\u002Fes\u002Fdocs\u002Fred\u002Ffirewall","Configuración de firewall","Qué puertos usa HeroCtl, cuáles necesitan estar abiertos y cuáles nunca deberían exponerse a internet.","rede","i-lucide-shield",{"path":996,"title":997,"description":998,"category":993,"order":66,"icon":978},"\u002Fes\u002Fdocs\u002Fred\u002Fingress-tls","Ingress y TLS automático","Cómo exponer aplicaciones por el puerto 443 con certificados emitidos y renovados automáticamente, sin operar un router externo.",{"path":897,"title":1000,"description":1001,"category":1002,"order":140,"icon":1003},"RBAC y control de acceso (Business+)","Modelo de roles, políticas y tokens para limitar quién puede enviar, leer y operar el cluster.","seguranca","i-lucide-users",{"path":1005,"title":1006,"description":1007,"category":1002,"order":66,"icon":1008},"\u002Fes\u002Fdocs\u002Fseguridad\u002Fsecretos","Gestión de secretos","Cómo guardar contraseñas, tokens y claves fuera del spec del job, con cifrado en reposo y rotación versionada.","i-lucide-key",{"path":904,"title":1010,"description":1011,"category":1012,"order":66,"icon":1013},"Troubleshooting de problemas comunes","Los 12 problemas más frecuentes en clusters HeroCtl, con síntoma, diagnóstico y corrección paso a paso.","troubleshooting","i-lucide-alert-triangle",1777362183190]