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
以上です。
この記事が気に入ったらサポートをしてみませんか?