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
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
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)