DEV Community

Elder Fernandes
Elder Fernandes

Posted on • Originally published at selfhoststack-8z4.pages.dev

How I Replaced $450/mo in SaaS Subscriptions with a Single $4 Hetzner VPS (And Slept Better)

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:
Enter fullscreen mode Exit fullscreen mode

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:
Enter fullscreen mode Exit fullscreen mode

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:
Enter fullscreen mode Exit fullscreen mode

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
}
Enter fullscreen mode Exit fullscreen mode

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)