Skip to main content

Operations

Everything here is a summary. The runbooks in the Hill90 repository are the procedures; they change in the same pull request as the code they describe, and CI checks them.

Deploying

Deploys run on the VPS over SSH, never from a workstation. The deploy scripts build and run containers wherever you execute them.
Three stacks, deployed independently:
Order matters on a fresh host: edge first, because docker-compose.infra.yml creates the three Docker networks the other stacks attach to as external. Vault deploys before anything meant to read secrets from it, and deploy.sh vault auto-unseals after compose up. Observability has no dependencies. Each stack has its own Compose project name (hill90-{env}-{stack}), so an errant docker compose down cannot reach across stacks.

Deploy safety

The edge stack is excluded from push-triggered deploys on purpose: recreating Traefik re-requests certificates, and Let’s Encrypt rate limits make that something to do deliberately. See Certificates.

Backups

Stateful deploys run scripts/backup.sh automatically before the deploy cycle. Backups land at /opt/hill90/backups/<service>/<timestamp>/ on the VPS with 7-day default retention.

Rebuilding the VPS

A full rebuild is automated end to end and requires no manual intervention:
Bootstrap alone takes about three to five minutes. Tailscale auth keys are generated and rotated automatically during rebuild, and DNS is reconciled as part of the process.

Disaster recovery

Recovery from total VPS loss depends on artefacts that must exist before the loss:
  • A local clone of the repository, current with main
  • The SOPS-encrypted secrets file, infra/secrets/prod.enc.env
  • The age private key, infra/secrets/keys/age-prod.keygitignored and never committed; restore it from your password manager or the VPS
  • Hostinger API access
The age key is the single point of failure in the chain. Everything else is reproducible from the repository.

Runbooks

Reference