Skip to content

Instantly share code, notes, and snippets.

@bnhansn
Last active August 8, 2023 05:53
Show Gist options
  • Save bnhansn/5c007b2fbb3986739b2bafee756d0a53 to your computer and use it in GitHub Desktop.
Save bnhansn/5c007b2fbb3986739b2bafee756d0a53 to your computer and use it in GitHub Desktop.
Ubuntu Elixir Distillery Deployment

Rough outline of setting up a Ubuntu server for deploying an Elixir app with Distillery.

ssh into server

ssh root@ip.address

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/*
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment