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:
| Project | Services | Railway cost/mo |
|---|---|---|
| Regression suite generator | api, worker (Playwright), Postgres, Redis, object storage | ~$2.16 |
| Learning platform | web, Postgres, cron job | ~$1.52 |
| NSE trading desk | web + persistent volume | ~$8.46 |
| Multi-tenant SaaS | web, 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.
| Component | RAM at demo idle |
|---|---|
| OS + Coolify | 1.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 indicator | 0.2–0.4 GB |
| Five more demo apps | 2.0–4.0 GB |
| Comfortable total | 8–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 / plan | vCPU | RAM | Disk | Cost/mo | India signup | Fits? |
|---|---|---|---|---|---|---|
| Contabo Cloud VPS 4 | 4 | 8 GB | 100 GB | ~€5.50 | Card/PayPal | No — will OOM |
| Contabo Cloud VPS 6 | 6 | 12 GB | 200 GB | ~€7.50 | Card/PayPal | Tight |
| Contabo Cloud VPS 8 | 8 | 24 GB | 300 GB | ~€14 | Card/PayPal | Yes |
| Hostinger KVM 2 | 2 | 8 GB | 100 GB | ₹779 → ₹1,199 renew | UPI | No |
| Hostinger KVM 4 | 4 | 16 GB | 200 GB | ₹1,099 → ₹2,399 renew | UPI | Short-term |
| Hostinger KVM 8 | 8 | 32 GB | 400 GB | ₹2,199 → ₹4,399 renew | UPI | Yes, costly |
| GigaNodes Cloud M | 8 | 16 GB | 120 GB | ~₹3,168 | UPI + GST | Disk thin |
| DigitalOcean (Bangalore) | 4 | 8 GB | 160 GB | ~$48 | Card | Worse than Railway |
| Stay on Railway | metered | — | — | $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:
- Provision the box, install Coolify, add an SSH key
- Recreate each app as a Coolify resource — pointed at the same GitHub repo, same Dockerfile, environment variables copied across by name
pg_dumpevery Railway Postgres, restore into the new one- Copy the volumes. ~934 MB for the NSE desk's data directory, ~18 MB of artifacts from the regression tool's object storage
- 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.
- Wait for certificates, then smoke-test every domain over HTTPS
- Rebuild the scheduled jobs. One app had a Railway cron hitting an endpoint every five minutes; that became a host crontab entry.
- 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_dumpto *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.