DEV Community

RyanCwynar
RyanCwynar

Posted on • Originally published at ryancwynar.com

One VPS, Ten Projects: Docker + Traefik + Cloudflare for Indie Hackers

If you are running multiple side projects and paying for separate hosting on each one, stop. A single $10/month VPS can host all of them with automatic HTTPS, zero-downtime deploys, and a reverse proxy that routes traffic by domain name. Here is the exact stack I use.

The Problem

Every indie hacker hits this wall. You have a Next.js blog on Vercel, an API on Railway, a workflow tool on some other platform, and a static site on Netlify. Each one is cheap individually, but the costs add up. Worse, you are scattered across five dashboards with five different deploy workflows.

I consolidated everything onto one Hostinger VPS. One machine. One docker-compose.yml. Ten services.

The Stack

Traefik sits at the front as a reverse proxy. It listens on ports 80 and 443, terminates TLS with automatic Let us Encrypt certificates, and routes requests to the right container based on the domain name. No nginx config files. No manual cert renewals.

Docker Compose defines every service. Each project gets its own container with its own Dockerfile. They all share a Docker network so they can talk to each other internally, but only Traefik is exposed to the internet.

Cloudflare handles DNS. Point your domain to the VPS IP, set it to DNS-only mode (not proxied, since Traefik handles TLS), and you are done. New project? Add an A record, add a container, redeploy.

What a Service Looks Like

Here is a stripped-down example from my docker-compose.yml:

website:
  build: ./repo/byldr-nextjs
  labels:
    - traefik.enable=true
    - traefik.http.routers.website.rule=Host(`byldr.co`)
    - traefik.http.routers.website.tls.certresolver=letsencrypt
  networks:
    - web
Enter fullscreen mode Exit fullscreen mode

That is the entire routing config. Traefik reads Docker labels at runtime. No config file to update, no proxy to restart. Add the labels, run docker compose up -d, and Traefik picks it up automatically.

What I Am Running

Right now my single VPS hosts:

  • Traefik — reverse proxy and TLS termination
  • A Next.js marketing site — server-side rendered, rebuilt with docker compose build
  • Convex backend — self-hosted database and serverless functions
  • Convex dashboard — admin UI for the backend
  • n8n — workflow automation (prospecting, SEO, monitoring)
  • PostgreSQL — relational data for analytics and keyword tracking
  • Redis — caching and rate limiting
  • A Rust API — lightweight endpoints for webhooks and integrations
  • A voice AI server — Twilio plus OpenAI Realtime API bridge

All on a VPS with 4 cores and 8GB of RAM. It never breaks a sweat.

Deploy Workflow

Deploying a change is two commands:

docker compose build --no-cache website
docker compose up -d website
Enter fullscreen mode Exit fullscreen mode

Traefik handles the switchover. The old container keeps serving until the new one is healthy. No load balancer config. No blue-green scripts.

For the Convex backend, I run npx convex deploy which pushes functions to the self-hosted instance. Same VPS, different deploy path.

The Economics

Hostinger VPS: $10 per month. Cloudflare DNS: free. Let us Encrypt: free. Docker: free. Traefik: free.

Compare that to hosting the same services across Vercel, Railway, Render, and a managed database. You are looking at $50 to $100 per month minimum, and you do not even get the benefit of services being able to talk to each other on a local network.

The tradeoff is that you are your own ops team. If the VPS goes down, you fix it. But honestly, it has been months since I had to touch anything beyond deploying new code.

When This Does Not Work

If you need global edge distribution, use Vercel or Cloudflare Workers. If you need five nines of uptime for paying customers, use managed infrastructure. If you are allergic to SSH, this is not for you.

But if you are an indie hacker with a portfolio of projects and you want to keep costs near zero while maintaining full control — one VPS, Docker Compose, and Traefik is hard to beat.

Getting Started

Spin up a cheap VPS. Install Docker. Copy a docker-compose.yml with Traefik configured for Let us Encrypt. Add your first service with the right labels. Point a domain at it.

The whole setup takes about an hour. After that, adding a new project takes five minutes.

Stop paying five platforms to host five projects. Put them all in one place and move on to building.

Top comments (0)