チュートリアル: Kamal を使用して Rails アプリをデプロイする
Kamal(英語) は、コンテナー化された Rails アプリケーション用のデプロイツールです。 Capistrano のように SSH 経由でタスクを実行する代わりに、Kamal はアプリケーションの Docker イメージを構築し、レジストリにプッシュして、軽量コンテナー内でサーバー上で実行します。
RubyMine では、内蔵ターミナルから直接、または を使って Kamal コマンドを実行できます。 これにより、IDE を移動することなく、デプロイのトリガー、環境の管理、ログの監視が容易になります。
このチュートリアルでは、Kamal を使用してサンプル Rails アプリケーションをリモートサーバーにデプロイする方法を説明します。 アプリケーションサーバーとして、Puma は Docker コンテナー内で実行され、Kamal Proxy が HTTP および HTTPS トラフィックを処理します。
前提条件
RubyMine から完全に Kamal を使用した Rails アプリケーションをデプロイするには、ローカル環境とリモートサーバーがこれらの要件を満たしていることを確認してください。
ローカルマシン
Mac と macOS
Rails プロジェクト用に RubyMine をインストールして構成します
Rails 8 アプリケーション。 古い Rails バージョンの場合は、Gemfile に Kamal を追加するか、
gem install kamalを使用してローカルにインストールしてください。プロジェクトルートに有効な
Dockerfileローカルにインストールされた Docker
資格情報が安全に保存されたコンテナーレジストリ (Docker、Hub、GitHub コンテナーレジストリ、またはプライベートレジストリ) へのアクセス
ローカルに設定された SSH
Web サーバー
Linux ベースのホスト
Kamal
deploy.ymlで定義された同じユーザーによる SSH アクセス (または OpenSSH の設定)Docker をインストールして実行 (カマルは
kamal setup中に新規ホストにインストールできる)
デプロイ
チュートリアルのこの部分では、Kamal を使用してアプリをデプロイするために必要な手順について説明します。
カマルを初期化する
RubyMine でターミナル( )を開きます。 または、IDE の左下隅にあるツールバーの ターミナル アイコンをクリックします。
次のコマンドを実行してください:
kamal initこれにより、 config/deploy.yml ファイルが作成されます。 このファイルにはデプロイの多くの設定キーとオプションが含まれていますが、このチュートリアルでは、デプロイに必要な設定のみに焦点を当てます。
デプロイを構成する
kamal init によって生成された作成された config/deploy.yml ファイルを編集します。
以下はファイルの内容の例です。
秘密を管理する
本番環境では、Rails は暗号化と安全な操作のために有効な SECRET_KEY_BASE を必要とします。 正しく設定するには、以下の手順に従ってください。
強力な
SECRET_KEY_BASEを生成するには、次のいずれかのコマンドを実行します。bin/rails secret # or ruby -rsecurerandom -e 'puts SecureRandom.hex(64)' # or, if using your built Docker image: docker run --rm <your-image> ./bin/rails secret生成されたキーを環境設定に追加して、 config/deploy.yml ファイルを更新します。
env: clear: RAILS_ENV: production PORT: "3000" SECRET_KEY_BASE: <%= ENV.fetch("SECRET_KEY_BASE") %>kamal deployコマンドを実行する前に、キーを環境にエクスポートします。export SECRET_KEY_BASE="<your-generated-value>"
デプロイされると、アプリケーションは提供された SECRET_KEY_BASE 値を使用して機密操作を保護します。
初回サーバーセットアップを実行する
kamal setup コマンドを実行して、サーバーをデプロイ用に準備します。
アプリケーションのデプロイ
デプロイを構成し、wev サーバーの準備が整ったことを確認したため、アプリケーションをデプロイできます。
RubyMine ターミナルから次のコマンドを実行します。
kamal deployKamal は次のことを行います。
Docker イメージをローカルでビルドする
レジストリにプッシュする
サーバーへの SSH 接続を確立する
新しいイメージをプルする
構成された環境でアプリケーションを起動する
デプロイが完了したら、ブラウザーを開き、アプリケーション用に構成した URL にアクセスします。
トラブルシューティング
SSH がパスフレーズ/パスワードを何度も要求する
パスフレーズのプロンプトを回避するには、SSH キーをエージェントにロードします。
ssh-add ~/.ssh/id_ed25519永続的なアクセスのために、SSH キーを macOS キーチェーンに追加します。
ssh-add --apple-use-keychain -K ~/.ssh/id_ed25519~/.ssh/config を設定して、SSH が正しいキーを使用することを確認します。
Host your-server-ip User your-username IdentityFile ~/.ssh/id_ed25519 IdentitiesOnly yesSSH 接続をテストして、すべてが機能していることを確認します。
ssh your-username@your-server-ip
ページが 404 を返す
リクエストが Rails に到達するかどうかを確認します。
# in one shell kamal app logs -f # in another shell curl -I http://app.example.com/ログが空の場合は、DNS またはプロキシを修正してください。 Rails のログに 404 が表示される場合は、アプリにルートルートを追加してください。
プロキシがルーティングされ正常であることを確認します。
kamal proxy ps kamal proxy logs -f curl -I -H "Host: app.example.com" http://127.0.0.1deploy.yml で 200 (たとえば、 /up ) を返すヘルスチェックパスを使用します。
アプリが正しいポート (デフォルトは 3000) をリッスンし、
0.0.0.0をバインドしていることを確認します。curl -I http://127.0.0.1:3000/
ロールバック
現在のデプロイに問題がある場合は、アプリケーションを以前のバージョンにロールバックしてください。 これにより、安定した状態を迅速に回復できます。
まず、以前のバージョンを識別するために利用可能なコンテナーを一覧表示します。
kamal app containers -q次に、希望するバージョンまたは最新の安定したバージョンを指定して、以前のイメージにロールバックします。
kamal rollbackロールバック後、ログとアプリの状態を監視して、以前のバージョンが正しく実行されていることを確認します。