[{"data":1,"prerenderedAt":1205},["ShallowReactive",2],{"doc-\u002Fdocs\u002Fdeploy\u002Frolling-canary-bluegreen":3,"docs-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_pt\u002Fdocs\u002Fdeploy\u002Frolling-canary-bluegreen.md","Rolling, canary, blue-green e 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 atualização troca código em produção. A diferença entre as 4 estratégias está em quanto tráfego vê código novo, por quanto tempo, e quão rápido você volta atrás se algo quebra.",[14,15,17],"h2",{"id":16},"comparacao-rapida","Comparação rápida",[19,20,21,43],"table",{},[22,23,24],"thead",{},[25,26,27,31,34,37,40],"tr",{},[28,29,30],"th",{},"Estratégia",[28,32,33],{},"Risco",[28,35,36],{},"Custo",[28,38,39],{},"Velocidade",[28,41,42],{},"Quando usar",[44,45,46,63,79,95],"tbody",{},[25,47,48,52,55,58,60],{},[49,50,51],"td",{},"Rolling",[49,53,54],{},"médio",[49,56,57],{},"1x",[49,59,54],{},[49,61,62],{},"90% dos casos",[25,64,65,68,71,73,76],{},[49,66,67],{},"Canary",[49,69,70],{},"baixo",[49,72,57],{},[49,74,75],{},"lento",[49,77,78],{},"mudança arriscada com 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],{},"rollback precisa 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últiplas versões coexistindo (B2B)",[10,111,112],{},"Não existe \"melhor estratégia\". Existe a estratégia certa para cada mudança.",[14,114,51],{"id":115},"rolling",[10,117,118],{},"A estratégia padrão. Substitui réplicas uma de cada vez (ou em pequenos lotes), esperando cada nova ficar saudável antes de mexer na próxima.",[120,121,123],"h3",{"id":122},"como-funciona","Como funciona",[10,125,126,127,131],{},"Imagine 4 réplicas rodando v1. Rolling com ",[128,129,130],"code",{},"max_parallel: 1",":",[133,134,135,139,142],"ol",{},[136,137,138],"li",{},"Mata 1 réplica v1, sobe 1 v2. Espera saudável.",[136,140,141],{},"Mata mais 1 v1, sobe 1 v2. Espera saudável.",[136,143,144],{},"Repete até as 4 serem v2.",[10,146,147],{},"Em qualquer momento, há mistura de v1 e v2 servindo. Para mudanças retro-compatíveis, ok. Para mudanças de schema ou contrato de API, perigoso.",[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"," — quantas trocar ao mesmo tempo. 1 é mais lento e mais seguro.",[136,301,302,305],{},[296,303,304],{},"min_healthy_time"," — quanto tempo a nova precisa ficar saudável antes de avançar. 30s pega a maioria dos crashes tardios.",[136,307,308,311],{},[296,309,310],{},"healthy_deadline"," — depois disso, considera falha.",[136,313,314,317],{},[296,315,316],{},"auto_revert"," — volta sozinho se falhar.",[120,319,321],{"id":320},"trade-offs","Trade-offs",[10,323,324],{},"Custo extra zero. A janela de mistura entre versões é o ponto fraco. Se v2 tem bug que só aparece com tráfego real, parte dos usuários sofre antes do rollback.",[326,327,328],"blockquote",{},[10,329,330,333],{},[296,331,332],{},"Nota:"," rolling é a escolha certa quando suas mudanças são pequenas, retro-compatíveis e o app suporta versões diferentes ativas ao mesmo tempo.",[335,336],"hr",{},[14,338,67],{"id":339},"canary",[10,341,342],{},"Em vez de trocar réplicas, rolling injeta uma quantidade pequena de novas e direciona uma fatia do tráfego para elas. Você observa métricas. Se tudo bem, aumenta a fatia. Se métricas degradam, reverte.",[120,344,123],{"id":345},"como-funciona-1",[10,347,348,349,352],{},"Com ",[128,350,351],{},"count: 10"," e canary configurado para 5% \u002F 25% \u002F 50% \u002F 100%:",[133,354,355,358,361,364,367],{},[136,356,357],{},"Sobe 1 réplica v2 ao lado das 10 v1. Roteia 5% do tráfego para ela.",[136,359,360],{},"Espera 5 min coletando métricas (latência, erros, CPU).",[136,362,363],{},"Se métricas dentro do baseline, sobe mais réplicas v2 e roteia 25%.",[136,365,366],{},"Repete em 50% e 100%.",[136,368,369],{},"Se em qualquer passo as métricas pioram, reverte automaticamente.",[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],{},"O bloco ",[128,583,584],{},"analysis"," define o que conta como \"ok\". Se a versão nova tem ",[128,587,588],{},"latency_p95"," de 300ms enquanto a anterior tinha 200ms, o sistema reverte sozinho antes de chegar a 100%.",[120,591,321],{"id":592},"trade-offs-1",[10,594,595],{},"Mais lento (40 min para promover totalmente vs. 5 min do rolling). Exige métricas confiáveis e baseline claro. Se sua aplicação não tem métricas de negócio bem definidas, canary vira teatro.",[326,597,598],{},[10,599,600,602],{},[296,601,332],{}," use canary quando o custo de uma versão ruim em produção é alto e você tem instrumentação para detectar regressão sem depender de tickets de usuário.",[335,604],{},[14,606,83],{"id":607},"blue-green",[10,609,610],{},"Dois ambientes paralelos. \"Blue\" recebe 100% do tráfego com versão atual. \"Green\" sobe com a versão nova, vazio. Quando saudável, switch instantâneo do tráfego de blue para green.",[120,612,123],{"id":613},"como-funciona-2",[133,615,616,619,622,625,628,631],{},[136,617,618],{},"Estado inicial: blue (v1) recebe 100%. Green não existe.",[136,620,621],{},"Sobe green com v2, mesma quantidade de réplicas.",[136,623,624],{},"Aguarda green ficar saudável (sem tráfego, mas com health check passando).",[136,626,627],{},"Switch: ingresso passa a apontar para green. Blue continua vivo, sem tráfego.",[136,629,630],{},"Período de observação (15 min, por exemplo).",[136,632,633],{},"Se ok, descarta blue. Se algo quebra, switch de volta em 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",", o switch precisa de 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 reverter:",[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],{},"Custo dobra durante a janela de validação (4 + 4 réplicas em vez de 4). Para apps com muita memória ou GPU, isso pesa. Em compensação, rollback é o mais rápido das 4 estratégias e não há mistura de versões em produção em nenhum momento.",[326,785,786],{},[10,787,788,791],{},[296,789,790],{},"Atenção:"," blue-green não resolve mudança de schema de banco. Se a nova versão precisa de coluna nova, ainda é responsabilidade da aplicação fazer a migração compatível com as duas versões durante a janela.",[335,793],{},[14,795,99],{"id":796},"rainbow",[10,798,799],{},"Várias versões coexistindo de forma permanente, cada uma servindo um conjunto específico de usuários. Não é estratégia de atualização e sim modelo de operação.",[120,801,803],{"id":802},"quando-faz-sentido","Quando faz sentido",[10,805,806],{},"Apenas para B2B com clientes que precisam de versão fixa por contrato. Exemplos:",[291,808,809,812,815],{},[136,810,811],{},"ERP onde o cliente A pediu para ficar travado em v3.2 até auditar.",[136,813,814],{},"API que cobra por SLA e cliente premium tem direito a mudar de versão sob demanda.",[136,816,817],{},"Plataforma multi-tenant com customização pesada por cliente.",[10,819,820],{},"Em SaaS B2C ou produtos de massa, rainbow é desperdício.",[120,822,123],{"id":823},"como-funciona-3",[10,825,826],{},"Várias versões do mesmo job rodando ao mesmo tempo, cada uma com tag distinta. Roteamento por header, subdomínio ou claim do token decide qual versão atende cada requisição.",[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],{},"A regra de ",[128,1011,1012],{},"routing.tenants"," é avaliada em cada requisição. O ingresso direciona pelo claim ",[128,1015,1016],{},"tenant_id"," do token.",[120,1019,321],{"id":1020},"trade-offs-3",[10,1022,1023],{},"Custo proporcional ao número de versões vivas. Operação fica complexa: cada bug fix precisa ser portado para todas as versões suportadas. Vire rainbow só com contratos ou regulação que justifiquem.",[326,1025,1026],{},[10,1027,1028,1030],{},[296,1029,790],{}," rainbow é fácil de iniciar e difícil de sair. Antes de adotar, pergunte se 2 versões \"verdes\" e uma janela de migração definida não resolvem o caso.",[335,1032],{},[14,1034,1036],{"id":1035},"como-escolher","Como escolher",[10,1038,1039],{},"Em ordem de pergunta:",[133,1041,1042,1048,1054,1060],{},[136,1043,1044,1047],{},[296,1045,1046],{},"A mudança é retro-compatível?"," Se sim, rolling resolve.",[136,1049,1050,1053],{},[296,1051,1052],{},"Existe métrica clara para detectar regressão em 5 min?"," Se sim, canary.",[136,1055,1056,1059],{},[296,1057,1058],{},"Rollback precisa ser instantâneo?"," Se sim, blue-green.",[136,1061,1062,1065],{},[296,1063,1064],{},"Vários clientes pagam para ficar em versão fixa?"," Aí, rainbow.",[10,1067,1068],{},"Na dúvida entre canary e blue-green, escolha a que combina com sua maturidade de observabilidade. Canary sem métricas viraja burocracia. Blue-green sem capacidade dobrada quebra na hora errada.",[10,1070,1071,1072,1077,1078,900,1081,1084,1085,1088],{},"Próximo passo: ",[1073,1074,1076],"a",{"href":1075},"\u002Fdocs\u002Foperacoes\u002Fcomandos-cli","referência completa do CLI"," com os comandos ",[128,1079,1080],{},"deploy promote",[128,1082,1083],{},"deploy abort"," e ",[128,1086,1087],{},"deploy pause"," usados aqui.",[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","Quatro estratégias de deploy. Quando usar cada uma, com exemplos completos e trade-offs honestos.",false,"md","i-lucide-git-branch","2026-04-26",{},"\u002Fdocs\u002Fdeploy\u002Frolling-canary-bluegreen",[1127],"primeiro-deploy","12 min",{"title":5,"description":1119},"docs\u002Fdeploy\u002Frolling-canary-bluegreen",[1118,115,339,607,1132],"estrategias","A-5HbQ7izVucruF1ZTwslW_xJFLuEG1iMwrZm42-Kag",[1135,1141,1146,1147,1153,1158,1163,1168,1173,1178,1184,1188,1194,1199],{"path":1136,"title":1137,"description":1138,"category":1139,"order":165,"icon":1140},"\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":1142,"title":1143,"description":1144,"category":1118,"order":165,"icon":1145},"\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.","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},"\u002Fdocs\u002Fobservabilidade\u002Fbackup-restore","Backup e restore do estado do cluster","Como salvar, agendar e restaurar snapshots do plano de controle do HeroCtl. Estratégia de disaster recovery.","observabilidade","i-lucide-archive",{"path":1154,"title":1155,"description":1156,"category":1151,"order":165,"icon":1157},"\u002Fdocs\u002Fobservabilidade\u002Fmetricas-logs","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":1075,"title":1159,"description":1160,"category":1161,"order":189,"icon":1162},"Referência completa do CLI","Todos os comandos heroctl com sinopse, flags e exemplo. Use como cola de mesa.","operacoes","i-lucide-terminal",{"path":1164,"title":1165,"description":1166,"category":1161,"order":165,"icon":1167},"\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":1169,"title":1170,"description":1171,"category":1161,"order":203,"icon":1172},"\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":1174,"title":1175,"description":1176,"category":1161,"order":180,"icon":1177},"\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":1179,"title":1180,"description":1181,"category":1182,"order":180,"icon":1183},"\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":1185,"title":1186,"description":1187,"category":1182,"order":165,"icon":1172},"\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":1189,"title":1190,"description":1191,"category":1192,"order":180,"icon":1193},"\u002Fdocs\u002Fseguranca\u002Frbac","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":1195,"title":1196,"description":1197,"category":1192,"order":165,"icon":1198},"\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":1200,"title":1201,"description":1202,"category":1203,"order":165,"icon":1204},"\u002Fdocs\u002Ftroubleshooting\u002Fproblemas-comuns","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",1777362178515]