Docker でインストールした Redmine 3.3.0 を 4.2.1 にアップグレードする

パートタイムで働いている会社で開発チームが使用しているRedmineがあるんですが、5年前に新システムをリリースした当時の開発責任者がインストールして以来全くメンテナンスされていなくてめちゃくちゃ古いんですね。バージョンは3.3.0。3.3.0にはセキュリティの問題があり、3.3系の最新バージョンか、4.0以上の最新バージョンへのアップグレードが推奨されているのですが、なにしろインストール当時の情報が何一つ残されていないので歴代の担当者が手を付けずにいました。特定のIPアドレスからしかアクセス出来ないからセキュリティリスクが問題になる可能性は低いという判断もあったんでしょうけど。


そんなに複雑なことはしていないから良いとは言え、API周りとかいろいろと不都合なこともあったので、次の仕事の開発環境がDockerになることだしDockerに慣れるためにも、退職までの間に最新バージョンにアップグレードしておくか!ということで業務外でやってみました。いろいろ大変なこともあったけど、手順としては上手くまとまったのでメモ代わりに書いておきます。今どき、3.3系からのアップグレード情報に需要があるかどうかは知りませんが。






前提条件

  • Redmineのバージョンは3.3.0
  • リポジトリはsameersbn/redmine
  • docker-compose.ymlやDockerfileは使用していない
  • AWS EC2
  • MySQL


起動コマンド

起動コマンドは以下の通り。

$ docker run --name=redmine -d  -p 10088:80 --env-file=~/docker/redmine.conf -v /mnt/data/redmine:/home/redmine/data sameersbn/redmine:3.3.0

  • 設定ファイル「redmine.conf」を読み込ませる(configure.ymlを外からコピー……とかではない)
  • ホスト側がマウントしているストレージ(EBS)をRedmineのストレージとしてマウント

設定ファイル「redmine.conf」

REDMINE_PORT=10088
DB_TYPE=mysql
DB_HOST=*.*.*.*
DB_NAME=redmine
DB_USER=user
DB_PASS=pass
SMTP_USER=admin@hoge.net
SMTP_PASS=password



アップグレード方法

基本的なアップグレード手順は、sameersbn/redmine のREADME.mdに書いてあります。


Upgrading
To upgrade to newer redmine releases, simply follow this 4 step upgrade procedure.

Step 1: Update the docker image.

docker pull sameersbn/redmine:4.2.1

Step 2: Stop and remove the currently running image
docker stop redmine
docker rm redmine

Step 3: Create a backup
docker run --name redmine -it --rm [OPTIONS] \
   sameersbn/redmine:x.x.x app:backup:create

Replace x.x.x with the version you are upgrading from. For example, if you are upgrading from version 2.6.4, set x.x.x to 2.6.4

Step 4: Start the image
docker run --name=redmine -d [OPTIONS] sameersbn/redmine:4.2.1

sameersbn/docker-redmine: Docker Image for Redmine


基本的にはこの通りにやれば終わります。特にバックアップが超簡単でかつレストアも簡単なので、気軽に試せると思います。

以下では、僕の環境で引っかかった部分を列記します。



アップグレードの際に生じた問題

非対応のプラグインがあると起動しなくなる

まず最初に躓いたのはこれでした。インストールされていて実際に使用されていたプラグインは3つしか無かったのですが、プラグインのアップグレードが上手くいきませんでした。幸い、UIをカスタマイズする的なシンプルなものばかりだったので、アップグレード前に一旦すべてアンインストールした上でアップグレード後に必要なものだけを再インストールして対応しました。

プラグインのアンインストール手順

Redmineに入る

$ docker exec -it redmine bash

プラグインのアンインストール

# bundle exec rake redmine:plugins:migrate NAME=redmine_agile VERSION=0 RAILS_ENV=production
# rm -rf plugins/redmine_agile
# rm -rf ../data/plugins/redmine_agile
# exit

キャッシュを削除するためにコンテナを作り直し

$ docker stop redmine
$ docker rm redmine
$ docker run --name=redmine -d  -p 10088:80 --env-file=~/docker/redmine.conf -v /mnt/data/redmine:/home/redmine/data sameersbn/redmine:3.3.0


ファイルが上手く削除出来なかったので2回削除していますが、どちらか片方でも良かったかも知れません(未検証)。


プラグインのインストール手順

Redmineに入る

$ docker exec -it redmine bash

プラグインをインストール

# cd plugins
# git clone git://github.com/suer/redmine_enter_cancel.git
# exit

Redmineを再起動

$ docker restart redmine



docker pullに失敗する

Rubyのバージョンが古い

