bootload
⚓ portal

📖 DOCS

Scaling & Idle Harbor

Run as many copies of a service as you need, let bootload scale them with load, or drop anchor entirely and pay nothing while it sleeps. Because billing is per-second, scaling down is the same as saving money — a service at zero replicas costs nothing to run.

Manual scaling

Set the number of replicas yourself:

bootload scale <service> --replicas 3

Replicas are horizontal copies of the same image behind one route; traffic is balanced across the healthy ones.

Drop anchor (scale to zero)

bootload scale <service> --replicas 0

This stops every replica — no compute billing while it's anchored. Storage (volumes, images) is still kept and still metered; only the running cost stops. Scale it back up with --replicas 1 when you need it.

Horizontal autoscaling

Let bootload add and remove replicas to hold a target CPU level:

bootload scale <service> --min 1 --max 5 --target-cpu 70

bootload keeps replicas between min and max, adding capacity when average CPU rises above the target and removing it when load falls. --target-cpu is what switches autoscaling on; --replicas switches it back to manual.

Vertical memory autoscaling

For a workload whose memory needs grow, cap the out-of-memory ladder instead of guessing a fixed size:

bootload scale <service> --autoscale-memory max=2048

bootload steps the replica's memory up the ladder as it approaches its limit, up to the cap you set (in MB). max=0 turns it off.

Idle Harbor — sleep when idle, wake on demand ⚓

For request-driven services that sit quiet between bursts, Idle Harbor scales them to zero when idle and wakes them on the next request — so you pay for compute only while traffic is actually arriving.

bootload idle-harbor <service> on
bootload idle-harbor <service> on --idle-after 300
bootload idle-harbor <service> off

After a period with no traffic (default 900 seconds, or whatever you set with --idle-after), the service sleeps. The next incoming request wakes it — the first request after a sleep waits for the cold start, then it's warm again.

While sleeping, bootload keeps a snapshot so the wake is fast; that snapshot is billed as storage at €0.05 per GB-month — far less than running idle compute. Idle Harbor suits HTTP apps, internal tools, and bursty workloads; a service that must never miss a beat should stay at a fixed replica count instead.

Wake ahead of time — on a schedule or by webhook

Idle Harbor wakes a suspended service on the first request, which means that first visitor waits for the boot. If you know when traffic arrives, or another system knows, wake it early.

On a schedule (cron). Weekdays at 08:00 Brussels time, for example:

bootload wake schedule api --cron "0 8 * * 1-5" --tz Europe/Brussels

Cron is the usual 5 fields (minute, hour, day, month, weekday), evaluated in the timezone you give. The service is awake, and billed, from each fire until its idle window passes again, so * * * * * keeps it permanently on — use the idle window for that instead.

By webhook. Create a URL that wakes the service when something POSTs to it, a CI run finishing, a queue filling, your own scheduler:

bootload wake webhook api

You get a URL and a secret (shown once). The simplest call is curl -X POST "<url>?token=<secret>"; for a signed call send X-Bootload-Signature: t=<unix>,v1=<hex hmac-sha256(secret, "<unix>." + body)> (rejected after 5 minutes, so a captured request can't be replayed). The webhook answers 202 at once; add ?wait=1 to block until the service is healthy, handy right before you send the real traffic. Each URL is rate-limited to one wake per 30 seconds.

Right now. bootload wake api, or the "wake now" button on the service page. Waking never scales: a service you scaled to zero stays at zero and reports no_replica.

Manage triggers with bootload wake list|rm|rotate-secret|fires, from the scheduled-wake panel on the service page, or through the MCP tools services_wake and wake_triggers_*. This also works for services with no public route at all, an internal worker that nothing ever "visits".