Rough outline of setting up a Ubuntu server for deploying an Elixir app with Distillery.
ssh into server
ssh [email protected]
update packages
apt-get update
apt-get upgrade
install erlang/elixir/hex
wget https://packages.erlang-solutions.com/erlang-solutions_1.0_all.deb && sudo dpkg -i erlang-solutions_1.0_all.deb
apt-get update
apt-get install esl-erlang
apt-get install elixir
mix local.hex
mix local.rebar
install postgres
apt-get install postgresql postgresql-contrib
switch to postgres role
sudo -i -u postgres
login to postgres
psql
add password to postgres user
alter user postgres with password '<password>';
create database
create database <db_name>;
create env file /etc/default/<name>.env
REPLACE_OS_VARS=true
MIX_ENV=prod
PORT=4000
SECRET_KEY_BASE=<key>
DB_USER=postgres
DB_PASSWORD=<db_password>
DB_NAME=<db_name>
create daemon service /etc/systemd/system/<name>.service
[Unit]
After=network.target
[Service]
WorkingDirectory=/opt/<name>
EnvironmentFile=/etc/default/<name>.env
ExecStart=/opt/<name>/_build/prod/rel/<name>/bin/<name> start
ExecStop=/opt/<name>/_build/prod/rel/<name>/bin/<name> stop
User=root
RemainAfterExit=yes
Restart=always
[Install]
WantedBy=multi-user.target
reload services
systemctl daemon-reload
start service
systemctl start <name>.service
enable service permanently
systemctl enable <name>.service
create git repo
cd /opt
mkdir <name>.git
cd <name>.git
git init --bare
create release directory
git clone <name>.git
create release hook in bare repo, hooks/post-receive
#!/bin/sh
WORKTREE=../<name>
while read oldrev newrev refname
do
GIT_WORK_TREE=$WORKTREE git checkout -f
done
cd $WORKTREE
sh release.sh
allow git to execute hooks
chmod ug+x <name>.git/hooks/*