[{"data":1,"prerenderedAt":1205},["ShallowReactive",2],{"doc-es-\u002Fes\u002Fdocs\u002Fdeploy\u002Frolling-canary-blue-green":3,"docs-es-all":1134},{"id":4,"title":5,"body":6,"category":1118,"description":1119,"draft":1120,"extension":1121,"icon":1122,"lastReviewed":1123,"meta":1124,"navigation":911,"order":180,"path":1125,"prerequisites":1126,"readingTime":1128,"seo":1129,"stem":1130,"tags":1131,"__hash__":1133},"docs_es\u002Fes\u002Fdocs\u002Fdeploy\u002Frolling-canary-blue-green.md","Rolling, canary, blue-green y rainbow",{"type":7,"value":8,"toc":1093},"minimark",[9,13,18,110,113,116,119,124,132,145,148,152,287,290,318,322,325,334,337,340,343,346,353,370,373,579,590,593,596,603,605,608,611,614,634,637,725,731,753,756,778,781,784,792,794,797,800,804,807,818,821,824,827,830,1007,1018,1021,1024,1031,1033,1037,1040,1066,1069,1089],[10,11,12],"p",{},"Toda actualización cambia código en producción. La diferencia entre las 4 estrategias está en cuánto tráfico ve código nuevo, por cuánto tiempo, y qué tan rápido vuelves atrás si algo se rompe.",[14,15,17],"h2",{"id":16},"comparacion-rapida","Comparación rápida",[19,20,21,43],"table",{},[22,23,24],"thead",{},[25,26,27,31,34,37,40],"tr",{},[28,29,30],"th",{},"Estrategia",[28,32,33],{},"Riesgo",[28,35,36],{},"Costo",[28,38,39],{},"Velocidad",[28,41,42],{},"Cuándo usar",[44,45,46,63,79,95],"tbody",{},[25,47,48,52,55,58,60],{},[49,50,51],"td",{},"Rolling",[49,53,54],{},"medio",[49,56,57],{},"1x",[49,59,54],{},[49,61,62],{},"90% de los casos",[25,64,65,68,71,73,76],{},[49,66,67],{},"Canary",[49,69,70],{},"bajo",[49,72,57],{},[49,74,75],{},"lento",[49,77,78],{},"cambio arriesgado con métricas claras",[25,80,81,84,86,89,92],{},[49,82,83],{},"Blue-green",[49,85,70],{},[49,87,88],{},"2x",[49,90,91],{},"rápido",[49,93,94],{},"el rollback debe ser instantáneo",[25,96,97,100,102,105,107],{},[49,98,99],{},"Rainbow",[49,101,70],{},[49,103,104],{},"Nx",[49,106,54],{},[49,108,109],{},"múltiples versiones coexistiendo (B2B)",[10,111,112],{},"No existe \"la mejor estrategia\". Existe la estrategia correcta para cada cambio.",[14,114,51],{"id":115},"rolling",[10,117,118],{},"La estrategia por defecto. Sustituye réplicas una a la vez (o en pequeños lotes), esperando que cada nueva quede saludable antes de tocar la próxima.",[120,121,123],"h3",{"id":122},"como-funciona","Cómo funciona",[10,125,126,127,131],{},"Imagina 4 réplicas corriendo v1. Rolling con ",[128,129,130],"code",{},"max_parallel: 1",":",[133,134,135,139,142],"ol",{},[136,137,138],"li",{},"Mata 1 réplica v1, sube 1 v2. Espera saludable.",[136,140,141],{},"Mata 1 v1 más, sube 1 v2. Espera saludable.",[136,143,144],{},"Repite hasta que las 4 sean v2.",[10,146,147],{},"En cualquier momento, hay mezcla de v1 y v2 sirviendo. Para cambios retro-compatibles, ok. Para cambios de schema o contrato de API, peligroso.",[120,149,151],{"id":150},"spec-yaml","Spec YAML",[153,154,159],"pre",{"className":155,"code":156,"language":157,"meta":158,"style":158},"language-yaml shiki shiki-themes github-dark-default","job: api-vendas\ntasks:\n  - name: web\n    image: minhaempresa\u002Fapi-vendas:1.5.0\n    count: 4\n    update:\n      strategy: rolling\n      max_parallel: 1\n      min_healthy_time: 30s\n      healthy_deadline: 300s\n      auto_revert: true\n","yaml","",[128,160,161,178,187,201,212,224,232,243,254,265,276],{"__ignoreMap":158},[162,163,166,170,174],"span",{"class":164,"line":165},"line",1,[162,167,169],{"class":168},"sPWt5","job",[162,171,173],{"class":172},"sZEs4",": ",[162,175,177],{"class":176},"s9uIt","api-vendas\n",[162,179,181,184],{"class":164,"line":180},2,[162,182,183],{"class":168},"tasks",[162,185,186],{"class":172},":\n",[162,188,190,193,196,198],{"class":164,"line":189},3,[162,191,192],{"class":172},"  - ",[162,194,195],{"class":168},"name",[162,197,173],{"class":172},[162,199,200],{"class":176},"web\n",[162,202,204,207,209],{"class":164,"line":203},4,[162,205,206],{"class":168},"    image",[162,208,173],{"class":172},[162,210,211],{"class":176},"minhaempresa\u002Fapi-vendas:1.5.0\n",[162,213,215,218,220],{"class":164,"line":214},5,[162,216,217],{"class":168},"    count",[162,219,173],{"class":172},[162,221,223],{"class":222},"sFSAA","4\n",[162,225,227,230],{"class":164,"line":226},6,[162,228,229],{"class":168},"    update",[162,231,186],{"class":172},[162,233,235,238,240],{"class":164,"line":234},7,[162,236,237],{"class":168},"      strategy",[162,239,173],{"class":172},[162,241,242],{"class":176},"rolling\n",[162,244,246,249,251],{"class":164,"line":245},8,[162,247,248],{"class":168},"      max_parallel",[162,250,173],{"class":172},[162,252,253],{"class":222},"1\n",[162,255,257,260,262],{"class":164,"line":256},9,[162,258,259],{"class":168},"      min_healthy_time",[162,261,173],{"class":172},[162,263,264],{"class":176},"30s\n",[162,266,268,271,273],{"class":164,"line":267},10,[162,269,270],{"class":168},"      healthy_deadline",[162,272,173],{"class":172},[162,274,275],{"class":176},"300s\n",[162,277,279,282,284],{"class":164,"line":278},11,[162,280,281],{"class":168},"      auto_revert",[162,283,173],{"class":172},[162,285,286],{"class":222},"true\n",[10,288,289],{},"Parámetros importantes:",[291,292,293,300,306,312],"ul",{},[136,294,295,299],{},[296,297,298],"strong",{},"max_parallel"," — cuántas cambiar al mismo tiempo. 1 es más lento y más seguro.",[136,301,302,305],{},[296,303,304],{},"min_healthy_time"," — cuánto tiempo la nueva debe quedar saludable antes de avanzar. 30s atrapa la mayoría de los crashes tardíos.",[136,307,308,311],{},[296,309,310],{},"healthy_deadline"," — después de eso, considera falla.",[136,313,314,317],{},[296,315,316],{},"auto_revert"," — vuelve solo si falla.",[120,319,321],{"id":320},"trade-offs","Trade-offs",[10,323,324],{},"Costo extra cero. La ventana de mezcla entre versiones es el punto débil. Si v2 tiene bug que solo aparece con tráfego real, parte de los usuarios sufre antes del rollback.",[326,327,328],"blockquote",{},[10,329,330,333],{},[296,331,332],{},"Nota:"," rolling es la elección correcta cuando tus cambios son pequeños, retro-compatibles y la app soporta versiones diferentes activas al mismo tiempo.",[335,336],"hr",{},[14,338,67],{"id":339},"canary",[10,341,342],{},"En lugar de cambiar réplicas, inyecta una cantidad pequeña de nuevas y direcciona una porción del tráfico a ellas. Observas métricas. Si todo bien, aumenta la porción. Si las métricas se degradan, revierte.",[120,344,123],{"id":345},"como-funciona-1",[10,347,348,349,352],{},"Con ",[128,350,351],{},"count: 10"," y canary configurado para 5% \u002F 25% \u002F 50% \u002F 100%:",[133,354,355,358,361,364,367],{},[136,356,357],{},"Sube 1 réplica v2 al lado de las 10 v1. Rutea 5% del tráfico hacia ella.",[136,359,360],{},"Espera 5 min recolectando métricas (latencia, errores, CPU).",[136,362,363],{},"Si las métricas están dentro del baseline, sube más réplicas v2 y rutea 25%.",[136,365,366],{},"Repite en 50% y 100%.",[136,368,369],{},"Si en cualquier paso las métricas empeoran, revierte automáticamente.",[120,371,151],{"id":372},"spec-yaml-1",[153,374,376],{"className":155,"code":375,"language":157,"meta":158,"style":158},"job: api-vendas\ntasks:\n  - name: web\n    image: minhaempresa\u002Fapi-vendas:1.5.0\n    count: 10\n    update:\n      strategy: canary\n      stages:\n        - percent: 5\n          duration: 5m\n        - percent: 25\n          duration: 10m\n        - percent: 50\n          duration: 10m\n        - percent: 100\n      analysis:\n        success_rate_min: 99.5\n        latency_p95_max: 250ms\n        error_rate_max: 0.5\n        baseline: previous_version\n      auto_revert: true\n",[128,377,378,386,392,402,410,419,425,434,441,454,464,475,485,497,506,518,526,537,548,559,570],{"__ignoreMap":158},[162,379,380,382,384],{"class":164,"line":165},[162,381,169],{"class":168},[162,383,173],{"class":172},[162,385,177],{"class":176},[162,387,388,390],{"class":164,"line":180},[162,389,183],{"class":168},[162,391,186],{"class":172},[162,393,394,396,398,400],{"class":164,"line":189},[162,395,192],{"class":172},[162,397,195],{"class":168},[162,399,173],{"class":172},[162,401,200],{"class":176},[162,403,404,406,408],{"class":164,"line":203},[162,405,206],{"class":168},[162,407,173],{"class":172},[162,409,211],{"class":176},[162,411,412,414,416],{"class":164,"line":214},[162,413,217],{"class":168},[162,415,173],{"class":172},[162,417,418],{"class":222},"10\n",[162,420,421,423],{"class":164,"line":226},[162,422,229],{"class":168},[162,424,186],{"class":172},[162,426,427,429,431],{"class":164,"line":234},[162,428,237],{"class":168},[162,430,173],{"class":172},[162,432,433],{"class":176},"canary\n",[162,435,436,439],{"class":164,"line":245},[162,437,438],{"class":168},"      stages",[162,440,186],{"class":172},[162,442,443,446,449,451],{"class":164,"line":256},[162,444,445],{"class":172},"        - ",[162,447,448],{"class":168},"percent",[162,450,173],{"class":172},[162,452,453],{"class":222},"5\n",[162,455,456,459,461],{"class":164,"line":267},[162,457,458],{"class":168},"          duration",[162,460,173],{"class":172},[162,462,463],{"class":176},"5m\n",[162,465,466,468,470,472],{"class":164,"line":278},[162,467,445],{"class":172},[162,469,448],{"class":168},[162,471,173],{"class":172},[162,473,474],{"class":222},"25\n",[162,476,478,480,482],{"class":164,"line":477},12,[162,479,458],{"class":168},[162,481,173],{"class":172},[162,483,484],{"class":176},"10m\n",[162,486,488,490,492,494],{"class":164,"line":487},13,[162,489,445],{"class":172},[162,491,448],{"class":168},[162,493,173],{"class":172},[162,495,496],{"class":222},"50\n",[162,498,500,502,504],{"class":164,"line":499},14,[162,501,458],{"class":168},[162,503,173],{"class":172},[162,505,484],{"class":176},[162,507,509,511,513,515],{"class":164,"line":508},15,[162,510,445],{"class":172},[162,512,448],{"class":168},[162,514,173],{"class":172},[162,516,517],{"class":222},"100\n",[162,519,521,524],{"class":164,"line":520},16,[162,522,523],{"class":168},"      analysis",[162,525,186],{"class":172},[162,527,529,532,534],{"class":164,"line":528},17,[162,530,531],{"class":168},"        success_rate_min",[162,533,173],{"class":172},[162,535,536],{"class":222},"99.5\n",[162,538,540,543,545],{"class":164,"line":539},18,[162,541,542],{"class":168},"        latency_p95_max",[162,544,173],{"class":172},[162,546,547],{"class":176},"250ms\n",[162,549,551,554,556],{"class":164,"line":550},19,[162,552,553],{"class":168},"        error_rate_max",[162,555,173],{"class":172},[162,557,558],{"class":222},"0.5\n",[162,560,562,565,567],{"class":164,"line":561},20,[162,563,564],{"class":168},"        baseline",[162,566,173],{"class":172},[162,568,569],{"class":176},"previous_version\n",[162,571,573,575,577],{"class":164,"line":572},21,[162,574,281],{"class":168},[162,576,173],{"class":172},[162,578,286],{"class":222},[10,580,581,582,585,586,589],{},"El bloque ",[128,583,584],{},"analysis"," define qué cuenta como \"ok\". Si la versión nueva tiene ",[128,587,588],{},"latency_p95"," de 300ms mientras la anterior tenía 200ms, el sistema revierte solo antes de llegar a 100%.",[120,591,321],{"id":592},"trade-offs-1",[10,594,595],{},"Más lento (40 min para promover totalmente vs. 5 min del rolling). Exige métricas confiables y baseline claro. Si tu aplicación no tiene métricas de negocio bien definidas, canary se vuelve teatro.",[326,597,598],{},[10,599,600,602],{},[296,601,332],{}," usa canary cuando el costo de una versión mala en producción sea alto y tengas instrumentación para detectar regresión sin depender de tickets de usuario.",[335,604],{},[14,606,83],{"id":607},"blue-green",[10,609,610],{},"Dos entornos paralelos. \"Blue\" recibe 100% del tráfico con la versión actual. \"Green\" sube con la versión nueva, vacío. Cuando está saludable, switch instantáneo del tráfico de blue a green.",[120,612,123],{"id":613},"como-funciona-2",[133,615,616,619,622,625,628,631],{},[136,617,618],{},"Estado inicial: blue (v1) recibe 100%. Green no existe.",[136,620,621],{},"Sube green con v2, misma cantidad de réplicas.",[136,623,624],{},"Aguarda a que green quede saludable (sin tráfico, pero con health check pasando).",[136,626,627],{},"Switch: el ingress pasa a apuntar a green. Blue sigue vivo, sin tráfico.",[136,629,630],{},"Período de observación (15 min, por ejemplo).",[136,632,633],{},"Si ok, descarta blue. Si algo se rompe, switch de vuelta en segundos.",[120,635,151],{"id":636},"spec-yaml-2",[153,638,640],{"className":155,"code":639,"language":157,"meta":158,"style":158},"job: api-vendas\ntasks:\n  - name: web\n    image: minhaempresa\u002Fapi-vendas:1.5.0\n    count: 4\n    update:\n      strategy: blue-green\n      promote_after: 15m\n      auto_promote: false\n      auto_revert: true\n",[128,641,642,650,656,666,674,682,688,697,707,717],{"__ignoreMap":158},[162,643,644,646,648],{"class":164,"line":165},[162,645,169],{"class":168},[162,647,173],{"class":172},[162,649,177],{"class":176},[162,651,652,654],{"class":164,"line":180},[162,653,183],{"class":168},[162,655,186],{"class":172},[162,657,658,660,662,664],{"class":164,"line":189},[162,659,192],{"class":172},[162,661,195],{"class":168},[162,663,173],{"class":172},[162,665,200],{"class":176},[162,667,668,670,672],{"class":164,"line":203},[162,669,206],{"class":168},[162,671,173],{"class":172},[162,673,211],{"class":176},[162,675,676,678,680],{"class":164,"line":214},[162,677,217],{"class":168},[162,679,173],{"class":172},[162,681,223],{"class":222},[162,683,684,686],{"class":164,"line":226},[162,685,229],{"class":168},[162,687,186],{"class":172},[162,689,690,692,694],{"class":164,"line":234},[162,691,237],{"class":168},[162,693,173],{"class":172},[162,695,696],{"class":176},"blue-green\n",[162,698,699,702,704],{"class":164,"line":245},[162,700,701],{"class":168},"      promote_after",[162,703,173],{"class":172},[162,705,706],{"class":176},"15m\n",[162,708,709,712,714],{"class":164,"line":256},[162,710,711],{"class":168},"      auto_promote",[162,713,173],{"class":172},[162,715,716],{"class":222},"false\n",[162,718,719,721,723],{"class":164,"line":267},[162,720,281],{"class":168},[162,722,173],{"class":172},[162,724,286],{"class":222},[10,726,348,727,730],{},[128,728,729],{},"auto_promote: false",", el switch necesita comando manual:",[153,732,736],{"className":733,"code":734,"language":735,"meta":158,"style":158},"language-bash shiki shiki-themes github-dark-default","heroctl deploy promote dep-2026-04-26-005\n","bash",[128,737,738],{"__ignoreMap":158},[162,739,740,744,747,750],{"class":164,"line":165},[162,741,743],{"class":742},"sQhOw","heroctl",[162,745,746],{"class":176}," deploy",[162,748,749],{"class":176}," promote",[162,751,752],{"class":176}," dep-2026-04-26-005\n",[10,754,755],{},"Para revertir:",[153,757,759],{"className":733,"code":758,"language":735,"meta":158,"style":158},"heroctl deploy abort dep-2026-04-26-005\n# tráfego volta para blue em 1-2 segundos\n",[128,760,761,772],{"__ignoreMap":158},[162,762,763,765,767,770],{"class":164,"line":165},[162,764,743],{"class":742},[162,766,746],{"class":176},[162,768,769],{"class":176}," abort",[162,771,752],{"class":176},[162,773,774],{"class":164,"line":180},[162,775,777],{"class":776},"sH3jZ","# tráfego volta para blue em 1-2 segundos\n",[120,779,321],{"id":780},"trade-offs-2",[10,782,783],{},"El costo se duplica durante la ventana de validación (4 + 4 réplicas en lugar de 4). Para apps con mucha memoria o GPU, eso pesa. En compensación, el rollback es el más rápido de las 4 estrategias y no hay mezcla de versiones en producción en ningún momento.",[326,785,786],{},[10,787,788,791],{},[296,789,790],{},"Atención:"," blue-green no resuelve cambio de schema de base. Si la nueva versión necesita columna nueva, sigue siendo responsabilidad de la aplicación hacer la migración compatible con las dos versiones durante la ventana.",[335,793],{},[14,795,99],{"id":796},"rainbow",[10,798,799],{},"Varias versiones coexistiendo de forma permanente, cada una sirviendo a un conjunto específico de usuarios. No es estrategia de actualización sino modelo de operación.",[120,801,803],{"id":802},"cuando-tiene-sentido","Cuándo tiene sentido",[10,805,806],{},"Solo para B2B con clientes que necesitan versión fija por contrato. Ejemplos:",[291,808,809,812,815],{},[136,810,811],{},"ERP donde el cliente A pidió quedarse trabado en v3.2 hasta auditar.",[136,813,814],{},"API que cobra por SLA y el cliente premium tiene derecho a cambiar de versión bajo demanda.",[136,816,817],{},"Plataforma multi-tenant con customización pesada por cliente.",[10,819,820],{},"En SaaS B2C o productos de masa, rainbow es desperdicio.",[120,822,123],{"id":823},"como-funciona-3",[10,825,826],{},"Varias versiones del mismo job corriendo al mismo tiempo, cada una con tag distinto. El ruteo por header, subdominio o claim del token decide qué versión atiende cada request.",[120,828,151],{"id":829},"spec-yaml-3",[153,831,833],{"className":155,"code":832,"language":157,"meta":158,"style":158},"job: api-vendas\nversions:\n  - tag: v3.2\n    image: minhaempresa\u002Fapi-vendas:3.2.7\n    count: 2\n    routing:\n      tenants: [acme, contoso]\n\n  - tag: v4.0\n    image: minhaempresa\u002Fapi-vendas:4.0.1\n    count: 4\n    routing:\n      tenants: [default]\n\n  - tag: v4.1-beta\n    image: minhaempresa\u002Fapi-vendas:4.1.0-rc3\n    count: 1\n    routing:\n      tenants: [internal-test]\n",[128,834,835,843,850,862,871,880,887,907,913,924,933,941,947,958,962,973,982,990,996],{"__ignoreMap":158},[162,836,837,839,841],{"class":164,"line":165},[162,838,169],{"class":168},[162,840,173],{"class":172},[162,842,177],{"class":176},[162,844,845,848],{"class":164,"line":180},[162,846,847],{"class":168},"versions",[162,849,186],{"class":172},[162,851,852,854,857,859],{"class":164,"line":189},[162,853,192],{"class":172},[162,855,856],{"class":168},"tag",[162,858,173],{"class":172},[162,860,861],{"class":176},"v3.2\n",[162,863,864,866,868],{"class":164,"line":203},[162,865,206],{"class":168},[162,867,173],{"class":172},[162,869,870],{"class":176},"minhaempresa\u002Fapi-vendas:3.2.7\n",[162,872,873,875,877],{"class":164,"line":214},[162,874,217],{"class":168},[162,876,173],{"class":172},[162,878,879],{"class":222},"2\n",[162,881,882,885],{"class":164,"line":226},[162,883,884],{"class":168},"    routing",[162,886,186],{"class":172},[162,888,889,892,895,898,901,904],{"class":164,"line":234},[162,890,891],{"class":168},"      tenants",[162,893,894],{"class":172},": [",[162,896,897],{"class":176},"acme",[162,899,900],{"class":172},", ",[162,902,903],{"class":176},"contoso",[162,905,906],{"class":172},"]\n",[162,908,909],{"class":164,"line":245},[162,910,912],{"emptyLinePlaceholder":911},true,"\n",[162,914,915,917,919,921],{"class":164,"line":256},[162,916,192],{"class":172},[162,918,856],{"class":168},[162,920,173],{"class":172},[162,922,923],{"class":176},"v4.0\n",[162,925,926,928,930],{"class":164,"line":267},[162,927,206],{"class":168},[162,929,173],{"class":172},[162,931,932],{"class":176},"minhaempresa\u002Fapi-vendas:4.0.1\n",[162,934,935,937,939],{"class":164,"line":278},[162,936,217],{"class":168},[162,938,173],{"class":172},[162,940,223],{"class":222},[162,942,943,945],{"class":164,"line":477},[162,944,884],{"class":168},[162,946,186],{"class":172},[162,948,949,951,953,956],{"class":164,"line":487},[162,950,891],{"class":168},[162,952,894],{"class":172},[162,954,955],{"class":176},"default",[162,957,906],{"class":172},[162,959,960],{"class":164,"line":499},[162,961,912],{"emptyLinePlaceholder":911},[162,963,964,966,968,970],{"class":164,"line":508},[162,965,192],{"class":172},[162,967,856],{"class":168},[162,969,173],{"class":172},[162,971,972],{"class":176},"v4.1-beta\n",[162,974,975,977,979],{"class":164,"line":520},[162,976,206],{"class":168},[162,978,173],{"class":172},[162,980,981],{"class":176},"minhaempresa\u002Fapi-vendas:4.1.0-rc3\n",[162,983,984,986,988],{"class":164,"line":528},[162,985,217],{"class":168},[162,987,173],{"class":172},[162,989,253],{"class":222},[162,991,992,994],{"class":164,"line":539},[162,993,884],{"class":168},[162,995,186],{"class":172},[162,997,998,1000,1002,1005],{"class":164,"line":550},[162,999,891],{"class":168},[162,1001,894],{"class":172},[162,1003,1004],{"class":176},"internal-test",[162,1006,906],{"class":172},[10,1008,1009,1010,1013,1014,1017],{},"La regla de ",[128,1011,1012],{},"routing.tenants"," se evalúa en cada request. El ingress direcciona por el claim ",[128,1015,1016],{},"tenant_id"," del token.",[120,1019,321],{"id":1020},"trade-offs-3",[10,1022,1023],{},"Costo proporcional al número de versiones vivas. La operación se vuelve compleja: cada bug fix debe ser portado a todas las versiones soportadas. Vuélvete rainbow solo con contratos o regulación que lo justifiquen.",[326,1025,1026],{},[10,1027,1028,1030],{},[296,1029,790],{}," rainbow es fácil de iniciar y difícil de salir. Antes de adoptarlo, pregunta si 2 versiones \"verdes\" y una ventana de migración definida no resuelven el caso.",[335,1032],{},[14,1034,1036],{"id":1035},"como-elegir","Cómo elegir",[10,1038,1039],{},"En orden de pregunta:",[133,1041,1042,1048,1054,1060],{},[136,1043,1044,1047],{},[296,1045,1046],{},"¿El cambio es retro-compatible?"," Si sí, rolling resuelve.",[136,1049,1050,1053],{},[296,1051,1052],{},"¿Existe métrica clara para detectar regresión en 5 min?"," Si sí, canary.",[136,1055,1056,1059],{},[296,1057,1058],{},"¿El rollback debe ser instantáneo?"," Si sí, blue-green.",[136,1061,1062,1065],{},[296,1063,1064],{},"¿Varios clientes pagan para quedarse en versión fija?"," Ahí, rainbow.",[10,1067,1068],{},"En la duda entre canary y blue-green, elige la que combine con tu madurez de observabilidad. Canary sin métricas se vuelve burocracia. Blue-green sin capacidad doblada se rompe en el momento equivocado.",[10,1070,1071,1072,1077,1078,900,1081,1084,1085,1088],{},"Próximo paso: ",[1073,1074,1076],"a",{"href":1075},"\u002Fes\u002Fdocs\u002Foperaciones\u002Freferencia-cli","referencia completa del CLI"," con los comandos ",[128,1079,1080],{},"deploy promote",[128,1082,1083],{},"deploy abort"," y ",[128,1086,1087],{},"deploy pause"," usados aquí.",[1090,1091,1092],"style",{},"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 .s9uIt, html code.shiki .s9uIt{--shiki-default:#A5D6FF}html pre.shiki code .sFSAA, html code.shiki .sFSAA{--shiki-default:#79C0FF}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 .sH3jZ, html code.shiki .sH3jZ{--shiki-default:#8B949E}",{"title":158,"searchDepth":180,"depth":180,"links":1094},[1095,1096,1101,1106,1111,1117],{"id":16,"depth":180,"text":17},{"id":115,"depth":180,"text":51,"children":1097},[1098,1099,1100],{"id":122,"depth":189,"text":123},{"id":150,"depth":189,"text":151},{"id":320,"depth":189,"text":321},{"id":339,"depth":180,"text":67,"children":1102},[1103,1104,1105],{"id":345,"depth":189,"text":123},{"id":372,"depth":189,"text":151},{"id":592,"depth":189,"text":321},{"id":607,"depth":180,"text":83,"children":1107},[1108,1109,1110],{"id":613,"depth":189,"text":123},{"id":636,"depth":189,"text":151},{"id":780,"depth":189,"text":321},{"id":796,"depth":180,"text":99,"children":1112},[1113,1114,1115,1116],{"id":802,"depth":189,"text":803},{"id":823,"depth":189,"text":123},{"id":829,"depth":189,"text":151},{"id":1020,"depth":189,"text":321},{"id":1035,"depth":180,"text":1036},"deploy","Cuatro estrategias de deploy. Cuándo usar cada una, con ejemplos completos y trade-offs honestos.",false,"md","i-lucide-git-branch","2026-04-26",{},"\u002Fes\u002Fdocs\u002Fdeploy\u002Frolling-canary-blue-green",[1127],"primeiro-deploy","12 min",{"title":5,"description":1119},"es\u002Fdocs\u002Fdeploy\u002Frolling-canary-blue-green",[1118,115,339,607,1132],"estrategias","tEq3G-D4fncqalIiyNdjzR77anJECz9oYyqdtoXSFYk",[1135,1141,1146,1147,1153,1158,1164,1169,1174,1178,1184,1188,1194,1199],{"path":1136,"title":1137,"description":1138,"category":1139,"order":165,"icon":1140},"\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":1142,"title":1143,"description":1144,"category":1118,"order":165,"icon":1145},"\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.","i-lucide-rocket",{"path":1125,"title":5,"description":1119,"category":1118,"order":180,"icon":1122},{"path":1148,"title":1149,"description":1150,"category":1151,"order":180,"icon":1152},"\u002Fes\u002Fdocs\u002Fobservabilidad\u002Fbackup-restauracion","Backup y restauración del estado del cluster","Cómo guardar, programar y restaurar snapshots del plano de control de HeroCtl. Estrategia de disaster recovery.","observabilidade","i-lucide-archive",{"path":1154,"title":1155,"description":1156,"category":1151,"order":165,"icon":1157},"\u002Fes\u002Fdocs\u002Fobservabilidad\u002Fmetricas-logs","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":1159,"title":1160,"description":1161,"category":1162,"order":165,"icon":1163},"\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":1165,"title":1166,"description":1167,"category":1162,"order":203,"icon":1168},"\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":1170,"title":1171,"description":1172,"category":1162,"order":180,"icon":1173},"\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":1075,"title":1175,"description":1176,"category":1162,"order":189,"icon":1177},"Referencia completa del CLI","Todos los comandos heroctl con sinopsis, flags y ejemplo. Úsalo como chuleta de mesa.","i-lucide-terminal",{"path":1179,"title":1180,"description":1181,"category":1182,"order":180,"icon":1183},"\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":1185,"title":1186,"description":1187,"category":1182,"order":165,"icon":1168},"\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":1189,"title":1190,"description":1191,"category":1192,"order":180,"icon":1193},"\u002Fes\u002Fdocs\u002Fseguridad\u002Frbac","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":1195,"title":1196,"description":1197,"category":1192,"order":165,"icon":1198},"\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":1200,"title":1201,"description":1202,"category":1203,"order":165,"icon":1204},"\u002Fes\u002Fdocs\u002Ftroubleshooting\u002Fproblemas-comunes","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",1777362182786]