Skip to main content

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

RailwayVessl equivalent
ProjectProject
Service (app)Application
Service (database)Add-on (PostgreSQL / MySQL / Redis)
VariablesVariables tab
Railway PostgresPostgreSQL add-on
Railway RedisRedis add-on
Railway MySQLMySQL add-on
railway runConsole tab → Run Command
LogsLogs tab
DeploymentsDeployments tab
RollbackDeployments tab → Rollback
ReplicasReplicas slider in Overview or Settings
Cron jobsServer 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:

  1. Add the appropriate add-on to your Vessl app (PostgreSQL or MySQL).
  2. Deploy once to provision it.
  3. Set up an SSH tunnel (see Databases & add-ons).
  4. 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).