使用 edeliver 部署 Elixir 應用程序

圖片描述

最近使用 Elixir 的 web 框架 Phoenix 開發了一個簡單的應用,部署的時候踩了很多坑。作一下筆記。git

引入 edeliver 依賴

修改 mix.exs 文件,引入 edeliver 依賴github

def application, do: [
  applications: [
    :edeliver
  ]
]

defp deps do
  [
    ...
    {:edeliver, "~> 1.4.4"},
    {:exrm, ">= 0.16.0", warn_missing: false},
  ]
end

這裏有兩種組合 edeliver + distillery 或者 edeliver + exrm,我選用了後者。由於配置更簡單一點。?web

edeliver 配置

在項目文件夾,建立 .deliver/config 文件sql

APP="your-erlang-app" # 應用名稱

BUILD_HOST="build-system.acme.org" # 構建的主機地址
BUILD_USER="build" # 構建主機的登陸用戶名

BUILD_AT="/tmp/erlang/my-app/builds" # 構建主機上的構建文件夾

STAGING_HOSTS="test1.acme.org test2.acme.org" # 測試主機地址
STAGING_USER="test" # 測試主機的登陸用戶名
TEST_AT="/test/my-erlang-app" # 測試的構建文件夾

PRODUCTION_HOSTS="deploy1.acme.org deploy2.acme.org" # 部署主機地址
PRODUCTION_USER="production" # 部署主機的登陸用戶名
DELIVER_TO="/opt/my-erlang-app" # 部署的文件夾

# config/prod.secret.exs 文件保存了不少的敏感信息,這個文件不能放在項目裏。
# 咱們把它放在服務器上,部署的時候自動鏈接過去。

pre_erlang_get_and_update_deps() {
  local _prod_secret_path="/home/builder/prod.secret.exs"
  if [ "$TARGET_MIX_ENV" = "prod" ]; then
    __sync_remote "
      ln -sfn '$_prod_secret_path' '$BUILD_AT/config/prod.secret.exs'
    "
  fi
}

舉個例子 ? 我某次的配置文件數據庫

#!/usr/bin/env bash

APP="short_url"

# 自動以 git revision 做爲發佈名稱
AUTO_VERSION="revision"

BUILD_HOST="url"
BUILD_USER="web"
BUILD_AT="/tmp/edeliver/short_url/builds"

# 我只有正式環境,因此沒有配置 STAGING 環境
PRODUCTION_HOSTS="url"
PRODUCTION_USER="web"

DELIVER_TO="/home/web/"

# 換用了國內的源,加快依賴安裝速度
HEX_MIRROR_URL="https://hexpm.upyun.com" 

pre_erlang_get_and_update_deps() {
  local _prod_secret_path="/home/builder/short_url.prod.secret.exs"
  if [ "$TARGET_MIX_ENV" = "prod" ]; then
    __sync_remote "
      ln -sfn '$_prod_secret_path' '$BUILD_AT/config/prod.secret.exs'
    "
  fi
}

配置好後,執行如下命令。每次構建的壓縮包,不記錄到 git 記錄裏bash

echo ".deliver/releases/" >> .gitignore

config/prod.exs 部署配置默認有這樣一句話,從系統里加載環境變量。若是你沒有在部署的主機上添加變量,這句話就刪除掉。別問我怎麼知道的。?服務器

load_from_system_env: true,

提交剛纔配置文件的修改,而且下載依賴編譯app

git add -A && git commit -m "Setting up edeliver"
mix do deps.get, compile

其餘的配置能夠參考 項目文檔框架

咱們的配置文件裏配置的線上環境的隱私信息從 /home/builder/short_url.prod.secret.exs 目錄獲取,因此運行下面的命令。上傳咱們的線上配置文件。該文件是不會記錄到 git 版本里的。post

scp ~/你的項目/config/prod.secret.exs 主機名:/home/builder/short_url.prod.secret.exs

數據庫設置配置

phoenix 默認使用的 postgreSQL 數據庫

切換到默認用戶 postgres

sudo su - postgres

進入數據庫

psql

建立用戶並賦予權限

CREATE USER www WITH PASSWORD 'u867#eDgg6#2@elo098OIUh';

CREATE DATABASE short_url_prod OWNER www;

alter role www login createdb;

建立數據庫

如今使用如下命令建立線上數據庫的數據表

mix edeliver migrate production

edeliver 命令

mix edeliver update production --start-deploy # 發佈應用並啓動

--branch=dev 指定使用 dev 分支 默認使用的 master

mix edeliver ping production # 查看應用是否正在運行
mix edeliver upgrade  # 升級應用

mix edeliver version production # 查看應用的版本
mix edeliver migrate production # 運行數據庫構建
mix edeliver restart production # 或者 start 或者 stop

日誌

若是不幸,發佈出現問題。能夠在一下目錄查看日誌

配置文件裏的 DELIVER_TO="/home/web/" 就是咱們項目的部署目錄,對應的日誌文件也在這裏。好比個人:/home/web/short_url/log

tail -f erlang.log.1

查看端口使用

netstat -tlunp
相關文章
相關標籤/搜索