For years, Heroku was the gold standard for developers who wanted to ‘just deploy’ without worrying about the underlying Linux server. But as pricing models shifted and the ecosystem evolved, many of us started looking for a more modern, cost-effective alternative. In this migrating from Heroku to Railway tutorial, I’ll share the exact process I used to move my production apps and databases to Railway without experiencing any downtime.
Before we dive into the technical steps, if you’re still on the fence about whether to make the switch, I highly recommend reading my railway.app vs heroku comparison to see how the two platforms stack up in 2026. For those who just want the raw experience, my railway.app review for developers covers the nuances of their developer experience (DX).
Prerequisites
Before starting the migration, make sure you have the following ready:
- A GitHub account (Railway works best with GitHub integration).
- Active Heroku account with the apps you intend to move.
- Heroku CLI installed on your local machine.
- A Railway.app account.
Step 1: Backing Up Your Heroku Database
The most critical part of any migration is the data. You cannot simply ‘link’ a Heroku Postgres DB to Railway; you need to export the data and import it into a new Railway instance. I’ve found that using pg_dump is the most reliable method for smaller to medium databases.
# Get your Heroku database URL
heroku pg:credentials:url -a your-app-name
# Dump the database to a local file
pg_dump [YOUR_HEROKU_DATABASE_URL] > backup.sql
Once you have the backup.sql file, you’re ready to move to the new environment.
Step 2: Setting Up the Infrastructure on Railway
Railway’s ‘Project Canvas’ is a breath of fresh air compared to Heroku’s list-based dashboard. Instead of creating a separate ‘Add-on’ for your database, you simply add a service to your project.
- Log into Railway and click + New Project.
- Select Provision PostgreSQL. Railway will instantly spin up a fresh database.
- Click on the Postgres service, go to the Variables tab, and copy the
DATABASE_URL.
As shown in the image below, the Railway interface allows you to see your database and application services as interconnected nodes, making the architecture much easier to visualize than the Heroku dashboard.
Step 3: Importing Your Data
Now, we push that backup.sql file into your new Railway Postgres instance. You can do this via your local terminal using psql.
# Import the backup to Railway
psql [YOUR_RAILWAY_DATABASE_URL] < backup.sql
Pro Tip: If you encounter encoding errors, try adding --no-owner --no-privileges to your pg_dump command to ensure the SQL script doesn't try to create Heroku-specific users on Railway.
Step 4: Deploying the Application
This is where the migration becomes incredibly simple. Railway connects directly to your GitHub repository and handles the build process automatically, similar to Heroku's git-push workflow but more integrated.
- In your Railway project, click + New → GitHub Repo.
- Select the repository used for your Heroku app.
- Railway will attempt to auto-detect your language (Node.js, Python, Go, etc.). If you have a
Dockerfile, it will use that by default.
Step 5: Migrating Environment Variables
Your app won't work without its config vars. I usually do this manually to ensure I'm not migrating old, unused keys.
# List all Heroku config vars
heroku config -a your-app-name
Copy these values into the Variables tab of your Railway service. Don't forget to update the DATABASE_URL to the one provided by Railway!
Step 6: DNS Switch and Final Testing
Before pointing your domain to Railway, I always test the Railway-provided .up.railway.app URL to ensure the app connects to the DB and renders correctly.
- Go to the Settings tab of your Railway service.
- Under Domains, click Custom Domain.
- Add your domain (e.g.,
app.yourdomain.com). - Update your CNAME record in your DNS provider (Cloudflare, Namecheap, etc.) to point to the Railway target.
Troubleshooting Common Migration Issues
During my own migrations, I ran into two common hiccups:
- Build Failures: If your app relied on Heroku's specific Buildpacks, you might need to create a simple
Dockerfile. Railway supports Nixpacks, which is generally more flexible, but Docker is the foolproof way to ensure consistency. - Connection Timeouts: Ensure your Railway database allows connections from the application service. In a single Railway project, this is handled automatically via internal networking, but check your variables if you're using an external DB.
What's Next?
Now that you've completed this migrating from Heroku to Railway tutorial, you can start exploring Railway's more advanced features, such as Cron Jobs and Private Networking. If you're managing multiple environments, I suggest looking into their staging environment templates to automate your CI/CD pipeline.
If you found this helpful, check out my other guides on automation tools and productivity stacks to further optimize your development workflow.