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
- 01Put 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.
- 02Generate 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.
- 03Deploy 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.
- 04Lock 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.