一个版本的哪些文件或目录是 运行 个版本的最低限度?

What files or directories of a release are the bare minimum to run a release?

比方说,我有一个全新的 VPS 服务器,我刚刚推出,我还没有安装任何东西。

并且我已经在我的 local 机器上编译并构建了一个 production release Phoenix 应用程序,它与 [=47] 相同=] 服务器 Linux 分布式和版本方面。

目录_build/prod/rel/my_app123下生成了4个子目录:

rel/my_app123/的内容,也就是这4个子目录,复制到一个VPS 绝对足以 运行 申请?

或者我还要安装一些额外的东西吗? Elixir 和 Erlang? 来自 mix.exs 的生产依赖性如何?或者这些是否已包含并编译到一个版本中?

P.S。假设我的web应用没有“js”、“css”之类的文件,也没有使用数据库

如果您进行默认构建,目标将位于您的 _build 目录中,sub-directories 用于配置环境和您的应用程序,例如_build/dev/rel/your_app/。该目录应包含 运行 您的应用程序所需的一切—— 运行ning mix release 之后的提示提供了一些线索,如:

Release created at _build/dev/rel/your_app!

不过,我发现将应用程序压缩到一个可移植文件中更有用(是的,我同意有关如何执行此操作的详细信息不一定是您在阅读 Elixir 版本时看到的第一件事).诀窍是通过充实 releases 选项来自定义 mix.exs —— 这通常是通过专用的私有函数完成的,但是如何组织提供选项取决于你。

我发现通常有用的是生成单个压缩 .tar.gz 文件。这可以通过指定 include_executables_for 选项和 steps 来完成。它看起来像这样:

# mix.exs
defmodule YourApp.MixProject do
  use Mix.Project

  def project do
    [
      # ...
      releases: releases()
      # ...
    ]
  end

  defp releases do
    [
      my_app: [
        include_executables_for: [:unix],
        steps: [:assemble, :tar]
      ]
    ]
  end

当您以这种方式配置您的应用程序时,运行ning mix release 将生成一个漂亮的可移植文件,其中包含您的应用程序所需的一切。解压缩此文件是了解您的应用程序所需的一切的教育。默认情况下,此文件将在 _build/dev/yourapp-1.0.0.tar.gz 等位置创建。您可以通过为您的应用指定 path 来配置构建路径。有关更多选项,请参阅 Mix.Release

当您 运行 mix release 时,它会将您对 MIX_ENV 的所有 Elixir/Erlang 依赖项捆绑到发布目录中,erlang BEAM runtime/VM 您在构建中使用的文件,以及您在 mix.exs.

中的混合项目中指定的任何文件

因为 BEAM 运行引导加载代码的时间和代码包含在发行版中,所以您不需要在目标机器上安装 Elixir 或 Erlang。

包括的内容包括:

  • 任何non-Elixir依赖项。例如,如果您依赖 openssl,则需要确保在计划 运行 的机器上安装了 binary-compatible 版本(通常是等效的主要版本)。
  • 可移植字节码。 BEAM 不像 Java 虚拟机。编译后的 BEAM 代码需要 运行 在基本相似的架构上。例如,在 Arm64 机器上构建以部署在 Arm64 虚拟机上,或 x86 用于 Intel-compatible 硬件。并且最好使用相同的主要 OS 发行版。在某些情况下,“任何 Linux * 相同的 CPU 架构”都可以,但例如,在 Elixir/OTP 的 Windows 或 MacOS 安装上构建在 Linux 上部署是 non-starter;你需要使用足够相似的 OS.

例如,我的一个项目使用 Docker 在 Alpine 上构建了它的版本,所以我们真的只需要担心 CPU 兼容性。在我们的例子中,我们确实需要确保我们的应用程序绑定到的一些外部 non-Elixir 依赖项包含在 docker 图像中。

RUN apk add --no-cache libstdc++ openssl ncurses-libs wkhtmltopdf xvfb \
  fontconfig \
  freetype \
  ttf-dejavu

(忽略 wkhtmltopdf 有点被弃用的事实,我们正在努力解决它。但现在它是我们依赖的 non-elixir 依赖项)。

如果您正在构建一个 EC2 实例,而不是使用 Docker,您只需要确保您的版本构建在与您的 OS 相似的基础上用于生产,并确保生产 AMI(图像)具有这些 non-Elixir 依赖性,或者在部署时将依赖于它,可能使用 apt 或其他包管理器。对于 VPS,non-elixir 依赖项的解决方案将取决于它们是否具有自定义基本机器映像的选项(可能使用 Packer or Ansible

由于您在评论中似乎对此有些困惑,是的,MIX_ENV=prod mix release 将构建您所有的生产 Elixir/Erlang 依赖项并将它们包含在 /_build/prod文件夹。

我在我们的版本中包含了整个 ./prod 文件夹,但它看起来像协议整合二进制文件和 lib 文件夹。Beam 文件都在 rel 文件夹中,所以这有点不必要。