Phoenix: デプロイについて

Published on 2020-06-26 00:00:00

Phoenixアプリケーションのデプロイについてはドキュメントとして、 Introduction to Deployment があります。

ここでは、そのデプロイ手順である以下が実際に何をしているかを説明します。

  1. 環境変数の用意

  2. ライブラリの取得とコンパイル

  3. assetsの用意

  4. DBのマイグレーション

  5. アプリケーションの起動

環境変数の用意

Phoenixのデフォルトプロジェクトの config/prod.secret.exs には環境変数として、
SECRET_KEY_BASEとPORTが記述されています。
secret_key_base =
  System.get_env("SECRET_KEY_BASE") ||
    raise """
    environment variable SECRET_KEY_BASE is missing.
    You can generate one by calling: mix phx.gen.secret
    """

config :my_app, MyAppWeb.Endpoint,
  http: [
    port: String.to_integer(System.get_env("PORT") || "4000"),
    compress: true,
    transport_options: [socket_opts: [:inet6]]
  ],
  secret_key_base: secret_key_base
secret_key_baseはクッキーやトークンの暗号化に使われます。
詳細は Phoenix.EndpointのRuntime configuration を参照してください。
httpのportはどのポートで待ち受けるかを決めます。
詳細は Phoenix.EndpointのAdapter configuration を参照してください。
環境変数を設定するには export を実行します。
$ export SECRET_KEY_BASE=$(mix phx.gen.secret)

警告

上記コードのとおり、SECRET_KEY_BASE は設定されていないと例外を投げるため、 mix compile の起動直後に停止します。(configファイルはコンパイル前に読まれます。)

ライブラリの取得とコンパイル

以下を実行することでライブラリの取得とコンパイルができます。

$ mix deps.get --only prod      # production用のライブラリだけを取得します。
$ npm install --prefix ./assets # node_modulesを取得します。
$ MIX_ENV=prod mix compile      # production用のコンパイルをします。
                                # これにより_build/prodが生成されます。

assetsの用意

以下を実行することでassetsの用意ができます。

$ npm run deploy --prefix ./assets # ./assets/package.json に定義より
                                   # webpackがproduciton modeで実行され、
                                   # ./priv下にassetsがコピー、生成されます。
$ mix phx.digest                   # ./priv/static下のファイルが圧縮されます。

DBのマイグレーション

DBを使用する場合はマイグレーションを行います。

$ MIX_ENV=prod mix ecto.migrate

アプリケーションの起動

サーバーを起動しています。

$ MIX_ENV=prod mix phx.server

以上です。