最近使用
Elixir
的 web 框架Phoenix
開發了一個簡單的應用,部署的時候踩了很多坑。作一下筆記。git
修改 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
在項目文件夾,建立 .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
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