🔭
Rails8 と Kamal2 を用いてさくらのVPSにアプリをデプロイする手順
1. はじめに
この記事では、Rails 8 と Kamal 2 を使用して、さくらのVPS にRailsアプリをデプロイする手順を紹介します。
さくらのVPSは、コストパフォーマンスが高く、柔軟なカスタマイズが可能なため、多くの開発者に選ばれています。Kamal 2は、Railsのデプロイを簡単にするためのツールで、Kubernetes環境を前提にしたデプロイができます。
2. そもそもKamal2でどのようにデプロイが行われているのか
kamal setup
を実行すると
- SSH 経由でサーバーに接続する (デフォルトでは root を使用し、SSH キーで認証される)。
- Docker が不足している可能性のあるサーバーに Docker をインストールする(get.docker.com を使用)。これには SSH 経由のルート アクセスが必要
- ローカルとリモートの両方でレジストリにログインする
- アプリケーションのルートにある標準の Dockerfile を使用してイメージをビルドする。
- イメージをレジストリにプッシュする。
- レジストリからイメージをサーバーにpullする。
- kamal-proxy が実行されており、ポート 80 および 443 でトラフィックを受け入れていることを確認する。
- 現在のGitバージョンのハッシュ値に一致するバージョンのアプリで新しいコンテナを開始する。
- kamal-proxy が GET /up に対して 200 OK (ステータス)で応答するようになったら、新しいコンテナにトラフィックをルーティングするように kamal-proxy に指示する。
- 古いバージョンのアプリを実行しているコンテナを停止する。
- 未使用のイメージと停止したコンテナを削除して、サーバーがいっぱいにならないようにする。
上記の流れでデプロイを行う。
3. 開発時の各種バージョン情報
- ruby 3.4.1
- Rails 8.0.1
- Kamal 2.4.0
4. 大まかな流れ
- さくらVPSの準備
- ドメイン名の取得
- root権限でssh接続できるように設定
- ポート 22 (SSH)と 80 (http)、443 (https)を開ける
- DockerHubの準備
- アカウントの作成
- イメージのリポジトリを用意
- PATの用意
- Railsアプリの準備
- rails8系ではrails newの時点でkamalが実装済み
- .kamalの設定
- .kamal/secrets
- configの設定
- config/deploy.yml
- config/environments/production.rb
- デプロイの実行
- kamalコマンドの実行
5. 具体的な手順
基本的にこちらのリンクを参考に参考に構築しているので、詰まったところを記述します
さくらVPSの準備
- ubuntuのインストール
- ポート22, 80, 443の解放
- ローカルマシンからrootユーザでSSHログイン
- ここはデフォルトではroot ログインは許可されていません
- ここら辺を参考にsshd_configを修正する必要があります
-
ssh root@ホスト名 -p 22
とかで接続できればOK
- 逆にここまでできればあとはkamalがいい感じにやってくれます
DockerHubの準備
- アカウントを持っていない人はここで作成する
- 加えてここでimageのリポジトリの作成を行う
- (作らなくてもkamalがいい感じに作ってくれるらしいが、うまくいかなかった。。。)
- PAT(個人アクセストークン)の作成
Railsアプリの準備
- 私が作成した github を載せておきます
- Rails8をrails new している場合は基本的に大きくいじる必要はありません
- Rails7.2とかでは細かな設定が必要です。
- Rails8では基本的にkamalの
config/deploy.yml
と.kamal/secrets
をいじればOKです。- さくらVPSのIPやホスト名
- DockerHubのアカウント、リポジトリ名、PAT
- secretsに関しては、直接書き込まず、環境変数やcredentialsから引っ張るようにする
- 参考にした記事でも記載してますが、
config/environments/production.rb
部分の修正が必要ですconfig.ssl_options = { redirect: { exclude: ->(request) { request.path == "/up" } } }
- /upはヘルスチェックとして、行われデプロイの際のチェックとして使われます
Kamalコマンドの実行
- kamal setupでセットアップが行われる
- デプロイまでいっぺんに実行されます
- 次回以降はkamal deployでOK
- setup はアクセサリの追加と環境変数のpush が併せて実行される
- setupコマンド以降のデプロイ or サーバーに Docker がすでにインストールされている場合はdeployコマンドのみでOK
参考にした文献・リンク
Discussion