Infrastructure · 13 Aug 2026

Nine apps, one €14 VPS: what moving off Railway actually cost me

A real migration from Railway to a Contabo VPS running Coolify — the numbers, the provider that rejected me, and what I gave up to save $25 a month.

Amit Ranjan · 13 August 2026

I had four applications on Railway costing about $17/month, and five more I wanted to put somewhere. Napkin maths said $25–40 once everything was up — and Railway's pricing scales with every service you add, so "somewhere between" was the honest answer, not a number.

For a business with revenue that's noise. For a solo founder with a runway, it's a line item you look at.

I moved everything to a single VPS running Coolify. One flat bill, ~€14/month. Here's what that actually involved, including the part where a provider refused my money.


What was running

Four Railway projects, and the per-project costs are worth showing because they weren't what I expected:

ProjectServicesRailway cost/mo
Regression suite generatorapi, worker (Playwright), Postgres, Redis, object storage~$2.16
Learning platformweb, Postgres, cron job~$1.52
NSE trading deskweb + persistent volume~$8.46
Multi-tenant SaaSweb, api, Postgres~$3.22

The interesting row is the third. My personal trading dashboard — the thing with zero users but me — was more than half my hosting bill, because of a persistent volume holding about a gigabyte of market data. My most complex application, the one running headless Chrome in a background worker, cost a quarter of that.

That is the thing about usage-based pricing: the cost lands where the *resources* are, not where the *value* is. You don't notice until you itemise it. I'd have guessed the Playwright worker was my expensive one and I'd have been wrong by 4x.


Sizing it honestly

Before comparing providers I wrote down what I actually needed to run, because the temptation is to pick the cheapest box and discover the OOM killer at 2am.

ComponentRAM at demo idle
OS + Coolify1.0–1.5 GB
Regression suite (api + Playwright worker + Postgres + Redis)2.0–3.5 GB
Learning platform (web + Postgres)0.5–0.8 GB
NSE desk (web + volume)0.5–1.0 GB
Multi-tenant SaaS (web + api + Postgres)0.8–1.2 GB
Availability indicator0.2–0.4 GB
Five more demo apps2.0–4.0 GB
Comfortable total8–12 GB minimum, 16–24 GB safer

Two things drove the number up. Playwright is the expensive tenant — a headless browser will happily take a gigabyte per instance, and it spikes rather than sitting flat. And Docker on a multi-app box eats disk faster than you expect: images, build cache, and a Postgres volume per app. I wanted ≥200 GB so I'd never be pruning images at midnight to finish a deploy.

If you take one thing from this post: size for your worst tenant's peak, not your average. The average is a comfortable lie.


The provider comparison

I compared eleven options on vCPU, RAM, disk, bandwidth, price, and — this is the part most comparison posts skip if they're not written from India — whether I could actually pay them.

Provider / planvCPURAMDiskCost/moIndia signupFits?
Contabo Cloud VPS 448 GB100 GB~€5.50Card/PayPalNo — will OOM
Contabo Cloud VPS 6612 GB200 GB~€7.50Card/PayPalTight
Contabo Cloud VPS 8824 GB300 GB~€14Card/PayPalYes
Hostinger KVM 228 GB100 GB₹779 → ₹1,199 renewUPINo
Hostinger KVM 4416 GB200 GB₹1,099 → ₹2,399 renewUPIShort-term
Hostinger KVM 8832 GB400 GB₹2,199 → ₹4,399 renewUPIYes, costly
GigaNodes Cloud M816 GB120 GB~₹3,168UPI + GSTDisk thin
DigitalOcean (Bangalore)48 GB160 GB~$48CardWorse than Railway
Stay on Railwaymetered$17 → $25–40+Cost scales forever

Watch the renewal prices. Hostinger's headline numbers are excellent and their renewals are 2–3x that. A first-year price is a marketing number; budget on year two.

DigitalOcean at ~$48/month for 8 GB would have cost more than the Railway bill I was leaving. Managed-cloud pricing in 2026 has drifted far enough from bare VPS pricing that it's not a close call at this scale.

The provider that said no

Hetzner rejected my account. Verification failed for an Indian signup, which is common enough that it's worth stating plainly — Hetzner is the default recommendation in every "cheap VPS" thread, and if you're signing up from India there's a real chance you'll spend a day on it and end up nowhere. I'd budgeted them as first choice and had to write "do not retry" in my own notes.

