Small, security-focused server provisioner.
serverpro creates hardened Ubuntu servers on Hetzner, Vultr, or DigitalOcean; keeps provider-neutral local state; uses Tailscale SSH for administration; and keeps public app ingress off by default. Cloudflare tunnel lifecycle can create or adopt an account tunnel and records pending local route metadata; it does not publish publicly routable routes yet.
serverpro also converges the host toolchain — git, Docker, per-user mise, Node,
Pi, and Herdr — through an integrity-verified bootstrap script over Tailscale
SSH (see SECURITY.md). Herdr is version- and digest-pinned, and its Pi
integration is installed for authoritative agent lifecycle reporting.
serverpro prepares hosts and safe access paths. It does not deploy apps, manage DNS records, run databases, or store application secrets.
Early public release. Interfaces and state shape can change before v1.0.0.
Use dry-runs when you already know provider catalog values, read SECURITY.md
before live use, and use at your own risk; the MIT License provides this
software without warranty.
Bugs and feature work are tracked in GitHub Issues. Security reports must follow
SECURITY.md, not public issue comments.
Install latest:
go install github.com/sagmans/serverpro/cmd/serverpro@latest
export PATH="$(go env GOPATH)/bin:$PATH"
serverpro --helpInstall a specific release (recommended):
go install github.com/sagmans/serverpro/cmd/serverpro@vX.Y.ZIf GOBIN is set, add that directory to PATH instead. Requires Go 1.26.5+.
Create provider accounts and tokens before live use:
Create a namespace, then create a server inside it. The server command prompts for provider catalog choices such as location, size, and image.
Create a namespace:
serverpro namespace create mynamespace
Start interactive server creation:
serverpro server create webapp -n mynamespace -p hetzner
Follow the prompts for compute shape, Tailscale access, optional Cloudflare Tunnel metadata, confirmation, and the remote admin sudo password.
- Tailscale SSH admin path required.
- Public SSH disabled.
- Public app ingress defaults to
none. - Host tools install through a checksum- and GPG-verified bootstrap script, not
curl|sh. - Server credentials stored per server with private file permissions.
- Remote admin sudo password is runtime-only.
- Destructive operations require known state, provider ownership metadata, and confirmation.