手当たり次第に書くんだ

飽きっぽいのは本能

Podman Redmine 構築

目次に戻る

Overview

Podman を使用して Redmine を構築します。必要なコンテナイメージは、MySQL, Redmine, Nginx です。今回は全て Docker Hub の正式なコンテナイメージを使用します。ポイントは TLS 化です。Redmine コンテナの Web サーバーで使用される rails server は、TLS 化に積極的ではないようで、あまり情報が多くありません。rails server を TLS 化するために、https-portal を利用するケースが事例として多いですが、何となく仕組みが中途半端な気がするので、今回は Nginx をフロントに置き、リバースプロキシで Redmine を公開するようにします。また、通常のサービスと同様に systemd でコンテナを管理するために sudo で作業します(具体的には他のサービスと同じ扱いにするためというニュアンスです)。

Pod

最初に Pod を作成します。今回は 10000 ポート Nginx (外部に公開するコンテナ) に割り当てます。

myadmin@ubuntu:~$ sudo podman pod create -n redmine-pod -p 10000:10000
myadmin@ubuntu:~$ sudo podman pod ls
POD ID NAME STATUS CREATED INFRA ID # OF CONTAINERS
e38e7f09dafd redmine-pod Created 6 seconds ago 5226a23ff4ad 1

MySQL

MySQL コンテナを作成します。

Volume

今回、MySQL コンテナに対して以下の 2 つの Volume を割り当てます。

redmine-mysql-db
MySQL のデータベースを格納します。
redmine-mysql-conf.d
MySQL の設定ファイルを格納します。

redmine-mysql-conf.d は事前に設定ファイルを格納しておく必要があるため、事前に Volume の作成が必要ですが、redmine-mysql-db についてはコンテナの生成時に自動生成されるため、このタイミングでの作成は必須ではありません(コンテナの移行等ではデータの移行のために事前作成が必要となります)。

myadmin@ubuntu:~$ sudo podman volume create redmine-mysql-db
myadmin@ubuntu:~$ sudo podman volume create redmine-mysql-conf.d
myadmin@ubuntu:~$ sudo podman volume ls

文字コード

Redmine は使用するデータベースの文字コードの指定があるようなので、下記の通り設定します。これは MySQL コンテナの起動時に読み込まれます。

myadmin@ubuntu:~$ sudo tee /var/lib/containers/storage/volumes/redmine-mysql-conf.d/_data/multibyte.cnf <<"EOF"
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci
EOF

コンテナの実行

MySQL コンテナを実行します。

myadmin@ubuntu:~$ sudo podman run -d --pod redmine-pod --name redmine-mysql \
--env='TZ=Asia/Tokyo' \
--env='MYSQL_ROOT_PASSWORD=password' \
--env='MYSQL_USER=redmine' \
--env='MYSQL_PASSWORD=password' \
--env='MYSQL_DATABASE=redmine' \
-v redmine-mysql-db:/var/lib/mysql \
-v redmine-mysql-conf.d:/etc/mysql/conf.d \
docker.io/library/mysql
myadmin@ubuntu:~$ sudo podman ps

コンテナのシェルを起動します。

myadmin@ubuntu:~$ sudo podman exec -it redmine-mysql bash

MySQL にログインし、デフォルトの文字セットの確認、redmine ユーザーの確認、redmine データベースの情報を確認しています。

bash-4.4# mysql -u root -p
mysql> show variables like '%char%';
+--------------------------+--------------------------------+
| Variable_name | Value |
+--------------------------+--------------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | utf8mb4 |
| character_set_filesystem | binary |
| character_set_results | latin1 |
| character_set_server | utf8mb4 |
| character_set_system | utf8mb3 |
| character_sets_dir | /usr/share/mysql-8.0/charsets/ |
+--------------------------+--------------------------------+
8 rows in set (0.01 sec)
mysql> select user,host,plugin from mysql.user;
+------------------+-----------+-----------------------+
| user | host | plugin |
+------------------+-----------+-----------------------+
| redmine | % | caching_sha2_password |
| root | % | caching_sha2_password |
| mysql.infoschema | localhost | caching_sha2_password |
| mysql.session | localhost | caching_sha2_password |
| mysql.sys | localhost | caching_sha2_password |
| root | localhost | caching_sha2_password |
+------------------+-----------+-----------------------+
6 rows in set (0.00 sec)
mysql> show create database redmine;
+----------+-----------------------------------------------------------------------------------------------------------------------------------+
| Database | Create Database |
+----------+-----------------------------------------------------------------------------------------------------------------------------------+
| redmine | CREATE DATABASE `redmine` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci */ /*!80016 DEFAULT ENCRYPTION='N' */ |
+----------+-----------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> exit
bash-4.4# exit

Redmine

Redmine コンテナを作成します。

Volume

Remine のデータ(本稿では Redmine アップロードしたファイル)を永続化するために、コンテナからマウントする Volume を作成します。コンテナの生成時にも自動生成されるため、このタイミングでの作成は必須ではありません。

myadmin@ubuntu:~$ sudo podman volume create redmine-files
myadmin@ubuntu:~$ sudo podman volume ls

コンテナの実行

Redmine コンテナを実行します。

