Tooling

Single VPS

One box, SSH access, and a deploy script. Often enough.

The most underrated setup in 2026. A single $5–50/mo VPS will run a real SaaS comfortably — sometimes for years.

Components

  • A VPS: Hetzner (€4/mo + tax for solid hardware), DigitalOcean ($6+), Vultr, Linode, Scaleway, Contabo (cheap, big disks).
  • OS: Debian 12 / Ubuntu 24.04 LTS — boring, supported.
  • Web server / proxy: Caddy — single binary, automatic HTTPS, glorious DX.
  • App runtime: Node / Bun / Python / Go / whatever; run it under systemd or PM2.
  • DB: Postgres on the same box, or a managed Postgres (Neon / Supabase / Crunchy).
  • Backup: restic → Cloudflare R2 / Backblaze B2 daily.
  • Monitoring: Netdata (free agent, beautiful UI), or Prometheus + Grafana if you like.
  • Network: Tailscale + UFW. SSH only over Tailscale; public ports limited to 80/443.
  • Deploy: Kamal 2, or just rsync + systemd, or Coolify if you want a UI.

What it's good at

  • Cost. $20/mo runs more than you'd think.
  • Mental model. One IP, one filesystem, one log file. Easy to reason about.
  • Speed of changes. SSH and edit. No CI/CD pipeline required (though add one).
  • Privacy / data sovereignty. You own the disk.

Where it strains

  • Single point of failure. Box crashes → outage. Mitigate with snapshots, fast restore, and DNS-level health checks.
  • Capacity planning. No autoscale. Buy bigger VPS when you outgrow it.
  • Updates. OS patching becomes a chore — set up unattended-upgrades.
  • Multi-region. Hard. If you need it, move on.

What's the actual setup look like

A typical "single VPS, Docker-flavored" setup:

  1. Provision the VPS, set hostname, lock down SSH (key-only, change port, fail2ban).
  2. Install Docker + Docker Compose.
  3. Install Coolify or set up Caddy + Docker Compose by hand.
  4. Install Tailscale for admin access.
  5. Set up restic → R2 nightly.
  6. Configure Netdata for monitoring.
  7. Point DNS, deploy, sleep at night.

When to upgrade

  • You can't reboot without a customer noticing → fleet of two.
  • DB and app are competing for resources → split DB to managed Postgres.
  • You're tired of running ansible-like scripts → move to PaaS or k8s.

Pick this if…

  • Solo founder, prototype, or v1. This is the right answer.
  • Internal tool for a small team. Boring. Bulletproof.
  • Side project / hobby. Don't overthink it.

Skip if you have multiple devs deploying simultaneously, or if your customers will riot over a 5-minute restart.

On this page