Server setup guide¶
This page is a short index for edge-node setup. The automated provisioner
(provisioner/) handles all of this non-interactively over SSH. These docs are
for operators who need to understand what the automation does, debug a failed
provision, or set up a node by hand.
Prerequisites¶
An edge node must be a fresh Debian 12 or Ubuntu 22.04+ host with:
- Root SSH access (key auth) from your operator workstation.
- Outbound internet access to
apt.debian.org/get.docker.com/dl.cloudsmith.io. - Inbound: port 22 (initial SSH), 80/tcp, 443/tcp, 51820/udp (for
all-in-one/edgeroles). The hardening phase locks down everything else with UFW. - At least 2 GB RAM and 20 GB disk (Standard 4 GB on Linode is the reference
plan used by
scripts/stage_deploy_linode.py). - A DNS A record pointing
{slug}.{base_domain}(andregistry.{slug}.{base_domain}) at the server IP before the TLS step runs, since Caddy needs to resolve the names for HTTP-01. The wildcard*.{slug}.{base_domain}needs DNS-01 and aCF_API_TOKENenvironment variable for the Cloudflare plugin.
Detailed setup notes¶
The two files below document the full manual procedure and the three-server
staging validation runbook. They live alongside this guide in
docs/operations/.
Server setup notes¶
Maps every automated provisioning phase to its manual equivalent shell commands. Read this when:
- You need to understand exactly what the automation does.
- A provision run failed mid-phase and you are doing manual remediation.
- You are setting up a self-hosted node without the SaaS control plane.
Phases covered:
| Phase | What it does |
|---|---|
| Phase 1 — system | apt-get dist-upgrade |
| Phase 2 — packages | Docker, Caddy, WireGuard (role-scoped) |
| Phase 3 — hardening | SSH drop-in, UFW, kernel sysctls |
| Phase 4 — services | WireGuard gateway, private registry, app compose up |
| Phase 5 — healthchecks | docker / app HTTPS / TLS cert / registry v2 / wg0 |
Three-server validation runbook¶
Step-by-step preflight, functional staging, load/soak tests, and failure drills for a three-role deployment (Server A: registry, Server B: control-plane app, Server C: VPN). Read this when:
- You are validating a new deployment before opening an event.
- You are doing capacity planning or load testing.
- You want acceptance criteria to gate a go/no-go decision.
Automated provisioning¶
If you are running the SaaS control plane and want to provision a new tenant
automatically, see Provisioning tenants. That page
covers TenantSpec, the phase pipeline, the audit chain, and the
scripts/stage_deploy_linode.py end-to-end runner.
For the Docker Compose deployment used on each provisioned node, see Deploy with Docker Compose.