[{"data":1,"prerenderedAt":1913},["ShallowReactive",2],{"doc-en-\u002Fen\u002Fdocs\u002Foperations\u002Fcli-reference":3,"docs-en-all":1843},{"id":4,"title":5,"body":6,"category":1825,"description":1826,"draft":1827,"extension":1828,"icon":1829,"lastReviewed":1830,"meta":1831,"navigation":1832,"order":612,"path":1833,"prerequisites":1834,"readingTime":1835,"seo":1836,"stem":1837,"tags":1838,"__hash__":1842},"docs_en\u002Fen\u002Fdocs\u002Foperations\u002Fcli-reference.md","Complete CLI reference",{"type":7,"value":8,"toc":1753},"minimark",[9,24,29,32,39,42,77,93,99,102,141,155,162,173,176,180,183,189,192,213,219,225,228,262,274,280,283,316,322,325,344,350,353,369,383,385,389,392,398,401,421,429,435,438,455,461,464,487,496,502,505,537,539,543,546,552,555,573,583,589,592,616,622,625,642,648,651,667,673,676,696,710,716,719,741,747,750,772,774,778,781,787,790,815,821,824,840,846,849,864,870,873,888,894,900,923,925,929,932,938,941,982,988,991,1020,1026,1033,1063,1069,1072,1093,1099,1102,1118,1120,1124,1131,1137,1140,1158,1164,1167,1188,1194,1197,1213,1219,1222,1238,1244,1247,1263,1265,1269,1272,1278,1281,1300,1306,1309,1325,1327,1331,1337,1340,1359,1365,1368,1391,1393,1397,1403,1406,1451,1467,1469,1473,1476,1482,1485,1503,1506,1512,1515,1533,1540,1546,1549,1580,1582,1586,1592,1595,1627,1633,1636,1653,1655,1659,1746,1749],[10,11,12,13,17,18,23],"p",{},"This page lists every command of the ",[14,15,16],"code",{},"heroctl"," binary. Use as a desk reference, not as a tutorial. For an introduction, start at ",[19,20,22],"a",{"href":21},"\u002Fen\u002Fdocs\u002Foperations\u002Finstallation","Installation",".",[25,26,28],"h2",{"id":27},"binary-modes","Binary modes",[10,30,31],{},"The same executable changes role via the initial flag.",[33,34,36],"h3",{"id":35},"heroctl-server",[14,37,38],{},"heroctl server",[10,40,41],{},"Starts the control plane. Runs as a systemd service in production.",[43,44,49],"pre",{"className":45,"code":46,"language":47,"meta":48,"style":48},"language-bash shiki shiki-themes github-dark-default","sudo heroctl server --bootstrap --advertise 10.0.0.1\n","bash","",[14,50,51],{"__ignoreMap":48},[52,53,56,60,64,67,71,74],"span",{"class":54,"line":55},"line",1,[52,57,59],{"class":58},"sQhOw","sudo",[52,61,63],{"class":62},"s9uIt"," heroctl",[52,65,66],{"class":62}," server",[52,68,70],{"class":69},"sFSAA"," --bootstrap",[52,72,73],{"class":69}," --advertise",[52,75,76],{"class":69}," 10.0.0.1\n",[10,78,79,80,83,84,83,87,83,90,23],{},"Main flags: ",[14,81,82],{},"--bootstrap",", ",[14,85,86],{},"--advertise",[14,88,89],{},"--config",[14,91,92],{},"--data-dir",[33,94,96],{"id":95},"heroctl-agent",[14,97,98],{},"heroctl agent",[10,100,101],{},"Starts a worker. Runs containers and reports health.",[43,103,105],{"className":45,"code":104,"language":47,"meta":48,"style":48},"sudo heroctl agent --token \u003CT> --advertise 10.0.0.10 --servers 10.0.0.1:8080,10.0.0.2:8080,10.0.0.3:8080\n",[14,106,107],{"__ignoreMap":48},[52,108,109,111,113,116,119,123,127,130,132,135,138],{"class":54,"line":55},[52,110,59],{"class":58},[52,112,63],{"class":62},[52,114,115],{"class":62}," agent",[52,117,118],{"class":69}," --token",[52,120,122],{"class":121},"suJrU"," \u003C",[52,124,126],{"class":125},"sZEs4","T",[52,128,129],{"class":121},">",[52,131,73],{"class":69},[52,133,134],{"class":69}," 10.0.0.10",[52,136,137],{"class":69}," --servers",[52,139,140],{"class":62}," 10.0.0.1:8080,10.0.0.2:8080,10.0.0.3:8080\n",[10,142,143,144,83,147,83,149,83,152,23],{},"Flags: ",[14,145,146],{},"--token",[14,148,86],{},[14,150,151],{},"--servers",[14,153,154],{},"--node-class",[33,156,158,161],{"id":157},"heroctl-cmd-cli-mode",[14,159,160],{},"heroctl \u003Ccmd>"," (CLI mode)",[10,163,164,165,168,169,172],{},"Without a mode flag, the binary becomes a client. It reads the server address from the ",[14,166,167],{},"HEROCTL_ADDR"," variable or the ",[14,170,171],{},"--addr"," flag.",[174,175],"hr",{},[25,177,179],{"id":178},"cluster","Cluster",[10,181,182],{},"Commands that change the control plane topology.",[33,184,186],{"id":185},"heroctl-cluster-init",[14,187,188],{},"heroctl cluster init",[10,190,191],{},"Creates the first node. Runs once per install.",[43,193,195],{"className":45,"code":194,"language":47,"meta":48,"style":48},"sudo heroctl cluster init --advertise 10.0.0.1\n",[14,196,197],{"__ignoreMap":48},[52,198,199,201,203,206,209,211],{"class":54,"line":55},[52,200,59],{"class":58},[52,202,63],{"class":62},[52,204,205],{"class":62}," cluster",[52,207,208],{"class":62}," init",[52,210,73],{"class":69},[52,212,76],{"class":69},[10,214,215,216,23],{},"Output: ",[14,217,218],{},"cluster initialized, node-id: node-1",[33,220,222],{"id":221},"heroctl-cluster-join",[14,223,224],{},"heroctl cluster join",[10,226,227],{},"Adds a server to an existing cluster.",[43,229,231],{"className":45,"code":230,"language":47,"meta":48,"style":48},"sudo heroctl cluster join --token \u003CT> --advertise 10.0.0.2 --servers 10.0.0.1:8080\n",[14,232,233],{"__ignoreMap":48},[52,234,235,237,239,241,244,246,248,250,252,254,257,259],{"class":54,"line":55},[52,236,59],{"class":58},[52,238,63],{"class":62},[52,240,205],{"class":62},[52,242,243],{"class":62}," join",[52,245,118],{"class":69},[52,247,122],{"class":121},[52,249,126],{"class":125},[52,251,129],{"class":121},[52,253,73],{"class":69},[52,255,256],{"class":69}," 10.0.0.2",[52,258,137],{"class":69},[52,260,261],{"class":62}," 10.0.0.1:8080\n",[10,263,143,264,83,266,83,268,83,270,273],{},[14,265,146],{},[14,267,86],{},[14,269,151],{},[14,271,272],{},"--role"," (server|agent).",[33,275,277],{"id":276},"heroctl-cluster-join-token",[14,278,279],{},"heroctl cluster join-token",[10,281,282],{},"Generates a signed token with TTL.",[43,284,286],{"className":45,"code":285,"language":47,"meta":48,"style":48},"heroctl cluster join-token --ttl 1h --role server\n# eyJhbGciOi...8X7Z\n",[14,287,288,309],{"__ignoreMap":48},[52,289,290,292,294,297,300,303,306],{"class":54,"line":55},[52,291,16],{"class":58},[52,293,205],{"class":62},[52,295,296],{"class":62}," join-token",[52,298,299],{"class":69}," --ttl",[52,301,302],{"class":62}," 1h",[52,304,305],{"class":69}," --role",[52,307,308],{"class":62}," server\n",[52,310,312],{"class":54,"line":311},2,[52,313,315],{"class":314},"sH3jZ","# eyJhbGciOi...8X7Z\n",[33,317,319],{"id":318},"heroctl-cluster-status",[14,320,321],{},"heroctl cluster status",[10,323,324],{},"Overview of the control plane.",[43,326,328],{"className":45,"code":327,"language":47,"meta":48,"style":48},"heroctl cluster status\n# cluster: 3 nodes, quorum: ok, leader: node-1\n",[14,329,330,339],{"__ignoreMap":48},[52,331,332,334,336],{"class":54,"line":55},[52,333,16],{"class":58},[52,335,205],{"class":62},[52,337,338],{"class":62}," status\n",[52,340,341],{"class":54,"line":311},[52,342,343],{"class":314},"# cluster: 3 nodes, quorum: ok, leader: node-1\n",[33,345,347],{"id":346},"heroctl-cluster-leave",[14,348,349],{},"heroctl cluster leave",[10,351,352],{},"Removes the current node from the cluster with an orderly exit.",[43,354,356],{"className":45,"code":355,"language":47,"meta":48,"style":48},"sudo heroctl cluster leave\n",[14,357,358],{"__ignoreMap":48},[52,359,360,362,364,366],{"class":54,"line":55},[52,361,59],{"class":58},[52,363,63],{"class":62},[52,365,205],{"class":62},[52,367,368],{"class":62}," leave\n",[370,371,372],"blockquote",{},[10,373,374,378,379,382],{},[375,376,377],"strong",{},"Warning:"," leaving without ",[14,380,381],{},"drain"," first interrupts running containers. Always drain first.",[174,384],{},[25,386,388],{"id":387},"nodes","Nodes",[10,390,391],{},"Commands that affect an individual node.",[33,393,395],{"id":394},"heroctl-node-list",[14,396,397],{},"heroctl node list",[10,399,400],{},"Lists all nodes with status.",[43,402,404],{"className":45,"code":403,"language":47,"meta":48,"style":48},"heroctl node list\n# node-1  server  ready   3.2 GB free   2 jobs\n",[14,405,406,416],{"__ignoreMap":48},[52,407,408,410,413],{"class":54,"line":55},[52,409,16],{"class":58},[52,411,412],{"class":62}," node",[52,414,415],{"class":62}," list\n",[52,417,418],{"class":54,"line":311},[52,419,420],{"class":314},"# node-1  server  ready   3.2 GB free   2 jobs\n",[10,422,143,423,83,426,23],{},[14,424,425],{},"--filter status=ready",[14,427,428],{},"--json",[33,430,432],{"id":431},"heroctl-node-info",[14,433,434],{},"heroctl node info",[10,436,437],{},"Details of a node: resources, allocs, events.",[43,439,441],{"className":45,"code":440,"language":47,"meta":48,"style":48},"heroctl node info node-2\n",[14,442,443],{"__ignoreMap":48},[52,444,445,447,449,452],{"class":54,"line":55},[52,446,16],{"class":58},[52,448,412],{"class":62},[52,450,451],{"class":62}," info",[52,453,454],{"class":62}," node-2\n",[33,456,458],{"id":457},"heroctl-node-drain",[14,459,460],{},"heroctl node drain",[10,462,463],{},"Moves workloads to other nodes and prevents new jobs. Use before maintenance.",[43,465,467],{"className":45,"code":466,"language":47,"meta":48,"style":48},"heroctl node drain node-2 --deadline 5m\n",[14,468,469],{"__ignoreMap":48},[52,470,471,473,475,478,481,484],{"class":54,"line":55},[52,472,16],{"class":58},[52,474,412],{"class":62},[52,476,477],{"class":62}," drain",[52,479,480],{"class":62}," node-2",[52,482,483],{"class":69}," --deadline",[52,485,486],{"class":62}," 5m\n",[10,488,143,489,83,492,495],{},[14,490,491],{},"--deadline",[14,493,494],{},"--force"," (does not wait).",[33,497,499],{"id":498},"heroctl-node-eligibility",[14,500,501],{},"heroctl node eligibility",[10,503,504],{},"Marks a node as eligible or not to receive workloads.",[43,506,508],{"className":45,"code":507,"language":47,"meta":48,"style":48},"heroctl node eligibility node-2 --ineligible\nheroctl node eligibility node-2 --eligible\n",[14,509,510,524],{"__ignoreMap":48},[52,511,512,514,516,519,521],{"class":54,"line":55},[52,513,16],{"class":58},[52,515,412],{"class":62},[52,517,518],{"class":62}," eligibility",[52,520,480],{"class":62},[52,522,523],{"class":69}," --ineligible\n",[52,525,526,528,530,532,534],{"class":54,"line":311},[52,527,16],{"class":58},[52,529,412],{"class":62},[52,531,518],{"class":62},[52,533,480],{"class":62},[52,535,536],{"class":69}," --eligible\n",[174,538],{},[25,540,542],{"id":541},"jobs","Jobs",[10,544,545],{},"Application definition. Heart of the system.",[33,547,549],{"id":548},"heroctl-job-submit",[14,550,551],{},"heroctl job submit",[10,553,554],{},"Sends a YAML spec to the cluster.",[43,556,558],{"className":45,"code":557,"language":47,"meta":48,"style":48},"heroctl job submit app.yaml\n",[14,559,560],{"__ignoreMap":48},[52,561,562,564,567,570],{"class":54,"line":55},[52,563,16],{"class":58},[52,565,566],{"class":62}," job",[52,568,569],{"class":62}," submit",[52,571,572],{"class":62}," app.yaml\n",[10,574,143,575,578,579,582],{},[14,576,577],{},"--detach"," (does not follow), ",[14,580,581],{},"--no-rolling"," (immediate deploy).",[33,584,586],{"id":585},"heroctl-job-list",[14,587,588],{},"heroctl job list",[10,590,591],{},"All cluster jobs.",[43,593,595],{"className":45,"code":594,"language":47,"meta":48,"style":48},"heroctl job list\n# api-vendas    running   2\u002F2   v3   2h\n# worker-email  running   1\u002F1   v1   5d\n",[14,596,597,605,610],{"__ignoreMap":48},[52,598,599,601,603],{"class":54,"line":55},[52,600,16],{"class":58},[52,602,566],{"class":62},[52,604,415],{"class":62},[52,606,607],{"class":54,"line":311},[52,608,609],{"class":314},"# api-vendas    running   2\u002F2   v3   2h\n",[52,611,613],{"class":54,"line":612},3,[52,614,615],{"class":314},"# worker-email  running   1\u002F1   v1   5d\n",[33,617,619],{"id":618},"heroctl-job-status",[14,620,621],{},"heroctl job status",[10,623,624],{},"Detailed state of a job: tasks, allocs, events.",[43,626,628],{"className":45,"code":627,"language":47,"meta":48,"style":48},"heroctl job status api-vendas\n",[14,629,630],{"__ignoreMap":48},[52,631,632,634,636,639],{"class":54,"line":55},[52,633,16],{"class":58},[52,635,566],{"class":62},[52,637,638],{"class":62}," status",[52,640,641],{"class":62}," api-vendas\n",[33,643,645],{"id":644},"heroctl-job-restart",[14,646,647],{},"heroctl job restart",[10,649,650],{},"Restarts all replicas with the same version. Useful after changing secrets.",[43,652,654],{"className":45,"code":653,"language":47,"meta":48,"style":48},"heroctl job restart api-vendas\n",[14,655,656],{"__ignoreMap":48},[52,657,658,660,662,665],{"class":54,"line":55},[52,659,16],{"class":58},[52,661,566],{"class":62},[52,663,664],{"class":62}," restart",[52,666,641],{"class":62},[33,668,670],{"id":669},"heroctl-job-stop",[14,671,672],{},"heroctl job stop",[10,674,675],{},"Stops the job and removes containers.",[43,677,679],{"className":45,"code":678,"language":47,"meta":48,"style":48},"heroctl job stop api-vendas --purge\n",[14,680,681],{"__ignoreMap":48},[52,682,683,685,687,690,693],{"class":54,"line":55},[52,684,16],{"class":58},[52,686,566],{"class":62},[52,688,689],{"class":62}," stop",[52,691,692],{"class":62}," api-vendas",[52,694,695],{"class":69}," --purge\n",[10,697,698,699,702,703,706,707,23],{},"The ",[14,700,701],{},"--purge"," flag erases history. Without it, the job stays in ",[14,704,705],{},"stopped"," and can come back with ",[14,708,709],{},"submit",[33,711,713],{"id":712},"heroctl-job-scale",[14,714,715],{},"heroctl job scale",[10,717,718],{},"Changes replica count without a new deploy.",[43,720,722],{"className":45,"code":721,"language":47,"meta":48,"style":48},"heroctl job scale api-vendas web=4\n",[14,723,724],{"__ignoreMap":48},[52,725,726,728,730,733,735,738],{"class":54,"line":55},[52,727,16],{"class":58},[52,729,566],{"class":62},[52,731,732],{"class":62}," scale",[52,734,692],{"class":62},[52,736,737],{"class":62}," web=",[52,739,740],{"class":69},"4\n",[33,742,744],{"id":743},"heroctl-job-revert",[14,745,746],{},"heroctl job revert",[10,748,749],{},"Goes back to a previous version.",[43,751,753],{"className":45,"code":752,"language":47,"meta":48,"style":48},"heroctl job revert api-vendas --version 2\n",[14,754,755],{"__ignoreMap":48},[52,756,757,759,761,764,766,769],{"class":54,"line":55},[52,758,16],{"class":58},[52,760,566],{"class":62},[52,762,763],{"class":62}," revert",[52,765,692],{"class":62},[52,767,768],{"class":69}," --version",[52,770,771],{"class":69}," 2\n",[174,773],{},[25,775,777],{"id":776},"allocations","Allocations",[10,779,780],{},"An alloc is a replica running on a node.",[33,782,784],{"id":783},"heroctl-alloc-list",[14,785,786],{},"heroctl alloc list",[10,788,789],{},"Lists replicas of a job.",[43,791,793],{"className":45,"code":792,"language":47,"meta":48,"style":48},"heroctl alloc list --job api-vendas\n# web-c3d4   node-1   running   healthy   2h\n",[14,794,795,810],{"__ignoreMap":48},[52,796,797,799,802,805,808],{"class":54,"line":55},[52,798,16],{"class":58},[52,800,801],{"class":62}," alloc",[52,803,804],{"class":62}," list",[52,806,807],{"class":69}," --job",[52,809,641],{"class":62},[52,811,812],{"class":54,"line":311},[52,813,814],{"class":314},"# web-c3d4   node-1   running   healthy   2h\n",[33,816,818],{"id":817},"heroctl-alloc-info",[14,819,820],{},"heroctl alloc info",[10,822,823],{},"Details: image, resources, events, restarts.",[43,825,827],{"className":45,"code":826,"language":47,"meta":48,"style":48},"heroctl alloc info web-c3d4\n",[14,828,829],{"__ignoreMap":48},[52,830,831,833,835,837],{"class":54,"line":55},[52,832,16],{"class":58},[52,834,801],{"class":62},[52,836,451],{"class":62},[52,838,839],{"class":62}," web-c3d4\n",[33,841,843],{"id":842},"heroctl-alloc-stop",[14,844,845],{},"heroctl alloc stop",[10,847,848],{},"Kills a replica. The cluster recreates it on another node.",[43,850,852],{"className":45,"code":851,"language":47,"meta":48,"style":48},"heroctl alloc stop web-c3d4\n",[14,853,854],{"__ignoreMap":48},[52,855,856,858,860,862],{"class":54,"line":55},[52,857,16],{"class":58},[52,859,801],{"class":62},[52,861,689],{"class":62},[52,863,839],{"class":62},[33,865,867],{"id":866},"heroctl-alloc-restart",[14,868,869],{},"heroctl alloc restart",[10,871,872],{},"Restarts the container while keeping the alloc.",[43,874,876],{"className":45,"code":875,"language":47,"meta":48,"style":48},"heroctl alloc restart web-c3d4\n",[14,877,878],{"__ignoreMap":48},[52,879,880,882,884,886],{"class":54,"line":55},[52,881,16],{"class":58},[52,883,801],{"class":62},[52,885,664],{"class":62},[52,887,839],{"class":62},[33,889,891],{"id":890},"heroctl-alloc-logs",[14,892,893],{},"heroctl alloc logs",[10,895,896,897,23],{},"Shortcut for ",[14,898,899],{},"heroctl logs --alloc",[43,901,903],{"className":45,"code":902,"language":47,"meta":48,"style":48},"heroctl alloc logs web-c3d4 --since 10m\n",[14,904,905],{"__ignoreMap":48},[52,906,907,909,911,914,917,920],{"class":54,"line":55},[52,908,16],{"class":58},[52,910,801],{"class":62},[52,912,913],{"class":62}," logs",[52,915,916],{"class":62}," web-c3d4",[52,918,919],{"class":69}," --since",[52,921,922],{"class":62}," 10m\n",[174,924],{},[25,926,928],{"id":927},"secrets","Secrets",[10,930,931],{},"Sensitive values injected at runtime.",[33,933,935],{"id":934},"heroctl-secret-create",[14,936,937],{},"heroctl secret create",[10,939,940],{},"Creates a secret.",[43,942,944],{"className":45,"code":943,"language":47,"meta":48,"style":48},"heroctl secret create db-password --value 'sN9kL...'\nheroctl secret create tls-cert --file .\u002Fcert.pem\n",[14,945,946,965],{"__ignoreMap":48},[52,947,948,950,953,956,959,962],{"class":54,"line":55},[52,949,16],{"class":58},[52,951,952],{"class":62}," secret",[52,954,955],{"class":62}," create",[52,957,958],{"class":62}," db-password",[52,960,961],{"class":69}," --value",[52,963,964],{"class":62}," 'sN9kL...'\n",[52,966,967,969,971,973,976,979],{"class":54,"line":311},[52,968,16],{"class":58},[52,970,952],{"class":62},[52,972,955],{"class":62},[52,974,975],{"class":62}," tls-cert",[52,977,978],{"class":69}," --file",[52,980,981],{"class":62}," .\u002Fcert.pem\n",[33,983,985],{"id":984},"heroctl-secret-list",[14,986,987],{},"heroctl secret list",[10,989,990],{},"Lists names (values never appear).",[43,992,994],{"className":45,"code":993,"language":47,"meta":48,"style":48},"heroctl secret list\n# NAME            VERSION  CREATED\n# db-password     3        2d ago\n# jwt-secret      1        5d ago\n",[14,995,996,1004,1009,1014],{"__ignoreMap":48},[52,997,998,1000,1002],{"class":54,"line":55},[52,999,16],{"class":58},[52,1001,952],{"class":62},[52,1003,415],{"class":62},[52,1005,1006],{"class":54,"line":311},[52,1007,1008],{"class":314},"# NAME            VERSION  CREATED\n",[52,1010,1011],{"class":54,"line":612},[52,1012,1013],{"class":314},"# db-password     3        2d ago\n",[52,1015,1017],{"class":54,"line":1016},4,[52,1018,1019],{"class":314},"# jwt-secret      1        5d ago\n",[33,1021,1023],{"id":1022},"heroctl-secret-get",[14,1024,1025],{},"heroctl secret get",[10,1027,1028,1029,1032],{},"Shows metadata. The value only comes out with ",[14,1030,1031],{},"--reveal"," and audit.",[43,1034,1036],{"className":45,"code":1035,"language":47,"meta":48,"style":48},"heroctl secret get db-password\nheroctl secret get db-password --reveal\n",[14,1037,1038,1050],{"__ignoreMap":48},[52,1039,1040,1042,1044,1047],{"class":54,"line":55},[52,1041,16],{"class":58},[52,1043,952],{"class":62},[52,1045,1046],{"class":62}," get",[52,1048,1049],{"class":62}," db-password\n",[52,1051,1052,1054,1056,1058,1060],{"class":54,"line":311},[52,1053,16],{"class":58},[52,1055,952],{"class":62},[52,1057,1046],{"class":62},[52,1059,958],{"class":62},[52,1061,1062],{"class":69}," --reveal\n",[33,1064,1066],{"id":1065},"heroctl-secret-update",[14,1067,1068],{},"heroctl secret update",[10,1070,1071],{},"Creates a new version. Jobs that reference it pick up at the next restart.",[43,1073,1075],{"className":45,"code":1074,"language":47,"meta":48,"style":48},"heroctl secret update db-password --value 'nNnK7...'\n",[14,1076,1077],{"__ignoreMap":48},[52,1078,1079,1081,1083,1086,1088,1090],{"class":54,"line":55},[52,1080,16],{"class":58},[52,1082,952],{"class":62},[52,1084,1085],{"class":62}," update",[52,1087,958],{"class":62},[52,1089,961],{"class":69},[52,1091,1092],{"class":62}," 'nNnK7...'\n",[33,1094,1096],{"id":1095},"heroctl-secret-delete",[14,1097,1098],{},"heroctl secret delete",[10,1100,1101],{},"Removes. Fails if any active job references it.",[43,1103,1105],{"className":45,"code":1104,"language":47,"meta":48,"style":48},"heroctl secret delete db-password\n",[14,1106,1107],{"__ignoreMap":48},[52,1108,1109,1111,1113,1116],{"class":54,"line":55},[52,1110,16],{"class":58},[52,1112,952],{"class":62},[52,1114,1115],{"class":62}," delete",[52,1117,1049],{"class":62},[174,1119],{},[25,1121,1123],{"id":1122},"deploys","Deploys",[10,1125,1126,1127,1130],{},"Each ",[14,1128,1129],{},"job submit"," creates a deploy. The commands below control that process.",[33,1132,1134],{"id":1133},"heroctl-deploy-list",[14,1135,1136],{},"heroctl deploy list",[10,1138,1139],{},"Deploy history.",[43,1141,1143],{"className":45,"code":1142,"language":47,"meta":48,"style":48},"heroctl deploy list --job api-vendas\n",[14,1144,1145],{"__ignoreMap":48},[52,1146,1147,1149,1152,1154,1156],{"class":54,"line":55},[52,1148,16],{"class":58},[52,1150,1151],{"class":62}," deploy",[52,1153,804],{"class":62},[52,1155,807],{"class":69},[52,1157,641],{"class":62},[33,1159,1161],{"id":1160},"heroctl-deploy-status",[14,1162,1163],{},"heroctl deploy status",[10,1165,1166],{},"Current progress.",[43,1168,1170],{"className":45,"code":1169,"language":47,"meta":48,"style":48},"heroctl deploy status dep-2026-04-26-001\n# strategy: rolling, progress: 2\u002F2, state: complete\n",[14,1171,1172,1183],{"__ignoreMap":48},[52,1173,1174,1176,1178,1180],{"class":54,"line":55},[52,1175,16],{"class":58},[52,1177,1151],{"class":62},[52,1179,638],{"class":62},[52,1181,1182],{"class":62}," dep-2026-04-26-001\n",[52,1184,1185],{"class":54,"line":311},[52,1186,1187],{"class":314},"# strategy: rolling, progress: 2\u002F2, state: complete\n",[33,1189,1191],{"id":1190},"heroctl-deploy-pause",[14,1192,1193],{},"heroctl deploy pause",[10,1195,1196],{},"Freezes a rolling update in progress. Already-swapped allocs stay new, the rest wait.",[43,1198,1200],{"className":45,"code":1199,"language":47,"meta":48,"style":48},"heroctl deploy pause dep-2026-04-26-001\n",[14,1201,1202],{"__ignoreMap":48},[52,1203,1204,1206,1208,1211],{"class":54,"line":55},[52,1205,16],{"class":58},[52,1207,1151],{"class":62},[52,1209,1210],{"class":62}," pause",[52,1212,1182],{"class":62},[33,1214,1216],{"id":1215},"heroctl-deploy-resume",[14,1217,1218],{},"heroctl deploy resume",[10,1220,1221],{},"Continues a paused deploy.",[43,1223,1225],{"className":45,"code":1224,"language":47,"meta":48,"style":48},"heroctl deploy resume dep-2026-04-26-001\n",[14,1226,1227],{"__ignoreMap":48},[52,1228,1229,1231,1233,1236],{"class":54,"line":55},[52,1230,16],{"class":58},[52,1232,1151],{"class":62},[52,1234,1235],{"class":62}," resume",[52,1237,1182],{"class":62},[33,1239,1241],{"id":1240},"heroctl-deploy-abort",[14,1242,1243],{},"heroctl deploy abort",[10,1245,1246],{},"Cancels and reverts to the previous version.",[43,1248,1250],{"className":45,"code":1249,"language":47,"meta":48,"style":48},"heroctl deploy abort dep-2026-04-26-001\n",[14,1251,1252],{"__ignoreMap":48},[52,1253,1254,1256,1258,1261],{"class":54,"line":55},[52,1255,16],{"class":58},[52,1257,1151],{"class":62},[52,1259,1260],{"class":62}," abort",[52,1262,1182],{"class":62},[174,1264],{},[25,1266,1268],{"id":1267},"ingress","Ingress",[10,1270,1271],{},"Public domains routed to jobs.",[33,1273,1275],{"id":1274},"heroctl-ingress-list",[14,1276,1277],{},"heroctl ingress list",[10,1279,1280],{},"All active domains.",[43,1282,1284],{"className":45,"code":1283,"language":47,"meta":48,"style":48},"heroctl ingress list\n# api.minhaempresa.com   api-vendas\u002Fweb   tls   2 backends\n",[14,1285,1286,1295],{"__ignoreMap":48},[52,1287,1288,1290,1293],{"class":54,"line":55},[52,1289,16],{"class":58},[52,1291,1292],{"class":62}," ingress",[52,1294,415],{"class":62},[52,1296,1297],{"class":54,"line":311},[52,1298,1299],{"class":314},"# api.minhaempresa.com   api-vendas\u002Fweb   tls   2 backends\n",[33,1301,1303],{"id":1302},"heroctl-ingress-info",[14,1304,1305],{},"heroctl ingress info",[10,1307,1308],{},"Details of a domain: backends, certificate, metrics.",[43,1310,1312],{"className":45,"code":1311,"language":47,"meta":48,"style":48},"heroctl ingress info api.minhaempresa.com\n",[14,1313,1314],{"__ignoreMap":48},[52,1315,1316,1318,1320,1322],{"class":54,"line":55},[52,1317,16],{"class":58},[52,1319,1292],{"class":62},[52,1321,451],{"class":62},[52,1323,1324],{"class":62}," api.minhaempresa.com\n",[174,1326],{},[25,1328,1330],{"id":1329},"metrics","Metrics",[33,1332,1334],{"id":1333},"heroctl-metrics-status",[14,1335,1336],{},"heroctl metrics status",[10,1338,1339],{},"State of the internal collector.",[43,1341,1343],{"className":45,"code":1342,"language":47,"meta":48,"style":48},"heroctl metrics status\n# scraping: 14 targets, last_run: 12s ago\n",[14,1344,1345,1354],{"__ignoreMap":48},[52,1346,1347,1349,1352],{"class":54,"line":55},[52,1348,16],{"class":58},[52,1350,1351],{"class":62}," metrics",[52,1353,338],{"class":62},[52,1355,1356],{"class":54,"line":311},[52,1357,1358],{"class":314},"# scraping: 14 targets, last_run: 12s ago\n",[33,1360,1362],{"id":1361},"heroctl-metrics-query",[14,1363,1364],{},"heroctl metrics query",[10,1366,1367],{},"Ad-hoc query by metric name.",[43,1369,1371],{"className":45,"code":1370,"language":47,"meta":48,"style":48},"heroctl metrics query 'cpu_usage{job=\"api-vendas\"}' --range 1h\n",[14,1372,1373],{"__ignoreMap":48},[52,1374,1375,1377,1379,1382,1385,1388],{"class":54,"line":55},[52,1376,16],{"class":58},[52,1378,1351],{"class":62},[52,1380,1381],{"class":62}," query",[52,1383,1384],{"class":62}," 'cpu_usage{job=\"api-vendas\"}'",[52,1386,1387],{"class":69}," --range",[52,1389,1390],{"class":62}," 1h\n",[174,1392],{},[25,1394,1396],{"id":1395},"logs","Logs",[33,1398,1400],{"id":1399},"heroctl-logs",[14,1401,1402],{},"heroctl logs",[10,1404,1405],{},"One interface, three targets.",[43,1407,1409],{"className":45,"code":1408,"language":47,"meta":48,"style":48},"heroctl logs --job api-vendas\nheroctl logs --alloc web-c3d4\nheroctl logs --job api-vendas --task web -f\n",[14,1410,1411,1421,1432],{"__ignoreMap":48},[52,1412,1413,1415,1417,1419],{"class":54,"line":55},[52,1414,16],{"class":58},[52,1416,913],{"class":62},[52,1418,807],{"class":69},[52,1420,641],{"class":62},[52,1422,1423,1425,1427,1430],{"class":54,"line":311},[52,1424,16],{"class":58},[52,1426,913],{"class":62},[52,1428,1429],{"class":69}," --alloc",[52,1431,839],{"class":62},[52,1433,1434,1436,1438,1440,1442,1445,1448],{"class":54,"line":612},[52,1435,16],{"class":58},[52,1437,913],{"class":62},[52,1439,807],{"class":69},[52,1441,692],{"class":62},[52,1443,1444],{"class":69}," --task",[52,1446,1447],{"class":62}," web",[52,1449,1450],{"class":69}," -f\n",[10,1452,1453,1454,1457,1458,83,1461,83,1464,23],{},"Important flags: ",[14,1455,1456],{},"-f"," (follow), ",[14,1459,1460],{},"--since 10m",[14,1462,1463],{},"--until '2026-04-26T18:00'",[14,1465,1466],{},"--grep ERROR",[174,1468],{},[25,1470,1472],{"id":1471},"snapshot","Snapshot",[10,1474,1475],{},"Backup of the complete cluster state.",[33,1477,1479],{"id":1478},"heroctl-snapshot-save",[14,1480,1481],{},"heroctl snapshot save",[10,1483,1484],{},"Saves a snapshot to a file.",[43,1486,1488],{"className":45,"code":1487,"language":47,"meta":48,"style":48},"heroctl snapshot save backup-2026-04-26.snap\n",[14,1489,1490],{"__ignoreMap":48},[52,1491,1492,1494,1497,1500],{"class":54,"line":55},[52,1493,16],{"class":58},[52,1495,1496],{"class":62}," snapshot",[52,1498,1499],{"class":62}," save",[52,1501,1502],{"class":62}," backup-2026-04-26.snap\n",[10,1504,1505],{},"Output includes size and hash. Keep in a safe place outside the cluster.",[33,1507,1509],{"id":1508},"heroctl-snapshot-restore",[14,1510,1511],{},"heroctl snapshot restore",[10,1513,1514],{},"Restores the cluster from a file.",[43,1516,1518],{"className":45,"code":1517,"language":47,"meta":48,"style":48},"sudo heroctl snapshot restore backup-2026-04-26.snap\n",[14,1519,1520],{"__ignoreMap":48},[52,1521,1522,1524,1526,1528,1531],{"class":54,"line":55},[52,1523,59],{"class":58},[52,1525,63],{"class":62},[52,1527,1496],{"class":62},[52,1529,1530],{"class":62}," restore",[52,1532,1502],{"class":62},[370,1534,1535],{},[10,1536,1537,1539],{},[375,1538,377],{}," restore overwrites the current state. Use only in disaster recovery, with the cluster offline.",[33,1541,1543],{"id":1542},"heroctl-snapshot-inspect",[14,1544,1545],{},"heroctl snapshot inspect",[10,1547,1548],{},"Shows metadata without applying.",[43,1550,1552],{"className":45,"code":1551,"language":47,"meta":48,"style":48},"heroctl snapshot inspect backup-2026-04-26.snap\n# created: 2026-04-26 14:00 UTC\n# jobs: 12, secrets: 8, nodes: 4\n# size: 2.4 MB\n",[14,1553,1554,1565,1570,1575],{"__ignoreMap":48},[52,1555,1556,1558,1560,1563],{"class":54,"line":55},[52,1557,16],{"class":58},[52,1559,1496],{"class":62},[52,1561,1562],{"class":62}," inspect",[52,1564,1502],{"class":62},[52,1566,1567],{"class":54,"line":311},[52,1568,1569],{"class":314},"# created: 2026-04-26 14:00 UTC\n",[52,1571,1572],{"class":54,"line":612},[52,1573,1574],{"class":314},"# jobs: 12, secrets: 8, nodes: 4\n",[52,1576,1577],{"class":54,"line":1016},[52,1578,1579],{"class":314},"# size: 2.4 MB\n",[174,1581],{},[25,1583,1585],{"id":1584},"others","Others",[33,1587,1589],{"id":1588},"heroctl-status",[14,1590,1591],{},"heroctl status",[10,1593,1594],{},"General summary. Combines cluster + jobs + nodes + ingress in a single screen.",[43,1596,1598],{"className":45,"code":1597,"language":47,"meta":48,"style":48},"heroctl status\n# cluster:  3 nodes (ok)\n# jobs:     5 running, 0 failed\n# allocs:   12\u002F12 healthy\n# ingress:  3 domains, all certs valid\n",[14,1599,1600,1606,1611,1616,1621],{"__ignoreMap":48},[52,1601,1602,1604],{"class":54,"line":55},[52,1603,16],{"class":58},[52,1605,338],{"class":62},[52,1607,1608],{"class":54,"line":311},[52,1609,1610],{"class":314},"# cluster:  3 nodes (ok)\n",[52,1612,1613],{"class":54,"line":612},[52,1614,1615],{"class":314},"# jobs:     5 running, 0 failed\n",[52,1617,1618],{"class":54,"line":1016},[52,1619,1620],{"class":314},"# allocs:   12\u002F12 healthy\n",[52,1622,1624],{"class":54,"line":1623},5,[52,1625,1626],{"class":314},"# ingress:  3 domains, all certs valid\n",[33,1628,1630],{"id":1629},"heroctl-version",[14,1631,1632],{},"heroctl version",[10,1634,1635],{},"Binary version and build.",[43,1637,1639],{"className":45,"code":1638,"language":47,"meta":48,"style":48},"heroctl version\n# heroctl 1.0.0 (commit abc123, build 2026-04-20)\n",[14,1640,1641,1648],{"__ignoreMap":48},[52,1642,1643,1645],{"class":54,"line":55},[52,1644,16],{"class":58},[52,1646,1647],{"class":62}," version\n",[52,1649,1650],{"class":54,"line":311},[52,1651,1652],{"class":314},"# heroctl 1.0.0 (commit abc123, build 2026-04-20)\n",[174,1654],{},[25,1656,1658],{"id":1657},"useful-environment-variables","Useful environment variables",[1660,1661,1662,1678],"table",{},[1663,1664,1665],"thead",{},[1666,1667,1668,1672,1675],"tr",{},[1669,1670,1671],"th",{},"Variable",[1669,1673,1674],{},"Function",[1669,1676,1677],{},"Example",[1679,1680,1681,1696,1711,1726],"tbody",{},[1666,1682,1683,1688,1691],{},[1684,1685,1686],"td",{},[14,1687,167],{},[1684,1689,1690],{},"server address",[1684,1692,1693],{},[14,1694,1695],{},"https:\u002F\u002Fmanage.exemplo.com",[1666,1697,1698,1703,1706],{},[1684,1699,1700],{},[14,1701,1702],{},"HEROCTL_TOKEN",[1684,1704,1705],{},"auth token",[1684,1707,1708],{},[14,1709,1710],{},"eyJh...",[1666,1712,1713,1718,1721],{},[1684,1714,1715],{},[14,1716,1717],{},"HEROCTL_NAMESPACE",[1684,1719,1720],{},"active namespace",[1684,1722,1723],{},[14,1724,1725],{},"production",[1666,1727,1728,1733,1736],{},[1684,1729,1730],{},[14,1731,1732],{},"HEROCTL_FORMAT",[1684,1734,1735],{},"default output format",[1684,1737,1738,83,1741,83,1744],{},[14,1739,1740],{},"json",[14,1742,1743],{},"yaml",[14,1745,1660],{},[10,1747,1748],{},"Configure in your shell to avoid repeating flags on every command.",[1750,1751,1752],"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 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 .suJrU, html code.shiki .suJrU{--shiki-default:#FF7B72}html pre.shiki code .sZEs4, html code.shiki .sZEs4{--shiki-default:#E6EDF3}html pre.shiki code .sH3jZ, html code.shiki .sH3jZ{--shiki-default:#8B949E}",{"title":48,"searchDepth":311,"depth":311,"links":1754},[1755,1761,1768,1774,1783,1790,1797,1804,1808,1812,1815,1820,1824],{"id":27,"depth":311,"text":28,"children":1756},[1757,1758,1759],{"id":35,"depth":612,"text":38},{"id":95,"depth":612,"text":98},{"id":157,"depth":612,"text":1760},"heroctl \u003Ccmd> (CLI mode)",{"id":178,"depth":311,"text":179,"children":1762},[1763,1764,1765,1766,1767],{"id":185,"depth":612,"text":188},{"id":221,"depth":612,"text":224},{"id":276,"depth":612,"text":279},{"id":318,"depth":612,"text":321},{"id":346,"depth":612,"text":349},{"id":387,"depth":311,"text":388,"children":1769},[1770,1771,1772,1773],{"id":394,"depth":612,"text":397},{"id":431,"depth":612,"text":434},{"id":457,"depth":612,"text":460},{"id":498,"depth":612,"text":501},{"id":541,"depth":311,"text":542,"children":1775},[1776,1777,1778,1779,1780,1781,1782],{"id":548,"depth":612,"text":551},{"id":585,"depth":612,"text":588},{"id":618,"depth":612,"text":621},{"id":644,"depth":612,"text":647},{"id":669,"depth":612,"text":672},{"id":712,"depth":612,"text":715},{"id":743,"depth":612,"text":746},{"id":776,"depth":311,"text":777,"children":1784},[1785,1786,1787,1788,1789],{"id":783,"depth":612,"text":786},{"id":817,"depth":612,"text":820},{"id":842,"depth":612,"text":845},{"id":866,"depth":612,"text":869},{"id":890,"depth":612,"text":893},{"id":927,"depth":311,"text":928,"children":1791},[1792,1793,1794,1795,1796],{"id":934,"depth":612,"text":937},{"id":984,"depth":612,"text":987},{"id":1022,"depth":612,"text":1025},{"id":1065,"depth":612,"text":1068},{"id":1095,"depth":612,"text":1098},{"id":1122,"depth":311,"text":1123,"children":1798},[1799,1800,1801,1802,1803],{"id":1133,"depth":612,"text":1136},{"id":1160,"depth":612,"text":1163},{"id":1190,"depth":612,"text":1193},{"id":1215,"depth":612,"text":1218},{"id":1240,"depth":612,"text":1243},{"id":1267,"depth":311,"text":1268,"children":1805},[1806,1807],{"id":1274,"depth":612,"text":1277},{"id":1302,"depth":612,"text":1305},{"id":1329,"depth":311,"text":1330,"children":1809},[1810,1811],{"id":1333,"depth":612,"text":1336},{"id":1361,"depth":612,"text":1364},{"id":1395,"depth":311,"text":1396,"children":1813},[1814],{"id":1399,"depth":612,"text":1402},{"id":1471,"depth":311,"text":1472,"children":1816},[1817,1818,1819],{"id":1478,"depth":612,"text":1481},{"id":1508,"depth":612,"text":1511},{"id":1542,"depth":612,"text":1545},{"id":1584,"depth":311,"text":1585,"children":1821},[1822,1823],{"id":1588,"depth":612,"text":1591},{"id":1629,"depth":612,"text":1632},{"id":1657,"depth":311,"text":1658},"operacoes","All heroctl commands with synopsis, flags, and example. Use as a desk reference.",false,"md","i-lucide-terminal","2026-04-26",{},true,"\u002Fen\u002Fdocs\u002Foperations\u002Fcli-reference",[],"20 min read",{"title":5,"description":1826},"en\u002Fdocs\u002Foperations\u002Fcli-reference",[1839,1840,1841],"cli","reference","commands","3vfh6k8ptbKQ-SfXZBBAxjgIAy-PcC9WypwCAUG-4Lo",[1844,1850,1856,1861,1867,1872,1878,1883,1884,1889,1892,1896,1902,1907],{"path":1845,"title":1846,"description":1847,"category":1848,"order":55,"icon":1849},"\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":1851,"title":1852,"description":1853,"category":1854,"order":55,"icon":1855},"\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.","deploy","i-lucide-rocket",{"path":1857,"title":1858,"description":1859,"category":1854,"order":311,"icon":1860},"\u002Fen\u002Fdocs\u002Fdeploy\u002Frolling-canary-blue-green","Rolling, canary, blue-green, and rainbow","Four deploy strategies. When to use each, with complete examples and honest trade-offs.","i-lucide-git-branch",{"path":1862,"title":1863,"description":1864,"category":1865,"order":311,"icon":1866},"\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":1868,"title":1869,"description":1870,"category":1865,"order":55,"icon":1871},"\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":1873,"title":1874,"description":1875,"category":1876,"order":311,"icon":1877},"\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":1879,"title":1880,"description":1881,"category":1876,"order":55,"icon":1882},"\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":1833,"title":5,"description":1826,"category":1825,"order":612,"icon":1829},{"path":1885,"title":1886,"description":1887,"category":1825,"order":311,"icon":1888},"\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":21,"title":22,"description":1890,"category":1825,"order":55,"icon":1891},"Install HeroCtl on any Linux server with Docker in a single command. Covers prerequisites, bootstrap, and verification.","i-lucide-download",{"path":1893,"title":1894,"description":1895,"category":1825,"order":1016,"icon":1871},"\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":1897,"title":1898,"description":1899,"category":1900,"order":311,"icon":1901},"\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":1903,"title":1904,"description":1905,"category":1900,"order":55,"icon":1906},"\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":1908,"title":1909,"description":1910,"category":1911,"order":55,"icon":1912},"\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",1777362181084]