Build your vagrant machine in some dir using the files Vagrantfile
and pre-install.app.sh
with the command vagrant up
.
That will deploy a new virtual machine accessible with vagrant ssh
, write down its ip visible with ifconfig
and update that IP/URL in the .deliver/config
file in this guide.
ivan@z11:~/Development/elixir$ mix phx.new deploy_me
ivan@z11:~/Development/elixir$ cd deploy_me/
ivan@z11:~/Development/elixir/deploy_me$ mix do ecto.create, phx.server
ivan@z11:~/Development/elixir/deploy_me$ git init && git add . && git commit -av -m "initial"
ivan@z11:~/Development/elixir/deploy_me (master)$ vim config/prod.secret.exs
config :deploy_me, DeployMe.Repo,
adapter: Ecto.Adapters.Postgres,
username: "deploy_me",
password: "passw0rd",
database: "deploy_me_prod",
pool_size: 15
ivan@z11:~/Development/elixir/deploy_me (master)$ vim mix.exs
def deps do
...
{:edeliver, "~> 1.4.4"},
{:distillery, "~> 1.5", runtime: false},
ivan@z11:~/Development/elixir/deploy_me (master)$ mix deps.get
ivan@z11:~/Development/elixir/deploy_me (master)$ mkdir .deliver/
ivan@z11:~/Development/elixir/deploy_me (master)$ vim .deliver/config
APP="deploy_me"
BUILD_HOST="172.28.128.4" # <-- PUT HERE YOUR VIRTUAL MACHINE IP
BUILD_USER="ivan"
BUILD_AT="/tmp/edeliver/$APP/builds"
#RELEASE_DIR="/tmp/edeliver/$APP/builds/_build/prod/rel/$APP"
# prevent re-installing node modules; this defaults to "."
#GIT_CLEAN_PATHS="_build rel priv/static"
# STAGING_HOSTS="188.166.182.170"
# STAGING_USER="deploy"
# TEST_AT="/home/deploy/staging"
PRODUCTION_HOSTS="172.28.128.4" # <-- PUT HERE YOUR VIRTUAL MACHINE IP
PRODUCTION_USER="ivan"
DELIVER_TO="/home/$PRODUCTION_USER"
# For *Phoenix* projects, symlink prod.secret.exs to our tmp source
pre_erlang_get_and_update_deps() {
local _prod_secret_path="/home/$PRODUCTION_USER/prod.secret.exs"
if [ "$TARGET_MIX_ENV" = "prod" ]; then
__sync_remote "
ln -sfn '$_prod_secret_path' '$BUILD_AT/config/prod.secret.exs'
"
fi
}
pre_erlang_clean_compile() {
status "Running phoenix.digest" # log output prepended with "----->"
__sync_remote " # runs the commands on the build host
# [ -f ~/.profile ] && source ~/.profile # load profile (optional)
source ~/.profile
# echo \$PATH # check if rbenv is in the path
set -e # fail if any command fails (recommended)
cd '$BUILD_AT/assets' # enter the build directory on the build host (required)
# prepare something
mkdir -p priv/static # required by the phx.digest task
npm install
./node_modules/brunch/bin/brunch build --production
cd '$BUILD_AT' # enter the build directory on the build host (required)
# run your custom task
APP='$APP' MIX_ENV='$TARGET_MIX_ENV' $MIX_CMD phx.digest $SILENCE
"
}
ivan@z11:~/Development/elixir/deploy_me (master)$ echo "" >> .gitignore
ivan@z11:~/Development/elixir/deploy_me (master)$ echo ".deliver/releases/" >> .gitignore
ivan@z11:~/Development/elixir/deploy_me (master)$ git add .
ivan@z11:~/Development/elixir/deploy_me (master)$ git commit -m "Edeliver"
ivan@z11:~/Development/elixir/deploy_me (master)$ vim config/prod.exs
config :deploy_me, DeployMeWeb.Endpoint,
# load_from_system_env: true, # COMMENT THIS!
# https://stackoverflow.com/questions/47071275
cache_static_manifest: "priv/static/cache_manifest.json",
# The port that the app runs on
http: [port: 4000],
# This is to generate links
url: [host: "example.com", port: 80],
config :phoenix, :serve_endpoints, true
# ESTA HACE FALTA? ivan@z11:~/Development/elixir/deploy_me (master)$ mix do deps.get, compile
ivan@z11:~/Development/elixir/deploy_me (master)$ mix release.init
ivan@z11:~/Development/elixir/deploy_me (master)$ vim rel/config.exs
enviroment :prod do
set output_dir: "rel/deploy_me"
ivan@z11:~/Development/elixir/deploy_me (master)$ git add .
ivan@z11:~/Development/elixir/deploy_me (master)$ git commit -m "Distillery"
ivan@z11:~/Development/elixir/deploy_me (master)$ scp config/prod.secret.exs 172.28.128.4:~/
ivan@z11:~/Development/elixir/deploy_me (master)$ mix edeliver build release production --verbose
ivan@z11:~/Development/elixir/deploy_me (master)$ mix edeliver deploy release production
ivan@z11:~/Development/elixir/deploy_me (master)$ mix edeliver start production
ivan@z11:~/Development/elixir/deploy_me (master)$ mix edeliver migrate production