Originally published on SelfHostStack
Every modern tech team hits the same inflection point. You start building your side project or startup with "generous free tiers":
- Google Analytics 4 for traffic
- Zapier for lead notifications
- Sentry for crash tracking
- 1Password / Bitwarden cloud for shared team credentials
- Better Uptime for health pings
For the first three months, everything looks free. Then you launch.
Traffic picks up, your users trigger hundreds of webhook events, your frontend throws a minor React render loop that floods Sentry with 50,000 exceptions, and suddenly you get a $480 invoice notification from your credit card.
Here is the exact setup I used to migrate 5 core SaaS tools to a single €3.79/mo Hetzner Cloud VPS (CX22 — 2 vCPUs, 4GB RAM) using Docker Compose, saving over $5,000/year while regaining 100% data privacy.
The SaaS vs. Self-Hosted Reality Check
| Proprietary SaaS | Typical Monthly Cost | Self-Hosted Replacement | Resource Usage (RAM) |
|---|---|---|---|
| Google Analytics (GA4) | $0 (data harvesting) / $50k | Umami Analytics | ~120 MB |
| Zapier (Starter Plan) | $29.99 - $120/mo | n8n | ~350 MB |
| Sentry (Team Plan) | $26 - $80/mo | GlitchTip | ~280 MB |
| Better Uptime | $30/mo | Uptime Kuma | ~90 MB |
| 1Password Teams (5 seats) | $39.95/mo | Vaultwarden | ~30 MB |
| Total | ~$450/month | Hetzner CX22 (€3.79/mo) | ~870 MB / 4000 MB |
Total RAM utilized: less than 1GB out of 4GB available. The server runs cool at ~2% CPU utilization.
1. Web Analytics: Say Goodbye to Cookie Banners with Umami
Google Analytics 4 is a bloated tracking monster that triggers mandatory GDPR cookie consent banners in Europe and slows down site speed.
Umami is an open-source analytics engine with a script payload under 2KB (10x lighter than GA4). It collects zero personal identifiable information, requires no cookie banners, and when served through your own domain, bypasses 99% of browser ad-blockers.
The Docker Compose Configuration:
version: '3.8'
services:
umami:
image: ghcr.io/umami-software/umami:postgresql-latest
container_name: umami
restart: always
ports:
- "3000:3000"
environment:
DATABASE_URL: postgresql://umami:securepassword123@db:5432/umami
DATABASE_TYPE: postgresql
APP_SECRET: your_random_32_byte_secret_here
depends_on:
- db
db:
image: postgres:16-alpine
container_name: umami-db
restart: always
environment:
POSTGRES_DB: umami
POSTGRES_USER: umami
POSTGRES_PASSWORD: securepassword123
volumes:
- umami-db-data:/var/lib/postgresql/data
volumes:
umami-db-data:
2. Team Passwords & Secrets: Vaultwarden
Centralized password databases make enticing breach targets. Vaultwarden is a lightweight Bitwarden server written in Rust. It consumes less than 30MB of RAM and works seamlessly with official Bitwarden mobile apps, desktop clients, and browser extensions.
version: '3.8'
services:
vaultwarden:
image: vaultwarden/server:latest
container_name: vaultwarden
restart: always
environment:
WEBSOCKET_ENABLED: "true"
SIGNUPS_ALLOWED: "false" # Lock registration after creating admin
ADMIN_TOKEN: "your_secure_admin_token"
volumes:
- vw-data:/data
ports:
- "8080:80"
volumes:
vw-data:
3. Workflow Automation: Unlimited Runs with n8n
Zapier meters every single task execution. A multi-step workflow that triggers 1,000 times a day will easily run you into hundreds of dollars every billing cycle.
n8n gives you visual drag-and-drop nodes, AI agent connectors, and custom Python/Node.js script nodes with unlimited executions.
version: '3.8'
services:
n8n:
image: docker.n8n.io/n8nio/n8n:latest
container_name: n8n
restart: always
ports:
- "5678:5678"
environment:
- N8N_HOST=n8n.yourdomain.com
- N8N_PORT=5678
- N8N_PROTOCOL=https
- NODE_ENV=production
- WEBHOOK_URL=https://n8n.yourdomain.com/
volumes:
- n8n_data:/home/node/.n8n
volumes:
n8n_data:
How to Glue It Together: Caddy Reverse Proxy & Automatic SSL
To expose each service securely under its own subdomain (e.g. analytics.yourdomain.com, vault.yourdomain.com, n8n.yourdomain.com), use Caddy. Caddy automatically provisions and auto-renews free Let's Encrypt TLS certificates.
Sample Caddyfile:
analytics.yourdomain.com {
reverse_proxy localhost:3000
}
vault.yourdomain.com {
reverse_proxy localhost:8080
}
n8n.yourdomain.com {
reverse_proxy localhost:5678
}
The Verdict
Self-hosting in 2026 is no longer about managing obscure Linux daemons. With Docker Compose and a reliable $4/mo VPS provider like Hetzner or DigitalOcean, you can run an entire enterprise stack with zero cloud lock-in.
Looking for more copy-paste Docker Compose templates and hardware minimums? Check out the full interactive catalog at SelfHostStack.
Top comments (0)