Payment method is a real constraint, not a footnote. Half the "best VPS" lists on the internet are written by people who have never had a signup declined.

Chosen: Contabo Cloud VPS 8 — 8 vCPU, 24 GB RAM, 300 GB SSD, ~€14/month, Ubuntu 24.04, EU region.


The migration

Coolify installs with one command and gives you a Traefik reverse proxy, automatic Let's Encrypt certificates, git-based deploys, and a UI for environment variables. It's the closest thing to Railway you can run yourself, and that similarity is the whole point — the mental model transfers.

The actual sequence:

  1. Provision the box, install Coolify, add an SSH key
  2. Recreate each app as a Coolify resource — pointed at the same GitHub repo, same Dockerfile, environment variables copied across by name
  3. pg_dump every Railway Postgres, restore into the new one
  4. Copy the volumes. ~934 MB for the NSE desk's data directory, ~18 MB of artifacts from the regression tool's object storage
  5. Re-point DNS — A records to the VPS IP, Railway CNAMEs removed. I automated this through my registrar's API rather than clicking through twenty records.
  6. Wait for certificates, then smoke-test every domain over HTTPS
  7. Rebuild the scheduled jobs. One app had a Railway cron hitting an endpoint every five minutes; that became a host crontab entry.
  8. Only then, stop the Railway services

Point 8 matters. Keep the old thing running until the new thing has been serving real traffic for a few days. Migration posts always end at "DNS propagated 🎉" and skip the week where you find the thing you forgot.

The things I forgot: the object storage (Railway's Tigris bucket had artifacts I'd never thought about, now on a local volume), and one API subdomain that had never had its own A record because Railway was handling it implicitly.

Four applications, databases restored, ~1 GB of volume data moved, and all five custom domains serving HTTPS. One working day. Making those deploys reproducible from git a few days later found four production bugs that uptime checks had never seen, including four containers answering to the name postgres.


What it actually cost me

The savings are real: ~$17–40/month down to ~€14 flat, and — more importantly — the marginal cost of the next app is now zero. That changes behaviour. I stopped thinking about whether a demo was "worth" deploying.

But the bill is not the whole trade, and I'd be selling you something if I pretended it was.

What Railway was doing that I now do myself:

  • Backups. Railway's managed Postgres backed itself up. Mine doesn't. Four databases on one machine with no backup is a strictly worse position than I was in before, until I fix it — and "until I fix it" is how people lose data. If you make this move, set up automated pg_dump to *another provider's* object storage before you cut over. Not after.
  • Security. The platform's attack surface is now mine. An admin panel, an SSH port, and every container on one host. Coolify's dashboard defaults to a plain HTTP port, which is fine on a laptop and not fine on a public IP — put it behind TLS and a firewall on day one.
  • Uptime. No platform team. If the box goes down at 3am, it's down until I notice. External uptime monitoring is not optional; it's the thing standing in for the ops team you no longer have.
  • The blast radius. Nine apps on one machine is nine apps that share a fate. Railway's isolation was worth something.

Latency. I'm in India; the box is in the EU. That's roughly 150ms of round-trip I've accepted because everything on it is a demo or an internal tool. Contabo's India datacentre is about $4/month extra and would be the obvious call the moment a real customer is served from it.

"Unlimited" bandwidth carries a fair-use asterisk, as it always does. Fine for this workload; read the terms if yours is different.


When this is the right move

Do it if you're running several small always-on services, your platform bill scales with service count, you're comfortable with Docker and a Linux box, and you'd rather own the operational work than pay to avoid it.

Don't if your bill is under ~$10/month (the migration costs more in time than you'll save), you have real customers and no on-call story, or you'd be doing it for the aesthetics of self-hosting rather than a number you actually looked at.

The honest summary: I traded roughly $25/month for a few hours of ongoing operational responsibility. At my current stage, where the marginal-cost-of-a-new-demo being zero changes what I build, that's a good trade. When there's a paying customer on that box, I'll re-run the sum — and the answer might well be different.


I build AI systems — retrieval platforms, in-app assistants, automated regression testing — and deploy them on infrastructure like this. If your team wants something in production rather than in a notebook, the AI Readiness Audit is the shortest way to find out what's actually running.