Running Production Infrastructure Solo: 162 Containers Across Three Hosts
Description and use
Three hosts, 162 containers, 78 compose stacks, one operator—automated TLS, central SSO, cross‑host monitoring, tested backups, and self‑hosted CI/CD enable reliable, client‑ready deployments without handing off infrastructure.
Problem
A developer who also runs production infrastructure must keep services reachable, backed up, and secure while avoiding split responsibilities that hide server issues from code authors.
Outcome
Three hosts, 162 containers, 78 compose stacks, one operator—automated TLS, central SSO, cross‑host monitoring, tested backups, and self‑hosted CI/CD enable reliable, client‑ready deployments without handing off infrastructure.
Workflow
- Deploy Traefik on each host with automated ACME TLS
- Configure authentik as the sole SSO provider
- Set up Prometheus to scrape metrics from all hosts
- Create Grafana dashboards for unified monitoring
- Implement Gitea Action runners for CI/CD
- Configure snapshot‑based backups on Synology and Duplicati/restic jobs
- Write a script to query Portainer API for container counts
- Document all configuration values in compose files
- Set alerts for missing exporter data
- Test backup restore procedures
Evidence
Three hosts, 162 containers, 78 compose stacks, one operator — with automated TLS, central SSO, cross-host monitoring, tested backups and self-hosted CI/CD.
Passbolt, my team password manager, started returning 504s and its cron job appeared to hang. It turned out to be three separate failure modes with one root cause: a configuration value that existed inside the running container but never in the compose file.
Numbers on a CV go stale quietly. Mine are re-derivable: a small script reads the live Docker endpoints through the Portainer API and counts containers and compose stacks per host.
- Record date: 2026-11-01T08:58:53.574Z