Elixir
Phoenix

【Gigalixir編①】Elixir/Phoenix本番リリース: 初期PJリリースまで

fukuoka.ex代表のpiacereです
今回もご覧いただいて、ありがとうございます:bow:

「Heroku」と似たような操作感のElixir/Phoenix向けPaaS「Gigalixir」にて、Railsで言うScaffold程度のカンタンなCRUD Webアプリをリリースする方法をお伝えします

今回は、Gigalixirに、初期状態のPhoenix PJをリリースするところまでを行います

「Gigalixir」で何ができるか?

「Gigalixir」は、Elixir/Phoenix向けのPaaSです

Herokuと同様、git pushのみで、アプリのリリースが行え、DB(PostgreSQL)も利用でき、オートスケールも行える(有料)ので、気軽にElixir/Phoenixの本番運用が開始できます

独自ドメイン設定時は、「Let's Encrypt」を使った無料SSL/TLS設定も半自動で行えます

また、本番運用とステージング運用を切り替えることもできれば、動かす筐体をGCPとAWSから選択することも可能です(デフォルトはGCP)

そして、Herokuとの最大の違いは、「ホットアップグレード」、つまり、Elixir/Phoenixを動かしっぱなしの状態でリリースできることです

このように、至れり尽くせりなGigalixirですが、日本語ドキュメントがほぼ無いため、そもそも知らない/知っていても利用が不安、といった声をよく聞くので、今回コラム化してみました

なお、英語ではありますが、以下にGigalixirのリファレンスがあります(そこまで難しい内容で書かれてはいないので、英語が苦手な方でも、頑張れば読めるレベルかと思います)
https://gigalixir.readthedocs.io/en/latest/

ローカルPCでgitとpipを使えるようにする

今回の手順は、gitコマンドとpipコマンド(Pythonパッケージ管理ツール)が使えることを前提としているので、コマンドプロンプトやシェルで、以下を実行して、バージョン表示されることを確認しておいてください

git --version
pip --version

バージョン表示されない場合は、以下等を参考にして、事前にインストールしておいてください

git
Windows:https://qiita.com/KSA10/items/a1ea27c07008b09e9328
mac:https://qiita.com/furusin_oriver/items/974a7b7fb8c56ad88d6e
Linux:https://ctips.slackhack.net/git/811/

pip
https://qiita.com/suzuki_y/items/3261ffa9b67410803443

Gigalixirのアカウント作成

以下URLをブラウザで開きます
https://gigalixir.com/
image.png

「GET STARTED FOR FREE」ボタンをクリックすると、ユーザ登録画面が出るので、メールアドレスとパスワードを入力し、アカウント作成します
image.png

確認メールが届くので、メール中の「Confirm」ボタンをクリックします
image.png

アカウント作成はこれで完了で、「Sign In」リンクをクリックすると、ログイン画面が出るので、先程作成したアカウントでログインします
image.png

ログインすると、ダッシュボードが表示されます
image.png

「Create App」ボタンをクリックすると、App(Gigalixirでのリリース先となる場所)が作成されます
image.png

このキャプチャだと「NAME」に書かれた「trivial-unlawful-insect」が、App名で、これからの操作で指定します(App作成時に振られる名前なので、お手元では各自、異なる名前になっていると思います)

この後の操作は、Phoenix PJ作成後に続きを行います

ローカルPCでPhoenix PJを作成

Phoneix PJを作成します

mix phx.new gigalixir_sample --no-brunch
…
Fetch and install dependencies? [Yn] n
…
cd gigalixir_sample 

Ecto経由でMnesiaを利用するためのライブラリ「EctoMnesia」を導入するため、mix.exsの「def deps do」配下に追記します(:phoenix~の記載の上行に追加)

なお、現在のPhoenix標準のEctoと、EctoMnesiaのバージョンがマッチしないので、EctoMnesiaの手前で、バージョン指定したEctoも追加します

それと、ここ最近のPhoenixは、plug_cowboyのエラーを出しているため、こちらも追加します

