herokuでelixirのphoenixをmysqlで動かす

バージョン

  • Elixir 1.6.4
  • Phoenix 1.3.2

内容

elixirのフレームワークであるphoenixで新規アプリを作成するときに、mix phx.new --database mysqlのようにデータベースにmysqlを指定した場合、mysqlを使う設定でアプリの雛形が作成される。
これをherokuで動かすために行った設定をまとめる。

herokuアプリの作成

  1. herokuに新規アプリを作成する
  2. Add-onsでClearDBを作成する
  3. 自動で環境変数に追加されたCLEARDB_DATABASE_URLから必要な情報を読取る。次のような形式になっているはず。
    • mysql://username:password@hostname/database?reconnect=true
    • Ecto.Adapters.MySQLに上記URLを直接設定できないため(まじで?)、passwordだけでも別の環境変数として設定しておく
  4. mix phx.gen.secretを実行した結果をSECRET_KEY_BASEの環境変数に設定する
  5. 次のbuildpackを設定する
    1. https://github.com/HashNuke/heroku-buildpack-elixir.git
    2. https://github.com/gjaldon/heroku-buildpack-phoenix-static.git

Phoenixアプリの設定

mysqlに関係すること以外は、公式のドキュメントの通りでオッケー。

socket

websocketのタイムアウトを短く設定しておく必要がある。
websocketを使わないアプリであれば無視。

  transport :websocket, Phoenix.Transports.WebSocket,
    timeout: 45_000

config/prod.exs

config/prod.exsに、次の設定を追加、削除する。

# 常にSSLを使う設定に変更と、シークレットキーを環境変数から取得する設定を追加
config :phx_app, PhxAppWeb.Endpoint,
  load_from_system_env: true,
  url: [scheme: "https", host: "myapp.herokuapp.com", port: 443],
  force_ssl: [rewrite_on: [:x_forwarded_proto]],
  cache_static_manifest: "priv/static/cache_manifest.json",
  secret_key_base: Map.fetch!(System.get_env(), "SECRET_KEY_BASE")

# import_configの行をコメントアウト
# import_config "prod.secret.exs"

# mysqlへの接続情報
config :phx_app, PhxApp.Repo,
  adapter: Ecto.Adapters.MySQL,
  hostname: "us-cdbr-iron-east-04.cleardb.net",
  username: "abcdef",
  password: System.get_env("MYSQL_PASSWORD"),
  database: "heroku_abababababababa",
  parameters: [reconnect: true],
  pool_size: 5

mysqlへの接続情報はherokuに設定されてあるCLEARDB_DATABASE_URLの値から読み取って設定する。パスワードは環境変数より。
pool_size: 5なのは、herokuで使えるClearDBの無料プランの場合はコネクションが10しかないためで、Phonix側の設定でpoolのDBConnection.Poolboyデフォルトのpool_sizeは10になっている。このままだと、migrateのようなコマンドを実行するためのコネクションが無くなってしまうので9以下にする必要がある。

Procfile

web: MIX_ENV=prod mix phx.server

デプロイ

プッシュして、

git push heroku master

マイグレートすればOK。

heroku run mix ecto.migrate
タイトルとURLをコピーしました