Repository navigation
feat(scaling): DigitalOcean and Hetzner Cloud providers - #573
Merged
Merged
Conversation
Droplets and Hetzner servers boot with user-data that runs the mesh's install line with a one-use, one-hour join token, carry Lens's tag, and are deleted when their unit goes. Groups on providers whose machines join over the mesh wait, launching nothing, until the mesh has that line. Both call the clouds' REST APIs with httpx, so nothing is installed. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01ALjNbLobvPe7VwvDL8j7V3
This was referenced Oct 18, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Description
Before: auto scaling could only run more workers on the machine Lens runs on.
After: an admin can add a DigitalOcean or Hetzner Cloud provider. Saving one checks the token with a read-only call, and units are priced at the cloud's hourly list price; Hetzner's euro price is turned into dollars at a rate the admin can set. A group on one of these providers launches machines tagged for Lens. Each machine's first boot runs the mesh's install line, with a join token for that unit that works once within an hour. When a unit goes, its machine is deleted. Until the mesh has its install line (in progress, docs/mesh.md), these groups wait and launch nothing, and
waiting_forsays why.How:
domain/scaling_clouds.pyholds a small REST driver base on httpx plus the two drivers.scaling_drivers.user_databuilds the first-boot script: the unit's name and steps as environment, then the install line. Drivers gainneeds_join, and the scaler keeps aneeds_joingroup from launching unlessscaling.can_join(cfg).Motivation and Context
Adeel asked for auto scaling worker nodes on AWS, DigitalOcean, Hetzner, Proxmox and remote Linux. This PR is the second piece, after the core in #556. AWS is in the Dynamic expansion thread's #559. Proxmox, SSH and the model hosts come next.
Types of changes
!in the title)Checklist:
make hookschecks it on commit).docs/accordingly.## UnreleasedinCHANGELOG.md. (n/a: the title and docs/scaling.md say it)Done questions (AGENTS.md)
digitaloceanandhetznerproviders.docs/scaling.md, the README, requirements and the threat model are updated. OpenAPI is unchanged (make openapiproduced no diff).docs/scaling.md.Local CI (
ci/local-ci.sh) passed on 5ef90e3 for both backend jobs, Next.js, pre-commit and the title check. The upgrade job was cut off by the background time limit, so GitHub CI covers it.Generated by Claude Code