Chapter 21

デプロイの紹介

koga1020
koga1020
2021.03.01に更新

デプロイの紹介

動作するアプリケーションができたら、それをデプロイする準備ができています。独自のアプリケーションがまだ完成していない場合でも、心配しないでください。起動ガイドにしたがって、デプロイに使用する基本的なアプリケーションを作成してください。

アプリケーションをデプロイするための準備は、3つの主要なステップがあります:

  • アプリケーションシークレットの取り扱い
  • アセットのコンパイル
  • productionモードでのサーバーの起動

このガイドでは、ローカルに本番動作環境を構築する方法を学びます。本番でアプリケーションを動かすためにはこのガイドで説明する同じ技法を使うことができますが、デプロイインフラストラクチャによっては、追加のステップが必要となるでしょう。

他のインフラストラクチャへのデプロイへの例として、3つの異なるアプローチも言及します: 1つ目はmix release を利用したElixirのリリースと、2つ目はGigalixirの利用、もうひとつはHerokuの利用です。もしコンテナー技術でデプロイをするのがお好みなら、このリリースガイドでは利用可能なサンプルのDockerファイルも紹介します。

上記の手順を1つずつ見ていきましょう。

アプリケーションシークレットの取り扱い

すべてのPhoenixアプリケーションは、たとえば、本番データベースのためのユーザーネームやパスワード、Phoenixが重要な情報の署名と暗号化に使用するシークレットなど、安全に保つ必要のあるデータがあります。一般的にはこれらを環境変数に保持しておいて、アプリケーションでそこから読み出すことが推奨されます。環境変数からシークレットとコンフィグを読み込む責務は、config/prod.secret.exs が持ちます。

したがって、関連する変数が正しく本番環境に設定されていることを確認する必要があります:

$ mix phx.gen.secret
REALLY_LONG_SECRET
$ export SECRET_KEY_BASE=REALLY_LONG_SECRET
$ export DATABASE_URL=ecto://USER:PASS@HOST/database

これらの値をそのままコピーしてはいけません。mix phx.gen.secret の結果にしたがって、SECRET_KEY_BASE を設定してください。DATABASE_URL はデータベースアドレスにしたがって設定をしてください。

いくつかの理由により環境変数を使いたくない場合には、config/prod.secret.exs に直接、シークレットを書き込んでください。しかし、config/prod.secret.exs がバージョンコントロールシステムで取り扱われないように確認をしておいてください。

シークレット情報が適切で安全に設定できたので、アセットを構成してみましょう!

このステップに進む前に、少し準備が必要です。本番用にすべてを準備しているので、依存関係の解決とコンパイルをすることにより、環境のセットアップが必要です。

$ mix deps.get --only prod
$ MIX_ENV=prod mix compile

アセットのコンパイル

このステップは、Phoenixアプリケーション内で画像、JavaScript、スタイルシート等の静的アセットがある場合に必要となります。Phoenixの標準では、webpackを使っています。これについてこれから説明していきます。

静的アセットのコンパイルは2ステップで行います。

$ npm run deploy --prefix ./assets
$ mix phx.digest
Check your digested files at "priv/static".

注記: Windowsでは、npm--prefix は動作しないかもしれない。もしそうなら、最初のコマンドを cd assets && npm run deploy && cd ...に置き換えてください。

これだけです! 最初のコマンドはアセットを構築し、2番目のコマンドはダイジェストとキャッシュマニフェストファイルを生成して、Phoenixが本番でアセットをすばやく提供できるようにします。

上記ステップの実行を忘れた場合には、Phoenixがエラーメッセージを吐き出すことを覚えておいてください:

$ PORT=4001 MIX_ENV=prod mix phx.server
10:50:18.732 [info] Running MyApp.Endpoint with Cowboy on http://example.com
10:50:18.735 [error] Could not find static manifest at "my_app/_build/prod/lib/foo/priv/static/cache_manifest.json". Run "mix phx.digest" after building your static files or remove the configuration from "config/prod.exs".

エラーメッセージは非常に明確です。Phoenixが静的なマニフェストを見つけられなかったことを表しています。上記のコマンドを実行して修正するか、アセットを提供しないかまったく気にしない場合には、config/prod.exs から cache_static_manifest 設定を削除してください。

productionモードでのサーバーの起動

productionモードでPhoenixを開始するには、mix phx.server を実行する際に、PORTMIX_ENV 環境を設定しておく必要があります:

$ PORT=4001 MIX_ENV=prod mix phx.server
10:59:19.136 [info] Running MyApp.Endpoint with Cowboy on http://example.com

デタッチモードを使うと、ターミナルを閉じたときにPhoenixサーバーを止めずに実行し続けるようになります:

$ PORT=4001 MIX_ENV=prod elixir --erl "-detached" -S mix phx.server

エラーメッセージが表示された場合は、注意深く読んで、まだ対処方法が明確でない場合はバグレポートを確認してください。

IEx内でアプリケーションを動かすこともできます:

$ PORT=4001 MIX_ENV=prod iex -S mix phx.server
10:59:19.136 [info] Running MyApp.Endpoint with Cowboy on http://example.com

まとめ

前の節までは、Phoenixアプリケーションをデプロイするために必要な主要ステップを概説しました。実際には、最終的に独自のステップを追加することになります。たとえば、データベースを使用している場合、データベースを最新に保つため、サーバーを起動する前に mix ecto.migrate を実行したいでしょう。

全体として、ここに雛形として使用できるスクリプトを示しておきます:

# Initial setup
$ mix deps.get --only prod
$ MIX_ENV=prod mix compile

# Compile assets
$ npm run deploy --prefix ./assets
$ mix phx.digest

# Custom tasks (like DB migrations)
$ MIX_ENV=prod mix ecto.migrate

# Finally run the server
$ PORT=4001 MIX_ENV=prod mix phx.server

以上です。続いてデプロイのための公式ガイドを利用できます。