myadmin@ubuntu:~$ sudo podman run -d --pod redmine-pod --name redmine \
--env='TZ=Asia/Tokyo' \
--env='REDMINE_DB_MYSQL=127.0.0.1' \
--env='REDMINE_DB_USERNAME=redmine' \
--env='REDMINE_DB_PASSWORD=password' \
-v redmine-files:/usr/src/redmine/files \
docker.io/library/redmine
myadmin@ubuntu:~$ sudo podman ps

Nginx

Nginx コンテナを作成します。

Volume

Nginx の設定ファイルと TLS 証明書を Nginx に読み込ませるため、コンテナからマウントする Volume を作成します。コンテナの生成時にも自動生成されるため、このタイミングでの作成は必須ではありません。

myadmin@ubuntu:~$ sudo podman volume create redmine-nginx-conf.d
myadmin@ubuntu:~$ sudo podman volume ls

設定ファイルと TLS 証明書の配置

TLS 証明書を配置( TLS 証明書の作成はこちらを参照)して、Nginx の設定ファイルを作成しています。本稿での Nginx はリバースプロキシとして使用します。http://127.0.0.1:3000 は Redmine コンテナのポート番号です。

myadmin@ubuntu:~$ sudo cp /home/myadmin/work/easy-rsa/pki/issued/si1230.com.crt /var/lib/containers/storage/volumes/redmine-nginx-conf.d/_data
myadmin@ubuntu:~$ sudo cp /home/myadmin/work/easy-rsa/pki/private/si1230.com.key /var/lib/containers/storage/volumes/redmine-nginx-conf.d/_data
myadmin@ubuntu:~$ sudo tee /var/lib/containers/storage/volumes/redmine-nginx-conf.d/_data/proxy.conf <<"EOF"
server {
listen 10000 ssl;
server_name redmine.si1230.com;
ssl_certificate /etc/nginx/conf.d/si1230.com.crt;
ssl_certificate_key /etc/nginx/conf.d/si1230.com.key;
location / {
proxy_pass http://127.0.0.1:3000;
}
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
}
EOF

コンテナの実行

Nginx コンテナを実行します。

myadmin@ubuntu:~$ sudo podman run -d --pod redmine-pod --name redmine-nginx \
--env='TZ=Asia/Tokyo' \
-v redmine-nginx-conf.d:/etc/nginx/conf.d \
docker.io/library/nginx
myadmin@ubuntu:~$ sudo podman ps

Redmine へのアクセス確認

以下で Redmine にアクセスできます。初回ログインは admin/admin です。TLS のため、FQDN でアクセスすべき(ブラウザで警告が出るため)ですが、IP アドレスでも問題はありません。

https://redmine.si1230.com:10000

systemd

Podman は、コンテナを管理するための systemd ユニットファイルを生成することができます。

systemd ユニットファイル

systemd ユニットファイルを生成します。コマンドオプションはいくつかありますが、通常は以下で十分でしょう。

myadmin@ubuntu:~$ cd /etc/systemd/system
myadmin@ubuntu:~$ sudo podman generate systemd -f -n redmine-pod
/etc/systemd/system/pod-redmine-pod.service
/etc/systemd/system/container-redmine.service
/etc/systemd/system/container-redmine-mysql.service
/etc/systemd/system/container-redmine-nginx.service
--files, -f
--files または -f フラグを使用すると、標準出力ではなくファイルが生成されます。生成されたファイルの名前は、{container,pod}-{ID,name}.service となり、現在の作業ディレクトリに配置されます。
--name, -n
--name または -n フラグを使用すると、ユニットファイルの開始、停止、説明にコンテナの名前が使用されます。

上記のオプション以外に、--restart-policy を設定しているケースもよくありますが、それを指定しない場合のデフォルト値は on-failure です。on-failure はプロセスが異常終了した場合にプロセスを再起動するための設定であり、apt でインストールするサービスのデフォルト値でもあります。これは Podman の設定ではなく、Systemd の設定値になるため、Systemd のマニュアルを参照すると良いでしょう。

systemd ユニットファイルの有効化

systemd を再起動して、追加したユニットファイルを読み込みます。

myadmin@ubuntu:~$ sudo systemctl daemon-reload

systemd を使用した Podman の操作

systemd から redmine-pod を操作してみます。systemd コマンドは一般的な内容であるため説明は省略します。尚、初回は systemd では起動していない状態ですが、実際はこれまでの作業で起動している状態です。sudo podman ps コマンドでも並行して確認すると良いでしょう。

myadmin@ubuntu:~$ sudo systemctl status pod-redmine-pod.service
myadmin@ubuntu:~$ sudo systemctl start pod-redmine-pod.service
myadmin@ubuntu:~$ sudo systemctl stop pod-redmine-pod.service
myadmin@ubuntu:~$ sudo systemctl restart pod-redmine-pod.service

systemd の自動起動設定

システム起動時に redmine-pod が起動するように systemd を設定します。

myadmin@ubuntu:~$ sudo systemctl enable pod-redmine-pod.service
myadmin@ubuntu:~$ sudo systemctl is-enabled pod-redmine-pod.service
enabled

参考資料

https://yuyublog.org/2021/08/09/post-2632/
目次に戻る

Podman Redmine 構築

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

トップへ戻る