A production-grade self-hosted ops stack designed for founders and lean teams. n8n, PostgreSQL, Redis, Listmonk, Mautic, Chatwoot, Umami, Traefik with auto-SSL, all on a single Oracle Cloud free-tier ARM VM. 21 containers, ~2.7 GB of 24 GB used, no SaaS lock-in, under two hours from empty machine to provisioned stack.
| SaaS | Typical cost | Self-hosted equivalent |
|---|---|---|
| Zapier / Make | $20–80/mo | n8n + Worker |
| Mailchimp / SendGrid | $30–100/mo | Listmonk |
| HubSpot / ActiveCampaign | $50–150/mo | Mautic |
| Intercom / Drift | $75–200/mo | Chatwoot |
| Google Analytics + Plausible | $0–20/mo | Umami |
| Heroku / Railway | $25–100/mo | Oracle Cloud free ARM VM |
| Cloudflare Pro | $20/mo | Traefik + Let's Encrypt |
| Total floor | ~$220–670/mo | minimal |
The entire stack runs on one Oracle Cloud ARM instance (4 cores, 24 GB RAM). Traefik terminates TLS on ports 80/443 and routes subdomains to the right container over an internal Docker network. PostgreSQL and Redis are shared between services but accessed over the private network only. Every container has a health check and a restart policy — if something crashes at 3 AM, the stack self-heals before anyone notices.
| Component | Containers | Approx RAM |
|---|---|---|
| Traefik | 1 | ~80 MB |
| PostgreSQL 16 | 1 | ~400 MB |
| Redis 7 | 1 | ~60 MB |
| n8n + worker | 2 | ~500 MB |
| Listmonk | 1 | ~150 MB |
| Mautic (app + php-fpm + nginx) | 3 | ~450 MB |
| Chatwoot (web + worker + sidekiq) | 3 | ~600 MB |
| Umami | 1 | ~100 MB |
| Supporting (CDN, backups, metrics) | 8 | ~350 MB |
| Total | 21 | ~2.7 GB / 24 GB |
| Concern | How it's handled |
|---|---|
| SSL / certs | Traefik + Let's Encrypt, auto-renew, wildcard where needed |
| Backups | Daily pg_dump cron, encrypted, shipped offsite (S3-compatible) |
| Secrets | .env files per service, never committed, rotated via one script |
| Monitoring | Container healthchecks + Uptime Kuma, Telegram alerts on failure |
| Firewall | Oracle security list + ufw, only 22/80/443 exposed |
| Updates | Weekly apt upgrade + staged container image bumps with rollback |
docker compose up -d against a committed compose file and environment. Rebuild on a new VM is under two hours — from empty Oracle instance to fully routed stack with SSL.Oracle free tier is ARM. Many official Docker images still ship x86-only or lag behind on multi-arch.
Most guides assume Cloudflare or a paid cert provider. That adds an external dependency and another bill.
Running one Postgres for n8n, Mautic, Listmonk and Chatwoot sounds dangerous — one bad migration can take everything down.
pg_hba.conf restricts internal networking only. Backups are per-schema so a restore of one service never touches the others.Pulling latest on a production Mautic or Chatwoot image is a good way to destroy a week.
Chatwoot's Rails + Sidekiq stack is hungry. Naive defaults push past 1 GB for a single service.
Self-hosted email has a reputation problem: either it lands in spam or you pay a commercial ESP anyway.
I migrate founders and lean teams off SaaS stacks into self-hosted infrastructure they actually own. Fixed scope, fixed price, runbook + handover included. Same stack I run for production environments, deployed for yours.
💬 Hire Me on Contra ← Back to portfolio