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 root@IP_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.