使用 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
相关文章
相关标签/搜索