Skip to content

Elixir/Phoenix database auto-migrations on deployment

Posted on:2023-10-09 | 1 min read

You can configure a release command depending on the platform you are using to deploy your Phoenix application. For example, you can use Fly’s release_command.

If you don’t have the option to specify a release command, you can use a bash script for this purpose. When you run mix phx.gen.release --docker, there will be two scripts generated under rel/overlays/bin and one elixir module containing tasks for running migrations under lib/app_name/release.ex.

The bin/migrate script calls MyApp.Release.migrate to run the DB migrations.
The bin/server script starts the server using the released binary my_app.

You can create a new script that runs the migration command (Release module) and then starts the server.

Let’s create it under rel/overlays/bin/migrate_and_server.

#!/bin/sh
cd -P -- "$(dirname -- "$0")"

# Run migrations. If they fail, don't start the server
./migrate && exec ./server

Now, modify the generated Dockerfile CMD (last line) to:

CMD ["/app/bin/migrate_and_server"]

Done! You now have auto-migrations on every deployment. Don’t worry, if migrations are already applied it will continue to start your server as usual.