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.




Previous Post
Automatically update your Elixir dependencies
Next Post
Linux compose key: use acute accents and other characters