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.

Connect read-only

How Hetscale works

1:34 · no sound
Text version
  1. Autoscaling for Hetzner CloudShown: The Hetscale mark and name.
  2. Add autoscaling and self-healing to the Hetzner servers you already run.your Hetzner project · your serversShown: The servers you already run, web-1 to web-3, in your Hetzner project behind a Hetzner load balancer, receiving requests.
  3. No Kubernetes. No migration. Your traffic never touches us.your account · your deploy tool · your traffic pathShown: Requests go from the visitors through the Hetzner load balancer to the servers. Hetscale sits apart from that path and is connected only to the Hetzner API.
  4. 1 · WatchReads the CPU of each node and the requests at your load balancer through the Hetzner API.CPU and requests readShown: Hetscale reads the CPU of each server and the requests at the load balancer from the Hetzner API, along a line apart from the traffic.
  5. 2 · DecideCompares them with the group’s scaling rules, and scale-in is always stricter than scale-out.load high · one moreShown: The load on the three servers rises, and the scaling rules call for one more node: an empty place opens beside them.
  6. 3 · CreateCreates the server in your project from the release you pinned, never :latest.web-4 · pinned releaseShown: Hetscale asks the Hetzner API for a new server, and web-4 appears in the empty place, booting from the pinned release.
  7. 4 · Health checkUntil your load balancer’s health check passes, a new node receives nothing.web-4 · no traffic yet; web-4 · passed check → attachedShown: Three healthy servers, web-1 to web-3, receive requests from a Hetzner load balancer. A new server, web-4, starts beside them; the load balancer's health check probes it along a dotted line and no request reaches it. When the check passes, the line turns solid, web-4 turns healthy and requests reach it too.
  8. 5 · DrainWhen load falls, a node leaves through the drain window.web-4 · out of the load balancer; web-4 · clean shutdown and deleteShown: The load falls. web-4 is taken out of the load balancer first, so no new request reaches it, then it shuts down cleanly and is deleted.
  9. 5 · ReplaceA node that dies is replaced by one started beside it.web-2 · unhealthy at the load balancer; web-2 kept for diagnosisShown: web-2 fails its health check and stops receiving requests. A new server, web-4, starts beside it, passes the check and takes requests; web-2 is kept, without traffic, for diagnosis.
  10. Read-only 14-day Observe trial, enforced by Hetzner’s own read-only token.[observe] would: create web-4 beside web-2; [observe] no API write; token is read-onlyShown: In the Observe trial Hetscale only records what it would have done, such as creating web-4 beside web-2 when web-2 fails its health check. Its Hetzner token can read but not write, so web-4 stays an outline and nothing is created.
  11. Approve each scaling action in the dashboard; unapproved proposals expire.[propose] waiting for approval…; [propose] approved → executingShown: The four modes, Observe, Rehearsal, Propose and Live, are stepped through up to Propose. A new server, web-4, waits as an outline for approval and is created once it is approved.
  12. Deletes only servers it created or a seed you promoted: ledger, labels and name must all match.ledger · labels · nameShown: Before a delete, three checks light one after another: the ledger, the labels and the name. A server that does not match all three is never touched.
  13. If Hetscale is down, your servers keep running and your load balancer keeps routing.no scaling or healing until it is backShown: Hetscale goes dark and its line to the Hetzner API drops. The load balancer keeps sending requests to the servers as before.
  14. Your account, your bill, no per-server fee.Pay for your normal load. Scale for your peak load.Shown: A load line rises to a peak and falls again. Under it a row of servers runs all the time; at the peak more are added, booting then healthy, and they are drained when the peak is over. No amounts are shown.
  15. Start read-only, move up when the report convinces you.14-day Observe trial · read-only token; hetscale.comShown: The Hetscale mark, the 14-day read-only Observe trial and the address hetscale.com.
14-day Observe trial · read-only token

Pay for your normal load.Scale for your peak load.

group: webrange 2–6 × cx33example timeline
  • web-1healthy
  • web-2failed
  • web-3healthy
  • web-4booting
  1. 03:01create web-4 (cx33, Falkenstein) beside web-2self-heal: keep 3 healthy nodes, range 2–6
  2. 03:00web-2 unhealthy at the load balancer for 3 minLB check /healthz, no response; server not rebooting
  3. 02:59no actionall 3 nodes healthy; p95 CPU 31%
3 · Replace
  1. 01Read-only 14-day Observe trial, enforced by Hetzner's own read-only token.
  2. 02No node receives traffic before it passes the load balancer health check.
  3. 03Your account, your bill, no per-server fee.
  4. 04Works with plain Docker or cloud-init, Coolify, and any webhook or CI.
  5. 05Replaces a dead node at 03:00 and adds one at 15:00, and explains both.
In every plan

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.
How it works

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
  1. [observe] web-2 unhealthy for 3 min
  2. [observe] would: create web-4 beside web-2
  3. [observe] would cost: +1 node-hour, billed by Hetzner
  4. [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.

  1. [rehearsal] create web-4 from template
  2. [rehearsal] deploy via adapter → wait for LB health
  3. [rehearsal] web-4 active → drain → delete
  4. [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.

  1. [propose] create web-5 (cx33)
  2. [propose] reason: CPU 78% > 75% for 3 min
  3. [propose] waiting for approval…
  4. [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.

  1. [live] web-2 unhealthy for 3 min
  2. [live] create web-4 beside web-2
  3. [live] web-4 active → LB target
  4. [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.

Calculator

What does your fleet cost outside the peak?

fleet with Hetscale
3–6 × cx33
saving, per month
up to €7

Daily peaks profile; adjust everything in the calculator. Hetzner's net list price at Falkenstein, 2026-09-17; the Growth plan, the cheapest whose node capacity covers this fleet, is deducted.

Open the calculator
Fit

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
Find your starting point: the onboarding cases

See what Hetscale would have done with your real data — connect read-only, get your report in minutes.

Connect read-only