Infrastructure

Replacing Vercel with Bare-Metal Debian and nginx

By Joseph W. Anady · Published 2026-05-20 · Updated 2026-05-22

Vercel and Netlify built a generation of developers who never had to touch a Linux box. The pricing model worked when sites were small. At any meaningful scale, the costs and the lock-in start to matter. Here is what running production traffic on bare-metal Debian plus nginx actually looks like in 2026, with real numbers from a 130-site portfolio.

Short answer: Bare-metal Debian plus nginx serves Next.js static exports and Astro builds with TTFB under 200ms, LCP under 2.5s on most pages, and operating costs around $30 per month per server. For static or mostly-static sites, it is faster, cheaper, and you own your stack. For SSR-heavy apps, the operational tradeoff is real.

Vercel pricing reality check

Vercel's free tier covers personal projects. The Pro tier starts at $20 per user per month and scales by team size and bandwidth. Once you cross any of: 1 TB bandwidth, 100k invocations, or basic feature gates, the bill compounds.

For a five-site studio shipping 50 GB per month each, you are paying $20 per user per month plus bandwidth overage. Add Edge Function invocations and the monthly invoice settles in the $80-$200 range for a single developer.

A single $30 Debian VPS runs the same five sites at any bandwidth without changing the bill.

What you actually need

The setup is unromantic. A Debian VPS (Hetzner, Vultr, Linode, DigitalOcean), nginx, Let's Encrypt for SSL, BIND or external DNS, and an rsync deploy step. That is the entire stack.

# nginx vhost for a Next.js static export
server {
  listen 443 ssl http2;
  server_name www.example.com;
  ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
  root /var/www/example.com;
  index index.html;

  # Static export: serve /path/index.html for /path/ requests
  location / {
    try_files $uri $uri/index.html $uri/ =404;
  }

  # Long cache for hashed assets, short cache for HTML
  location /_next/static/ {
    expires 365d;
    add_header Cache-Control "public, immutable";
  }
  location ~* \.html$ {
    expires 5m;
    add_header Cache-Control "public, must-revalidate";
  }
}

Performance comparison

Side-by-side PSI runs on the same Next.js 14 site, deployed to (a) Vercel Pro and (b) bare-metal Debian + nginx in the US Central region:

MetricVercel ProDebian + nginx
TTFB180-280ms90-180ms
LCP mobile2.4-3.1s2.1-2.9s
CLS0.00-0.050.00-0.05
PSI performance score88-9490-97

Bare-metal usually wins TTFB because the request hits one server, not an edge function that warms up a Node container on each cold start. For static content, the edge layer adds latency rather than removing it. For SSR with real compute work per request, the Vercel edge is genuinely fast; the comparison flips.

The lock-in cost nobody talks about

Vercel-specific primitives (Edge Functions, Image Optimization, Middleware in the platform-specific shape, ISR with their cache invalidation API) only run on Vercel. The moment you depend on one, your site cannot migrate without a rewrite.

On bare-metal, the same Next.js build artifact (the static export from next build with output: 'export') runs anywhere a webroot can be served from. The platform is interchangeable. The site is portable.

When Vercel is the right answer

This is not an anti-Vercel piece. Vercel makes sense when:

For everyone else, bare-metal is the cleaner answer.

Operational reality

Running bare-metal is not free. You will spend time on:

The ThatDevPro pattern is to run one beefy VPS (4 vCPU, 16 GB RAM) serving 100+ sites via nginx vhosts. Backup runs nightly to a $5 storage VPS at a different provider. Total cost: about $35 per month for the whole portfolio.

If you want this

The studio runs managed bare-metal hosting as part of every engagement. Or read the tutorials for the patterns: nginx config, certbot automation, rsync deploy, and the monitoring stack.