Kamal

Kamal already assumes a host list; the recipe replaces the static list with one built from the inventory API and lets node.created trigger the per-host deploy. The one to two hours are the recipe and the load balancer.

Prerequisite work
host list from the inventory API (recipe)
Time to set up
1–2 h
Adapter
Webhook (recipe)
Fit
6/10

Prerequisites, time and fit are the ADR-0028 row for this case. Hetscale's own setup is about 15 minutes in every case; the rest is work on your side.

Steps

  1. 01
    Put a load balancer in front

    A Hetzner load balancer with a health check, TLS terminated at it. Kamal’s own proxy on each host serves plain HTTP behind it.

  2. 02
    Generate the host list from the inventory API

    GET /groups/{id}/nodes returns the current nodes with phase, IPs and release. A small step in your deploy renders Kamal’s server list from it instead of a hand-kept file.

  3. 03
    Deploy on node.created

    On the signed node.created event, run the deploy for that host. The load balancer health check decides when the node serves.

  4. 04
    Lock the group during your own rollouts

    POST /groups/{id}/lock with a TTL while Kamal rolls the fleet, so scaling waits.

FAQ for this case

Is there a native Kamal adapter?

Not in the MVP: Kamal is served by the webhook adapter and a documented recipe. A native adapter is on the post-MVP list.

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

Connect read-only