KamalでRedmineをデプロイする
この記事は Redmine Advent Calendar 2024 の17日目です。
はじめに
エンジニアとして、今年の夏からRedmineのプラグイン開発に関わっています。
プロジェクト管理ツールはいろいろと使ったことがありましたが、Redmineは未経験でした。 Redmineを使いこなすために、自分用のRedmineを立ち上げたいと思い、Kamalを使ってデプロイしました。 この記事ではその手順を紹介します。
また、Rails 8からKamalがデフォルトのデプロイツールになったということで、試してみようと思いました。
Kamalとは
Kamalは37signalsが開発した、Dockerコンテナを利用してアプリケーションをデプロイするツールです。 Railsのデプロイツールとして有名なCapistranoのDockerコンテナ版といった位置づけになります。
特長
Kamalの特長は以下の通りです。
- Dockerがインストール可能なUbuntuサーバであれば、どこにでもデプロイ可能
- Railsアプリケーションだけでなく、Dockerベースのアプリケーションに対応
- Blue/Greenデプロイメントによるダウンタイムなしのデプロイ(Kamal Proxyを利用)
デプロイ設定は簡単で、YAMLファイルにアプリケーションの設定内容とデプロイ先サーバのIPアドレスを記載するだけで、DockerインストールからSSL証明書の設定まで自動化されます。
デプロイ手順
今回の構成は以下の通りです。
- VPS: Ubuntu 20.04.6 LTS、512MB RAM/1 Core CPU
- Redmine Version: 6.0.1.stable
- Database: PostgreSQL 17.2
- Kamal Version: 2.4.0
詳細なコードは こちら にあります。
VPSの設定
ConoHaの安いプランでVPSをレンタルしました。公開鍵認証を利用するため、サーバ構築前にSSHキーを登録し、サーバ構築時にそのキーを紐づけます。
また、ConoHaの「セキュリティグループ」で以下のポートを許可しました。
- 22 (SSH)
- 80 (HTTP)
- 443 (HTTPS)
Dockerは未インストールでも、Kamalのセットアップ時に自動でインストールされます。
DNSの設定
ムームードメインで取得済みのドメインを利用し、サブドメインをVPSのIPアドレスに紐づけました。
Docker Hubの設定
Kamalのデプロイにはコンテナレジストリが必要です。今回はDocker Hubを利用しました。無料プランではプライベートリポジトリを1つ使用可能です。 「Read/Write」を許可するアクセストークンを取得しました。
Dockerアプリの用意
こちら のDockerfileを基にRedmine 6系のイメージを構築しました。プラグインもDockerイメージに組み込んでいます。
Kamalのインストール
Rubyをメインで使用しているため、以下のコマンドでKamalをインストールしました。他のインストール方法は公式ドキュメントに記載されています。
$ gem install kamal
初期設定ファイルを生成します。
$ kamal init
Kamalセットアップ
config/deploy.yml
に以下のように設定を記述しました。最終的なコードは こちら にあります。
Proxy設定
proxy:
ssl: true
host: redmine.uchinokot.com
app_port: 3000
healthcheck:
path: /login
app_port
はRailsアプリがポート3000で動作しているため、それに合わせています。
healthcheck
は /up
デフォルトなのですが、Redmineに標準で存在する /login
を指定しています。
データベース設定
accessories:
db:
image: postgres:17.2
host: 160.251.184.187
env:
clear:
POSTGRES_USER: app_user
POSTGRES_DB: redmine_production
secret:
- POSTGRES_PASSWORD
directories:
- data:/var/lib/postgresql/data
PostgreSQLを使用し、データの永続化には directories
を指定しました。
volumes
を使ってもデータの永続化ができるのですが、 directories
はボリュームをマウントする前にホスト上にディレクトリを作成してくれます。
環境変数
環境変数は .kamal/secrets で管理しています。
.env
経由でセットされるようにしているので、各種パスワードを以下のように設定してください。
KAMAL_REGISTRY_PASSWORD=Docker Hubで取得したパスワード
POSTGRES_PASSWORD=任意のDBパスワード
デプロイ実行
設定が完了したら、以下のコマンドでVPSのセットアップとデプロイを実行します。
$ kamal setup
その後のデプロイは次のコマンドで行えます。
$ kamal deploy
デプロイしたRedmineは https://redmine.uchinokot.com/ で動作しています。
おわりに
Dockerが動く環境であればどこにでもデプロイできるKamalはとても便利でした。 今回はシンプルな構成で試しましたが、Capistranoのように宣言的に書いていく設定なので分かりやすいと感じました。
余談ですが、「Kamal」は名前の由来が良いですよね。
Kamal is named after the ancient Arab navigational tool used by sailors to keep course by determining their latitude via the Pole Star.
自作ツールをつくって、こんな名前を付けてみたいなと思います。