Install on a VM

Railway's workflow on your own servers

Open source and self-hosted. Install it on a Linux VM and deploy apps and databases from a canvas, the way you do on Railway.

curl -fsSL https://openrail.app/install.sh | sudo sh
The Docker image picker in the console, with nginx:1.27 typed and the Add nginx:1.27 option

Deploy a Docker image, add Postgres, point DATABASE_URL at it, generate an HTTPS domain and open it: the real console on a fresh 2 vCPU VM, 2026-10-24, one take of 24 s. Waits are sped up and labelled on screen; host names are replaced with example.com.

Read the steps
  1. Deploy an image. On an empty canvas, Add, then Docker Image: nginx:1.27 is staged and deployed. The wait is sped up and labelled.
  2. Add Postgres. Add Postgres. It runs as its own service with a volume.
  3. Wire DATABASE_URL. Set DATABASE_URL on nginx to ${{Postgres.DATABASE_URL}}, then redeploy.
  4. Get a URL. In Settings, Networking, Generate Domain gives nginx a public HTTPS name.
  5. Live. Open the name: the nginx welcome page, served over HTTPS.

The same flow, step by step, is the quick start.

Watch the 88 s demo

One take on a fresh VM: install, deploy, add Postgres, reference its URL, open the HTTPS address, scale. Captions are on; there is no sound.

The console you already know

The canvas of the orbit project: web, api with 3 replicas, a cron job, a crashed worker, Postgres grouped with PgBouncer, Redis, docs with one staged change and search deploying, joined by dashed reference lines The canvas of the orbit project: web, api with 3 replicas, a cron job, a crashed worker, Postgres grouped with PgBouncer, Redis, docs with one staged change and search deploying, joined by dashed reference lines
Every service of a project on one canvas. Dashed lines are variable references; changes wait in one bar until you deploy them. The basics
The Add menu open on the canvas, listing GitHub Repo, Template, Database, Docker Image, Empty Service, Volume and Import Compose File The Add menu open on the canvas, listing GitHub Repo, Template, Database, Docker Image, Empty Service, Volume and Import Compose File
Add a GitHub repo, a database, a template, a Docker image, an empty service or a volume from one menu. Deploy a Docker image
The Metrics tab of the api service: CPU per replica over the last week with a deploy marker, and the top of the memory chart The Metrics tab of the api service: CPU per replica over the last week with a deploy marker, and the top of the memory chart
CPU, memory, network, HTTP requests, error rate and response time for each service, with every deploy marked on the charts. The basics
The Scale settings of the api service: CPU and memory limits per replica, the memory reservation, and Use all cores switched on under Processes The Scale settings of the api service: CPU and memory limits per replica, the memory reservation, and Use all cores switched on under Processes
Set Replicas and openrail runs that many copies behind its proxy. Use all cores runs a Node service started with node server.js as one process per vCPU; other runtimes get WEB_CONCURRENCY. Use all coresBeta: replicas spread across several hosts work in 0.1.0 but are not yet covered by the end-to-end tests. What is beta Use all cores, measured: 4.05x on a 4-core VM. On an 8 vCPU VM with 4 physical cores, a CPU-bound Node service went from 59.2 to 239 req/s and from 534 to 2232 req/s (4.04x, 4.18x). The gain is about the number of physical cores. On an earlier 2 vCPU VM whose two vCPUs were two threads of one core, the same test gained only 1.03x to 1.07x, because both processes shared one core's divider. How it was measured
The installer’s real output on a fresh VM: packages, Docker Engine, the control plane, the console address and a one-time link to create the owner account
What the installer prints on a fresh Ubuntu 24.04 VM. The address and token are masked.

Install with one command

One install script turns a Linux VM into a canvas of services. Run it on a fresh Ubuntu 24.04 VM with a public IPv4 address and ports 80 and 443 open. It installs Docker, the control plane, the agent, Caddy for HTTPS and a private registry, then prints a one-time link to create your account.

With curl
curl -fsSL https://openrail.app/install.sh | sudo sh
With wget
wget -qO- https://openrail.app/install.sh | sudo sh
Guided: asks for your domain and email
curl -fsSLo install.sh https://openrail.app/install.sh && sudo sh install.sh

No domain needed: without one, the console and your services get sslip.io names with real certificates. See the install guide and every install option.

Your domains, with HTTPS

Every service can get a generated sslip.io name, and your own domains get Let's Encrypt certificates.

  1. Generate Domain gives a public HTTPS name that works at once.
  2. Custom Domain asks for one DNS record.
  3. The status moves from Waiting for DNS to Issuing certificate to Active.
Records for shop.example.com, host at 203.0.113.10. Custom domains guide
TypeNameValue
Ashop203.0.113.10
CNAMEwwwshop.example.com
The Networking settings of the web service: a generated domain and a custom domain, each with a valid certificate, the Generate Domain, Custom Domain and TCP Proxy buttons, and the private domain web.internal The Networking settings of the web service: a generated domain and a custom domain, each with a valid certificate, the Generate Domain, Custom Domain and TCP Proxy buttons, and the private domain web.internal
Settings, Networking, on a service with a generated name and a custom domain.

