OS: Ubuntu 17.04/zesty
We’ll be deploying using a git hook. This is not intended to be used in a production environment, but works just fine for a personal side project.
Let’s start with the server setup
Erlang/Elixir
#Add Erlang Solutions repo wget https://packages.erlang-solutions.com/erlang-solutions_1.0_all.deb && sudo dpkg -i erlang-solutions_1.0_all.deb sudo apt-get update #Install Erlang/OTP sudo apt-get install esl-erlang
We’ll be using kiex for Elixir
#Install Elixir \curl -sSL https://raw.githubusercontent.com/taylor/kiex/master/install | bash -s #Add to .bashrc test -s "$HOME/.kiex/scripts/kiex" && source "$HOME/.kiex/scripts/kiex" kiex install 1.4.0 kiex use 1.4.0 kiex default 1.4.0
Let’s init a repo
apt-get install git-core mkdir repos && cd repos mkdir my_repo cd my_repo git init --bare
Add a remote to your local repo:
git remote add some_name [email protected]_ADDRESS:repos/your_repo.git
Go back to the server and create a post-deploy hook. This will generate a new release after each git push.
Create post-receive file inside of your git hooks directory with this content:
#!/bin/bash -l [[ -s "$HOME/.kiex/scripts/kiex" ]] && source "$HOME/.kiex/scripts/kiex" GIT_REPO=$HOME/repos/your_repo.git TMP_GIT_CLONE=$HOME/tmp/git/your_repo cd $TMP_GIT_CLONE PORT=4000 _build/prod/rel/{app_name}/bin/{app_name} stop cd $HOME rm -r $TMP_GIT_CLONE git clone $GIT_REPO $TMP_GIT_CLONE cd $TMP_GIT_CLONE mix deps.get cd assets npm install brunch build --production cd .. MIX_ENV=prod mix do compile, phx.digest, release --env=prod MIX_ENV=prod mix ecto.migrate PORT=4000 _build/prod/rel/{app_name}/bin/{app_name} start
This will stop your existing elixir app, remove old code, compile and release your new code, run the migration, and start the app on port 4000.
If you run it behind NGINX, set it up as a reverse proxy:
server { listen 80; listen [::]:80; server_name domain.com; location / { proxy_redirect off; proxy_pass http://127.0.0.1:4000/; } }
Let’s go back to your Phoenix project and add distillery
Add to mix.exs deps:
{:distillery, "~> 1.5"}
Initialize reliase config:
mix release.init
Update config/prod.exs
config :app_name, AiPhoenixWeb.Endpoint, http: [port: {:system, "PORT"}], url: [host: "localhost", port: {:system, "PORT"}], # This is critical for ensuring web-sockets properly authorize. cache_static_manifest: "priv/static/cache_manifest.json", server: true, root: ".", version: Mix.Project.config[:version]
If using PostgreSQL, let’s install Postgresql and create a deploy user for our database:
sudo apt-get install postgresql postgresql-contrib libpq-dev sudo su - postgres createuser --pwprompt deploy createdb -O deploy my_app_name_production Exit
Auto-start your phoenix app on reboot:
Create a new file:
#!/bin/bash cd $HOME/phoenix_app_location PORT=4001 _build/prod/rel/phoenix_name/bin/phoenix_name start
Make it an executable
chmod +x phoenix_autostart.sh
Schedule it as a cron task:
Crontab -e
@reboot /root/path_to_script/phoenix_autostart.sh
The last step to to “git push” and verify that everything works.