Kamal で Rails アプリを Ubuntu サーバーにデプロイする

外観

目的

Kamal を使って Rails アプリを Ubuntu サーバーにデプロイする。

方針

Mac 上の仮想サーバーにデプロイする。
Docker in Docker せずに UTM.app で仮想サーバーを動かす。
Cloudflare Tunnel を使って外部からアクセスする。

環境

Mac

USキーボード
macOS Sonoma 14.2.1
UTM.app 4.1.6
Docker Desktop.app 4.27.2

アカウント

Docker Hub アクセストークン発行
Cloudflare ドメイン所持

Ubuntu サーバー

Ubuntu Server 22.04.3 LTS

UTM.app

仮想マシン名: ubuntu-22.04.3
ISOファイル: ubuntu-22.04.3-live-server-amd64.iso
Language: English (英語)
Continue without updating (後でアップデートする)
Keyboard configuration:
Variant: English (US) - English (Macintosh)
Profile setup: ubuntu
Install OpenSSH server (SSHサーバーを使う)

以下、サーバーの IP アドレスが SERVER_ADDRESS として進める。

Server

SSHでログインできることを確認する。

ssh ubuntu@SERVER_ADDRESS
exit

パスワード入力なしでログインできるようにする。

ssh-copy-id ubuntu@SERVER_ADDRESS
ssh ubuntu@SERVER_ADDRESS

アップグレードする。

sudo apt-get update
sudo apt upgrade -y

Using a different SSH user than root
https://kamal-deploy.org/docs/configuration

今回は root ではないので、docker などをインストールする。

Docker をインストールする。
Install using the apt repository
https://docs.docker.com/engine/install/ubuntu/

1. Set up Docker's apt repository.

# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

# Add the repository to Apt sources:
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update

2. To install the latest version, run:

sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

sudo なしで docker を実行できるようにする。再ログインで使用できる。

sudo usermod -a -G docker ubuntu
sudo apt install -y curl git
exit
ssh ubuntu@SERVER_ADDRESS
docker ps

今回のアプリでは SQLite でマウントするディレクトリを作る。

mkdir hello-storage
sudo chmod 777 hello-storage
exit

Rails

Ruby 3.2.2    ※3.3.0のDockerイメージでは上手くいかないようです。
Rails 7.1.3
Kamal 1.3.1

rbenv install 3.2.2
rbenv global 3.2.2
ruby -v
gem install rails -v 7.1.3 --no-document
rails -v

rails _7.1.3_ new hello
cd hello
bundle lock --add-platform aarch64-linux
bin/rails g scaffold Post body:text
bin/setup

config/routes.rb

Rails.application.routes.draw do
  resources :posts
  get "up" => "rails/health#show", as: :rails_health_check
  root "posts#index"
end

config/environments/production.rb

config.assume_ssl = true

動作確認しておく。

bin/rails s
open http://127.0.0.1:3000/

Kamal をインストールする。

gem install kamal
kamal init --bundle

config/deploy.yml

service: hello
image: usutani/hello
servers:
  - SERVER_ADDRESS
registry:
  username: usutani
  password:
    - KAMAL_REGISTRY_PASSWORD
env:
  secret:
    - RAILS_MASTER_KEY
ssh:
  user: ubuntu
volumes:
  - "./hello-storage:/rails/storage"

.env

Docker Hub のアクセストークンを KAMAL_REGISTRY_PASSWORD に設定する。
master.key の内容を RAILS_MASTER_KEY に設定する。

cat config/master.key | pbcopy
KAMAL_REGISTRY_PASSWORD=...
RAILS_MASTER_KEY=...
kamal setup
open http://SERVER_ADDRESS/up
open http://SERVER_ADDRESS/posts

Cloudflare Tunnel

hello.DOMAINNAME
HTTP
SERVER_ADDRESS

open http://hello.DOMAINNAME/posts
リダイレクト=> https://hello.DOMAINNAME/posts

以上です。

この記事が気に入ったらサポートをしてみませんか?