Railsアプリをfly.ioに配備する
Fly.ioの利用関してハマったところを含めて簡単にまとめておく。
アカウント登録
GitHub連携やメアドで登録。無料枠を増やしたい場合はクレカ登録する。
ツールのインストール
基本コマンドでの操作なので、flyctl
というcliツールをインストールする。
サインイン
> flyctl auth login
配備の準備
アプリがあるディレクトリに移動してflyctl launch
を実行し、fly.toml
やDockerfile
を始めとした配備に必要なファイルを生成。
> cd /my/rails/app
> flyctl launch
質問があるので、それに答える。名前は面倒なので自動生成。
- リージョン。日本にいるので今回は Tokyo, Japan (nrt)
- Upstash Redis databaseは無料枠の100MBで作成
他のPaaS環境を併用する場合、Dockerfile
等のが存在が邪魔になったりする場合があるので、必要に応じて.gitignore
に登録しておくこと。
環境に応じて、fly.toml
等のファイルを修正。
環境変数の定義
アプリの実行環境に必要な環境変数をflyctl secrets set
コマンドで設定。
flyctl secrets set PACKAGES_AUTH_TOKEN=ghp_xxx
flyctl secrets set MONGODB_URI=mongodb+srv://xxx:yyy@zzz/dbname
flyctl secrets set BUNDLE_GITHUB__COM=ghp_xxx:x-oauth-basic
flyctl secrets set SECRET_KEY_BASE=xxx
flyctl secrets set REDIS_URL=redis://default:[email protected]
flyctl secrets set SENDGRID_API_KEY=xxxxx
REDIS_URL
を定義するのに、Redis環境の確認。
flyctl redis status xxx-yyy-zzzz-redis
Redis
ID = xxxxxxxxxxxxxxxxxx
Name = xxx-yyy-zzzz-redis
Plan = Free
Primary Region = nrt
Read Regions = None
Eviction = Disabled
Private URL = redis://default:[email protected]
ビルド時の環境変数
PACKAGES_AUTH_TOKEN
、BUNDLE_GITHUB__COM
など、ビルド時にも使われる環境変数はDockerfileへ渡すよう定義する。
変数定義に関連したファイルのコピー操作も修正。
- COPY --link package.json yarn.lock ./
+ COPY --link package.json yarn.lock .npmrc ./
Swapの設定
デフォルトだと、Swapが不足してOOMEでアプリがほぼ確実に停止するので設定する。
アプリを開始するときにswapを作成する操作を挿入。rootでコマンドを開始するよう、Dockerfile
のUSER定義を削除し、docker-entrypoint
にてroot時の処理を追加し、操作のあとに一般ユーザ(rails)に切り替えるようにする。
Dockerfile
- USER rails:rails
bin/docker-entrypoint
#!/bin/bash -e
if [ $UID -eq 0 ]; then
fallocate -l 512M /swapfile
chmod 0600 /swapfile
mkswap /swapfile
echo 10 > /proc/sys/vm/swappiness
swapon /swapfile
echo 1 > /proc/sys/vm/overcommit_memory
exec su rails $0 $@
fi
exec "${@}"
自動停止の無効化
デフォルトだと一定期間アイドルだとアプリが勝手に止まるようで、それを抑止したい場合は、fly.toml
のauto_stop_machines
をfalse
にする。
fly.toml
- auto_stop_machines = true
+ auto_stop_machines = false
配備
> flyctl deploy
状態の確認
状態を確認。
> flyctl status
App
Name = xxx-yyyy-zzzz
Owner = personal
Hostname = xxx-yyyy-zzzz.fly.dev
Image = xxx-yyyy-zzzz:deployment-xxxxxxxxxxxxxxxxxxxxxxxxxx
Platform = machines
Machines
PROCESS ID VERSION REGION STATE CHECKS LAST UPDATED
app xxxxxxxxxxxxxx 13 nrt started 2023-06-30T01:21:14Z
ブラウザで確認。
> flyctl open
opening http://xxx-yyyy-zzzz.fly.dev ...
ログ確認
> flyctl logs
アプリ環境へのログイン
アクセストークンを確認
> flyctl auth token
xxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
アクセストークンをつけてログイン。
> flyctl ssh console -t xxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx