前回のおさらいと今回の内容
私は、1 台 100 円のバーコードリーダーを使った、
バーコードバ⚪︎ラー風のゲーム「バーコードファイター」を Rails で作成!
↑これが「バーコードファイター」
一人で遊ぶのは非常にもったいないので、
オフィスにいるみんなで「レッツファイト!!!!」したくなりました...
そこで、最近社内に突然生えた私物ラックサーバー内のVMに、
バーコードファイターをデプロイしてみんなで遊んでみようと思います!
Kamal とはなんぞや!?
なんと、Rails にはオンプレミスなサーバーやVPSへ迅速にデプロイできる、Kamal というツールが標準搭載されているらしいです!
(Ruby on Rails 8.0 から標準搭載されたらしい)
アプリケーションをデプロイするツールであるKamal 2がRailsにプリインストールされました。Kamalを使うと、新品のLinuxマシンをkamal setupコマンド1つでアプリケーションサーバーやアクセサリサーバーに変えます。
作ったものを簡単にデプロイできるのは良いですね!
これは個人開発など、インフラコストが重視される場合に役立ちますね!
デプロイ先環境
スペック
HP ProLiant DL360 Gen10
(Xeon Silver 2CPU、Proxmox導入済み)
※ネットワークは業務用とは完全に隔離されたゲストネットワークを使用
デプロイしてみた
準備
開発用 PC に Docker がインストールされていることが前提ですので、
入れていない方は導入しましょう!
今回は DockerHub を使うため、ユーザー登録を行い、
以下のコマンドを使用し開発用 PC で Docker レジストリにログインしておいてください!
docker login
VM に Ubuntu Server を入れる
いつも通り、インストールする

