Migrating from Railway
Railway and Vessl are similar in feel: both deploy from Git, inject environment variables, and provision databases alongside your app. The key difference is ownership — Railway manages the infrastructure for you, while Vessl runs everything on a server you own.
Concept mapping
| Railway | Vessl equivalent |
|---|---|
| Project | Project |
| Service (app) | Application |
| Service (database) | Add-on (PostgreSQL / MySQL / Redis) |
| Variables | Variables tab |
| Railway Postgres | PostgreSQL add-on |
| Railway Redis | Redis add-on |
| Railway MySQL | MySQL add-on |
railway run | Console tab → Run Command |
| Logs | Logs tab |
| Deployments | Deployments tab |
| Rollback | Deployments tab → Rollback |
| Replicas | Replicas slider in Overview or Settings |
| Cron jobs | Server cron job or daemon with a cron loop |
Step 1 — Add a server
Provision a VPS with any Ubuntu-based provider and add it to Vessl. See Add your server.
Step 2 — Migrate environment variables
In Railway, go to your service → Variables and export all variables. In Vessl, paste them into the Variables tab.
Skip DATABASE_URL, POSTGRES_URL, REDIS_URL, MYSQL_URL — Vessl injects these automatically after you attach an add-on.
Step 3 — Migrate the database
Export from Railway:
Railway provides a database connection string in your service variables (DATABASE_URL or PGHOST/PGPASSWORD/etc.). Use pg_dump to export:
pg_dump "<your-railway-postgres-url>" -Fc -f backup.dump
For MySQL:
mysqldump -h <host> -P <port> -u <user> -p<password> <dbname> > backup.sql
Restore to Vessl:
- Add the appropriate add-on to your Vessl app (PostgreSQL or MySQL).
- Deploy once to provision it.
- Set up an SSH tunnel (see Databases & add-ons).
- Restore:
# PostgreSQL
pg_restore --host 127.0.0.1 --port 15432 \
--username <DB_USERNAME> --dbname <DB_DATABASE> \
--no-owner --no-privileges backup.dump
# MySQL
mysql -h 127.0.0.1 -P 13306 -u <DB_USERNAME> -p<DB_PASSWORD> <DB_DATABASE> < backup.sql
Step 4 — Start command
Railway auto-detects start commands similarly to Vessl. If you have a custom start command set in Railway, copy it to Vessl's Start command field (Settings → Runtime & Release).
Step 5 — Cron jobs
Railway has a built-in cron job feature per service. In Vessl, use either:
- Server cron jobs (Servers → your server → Cron Jobs) — for simple recurring commands
- A daemon with a loop for app-context tasks:
/bin/sh -c "while true; do node scripts/run-job.js; sleep 300; done"
Common differences
Volume mounts Railway persistent volumes map directly to Vessl's persistent storage. In Vessl, add a volume in the wizard and set the mount path to wherever your app writes data.
Private networking
Railway services on the same project communicate over a private network using railway.internal hostnames. On Vessl, containers on the same server communicate via Docker's internal network — the add-on hostnames are injected via environment variables (DB_HOST, REDIS_HOST, etc.) rather than a service-discovery DNS.
Multiple services per project Railway lets you run multiple services (e.g. a web app + an API + a worker) all within one project, billed as a unit. In Vessl, each service is a separate application under a project, and you control where each one runs (they can all go on the same server).