コンテナ上のRedmineをアップデートする①の続きになります。
アップデートおよびhttps化の流れ
このブログでは下記太字の部分を紹介します。(①②は前回の記事をご確認ください。)
①Redmineの構成紹介と新旧のバージョン比較
②旧バージョンの構築
③新バージョンにアップデート
④https化
③新バージョンにアップデート
続いて新バージョンにアップデートしていきます。アップデートにあたって、アップデート後のバージョンのイメージを用意します。
イメージの用意方法については②で紹介しているため、割愛します。
この後の作業の大まかな流れとしては下記になります。
③-0 アップデート前の状態確認
③-1 アップデート前の保険
③-2 新しいバージョンでコンテナを起動
③-3 アップデート後の状態確認
③-0 アップデート前の状態確認
下記のように事前にテスト用のプロジェクト及びチケットを作成いたしました。一部のチケットには、写真(情報画面)を添付しています。


とても簡易的でありますが、上記のプロジェクトやチケット、添付した写真がアップデート後にも確認ができるのかといった点を確認観点にしようと思います。
③-1 アップデート前の保険
アップデート前の保険として、仮想マシンのスナップショットを行います。
今回はスナップショットを取得する時間帯は、データベースへの書き込みなどが発生していないと仮定し、活性状態のままスナップショットを取得します。(書き込み途中のデータを完全に防ぎたい場合は事前に停止が安全です。)
下記コマンドでもスナップショットを取得できているか確認できます。
virsh snapshot-list <仮想マシン名>
③-2 新しいバージョンでコンテナを起動
新しいバージョンでのコンテナ起動を行うにあたり、既存のコンテナを停止し削除します。
停止は下記でpodそのものを停止させることで、podに紐づくコンテナを一度に停止できます。
podman pod stop <pod名>
停止させた後は、下記コマンドで削除しますが、これもpodそのものを削除することで、コンテナも一度に削除できます。
podman pod rm <pod名>
削除した後は、②の手順で紹介した用にpodの起動→コンテナの起動を行っていきます。当然ですが、指定するイメージはアップデート後のバージョンです。
# pod作成
# podman pod create --name redmine-pod -p 8080:80 -p 8443:443
# データベースコンテナ作成
# podman run -d \
--name redmine-db \
--pod redmine-pod \
-e MYSQL_ROOT_PASSWORD=<password> \
-e MYSQL_DATABASE=<database_name> \
-e MYSQL_USER=<user_name> \
-e MYSQL_PASSWORD=<PASSWORD> \
-v $(pwd)/redmine/db/my.cnf:/etc/mysql/conf.d/my.cnf:Z \
-v redmine-db-data:/var/lib/mysql \
mysql:8.1
# redmineコンテナ作成
podman run -d \
--pod redmine-pod \
--name redmine-app \
-e REDMINE_DB_MYSQL=<dbcontainer_name> \
-e REDMINE_DB_DATABASE=<datebase_name> \
-e REDMINE_DB_USERNAME=<user_name> \
-e REDMINE_DB_PASSWORD=<PASSWORD> \
-v redmine-app-data:/usr/src/redmine/file \
redmine:6.0.9
# apacheコンテナ作成
podman run -d \
--pod redmine-pod \
--name redmine-apache \
-v $(pwd)/redmine/apache/httpd.conf:/usr/local/apache2/conf/httpd.conf:ro,Z \
-v $(pwd)/redmine/apache/conf.d:/usr/local/apache2/conf/conf.d:Z \
httpd:2.4.66
#プラグイン反映
#podman exec -it redmine-app \
bundle exec rake db:migrate RAILS_ENV=production
#podman exec -it redmine-app \
bundle exec rake redmine:plugins:migrate RAILS_ENV=production
③-3 アップデート後の状態確認
ここまでできたら、実際にアクセスして確認します。
管理タブの情報において、redmineのバージョンがアップされていることを確認できました。

また、テスト用のプロジェクトがそのまま残っており、添付した写真も残っていることを確認できました。


その他新しいプロジェクト・チケットの作成、写真の添付を試しましたが、動作に問題はありませんでした。
④https化
最後にhttps化を行います。
このの作業の大まかな流れとしては下記になります。
④-0 秘密鍵、証明書ファイルの作成
④-1 apacheのhttps用設定ファイルを作成
④-2 秘密鍵、証明書ファイル、設定ファイルの配置
④-3 再起動
④-4 接続確認
④-0 秘密鍵、証明書ファイルの作成
今回は自己署名証明書を作成します。
# openssl req -x509 -nodes -days 365 \ #-x509:自分で署名,-nodes:パスワードなしで秘密鍵を作成,-days:有効期限
-newkey rsa:2048 \ #新しい鍵を作成
-keyout ./certs/server.key \ #秘密鍵ファイル
-out ./certs/server.crt #証明書ファイル
**④-1 apacheのhttps用設定ファイルを作成 **
以下のような設定ファイルを作成します。
LoadModule ssl_module modules/mod_ssl.so
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
Listen 443
<VirtualHost *:443>
ServerName <servername>
SSLEngine on
SSLCertificateFile /certs/server.crt
SSLCertificateKeyFile /certs/server.key
ProxyPreserveHost On
ProxyPass / http://localhost:3000/ #podだと直接コンテナのホスト名やIPアドレスを指定しなくてもlocalhostで指定できる
ProxyPassReverse / http://localhost:3000/
</VirtualHost>
**④-2 秘密鍵、証明書ファイル、設定ファイルの配置 **
今回ローカルの方にディレクトリを作成、そこに秘密鍵、証明書ファイルを格納して、バインドマウントしようと思います。設定ファイルも同様です。
④-3 再起動
配置できたら、一旦apacheコンテナを停止・削除して、以下のコマンドでもう一度起動します。
podman run -d \
--pod redmine-pod \
--name redmine-apache \
-v $(pwd)/redmine/apache/httpd.conf:/usr/local/apache2/conf/httpd.conf:ro,Z \
-v $(pwd)/redmine/apache/conf.d:/usr/local/apache2/conf/conf.d:Z \
-v $(pwd)/redmine/apache/certs:/certs:Z \
httpd:2.4.66
④-4 接続確認
https://コンテナサーバのIPアドレス:8443にアクセスできるか確認します。
自己署名証明書であるため警告がでますが、接続確認ができました。

以上でアップデートとhttps化は終了です。
あとがき
今回バージョンアップをして思ったのは、ボリュームの偉大さです。ボリュームがなければ、コンテナを削除したらそのままデータは消えてしまい、戻しの手順が発生します。
逆に言うと、②の旧バージョンの構築で適切なボリューム設計をしていればデータを失うことなくバージョンアップ後も利用することができます。
もしボリュームの設計が適切に行われていない場合に備えて、今回行わなかったデータベースのバックアップをmysqldumpコマンドを使って行うなどやっておいた方がいいかなと思いました。
またもう少し調べると現在使っているプラグインがバージョンアップ後だと使用できないリスクもあるため、そういった点も考慮する必要があると認識しました。
