[{"data":1,"prerenderedAt":466},["ShallowReactive",2],{"doc-en-\u002Fen\u002Fdocs\u002Foperations\u002Fmulti-region":3,"docs-en-all":396},{"id":4,"title":5,"body":6,"category":377,"description":378,"draft":379,"extension":380,"icon":381,"lastReviewed":382,"meta":383,"navigation":384,"order":385,"path":386,"prerequisites":387,"readingTime":388,"seo":389,"stem":390,"tags":391,"__hash__":395},"docs_en\u002Fen\u002Fdocs\u002Foperations\u002Fmulti-region.md","Multi-region (planned for Q4 2026)",{"type":7,"value":8,"toc":359},"minimark",[9,24,29,32,54,58,65,68,79,82,94,97,102,126,130,134,137,140,144,147,150,154,157,160,164,167,193,200,204,207,267,270,274,277,303,307,318,329,332,336],[10,11,12],"blockquote",{},[13,14,15,19,20,23],"p",{},[16,17,18],"strong",{},"Status as of 2026-04-26:"," native multi-region is ",[16,21,22],{},"not available",". The feature entered the roadmap for the fourth quarter of 2026. This page exists to help you prepare — and to show how to live well without it until then.",[25,26,28],"h2",{"id":27},"why-multi-region-matters","Why multi-region matters",[13,30,31],{},"Three main reasons:",[33,34,35,42,48],"ol",{},[36,37,38,41],"li",{},[16,39,40],{},"Regional latency."," Serving a user in Recife from Virginia adds 130ms round-trip before the application even responds. For some products, tolerable. For others, the difference between making a sale and losing one.",[36,43,44,47],{},[16,45,46],{},"Disaster recovery."," A whole datacenter can fail. A whole provider can be out for hours. Being present in another region gives you a real plan B.",[36,49,50,53],{},[16,51,52],{},"Compliance and data residency."," LGPD favors Brazilian citizens' data in national territory. GDPR is even more explicit in Europe. To sell in regulated markets, the region where data lives stops being a technical detail.",[25,55,57],{"id":56},"how-to-run-across-regions-today","How to run across regions today",[13,59,60,61,64],{},"Without native support, the current path involves ",[16,62,63],{},"independent clusters"," — one per region — coordinated by DNS.",[13,66,67],{},"Typical topology:",[69,70,75],"pre",{"className":71,"code":73,"language":74},[72],"language-text","                        Cloudflare DNS\n                       (geo steering)\n                              │\n                ┌─────────────┼─────────────┐\n                │             │             │\n        cluster-br      cluster-us    cluster-eu\n        (São Paulo)    (Virginia)    (Frankfurt)\n        4 nodes        4 nodes       4 nodes\n","text",[76,77,73],"code",{"__ignoreMap":78},"",[13,80,81],{},"Each cluster:",[83,84,85,88,91],"ul",{},[36,86,87],{},"Runs independently. Has its own control plane.",[36,89,90],{},"Receives the same jobs, configured separately.",[36,92,93],{},"Has its own backup, its own secrets, its own metrics.",[13,95,96],{},"DNS resolves the user to the closest cluster. Cloudflare Geo Steering or AWS Route 53 with latency-based routing handles that work.",[98,99,101],"h3",{"id":100},"things-to-watch","Things to watch",[83,103,104,114,120],{},[36,105,106,109,110,113],{},[16,107,108],{},"Changes need to be applied across every cluster."," It is worth automating — even with a script that runs ",[76,111,112],{},"heroctl jobs submit"," against each cluster.",[36,115,116,119],{},[16,117,118],{},"Secrets live isolated."," Updating a password in one cluster does not update it in the others.",[36,121,122,125],{},[16,123,124],{},"The database is a separate problem."," Read replicas per region, centralized writes, or active-active models — pick your strategy. There is no magic here.",[25,127,129],{"id":128},"common-scenarios","Common scenarios",[98,131,133],{"id":132},"brazilian-startup-that-wants-to-expand","Brazilian startup that wants to expand",[13,135,136],{},"Minimum topology: one cluster in São Paulo, one cluster in US-East. DNS routes by proximity.",[13,138,139],{},"Advantage: Brazilian users get low local latency; international clients do not feel the delay of crossing the Atlantic twice.",[98,141,143],{"id":142},"company-with-clients-in-regulated-markets","Company with clients in regulated markets",[13,145,146],{},"BR cluster for Brazilian clients. EU cluster for European clients. US cluster for the rest.",[13,148,149],{},"Each cluster sits in the appropriate jurisdiction. Data does not cross borders unless you decide explicitly.",[98,151,153],{"id":152},"pure-disaster-recovery","Pure disaster recovery",[13,155,156],{},"It does not matter where the user is — you just want a plan B if the primary provider goes down.",[13,158,159],{},"Active cluster + passive cluster in another region. DNS points to the active one. On disaster, switch DNS to the passive. Restore the most recent snapshot there. Recovery time: minutes to one hour, depending on size.",[25,161,163],{"id":162},"honest-trade-offs","Honest trade-offs",[13,165,166],{},"Multi-region is not free. The costs:",[83,168,169,175,181,187],{},[36,170,171,174],{},[16,172,173],{},"Cross-region latency."," Synchronizing anything between regions adds tens to hundreds of milliseconds.",[36,176,177,180],{},[16,178,179],{},"Inter-region traffic is expensive."," Most clouds charge per GB leaving the region. Multiply by scale and the number gets scary.",[36,182,183,186],{},[16,184,185],{},"Operations grow."," Two clusters are not twice one cluster — they are three times (because coordination between them is new work).",[36,188,189,192],{},[16,190,191],{},"Debugging gets harder."," A problem that shows up in one region and not in the other demands extra hypotheses.",[13,194,195,196,199],{},"The practical rule: ",[16,197,198],{},"only go multi-region when the cost of not being is greater than the cost of being",". Bad latency that is losing customers. Compliance that is blocking a contract. DR risk that keeps the team awake at night. If none of that is true, stay in one region and sleep better.",[25,201,203],{"id":202},"roadmap","Roadmap",[13,205,206],{},"What is coming for HeroCtl:",[208,209,210,223],"table",{},[211,212,213],"thead",{},[214,215,216,220],"tr",{},[217,218,219],"th",{},"When",[217,221,222],{},"What",[224,225,226,237,247,257],"tbody",{},[214,227,228,234],{},[229,230,231],"td",{},[16,232,233],{},"Q4 2026",[229,235,236],{},"Cluster federation: each region remains a cluster, but you can list and operate all of them from a single panel",[214,238,239,244],{},[229,240,241],{},[16,242,243],{},"Q1 2027",[229,245,246],{},"Storage replication between regions for storage managed by the platform",[214,248,249,254],{},[229,250,251],{},[16,252,253],{},"Q2 2027",[229,255,256],{},"Workload migration between regions, with controlled window",[214,258,259,264],{},[229,260,261],{},[16,262,263],{},"Q3 2027",[229,265,266],{},"Automated DNS failover when a region goes down",[13,268,269],{},"Indicative dates. Things change.",[25,271,273],{"id":272},"how-to-prepare-now","How to prepare now",[13,275,276],{},"Even without native support, some decisions ease the transition:",[83,278,279,285,291,297],{},[36,280,281,284],{},[16,282,283],{},"Keep job definitions in versioned files."," You will want to apply the same jobs across more than one cluster.",[36,286,287,290],{},[16,288,289],{},"Centralize secrets in an external vault."," Vault, AWS Secrets Manager, or similar. Each cluster fetches from there.",[36,292,293,296],{},[16,294,295],{},"Think about the database now."," Migrating to a regional model later is more painful than starting planned.",[36,298,299,302],{},[16,300,301],{},"Document your RPO and RTO."," How much data you can lose. How much downtime you can take. The answers guide every other decision.",[25,304,306],{"id":305},"early-interest","Early interest",[13,308,309,310,317],{},"If you want to participate in the federation beta in Q4 2026, write to ",[16,311,312],{},[313,314,316],"a",{"href":315},"mailto:roadmap@heroctl.com","roadmap@heroctl.com"," with:",[83,319,320,323,326],{},[36,321,322],{},"How many regions you operate today",[36,324,325],{},"Estimated job volume",[36,327,328],{},"Relevant regulatory constraints",[13,330,331],{},"We pick a small group of partners for the early program. Feedback at that stage shapes the final product.",[25,333,335],{"id":334},"next-steps","Next steps",[83,337,338,345,352],{},[36,339,340,344],{},[313,341,343],{"href":342},"\u002Fen\u002Fdocs\u002Fobservability\u002Fbackup-restore","Backup and restore"," — base of any DR strategy.",[36,346,347,351],{},[313,348,350],{"href":349},"\u002Fen\u002Fdocs\u002Fnetworking\u002Fingress-tls","Ingress"," — DNS and routing for multiple endpoints.",[36,353,354,358],{},[313,355,357],{"href":356},"\u002Fen\u002Fdocs\u002Ftroubleshooting\u002Fcommon-problems","Troubleshooting"," — common operational problems.",{"title":78,"searchDepth":360,"depth":360,"links":361},2,[362,363,367,372,373,374,375,376],{"id":27,"depth":360,"text":28},{"id":56,"depth":360,"text":57,"children":364},[365],{"id":100,"depth":366,"text":101},3,{"id":128,"depth":360,"text":129,"children":368},[369,370,371],{"id":132,"depth":366,"text":133},{"id":142,"depth":366,"text":143},{"id":152,"depth":366,"text":153},{"id":162,"depth":360,"text":163},{"id":202,"depth":360,"text":203},{"id":272,"depth":360,"text":273},{"id":305,"depth":360,"text":306},{"id":334,"depth":360,"text":335},"operacoes","What to expect from multi-region in HeroCtl, how to run across regions today, and the roadmap through 2027.",false,"md","i-lucide-globe","2026-04-26",{},true,4,"\u002Fen\u002Fdocs\u002Foperations\u002Fmulti-region",[],"5 min read",{"title":5,"description":378},"en\u002Fdocs\u002Foperations\u002Fmulti-region",[392,393,394,202],"multi-region","disaster-recovery","lgpd","qEFMpd8KjxymEafXHwvWi12aAxIaf6wsyX2WfIn8zKw",[397,404,410,415,421,424,429,434,439,444,449,450,456,461],{"path":398,"title":399,"description":400,"category":401,"order":402,"icon":403},"\u002Fen\u002Fdocs\u002Fapi\u002Fapi-reference","REST API reference","Endpoints, JWT authentication, curl examples, and error patterns of the HeroCtl API.","api",1,"i-lucide-code",{"path":405,"title":406,"description":407,"category":408,"order":402,"icon":409},"\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":411,"title":412,"description":413,"category":408,"order":360,"icon":414},"\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":416,"title":417,"description":418,"category":419,"order":360,"icon":420},"\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":349,"title":422,"description":423,"category":419,"order":402,"icon":381},"Ingress and automatic TLS","How to expose applications on port 443 with certificates issued and renewed automatically, without operating an external router.",{"path":342,"title":425,"description":426,"category":427,"order":360,"icon":428},"Backup and restore of cluster state","How to save, schedule, and restore HeroCtl control plane snapshots. Disaster recovery strategy.","observabilidade","i-lucide-archive",{"path":430,"title":431,"description":432,"category":427,"order":402,"icon":433},"\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":435,"title":436,"description":437,"category":377,"order":366,"icon":438},"\u002Fen\u002Fdocs\u002Foperations\u002Fcli-reference","Complete CLI reference","All heroctl commands with synopsis, flags, and example. Use as a desk reference.","i-lucide-terminal",{"path":440,"title":441,"description":442,"category":377,"order":360,"icon":443},"\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":445,"title":446,"description":447,"category":377,"order":402,"icon":448},"\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":386,"title":5,"description":378,"category":377,"order":385,"icon":381},{"path":451,"title":452,"description":453,"category":454,"order":360,"icon":455},"\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":457,"title":458,"description":459,"category":454,"order":402,"icon":460},"\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":356,"title":462,"description":463,"category":464,"order":402,"icon":465},"Troubleshooting common problems","The 12 most frequent problems in HeroCtl clusters, with symptom, diagnosis, and step-by-step fix.","troubleshooting","i-lucide-alert-triangle",1777362181088]