1 min read

Exrm 部署 PhoenixFramework 应用

我的开发电脑是 macOS Sierra,服务器是 CentOS 7。

要将 mac 上的代码部署到 CentOS 上,我有两种选择:

  1. 将本地源代码复制到 CentOS 上,直接在服务器上编译构建
  2. 在本地开启 CentOS 虚拟机,打包完再部署到服务器上

那么,在 mac 上打包完再部署到服务器上如何?不行,我们可以看 PhoenixFramework 文档中的一段说明

We need to be sure that the architectures for both our build and hosting environments are the same, e.g. 64-bit Linux -> 64-bit Linux. If the architectures don’t match, our application might not run when deployed. Using a virtual machine that mirrors our hosting environment as our build environment is an easy way to avoid that problem.

请确保构建与托管环境的架构一致,比如 64 位 Linux -> 64 位 Linux。如果架构不匹配,我们的应用部署后可能无法运行。使用模拟托管环境的虚拟机来构建是避免问题的一个简单办法。

上面的两种办法里,第一种是简单粗暴的,把代码复制到服务器,然后按文档操作即可。

第二种方法,则十分复杂。

另外,在第二种办法里,我用到了 Docker。

怎么不用虚拟机?我觉得虚拟机太占硬盘 - 我的 mac 只有 128G 容量,而 docker 的 image 则小巧多了,而且便携,方便后面复用。

下载 docker image

首先从 docker 上安装我配置好的 image:

  $ docker pull chenxsan/docker-centos-erlang-elixir

然后运行一个容器(container):

  $ docker run -i -t -v /Users/sam/myProjects:/home/myProjects --name container_name docker_image

注意上面的 -v 参数,我把 mac 上的 /Users/sam/myProjects 映射到 container 里的 /home/myProjects,这样在 container 中做的修改 mac 里能直接看到,反之亦然。

接下来,按 PhoenixFramework 文档 配置好 prod.secret.exs 文件。

然后运行以下命令:

  $ MIX_ENV=prod mix do deps.get, phoenix.digest, compile, release

呃,事情并没有这么简单。

想想,如果我们只是把构建后的应用上传到服务器上,数据库怎么办?Migration 等等怎么办?

请参照 此链接给你的代码增加一个模块。

然后才运行打包的命令:

  $ MIX_ENV=prod mix do deps.get, phoenix.digest, compile, release

该命令会打包出我们需要的应用。

接着,将项目下的 rel/app_name/releases/version_number_here/app_name.tar.gz 复制到服务器上。

然后解压:

  $ tar xvzf app_name.tar.gz

接着运行以下两条命令来创建数据库与表:

  $ bin/app_name command Elixir.AppName.ReleaseTasks create
  $ bin/app_name command Elixir.AppName.ReleaseTasks migrate

等数据库与表建立好后,我们就可以运行起应用了:

  $ bin/app_name start

参考链接

  1. Accessing Mix tasks from release
报告问题 修订

如果你有自建 https 代理的需求,欢迎尝试 Phantom,一键搭建,方便快捷。查看 demo