Redmineを動かす環境はコンテナの中にあるのだから、ホストのRubyバージョンが古くても別に良いんじゃねと思っていたんですけど、あまりに古いとDockerコマンド自体が失敗するようで……調べてみたら驚きの2.0.0でした。

$ ruby -v
ruby 2.0.0p648 (2015-12-16) [x86_64-linux]

yumでインストールしようとしましたが、微妙にバージョンが古い(2.4まで)ので止めて、ちょっと遠回りになりますがrbenvをインストールしてからそこでバージョン管理をする形で最新バージョンを入れました。詳細情報はここを参考にしています。

CentOSにrbenv, Rubyをインストールする – Qiita

最終的な部分はこんな感じ。

# インストールできるrubyのバージョンを確認
$ rbenv install --list

# rubyインストール
$ rbenv install 2.7.3

# 切り替え可能なrubyのバージョンを確認
$ rbenv versions

# rubyのバージョンを切り替え
$ rbenv global 2.7.3

# rubyのバージョンが切り替わったことを確認
$ ruby -v


「rbenv install 2.7.3」の部分で「止まった?」と思うほど時間が掛かりましたが、15分ぐらいで無事インストール完了。その後バージョンを切り替えて終わり。簡単ですね。


EC2の容量が足りない

Rubyのバージョンを上げたことでエラーメッセージが変わりました。どうやらストレージが足りてない。

調べてみると使用してないimageやらコンテナやら古いバックアップファイルやらがかなり圧迫しているようなので(残り容量0%)、使用しているもの以外はすべて削除しました。「sameersbn/redmine:4.2.1」のpullが終了したあとに確認したところ、150MBほど使用していたのでそれぐらい空いていれば大丈夫そうです。



問題が起きたときの復旧方法(レストア)

アップグレードの際に以下のコマンドでバックアップを作成したと思います。


$ docker run --name=redmine -d -p 10088:80 --env-file=/home/webuser/work/docker/redmine.conf -v /mnt/data/redmine:/home/redmine/data sameersbn/redmine:4.2.1 app:backup:create


なにか問題があって起動しなくなった、解決まで時間が掛かりそうなのでとりあえず巻き戻しておきたい。そんなときは、このバックアップを読み込みつつ旧バージョンのimageで起動すれば大丈夫です。


$ docker stop redmine
$ docker rm redmine
$ docker run --name redmine -it --rm -p 10088:80 --env-file=/home/webuser/work/docker/redmine.conf -v /mnt/data/redmine:/home/redmine/data sameersbn/redmine:3.3.0 app:backup:restore


その後バックアップファイルを指定すると復旧処理が行われ、バックアップを作成した状態でRedmineが立ち上がります。素敵すぎ。これだけでも「sameersbn/redmine」リポジトリを使う意味があります。



今後の課題

マイナーアップグレードの場合には、プラグインの対応を待ってからプラグインのアップグレード → Redmine本体のアップグレードという順にやれば問題なくいけるはずです。メジャーアップグレードの場合は、今回のようにプラグインの対応がない場合もあるので、プラグインひとつひとつに関して、アップグレード、削除、再インストールから対応を選ぶ必要がありそうです。僕が触った環境においては今後プラグインを増やす予定はない(と思う)ので、どういう対応をしても特に問題はないとは思いますが。


できればdocker-compose.ymlがあって欲しい

今回のアップグレードで一番苦労したことは、どういう環境で動いているのかが非常にわかりにくかったことでした。最終的にはRedmineに入って設定ファイルを調べていろいろ把握出来たのですが、出来ればdocker-composeを入れてdocker-compose.ymlを読み込むようにしておいて欲しかったなというのが率直な感想です。もしかすると導入当時は一般的ではなかったのかも知れませんが、最近のインストール情報ではdocker-compose.ymlは必須になってそうなので。仮に個人的にDockerを利用することがあったときには、まずdocker-compose.ymlを書くところから始めたいですね。

てか、今、プライベートな開発環境はすべてVagrantにしてるんですけど(現職の開発環境のノウハウを応用したので)、Dockerの導入・管理がこんなに簡単ならもう全部Dockerに切り替えてしまいたい……言うほど簡単じゃないってことはわかってますけど、せめてローカル開発環境だけでもDockerに出来ないかなあ。今はWindows10でもサクサク動きますし、もし機会があれば調べてみたいと思います。どうせ次の仕事では開発チームが作成したDockerをローカルに入れて開発を行うことになると思うので、そのノウハウなんかも学べれば。



以上、超古いRedmineをなんとか最新バージョンにしたという話でした。無事終わって良かった。