🔭

Rails8 と Kamal2 を用いてさくらのVPSにアプリをデプロイする手順

2025/01/19に公開

1. はじめに

この記事では、Rails 8Kamal 2 を使用して、さくらのVPS にRailsアプリをデプロイする手順を紹介します。
さくらのVPSは、コストパフォーマンスが高く、柔軟なカスタマイズが可能なため、多くの開発者に選ばれています。Kamal 2は、Railsのデプロイを簡単にするためのツールで、Kubernetes環境を前提にしたデプロイができます。

2. そもそもKamal2でどのようにデプロイが行われているのか

https://kamal-deploy.org/docs/installation/
を引用させていただく。
kamal setup を実行すると

  1. SSH 経由でサーバーに接続する (デフォルトでは root を使用し、SSH キーで認証される)。
  2. Docker が不足している可能性のあるサーバーに Docker をインストールする(get.docker.com を使用)。これには SSH 経由のルート アクセスが必要
  3. ローカルとリモートの両方でレジストリにログインする
  4. アプリケーションのルートにある標準の Dockerfile を使用してイメージをビルドする。
  5. イメージをレジストリにプッシュする。
  6. レジストリからイメージをサーバーにpullする。
  7. kamal-proxy が実行されており、ポート 80 および 443 でトラフィックを受け入れていることを確認する。
  8. 現在のGitバージョンのハッシュ値に一致するバージョンのアプリで新しいコンテナを開始する。
  9. kamal-proxy が GET /up に対して 200 OK (ステータス)で応答するようになったら、新しいコンテナにトラフィックをルーティングするように kamal-proxy に指示する。
  10. 古いバージョンのアプリを実行しているコンテナを停止する。
  11. 未使用のイメージと停止したコンテナを削除して、サーバーがいっぱいにならないようにする。

上記の流れでデプロイを行う。

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. 具体的な手順

基本的にこちらのリンクを参考に参考に構築しているので、詰まったところを記述します
https://zenn.dev/naofumik/articles/ce92c135a3cb2b

さくらVPSの準備

  • ubuntuのインストール
  • ポート22, 80, 443の解放
  • ローカルマシンからrootユーザでSSHログイン
  • 逆にここまでできればあとは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

参考にした文献・リンク

https://kamal-deploy.org
https://zenn.dev/naofumik/articles/ce92c135a3cb2b

Discussion