[{"data":1,"prerenderedAt":1204},["ShallowReactive",2],{"doc-en-\u002Fen\u002Fdocs\u002Fdeploy\u002Frolling-canary-blue-green":3,"docs-en-all":1133},{"id":4,"title":5,"body":6,"category":1117,"description":1118,"draft":1119,"extension":1120,"icon":1121,"lastReviewed":1122,"meta":1123,"navigation":911,"order":180,"path":1124,"prerequisites":1125,"readingTime":1127,"seo":1128,"stem":1129,"tags":1130,"__hash__":1132},"docs_en\u002Fen\u002Fdocs\u002Fdeploy\u002Frolling-canary-blue-green.md","Rolling, canary, blue-green, and rainbow",{"type":7,"value":8,"toc":1092},"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,1017,1020,1023,1030,1032,1036,1039,1065,1068,1088],[10,11,12],"p",{},"Every update swaps code in production. The difference between the 4 strategies is in how much traffic sees the new code, for how long, and how fast you can go back if something breaks.",[14,15,17],"h2",{"id":16},"quick-comparison","Quick comparison",[19,20,21,43],"table",{},[22,23,24],"thead",{},[25,26,27,31,34,37,40],"tr",{},[28,29,30],"th",{},"Strategy",[28,32,33],{},"Risk",[28,35,36],{},"Cost",[28,38,39],{},"Speed",[28,41,42],{},"When to use",[44,45,46,63,79,95],"tbody",{},[25,47,48,52,55,58,60],{},[49,50,51],"td",{},"Rolling",[49,53,54],{},"medium",[49,56,57],{},"1x",[49,59,54],{},[49,61,62],{},"90% of cases",[25,64,65,68,71,73,76],{},[49,66,67],{},"Canary",[49,69,70],{},"low",[49,72,57],{},[49,74,75],{},"slow",[49,77,78],{},"risky change with clear metrics",[25,80,81,84,86,89,92],{},[49,82,83],{},"Blue-green",[49,85,70],{},[49,87,88],{},"2x",[49,90,91],{},"fast",[49,93,94],{},"rollback must be instant",[25,96,97,100,102,105,107],{},[49,98,99],{},"Rainbow",[49,101,70],{},[49,103,104],{},"Nx",[49,106,54],{},[49,108,109],{},"multiple coexisting versions (B2B)",[10,111,112],{},"There is no \"best strategy\". There is the right strategy for each change.",[14,114,51],{"id":115},"rolling",[10,117,118],{},"The default strategy. Replaces replicas one at a time (or in small batches), waiting for each new one to become healthy before touching the next.",[120,121,123],"h3",{"id":122},"how-it-works","How it works",[10,125,126,127,131],{},"Imagine 4 replicas running v1. Rolling update with ",[128,129,130],"code",{},"max_parallel: 1",":",[133,134,135,139,142],"ol",{},[136,137,138],"li",{},"Kill 1 v1 replica, bring up 1 v2. Wait healthy.",[136,140,141],{},"Kill another v1, bring up 1 v2. Wait healthy.",[136,143,144],{},"Repeat until all 4 are v2.",[10,146,147],{},"At any moment, there is a mix of v1 and v2 serving. For backward-compatible changes, ok. For schema or API contract changes, dangerous.",[120,149,151],{"id":150},"yaml-spec","YAML spec",[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],{},"Important parameters:",[291,292,293,300,306,312],"ul",{},[136,294,295,299],{},[296,297,298],"strong",{},"max_parallel"," — how many to swap at the same time. 1 is slower and safer.",[136,301,302,305],{},[296,303,304],{},"min_healthy_time"," — how long the new one must stay healthy before advancing. 30s catches most late crashes.",[136,307,308,311],{},[296,309,310],{},"healthy_deadline"," — past this, considers it a failure.",[136,313,314,317],{},[296,315,316],{},"auto_revert"," — reverts on its own if it fails.",[120,319,321],{"id":320},"trade-offs","Trade-offs",[10,323,324],{},"Zero extra cost. The version-mix window is the weak point. If v2 has a bug that only appears with real traffic, some users suffer before rollback.",[326,327,328],"blockquote",{},[10,329,330,333],{},[296,331,332],{},"Note:"," rolling update is the right choice when your changes are small, backward-compatible, and the app supports different active versions at the same time.",[335,336],"hr",{},[14,338,67],{"id":339},"canary",[10,341,342],{},"Instead of swapping replicas, canary injects a small amount of new ones and routes a slice of traffic to them. You watch metrics. If all good, you increase the slice. If metrics degrade, you revert.",[120,344,123],{"id":345},"how-it-works-1",[10,347,348,349,352],{},"With ",[128,350,351],{},"count: 10"," and canary configured for 5% \u002F 25% \u002F 50% \u002F 100%:",[133,354,355,358,361,364,367],{},[136,356,357],{},"Bring up 1 v2 replica next to the 10 v1. Route 5% of traffic to it.",[136,359,360],{},"Wait 5 min collecting metrics (latency, errors, CPU).",[136,362,363],{},"If metrics within baseline, bring up more v2 replicas and route 25%.",[136,365,366],{},"Repeat at 50% and 100%.",[136,368,369],{},"If at any step metrics worsen, revert automatically.",[120,371,151],{"id":372},"yaml-spec-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],{},"The ",[128,583,584],{},"analysis"," block defines what counts as \"ok\". If the new version has ",[128,587,588],{},"latency_p95"," of 300ms while the previous one had 200ms, the system reverts on its own before reaching 100%.",[120,591,321],{"id":592},"trade-offs-1",[10,594,595],{},"Slower (40 min to fully promote vs. 5 min for rolling). Requires reliable metrics and a clear baseline. If your application does not have well-defined business metrics, canary becomes theater.",[326,597,598],{},[10,599,600,602],{},[296,601,332],{}," use canary when the cost of a bad version in production is high and you have instrumentation to detect regression without depending on user tickets.",[335,604],{},[14,606,83],{"id":607},"blue-green",[10,609,610],{},"Two parallel environments. \"Blue\" receives 100% of traffic with the current version. \"Green\" comes up with the new version, empty. When healthy, instant traffic switch from blue to green.",[120,612,123],{"id":613},"how-it-works-2",[133,615,616,619,622,625,628,631],{},[136,617,618],{},"Initial state: blue (v1) receives 100%. Green does not exist.",[136,620,621],{},"Bring up green with v2, same number of replicas.",[136,623,624],{},"Wait for green to become healthy (no traffic, but with health check passing).",[136,626,627],{},"Switch: ingress now points to green. Blue stays alive, no traffic.",[136,629,630],{},"Observation period (15 min, for example).",[136,632,633],{},"If ok, discard blue. If something breaks, switch back in seconds.",[120,635,151],{"id":636},"yaml-spec-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",", the switch needs a manual command:",[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],{},"To revert:",[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],{},"Cost doubles during the validation window (4 + 4 replicas instead of 4). For apps with lots of memory or GPU, that hurts. In return, rollback is the fastest of the 4 strategies and there is no version mix in production at any moment.",[326,785,786],{},[10,787,788,791],{},[296,789,790],{},"Warning:"," blue-green does not solve database schema changes. If the new version needs a new column, it is still the application's responsibility to do the migration compatible with both versions during the window.",[335,793],{},[14,795,99],{"id":796},"rainbow",[10,798,799],{},"Multiple versions coexisting permanently, each serving a specific set of users. It is not an update strategy but an operating model.",[120,801,803],{"id":802},"when-it-makes-sense","When it makes sense",[10,805,806],{},"Only for B2B with clients that need a fixed version by contract. Examples:",[291,808,809,812,815],{},[136,810,811],{},"ERP where client A asked to be locked at v3.2 until they audit.",[136,813,814],{},"API that charges per SLA and the premium client has the right to change versions on demand.",[136,816,817],{},"Multi-tenant platform with heavy per-client customization.",[10,819,820],{},"In SaaS B2C or mass-market products, rainbow is waste.",[120,822,123],{"id":823},"how-it-works-3",[10,825,826],{},"Several versions of the same job running at the same time, each with a distinct tag. Routing by header, subdomain, or token claim decides which version answers each request.",[120,828,151],{"id":829},"yaml-spec-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,581,1009,1012,1013,1016],{},[128,1010,1011],{},"routing.tenants"," rule is evaluated on each request. Ingress routes by the token's ",[128,1014,1015],{},"tenant_id"," claim.",[120,1018,321],{"id":1019},"trade-offs-3",[10,1021,1022],{},"Cost proportional to the number of live versions. Operations get complex: each bug fix needs to be ported to all supported versions. Go rainbow only with contracts or regulation that justify it.",[326,1024,1025],{},[10,1026,1027,1029],{},[296,1028,790],{}," rainbow is easy to start and hard to leave. Before adopting, ask whether 2 \"green\" versions and a defined migration window do not solve the case.",[335,1031],{},[14,1033,1035],{"id":1034},"how-to-choose","How to choose",[10,1037,1038],{},"In question order:",[133,1040,1041,1047,1053,1059],{},[136,1042,1043,1046],{},[296,1044,1045],{},"Is the change backward-compatible?"," If yes, rolling solves it.",[136,1048,1049,1052],{},[296,1050,1051],{},"Is there a clear metric to detect regression in 5 min?"," If yes, canary.",[136,1054,1055,1058],{},[296,1056,1057],{},"Does rollback need to be instant?"," If yes, blue-green.",[136,1060,1061,1064],{},[296,1062,1063],{},"Do several clients pay to stay on a fixed version?"," Then, rainbow.",[10,1066,1067],{},"When in doubt between canary and blue-green, choose the one that matches your observability maturity. Canary without metrics turns into bureaucracy. Blue-green without doubled capacity breaks at the wrong time.",[10,1069,1070,1071,1076,1077,900,1080,1083,1084,1087],{},"Next step: ",[1072,1073,1075],"a",{"href":1074},"\u002Fen\u002Fdocs\u002Foperations\u002Fcli-reference","complete CLI reference"," with the ",[128,1078,1079],{},"deploy promote",[128,1081,1082],{},"deploy abort",", and ",[128,1085,1086],{},"deploy pause"," commands used here.",[1089,1090,1091],"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":1093},[1094,1095,1100,1105,1110,1116],{"id":16,"depth":180,"text":17},{"id":115,"depth":180,"text":51,"children":1096},[1097,1098,1099],{"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":1101},[1102,1103,1104],{"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":1106},[1107,1108,1109],{"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":1111},[1112,1113,1114,1115],{"id":802,"depth":189,"text":803},{"id":823,"depth":189,"text":123},{"id":829,"depth":189,"text":151},{"id":1019,"depth":189,"text":321},{"id":1034,"depth":180,"text":1035},"deploy","Four deploy strategies. When to use each, with complete examples and honest trade-offs.",false,"md","i-lucide-git-branch","2026-04-26",{},"\u002Fen\u002Fdocs\u002Fdeploy\u002Frolling-canary-blue-green",[1126],"primeiro-deploy","12 min read",{"title":5,"description":1118},"en\u002Fdocs\u002Fdeploy\u002Frolling-canary-blue-green",[1117,115,339,607,1131],"strategies","3tRYgrAPL93DrBDps4gLkU4RT9m-ov8VJu5O_V6YhIs",[1134,1140,1145,1146,1152,1157,1163,1168,1173,1178,1183,1187,1193,1198],{"path":1135,"title":1136,"description":1137,"category":1138,"order":165,"icon":1139},"\u002Fen\u002Fdocs\u002Fapi\u002Fapi-reference","REST API reference","Endpoints, JWT authentication, curl examples, and error patterns of the HeroCtl API.","api","i-lucide-code",{"path":1141,"title":1142,"description":1143,"category":1117,"order":165,"icon":1144},"\u002Fen\u002Fdocs\u002Fdeploy\u002Ffirst-deploy","Deploy your first app","Bring up a Node.js application with a Postgres database in 50 lines of YAML. Includes health check, rolling deploy, and rollback.","i-lucide-rocket",{"path":1124,"title":5,"description":1118,"category":1117,"order":180,"icon":1121},{"path":1147,"title":1148,"description":1149,"category":1150,"order":180,"icon":1151},"\u002Fen\u002Fdocs\u002Fnetworking\u002Ffirewall","Firewall configuration","Which ports HeroCtl uses, which need to stay open, and which should never be exposed to the internet.","rede","i-lucide-shield",{"path":1153,"title":1154,"description":1155,"category":1150,"order":165,"icon":1156},"\u002Fen\u002Fdocs\u002Fnetworking\u002Fingress-tls","Ingress and automatic TLS","How to expose applications on port 443 with certificates issued and renewed automatically, without operating an external router.","i-lucide-globe",{"path":1158,"title":1159,"description":1160,"category":1161,"order":180,"icon":1162},"\u002Fen\u002Fdocs\u002Fobservability\u002Fbackup-restore","Backup and restore of cluster state","How to save, schedule, and restore HeroCtl control plane snapshots. Disaster recovery strategy.","observabilidade","i-lucide-archive",{"path":1164,"title":1165,"description":1166,"category":1161,"order":165,"icon":1167},"\u002Fen\u002Fdocs\u002Fobservability\u002Fmetrics-logs","Metrics and logs","Collect metrics, logs, and traces without standing up an external observability stack. When it's worth it, and when to integrate with an outside tool.","i-lucide-activity",{"path":1074,"title":1169,"description":1170,"category":1171,"order":189,"icon":1172},"Complete CLI reference","All heroctl commands with synopsis, flags, and example. Use as a desk reference.","operacoes","i-lucide-terminal",{"path":1174,"title":1175,"description":1176,"category":1171,"order":180,"icon":1177},"\u002Fen\u002Fdocs\u002Foperations\u002Ffirst-cluster","Bring up a 3-node cluster","Form a cluster with 3 servers in under 10 minutes. Tolerates 1-node failure with no downtime.","i-lucide-network",{"path":1179,"title":1180,"description":1181,"category":1171,"order":165,"icon":1182},"\u002Fen\u002Fdocs\u002Foperations\u002Finstallation","Installation","Install HeroCtl on any Linux server with Docker in a single command. Covers prerequisites, bootstrap, and verification.","i-lucide-download",{"path":1184,"title":1185,"description":1186,"category":1171,"order":203,"icon":1156},"\u002Fen\u002Fdocs\u002Foperations\u002Fmulti-region","Multi-region (planned for Q4 2026)","What to expect from multi-region in HeroCtl, how to run across regions today, and the roadmap through 2027.",{"path":1188,"title":1189,"description":1190,"category":1191,"order":180,"icon":1192},"\u002Fen\u002Fdocs\u002Fsecurity\u002Frbac","RBAC and access control (Business+)","Role, policy, and token model to limit who can submit, read, and operate the cluster.","seguranca","i-lucide-users",{"path":1194,"title":1195,"description":1196,"category":1191,"order":165,"icon":1197},"\u002Fen\u002Fdocs\u002Fsecurity\u002Fsecrets","Secret management","How to keep passwords, tokens, and keys outside the job spec, with encryption at rest and versioned rotation.","i-lucide-key",{"path":1199,"title":1200,"description":1201,"category":1202,"order":165,"icon":1203},"\u002Fen\u002Fdocs\u002Ftroubleshooting\u002Fcommon-problems","Troubleshooting common problems","The 12 most frequent problems in HeroCtl clusters, with symptom, diagnosis, and step-by-step fix.","troubleshooting","i-lucide-alert-triangle",1777362181463]