mix.exs

  defp deps do
    [
      { :ecto, "~> 2.1" }, 
      { :ecto_mnesia, "~> 0.9.1" }, 
      { :plug_cowboy, "~> 1.0" }, 
      

デフォルトでPostgreSQL接続となっている設定をコメントアウトし、Mnesia接続へと変更します

config/dev.exs

# Configure your database
#config :gigalixir_sample, GigalixirSample.Repo,
#  adapter: Ecto.Adapters.Postgres,
#  username: "postgres",
#  password: "postgres",
#  database: "sample_db_dev",
#  hostname: "localhost",
#  pool_size: 10

config :gigalixir_sample, GigalixirSample.Repo,
  adapter: EctoMnesia.Adapter

config :ecto_mnesia, 
  host: { :system, :atom, "MNESIA_HOST", Kernel.node() }, 
  storage_type: { :system, :atom, "MNESIA_STORAGE_TYPE", :disc_copies }

config :mnesia, 
  dir: 'priv'

ライブラリを取得します(要ネット接続)

mix deps.get

DBを作成します

mix ecto.create

Phoenixサーバーを起動します

iex -S mix phx.server

ブラウザで「http://localhost:4000」にアクセスすると、Phoenixで作られたWebページが見れます

image.png

Gigalixir用のアプリ・DB設定

prod.exsのEndpoint設定の「load_from_system_env: true,」の上に「server」を追加し、末尾の「import_config "prod.secret.exs"」をコメントアウトします

その後に、Repo設定を追加します

今回、ローカルPCでは、Mnesiaを利用しますが、GigalixirではPhoenixデフォルトのPostgreSQLを利用するため、「Ecto.Adapters.Postgres」を指定しています

config/prod.exs
use Mix.Config

config :gigalixir_sample, GigalixirSampleWeb.Endpoint,
  server: true,
  load_from_system_env: true,
 …
# import_config "prod.secret.exs"

config :gigalixir_sample, GigalixirSample.Repo,
  adapter: Ecto.Adapters.Postgres,
  url: "${DATABASE_URL}",
  database: "",
  ssl: true,
  pool_size: 1

GigalixirレポジトリをPJに設定

さきほど作成したPhoenix PJフォルダ直下で、Phoenix PJフォルダをgit初期化します

git init

次に、ダッシュボードのApp名の右にある「Setup」ボタンをクリックすると、Appにリリースするためのgit設定・操作と、gigalixirコマンドの導入方法が表示されるので、「Deploy」の1行目に書かれているコマンドをコピペして、実行します

このコマンドで、GigalixirのAppにあるリモートレポジトリが、Phoenix PJフォルダに設定され、git pushした際、Gigalixirリモートレポジトリにpushされるようになります
image.png

git remote add gigalixir https://【Gigalixirログイン情報】@git.gigalixir.com/【App名】.git

Gigalixirへのリリース

いよいよ、GigalixirにPhoenix PJをリリースします

まず、リリース対象となる、ローカルフォルダ配下のファイルを追加・コミットします

git add .
git commit -m "Initial commit"

その後、コミットをpushします

git push gigalixir master

このpushにより、Gigalixirレポジトリが更新された後、Gigalixir側で、mix deps.getやコンパイルが自動的に走り、リリースが行われ、以下のようなログが出てきた後、Gigalixir側Phoenixが起動します

…
remote: Creating release.
remote: Starting zero-downtime rolling deploy.
remote: Please wait a minute for the new instance(s) to roll out and pass health checks.
remote: For troubleshooting, See http://gigalixir.readthedocs.io/en/latest/main.html#troubleshooting
remote: For help, contact help@gigalixir.com
remote: curl https://trivial-unlawful-insect.gigalixirapp.com/
remote: Updated property [core/account].
To https://git.gigalixir.com/trivial-unlawful-insect.git
 * [new branch]      master -> master

上記ログの「curl https://~」で始まるURLをブラウザで開くと、リリースされたPhoenixのWebページが見れます(少し表示されるまで時間がかかる場合もあります)

image.png

以降は、コミットした内容をpushするだけで、リリースできるようになります、素晴らしい!:confetti_ball:

終わり

これで、GigalixirにPhoenixアプリをリリースすることができるようになりました

次回は、CRUD Webアプリを構築し、Gigalixirにリリースしたいと思います

p.s.「いいね」よろしくお願いします

ページ左上の image.pngimage.png のクリックを、どうぞよろしくお願いします:bow:
ここの数字が増えると、書き手としては「ウケている」という感覚が得られ、連載を更に進化させていくモチベーションになりますので、もっとElixirネタを見たいというあなた、私達と一緒に盛り上げてください!:tada: