2026-07-23 · 6 min read · Rahul Chitturi
- self-hosted
- cloud
- ops
Self-hosting is attractive because one Docker Compose file can replace a managed service bill. The hidden cost is operational discipline: domains, backups, cron jobs, updates, and secrets now belong to your team.
A launch checklist keeps the first public deploy from becoming the first incident. It also gives future maintainers a map when the service moves from a weekend project to a business dependency.
Check public routing first
Before testing application features, prove that traffic reaches the right container. DNS records, reverse proxy labels, TLS certificates, exposed ports, and firewall rules should all agree on the public hostname.
- Confirm the domain points to the expected server or load balancer
- Verify proxy labels and service ports in Compose
- Keep admin dashboards behind authentication or private networks
- Document the health check URL and expected response
Treat background jobs as production code
Backups, cleanup jobs, feed imports, email senders, and certificate renewals often run quietly until they break. Record cron schedules in UTC or a named timezone, preview the next runs, and make destructive jobs idempotent.
If a launch requires a manual backfill, capture the date range and dry-run output before executing it. Recovery scripts should be safer than the incident they are fixing.
A Flashman workflow
Use the Portainer env helper for stack variables, the cron tool for scheduled jobs, the JSON formatter for app config, and the diff tool for launch notes. Keep sanitized examples in the checklist and store real secrets in the deployment platform.
The final handoff should include domain, service owner, compose source, image tag, env location, backup schedule, health check, restore note, and rollback path.