※Kamal は SSH を使用してデプロイを行うので、SSH 接続を行えるようにセットアップ時に設定をしましょう
Kamal が Docker を自動で導入できるようにする
Kamal は自動的に Docker を導入してくれる優れものです。
Docker を自動で入れられるように、一旦ユーザーに対して sudo を実行できるようにしましょう!
この設定は最初のみ行い、初回デプロイ後に消します
echo 'user-name ALL=(ALL) NOPASSWD:ALL' \
| sudo tee /etc/sudoers.d/kamal-docker-setup \
&& sudo chmod 440 /etc/sudoers.d/kamal-docker-setup
user-name はデプロイするサーバーのユーザー名を指定しましょう
Kamal の設定
1. Kamal の deploy.yml を生成する
Railsプロジェクトのルートディレクトリで kamal init を実行します。
config ディレクトリに deploy.yml が生成されるので開きます。
bar_code_fighter % kamal init
Config file already exists in config/deploy.yml (remove first to create a new one)
# 私の環境ではすでに生成されていた
2. deploy.yml を設定する
service: bar_code_fighter # 任意のサービス名を入力
image: your-user/bar_code_fighter # DockerHub 上のイメージの場所を指定する
servers:
web:
- 192.168.0.1 # ここにデプロイしたいサーバーの IP アドレスを入力する
registry:
server: registry-1.docker.io # DockerHub を使うので、これを指定
username: your-user # ここに DockerHub のユーザー名を入力
password:
- KAMAL_REGISTRY_PASSWORD # DockerHub のアクセストークンは .kamal/secrets に記述する
env:
secret:
- RAILS_MASTER_KEY #Credentials は .kamal/secrets に記述する
# 他に追加したい環境変数があれば、変数名を記述しましょう。
# 値は .kamal/secrets に記述します。
# - GEMINI_API_KEY (例)
builder:
arch: amd64
ssh:
user: user-name # デプロイするサーバーのユーザー名
keys: [ "~/.ssh/id" ] # SSH接続用の秘密鍵のあるパスを指定 (お使いの環境に合わせて指定してください)
※your-user には、DockerHub のユーザー名を入れてください。
3. シークレットキー周りを設定する
deploy.yml で指定した Credentials 類は .kamal ディレクトリにある secrets ファイルへ記述しましょう。(あまり良くないですが...)
※Credentials 類を扱うため、.gitignore で Git 管理下から外しましょう!
# .gitignore で Git の管理下から外して、このファイルが外部に漏れないようにすること!
KAMAL_REGISTRY_PASSWORD=xxxxxxxxxxxxxxxxxxxxxx # DockerHub のアクセストークンを記述
RAILS_MASTER_KEY=$(cat config/master.key)
# 他に追加したい環境変数があればここに記述する
# 追加する場合は予め、deploy.yml の env に変数名を記述しておきましょう
# GEMINI_API_KEY=xxxxxxxxxxxxxxxxxxxxxx (例)
すでに管理下に置かれている場合、追跡を停止させてから、.gitignore に以下のものを追加しましょう。
.kamal/secrets
初デプロイ
ついにデプロイする時が来ました!!!
以下を実行しましょう!
kamal setup
デプロイが走っています!!!!
bar_code_fighter % kamal setup
INFO [b70810f3] Running /usr/bin/env mkdir -p .kamal on 192.168.0.6
INFO [b70810f3] Finished in 0.635 seconds with exit status 0 (successful).
Acquiring the deploy lock...
Ensure Docker is installed...
INFO [93a9dc51] Running docker -v on 192.168.0.6
INFO [93a9dc51] Finished in 0.057 seconds with exit status 127 (failed).
INFO [b6ac0763] Running [ "${EUID:-$(id -u)}" -eq 0 ] || command -v sudo >/dev/null || command -v su >/dev/null on 192.168.0.6
INFO [b6ac0763] Finished in 0.060 seconds with exit status 0 (successful).
INFO Missing Docker on 192.168.0.6. Installing…
INFO [dc60a3aa] Running /usr/bin/env sh -c 'curl -fsSL https://get.docker.com || wget -O - https://get.docker.com || echo "exit 1"' | sh on 192.168.0.6
デプロイできた!!!!!
待つこと約 1 分。
デプロイができました!!!
INFO [188e42d5] Finished in 0.135 seconds with exit status 0 (successful).
Finished all in 57.6 seconds
Releasing the deploy lock...
Finished all in 58.5 second
トラブルシューティング: 初回デプロイでパーミッションエラー!!!
ERROR (SSHKit::Command::Failed): Exception while executing on host 192.168.0.6: docker exit status: 1
docker stdout: Nothing written
docker stderr: permission denied while trying to connect to the docker API at unix:///var/run/docker.sock
上記のようなパーミッション関連エラーが起こった場合、デプロイに使用するユーザーを docker グループへ追加しましょう
sudo usermod -aG docker user-name
sudo 設定を消す
KamalがDockerを自動で導入できるようにする で一旦ユーザーに対して sudo を実行できるようにした設定を消します。
sudo rm /etc/sudoers.d/kamal-docker-setup
sudo -n true
a password is required と表示されれば問題ありません!
次回のデプロイからはどうすれば...!?
次回のデプロイからは以下のコマンドを用いてデプロイしましょう。
kamal deploy
問題なくデプロイできています!
INFO [54164761] Finished in 0.153 seconds with exit status 0 (successful).
Releasing the deploy lock...
Finished all in 33.4 seconds
社内のみんなとレッツファイト!!!!!
早速、今日オフィスにいる人とレッツファイトしてみました!
Meta 社「Meta Quest 3S」 VS 任天堂 「スーパーファミコン ミニ」
オフィス内にあった私物のMeta Quest 3S と スーパーファミコン ミニ (どちらも私物)で戦ってみました!
私が「スーパーファミコン ミニ」の方です。
結果
スーパーファミコン ミニが圧倒的に強く、Quest 3S は負けてしまいました...
(夢中になりすぎて、戦いの様子はスクリーンショットしか残せていませんでした...)
終わりに
Rails入門を通して、「あったらいいな」や「欲しい!」が最初から標準で揃っている心強さを感じました。
さらに、「作りたいもの」をすぐ形にできて、作る過程そのものも楽しめるのが Ruby と Rails の魅力だと実感しました。
今後の開発でも積極的に採用していきたいと思います!!!
※この記事は、AI文章校正ツール「ちゅらいと」で校正されています。

