The "I have one $5 VPS" path. Single Ubuntu 26.04 (or 24.04) host, Docker, Cloudflare Tunnel for ingress. Setup in ~10 minutes.
- Boot a fresh Ubuntu 26.04 LTS droplet / instance (1 vCPU / 1 GB RAM is enough for the static channel; bump to 2 GB if you also run the API container in Phase M).
- SSH in as a non-root user with passwordless sudo.
curl -fsSL https://get.docker.com | sudo sh
sudo usermod -aG docker $USER
newgrp dockergit clone https://github.com/simtabi/get-installer.git
cd get-installer
cp .env.example .env
# Edit .env: set PG_PASSWORD, GET_INSTALLER_TOKEN_SECRET,
# CLOUDFLARE_TUNNEL_TOKEN
python3 scripts/bundle.py # builds dist/installer.py# Static-only (no DB / API):
docker compose up -d get
# Static + Cloudflare Tunnel:
docker compose --profile tunnel up -d
# Full stack (static + DB; the API service ships in Phase M):
docker compose up -dcurl -fsS http://localhost:8080/healthz # local
curl -fsSL https://get.simtabi.com/install.sh | head -1 # public, via CF tunnelgit pull
python3 scripts/bundle.py
docker compose pull
docker compose up -d --build- Logs:
docker compose logs -f getfor nginx, ditto forcloudflared. The container streams everything to stdout/stderr; no log files to rotate inside. - Backups: only
postgrescarries state.docker compose exec postgres pg_dump -U $PG_USER $PG_DB > backup.sqlon a cron. - Monitoring: the
healthzendpoint + theHEALTHCHECKdirective in the Dockerfile meandocker compose psalready shows green/red. For external monitoring, point UptimeRobot / Better Stack athttps://get.<domain>/healthz. - Resource limits: add
deploy.resources.limits.memory/cpusto each service indocker-compose.prod.ymlif you're sharing the box with other workloads.
A single $5 VPS handles ~1k installs/day without breaking a sweat,
because the workload is "serve static bytes". When you exceed that,
or need multi-region, switch to the AWS deployment in
deploy/aws.md.