- Postgres database
- Custom domain
- Background worker, like Oban
Migrating your app
The steps below run you through the process of migrating your Phoenix app from Heroku to Fly.Provision and deploy Phoenix app to Fly
From the root of the Elixir app you’re running on Heroku, runfly launch and select the options to provision a new Postgres database.
When you run fly launch from the newly-created project directory, the launcher provides some defaults for your new app, and gives you the option to tweak the settings.
Run:
y at the prompt to open the Fly Launch page, and make the following changes to your app config:
- Change the default app name and region, if needed.
- For Databases, select Fly Postgres, give the Postgres database app a name (for example, your app name with
-dbappended) and choose a configuration.
- Run the deployment setup task
- Build the image
- Set secrets required by (
SECRET_KEY_BASE, for example) - Deploy the application in your selected region
Make sure to note your Postgres credentials from the output.
fly apps open to see your deployed app in action.
Try a few other commands:
fly logs- Tail your application logsfly status- App deployment detailsfly status -a postgres-database-app-name- Database deployment detailsfly deploy- Deploy the application after making changes
Transfer Heroku secrets
To see all of your Heroku env vars and secrets, run:DATABASE_URL and imports them into Fly.
Verify your Heroku secrets are in Fly.
Transfer the Database
Any new data created by your Heroku app during this database migration won’t be moved over to Fly.io. Consider taking your Heroku application offline or place in read-only mode if you want to be confident that this migration will move over 100% of your Heroku data to Fly.io.
HEROKU_DATABASE_URL variable in your Fly.io environment.
HEROKU_DATABASE_URL variable.
Custom Domain & SSL Certificates
After you finish deploying your application to Fly.io and have tested it extensively, read through the Custom Domain docs and point your domain at it. In addition to supportingCNAME DNS records, Fly.io also supports A and AAAA records for those who want to point example.com (without the www.example.com) directly at their App on Fly.io.
Cheat Sheet
Old habits die hard, especially good habits like deploying frequently to production. Below is a quick overview of the differences you’ll notice initially between Fly.io and Heroku.Commands
flyctl commands are a bit different than Heroku, but you’ll get use to them after a few days.
Check out the flyctl docs for a more extensive inventory of flyctl commands.
Deployments
By default Heroku deployments are kicked off via thegit push heroku command. Fly.io works a bit differently by kicking of deployments via fly deploy—git isn’t needed to deploy to Fly.io. The advantage to this approach is your git history will be clean and not full of commits like git push heroku -am "make app work" or git push heroku -m "ok it will really work this time".
To achieve the desired git push behavior, we recommend setting up fly deploy as the final command in your continuous integration pipeline, as outlined for GitHub in the Continuous Deployment with Fly.io and GitHub Actions docs.
Deploy via git
Heroku’s default deployment technique is viagit push heroku. Fly.io doesn’t require a git commit, just run fly deploy and the files on your local workstation will be deployed.
Fly.io can be configured to deploy on git commits with the following techniques with a GitHub Action.
Databases
Fly.io and Heroku have different Postgres database offerings. The most important distinction to understand about using Fly.io is that it automates provisioning, maintenance, and snapshot tasks for your Postgres database, but it does not manage it. If you run out of disk space, RAM, or other resources on your Fly Postgres instances, you’ll have to scale those virtual machines from the Fly CLI. Contrast that with Heroku, which fully manages your database and includes an extensive suite of tools to provision, backup, snapshot, fork, patch, upgrade, and scale up/down your database resources. The good news for people who want a highly managed Postgres database is they can continue hosting it at Heroku and point their Fly.io instances to it!Heroku’s managed database
One command is all it takes to point Fly Apps at your Heroku managed database.Fly Postgres
The most important thing you’ll want to be comfortable with using Fly.io’s database offering is backing up and restoring your database. As your application grows, you’ll probably first scale disk and RAM resources, then scale out with multiple replicas. Common maintenance tasks will include upgrading Postgres as new versions are released with new features and security updates. See here for a more comprehensive guide for what’s required when running your Postgres databases on Fly.io.Pricing
Heroku and Fly.io have very different pricing structures. You’ll want to read through the details on Fly.io’s pricing page before launching to production. The sections below serve as a rough comparison between Heroku’s and Fly.io’s plans as of August 2022.Please do your own comparison of plans before switching from Heroku to Fly.io. The examples below are illustrative estimates between two very different offerings, which focuses on the costs of app & database servers. It does not represent the final costs of each plan. Also, the prices below may not be immediately updated if Fly.io or Heroku change prices.
Free Plans
Heroku will not offer free plans as of November 28, 2022. Fly.io offers free usage for up to 3 full time VMs with 256MB of RAM, which is enough to run a Elixir app and Postgres database to get a feel for how Fly.io works.Plans for Small Elixir Apps
Heroku’s Hobby tier is limited to 10,000 rows of data, which gets exceeded pretty quickly requiring the purchase of additional rows of data.
Fly.io pricing is metered for the resources you use. Database is billed by the amount of RAM and disk space used, not by rows. The closest equivalent to the Heroku Hobby tier on Fly.io looks like this:
Plans for Medium to Elixir Apps
There’s too many variables to compare Fly.io’s and Heroku’s pricing for larger Elixir applications depending on your needs, so you’ll definitely want to do your homework before migrating everything to Fly.io. This comparison focuses narrowly on the costs of app & database resources, and excludes other factors such as bandwidth costs, bundled support, etc.
Here’s roughly the equivalent resources on Fly:
Again, the comparison isn’t realistic because it focuses only on application and database servers, but it does give you an idea of how the different cost structures scale on each platform. For example, Heroku’s database offering at this level is redundant, whereas Fly.io offers 2 database instances to achieve similar levels of redundancy.