Phoenix is the most widely used web framework for the Elixir programming language. Both Phoenix and Elixir are relatively new and although well established in many areas, deployment doesn't seem to yet have a defacto method. I don't use Heroku and haven't yet jumped onboard the docker
bandwagon container ship.
Exrm releases seem extremely stable, but have some caveats:
- Require build environment to be very similar to deployment
- Require extra maintenance to ensure the correct application components are loaded by Erlang
- Requires a custom script to
scpthe release to the server
With these points in mind I decided to experiment with using a familiar Capistrano based workflow. Something along the lines of:
Capistrano deploys code -> Builds on server -> Upstart handles launch and keep-alive
Sadly however this didn't seem practical when it comes to Exrm's upgrade and downgrade. Instead I ended up creating a custom shell script.
- Uploading all code to the remote server
- Compiling an Exrm release, the current version is detected from
- Move release to app directory
- Run hot upgrade with Exrm
- Runs migrations on server
The script below is targeted to a project which uses Webpack in an
app directory. If your project uses Brunch some minor modification may be necessary.
Create a file called
exdeploy in the root of your project containing the code from the Gist at the end of this article.
Dont forget to
chmod +x ./exdeploy to make it executable.
# Upload and compile current version onto the server ./exdeploy deploy # Run migrations ./exdeploy migrate # Restart (could be used after overwriting a version to relaunch) ./exdeploy restart # Upgrade to the latest version ./exdeploy upgrade
You will need to customize the first few variables to include your app's name and server details etc.