What it costs

For the 4 vCPU API running all month: Railway $220.15 at steady load and $134.15 at typical load; a VM with 8 dedicated vCPU that fits it, about $156.89.

openrail is free. You pay your VM provider a fixed monthly price. A small, mostly idle app costs about the same either way, and Railway also runs the servers for you.

4 vCPU / 8 GB API with Postgres and Redis, all month. Monthly cost at list prices. VM prices include $0.75 for a backups bucket.
  • Railway, steady loadall of it in use around the clock$220.15
  • Railway, typical loadabout 1.6 vCPU and 6 GB on average$134.15
  • Hetzner CCX33 with openrail8 dedicated vCPU, 32 GB: the fair match for steady load$156.89
  • Hetzner CPX42 with openrail8 shared vCPU, 16 GB: may be throttled under constant load$79.38
Prices and sources
  • API sized 4 vCPU / 8 GB; Postgres 1 vCPU / 2 GB; Redis 0.1 vCPU / 0.5 GB
  • Steady case: all of that in use 730 hours. Typical case: API averages 1.6 vCPU / 6 GB, Postgres 0.5 / 1.5, Redis 0.05 / 0.3
  • 21 GB volumes, 200 GB egress
  • Railway Pro (the $20 minimum is covered by usage)

List prices in USD read on 2026-10-22, excluding tax; euro prices at 1.1234 USD per EUR (ECB, 2026-10-21). Shared vCPUs under constant full load may be throttled, so the dedicated row is the fair comparison for the steady case. Check current prices: railway.com/pricing, docs.railway.com/reference/pricing/plans, hetzner.com/cloud/cost-optimized, hetzner.com/cloud/regular-performance, hetzner.com/cloud/general-purpose, docs.hetzner.com/general/infrastructure-and-availability/ipv4-pricing.

Bring your Railway habits

A railway CLI alias, the same variable names and the same reference syntax. After openrail alias install, the commands you type today deploy to your own console.

Install the CLI on your laptop with curl -fsSL https://openrail.app/install.sh | sh -s -- --cli. Coming from Railway lists every difference.
On RailwayOn openrail
railway uprailway up, or openrail up
railway linkrailway link
${{Postgres.DATABASE_URL}}${{Postgres.DATABASE_URL}}
railway.json in the reporailway.json in your repo is read and applied
Railpack buildsRailpack builds, or your Dockerfile
Import a projectBy hand in 0.1.0: move a project
The Variables tab of the api service: DATABASE_URL open for editing with the value ${{Postgres.DATABASE_URL}}, then NODE_ENV, REDIS_URL, a sealed SESSION_SECRET and WEB_ORIGIN with hidden values The Variables tab of the api service: DATABASE_URL open for editing with the value ${{Postgres.DATABASE_URL}}, then NODE_ENV, REDIS_URL, a sealed SESSION_SECRET and WEB_ORIGIN with hidden values
The same reference syntax in the openrail console: DATABASE_URL follows Postgres wherever it runs. Variables

Honest limits

Beta in 0.1.0

These work but are not yet covered by the end-to-end tests that run on fresh VMs.

  • More than one host: joining hosts, the private WireGuard network, a second ingress host.
  • Replicas spread across hosts.
  • Database backups to an S3-compatible bucket, and restoring them.
  • Upgrades with openrail upgrade and their automatic revert.

Not in 0.1.0

  • The Railway project importer. The manual move works today.
  • PR environments, app sleeping, global regions and an edge network.
  • Master key rotation, and enforcing two-factor login for everyone.
  • A clear error when a certificate fails: it stays on Issuing certificate.

By design

  • One control host. If it is down, apps keep serving but deploys, cron and the console wait.
  • Databases run on one host each, with no automatic failover.
  • Services with a volume have a short gap on each deploy.
  • You own the VM. Security updates are automatic; reboots are yours.

Every limit, with what to do about it

Open source, no lock-in

The server is AGPL-3.0; the CLI, templates and installer are MIT. Every deployment is a standard Docker image, databases are ordinary containers, and openrail config pull writes your services to one file.

Questions

Is it cheaper than Railway for a small project?

Usually not. Railway bills by use, so an idle app costs $6.20 to $14.65 a month there, about what a small VM costs. The saving shows up at steady load, with several apps on one VM, and with a lot of egress.

What do I need?

A Linux VM with a public IPv4 address, ports 80 and 443 open, and root access. Ubuntu 24.04 is tested, on amd64 or arm64. 2 vCPU and 4 GB of RAM is a comfortable start.

Do I need a domain?

No. Without one, the console and your services get sslip.io names with real certificates. Add your own domain at install time or later, per service.

Is it a fork of Railway?

No. It is an independent project that follows Railway's ideas and names so your projects and habits move over. It is not affiliated with Railway. Builds use Railpack, Railway's open-source builder.

Can I use my Docker Compose file?

Yes. openrail import compose docker-compose.yml stages its services, variables, ports and volumes for you to review and deploy.

Install it on a VM you already pay for

curl -fsSL https://openrail.app/install.sh | sudo sh

Install on a VM Read the quick start