Autoscaling for Hetzner Cloud
Add autoscaling and self-healing to the Hetzner servers you already run. No Kubernetes. No migration. Your traffic never touches us.
Pay for your normal load.Scale for your peak load.
- web-1healthy
- web-2failed
- web-3healthy
- web-4booting
- 03:01create web-4 (cx33, Falkenstein) beside web-2self-heal: keep 3 healthy nodes, range 2–6
- 03:00web-2 unhealthy at the load balancer for 3 minLB check /healthz, no response; server not rebooting
- 02:59no actionall 3 nodes healthy; p95 CPU 31%
- 01Read-only 14-day Observe trial, enforced by Hetzner's own read-only token.
- 02No node receives traffic before it passes the load balancer health check.
- 03Your account, your bill, no per-server fee.
- 04Works with plain Docker or cloud-init, Coolify, and any webhook or CI.
- 05Replaces a dead node at 03:00 and adds one at 15:00, and explains both.
What keeps you in control
- Ownership guardDeletes only servers it created or a seed you promoted: ledger, labels and name must all match.
- Health gateNo node receives traffic before your load balancer says it is healthy.
- Pinned releaseEvery new node boots the release you chose, never :latest. Shown on the group page.
- ProposeApprove each scaling action in the dashboard; unapproved proposals expire.
- RehearsalWatch one node created, checked, drained and deleted before going Live.
- Emergency stopPause a group, or stop every create and delete in it; moving to a safer mode is immediate.
- Action logEvery action carries its trigger, the metric values and the rule that fired.
- web-4draining
- web-3healthy
- web-4 · clean shutdown and deletea server it created
- web-3 · never touchednot in the ledger
Four modes. Start read-only, move up when the report convinces you.
The mode decides whether Hetscale may call the Hetzner API. It never changes how a decision is made, or how it is explained.
How Hetscale works, step by step- [observe] web-2 unhealthy for 3 min
- [observe] would: create web-4 beside web-2
- [observe] would cost: +1 node-hour, billed by Hetzner
- [observe] no API write; token is read-only
The trial mode. While a project only observes, Hetscale holds a Hetzner token with read permission only, so it cannot create or delete anything even by mistake. For 14 days the group page lists every decision it would have taken, set against the day-0 report.
- [rehearsal] create web-4 from template
- [rehearsal] deploy via adapter → wait for LB health
- [rehearsal] web-4 active → drain → delete
- [rehearsal] passed; Live unlocked
A supervised rehearsal before Live: Hetscale creates one short-lived server from your template, deploys through your adapter, waits for the load balancer health check, drains it and deletes it while you watch; Hetzner bills at least one started hour. Success unlocks Live; failure produces a report and never leaves a node behind.
- [propose] create web-5 (cx33)
- [propose] reason: CPU 78% > 75% for 3 min
- [propose] waiting for approval…
- [propose] approved → executing
Each scaling action is proposed with its reason and waits for approval in the dashboard; a mail links you to it. Unapproved proposals expire, and healing acts on its own.
- [live] web-2 unhealthy for 3 min
- [live] create web-4 beside web-2
- [live] web-4 active → LB target
- [live] web-2 kept for diagnosis; 3 healthy
Hetscale creates, health-checks, attaches, drains and deletes nodes within the minimum and maximum you set. Moving back to a safer mode takes effect immediately.
Built for
- Stateless web apps and APIs behind a Hetzner load balancer
- Deployed with Docker or cloud-init, Coolify, or your own CI via webhook
- One server today, a range you set tomorrow: the same app, more copies when load rises