Rails8 3分クッキング -アプリケーション作成からすばやく世に出す-
本記事は、Rails8から導入されたKamal2, Thrusterを利用して、着想からなるべく早くデプロイし世に出してみようという記事です。
Rails8からはSolidシリーズも登場して、より色々準備する手間が省けるようになりました。
Kamal2, Thruster, Solidシリーズ などの説明は省略します。
背景
私自身も思いつきで個人開発をする際に、この方法でいくつか世に出してみました。
軽い個人開発のようなものや、ニーズがあるのかどうか早く確かめたいものであれば、有効かなと個人的には思います。
また、昨今、AIの登場によりものづくりの敷居はぐっと下がったように思います。さくっと作ってみたものを公開して反響を確かめたい場合でも有効かなと。
手間なくそれでいて色々揃っている「こういうのでいいんだよこういうので」という感覚です。
※ 実際に3分計測したわけではないですが、体感それくらい手軽に早く世の中に出せるよ。というニュアンスです。あくまで初期立ち上げからデプロイまでなので、着想アイデアの開発は別です。
準備するもの
- SSH接続可能なサーバ ※1
- パブリックIPの割り当てを有効化して、sshコマンドで接続できるようにしておく
- ドメインを割り当てたい場合は、その設定もしておく
- コンテナレジストリ ※2
- GitHubリポジトリ
※1 Railsコンテナを動かすためにもメモリは少なくとも1GB以上あるとよいです
※2 Docker Hubの無料プランの場合、プライベートコンテナイメージは1つまでしか保存できません
前提
- SSL証明書はLet’s Encrypt を利用する
- DBはRails8備え付けのSQLite
- 作りたいものの特性・制約やニーズがあることが確認できたら、RDSなどを用意するという想定
一例ですが、私の場合は、AWS環境でサーバは「EC2 (t3.micro)」で、複数サービスを並行して開発したかったので、コンテナレジストリは「ECR」、DBはSQLiteのままですが、永続的なストレージボリュームにしたかったので「Amazon EFS」に保存しています。
▽ 一例のイメージ
アプリケーション作成からデプロイまで
- Rails8 アプリケーション作成
rails new myapp
- GitHub管理下にする
git remote add (HTTPS or SSH: owner/myapp.git)
-
config/deploy.yml
を修正
- image: your-user/myapp
+ image: myapp # Docker Hub利用の場合はyour-user含めて変更、ECRなどの場合はimage名のみでOK
servers:
web:
- - 192.168.0.1
+ - xxx.xxx.xxx.xxx # Public IPに書き換える
proxy:
ssl: true
- host: app.example.com
+ host: xxx.com # ドメイン取得済みであれば書き換える
registry:
- username: your-user
+ server: 012345678901.dkr.ecr.ap-northeast-1.amazonaws.com # Docker Hub利用の場合はserverは指定しなくてよい
+ username: AWS # Docker Hub利用の場合は、ユーザ名を変更 / ECRの場合はAWS
volumes:
- - "myapp_storage:/rails/storage"
+ - "/mnt/path/to/myapp/storage:/mnt/path/to/myapp/storage" # 適宜、ストレージを永続化する場合には書き換える
-# ssh:
-# user: app
+ ssh:
+ user: ec2-user # SSH接続可能なユーザ名を指定
-
KAMAL_REGISTRY_PASSWORD
環境変数の設定
Kamalでコンテナイメージの保存ができるように、KAMAL_REGISTRY_PASSWORD
環境変数を設定する。
Docker Hub なら、Personal access token の値、ECRなら aws ecr get-login-password
で取得した値。
- Kamal デプロイ実行
bin/kamal deploy
何も問題がなければ、以上で完了です。
その後、何か変更をしてデプロイしたくなったら、コミットしてから同様に bin/kamal deploy
を実行すればよいです。
デプロイに失敗する場合には、 config/deploy.yml
の設定が間違っている可能性があります。
railsコンテナの立ち上げに失敗しているようであれば、サーバにSSH接続した上で docker logs
などで失敗したrailsコンテナのログを見てみるとよいです。
あとは、メディアっぽいサービスであればGoogle Analytics, Search Consoleを導入するなりして、さまざまな方法で検証し、継続・クローズの判断をしていけばよいのかなと。
余談
今回は volumes を永続化のため変更していますが、そのままでもデプロイ自体は可能です。
ただし、コメントにも書いてあるとおり、サーバ外でのマウント済みのボリュームパスに変更することが推奨されています。
Use a persistent storage volume for sqlite database files and local Active Storage files.
Recommended to change this to a mounted volume path that is backed up off server.
Discussion