🍳

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」に保存しています。

▽ 一例のイメージ

アプリケーション作成からデプロイまで

  1. Rails8 アプリケーション作成
rails new myapp
  1. GitHub管理下にする
git remote add (HTTPS or SSH: owner/myapp.git)
  1. 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接続可能なユーザ名を指定
  1. KAMAL_REGISTRY_PASSWORD 環境変数の設定

Kamalでコンテナイメージの保存ができるように、KAMAL_REGISTRY_PASSWORD 環境変数を設定する。
Docker Hub なら、Personal access token の値、ECRなら aws ecr get-login-password で取得した値。

  1. 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