バージョン
- Elixir 1.6.4
- Phoenix 1.3.2
内容
elixirのフレームワークであるphoenixで新規アプリを作成するときに、mix phx.new --database mysql
のようにデータベースにmysqlを指定した場合、mysqlを使う設定でアプリの雛形が作成される。
これをherokuで動かすために行った設定をまとめる。
herokuアプリの作成
- herokuに新規アプリを作成する
- Add-onsで
ClearDB
を作成する - 自動で環境変数に追加された
CLEARDB_DATABASE_URL
から必要な情報を読取る。次のような形式になっているはず。mysql://username:password@hostname/database?reconnect=true
Ecto.Adapters.MySQL
に上記URLを直接設定できないため(まじで?)、passwordだけでも別の環境変数として設定しておく
mix phx.gen.secret
を実行した結果をSECRET_KEY_BASE
の環境変数に設定する- 次のbuildpackを設定する
- https://github.com/HashNuke/heroku-buildpack-elixir.git
- 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