Redmine 2.5からRedmine 4.2へアップグレードする

社内からの要望でRedmineをアップグレードすることになりました。

使っていたのはRedmine 2.5。これを新しいものにアップグレードします。

# どうやってすればいいのか

Redmineのインストールには若干苦手意識があったのですが、調べてみるとRedmine 1からRedemine 4にアップグレードをしている人がいました。

https://hikari-blog.com/redmine-upgrade/

言われてみればそうだなと思ったのですが、Railsで組まれているのでマイグレーションしていけば最新版になるはずです。
正直アップグレード方法はこれでOKですので、この通り進めます。
ということで、これをもとにRedemine 4とRedmine 5の試用環境を作って、どちらが良いかを社内の人に決めてもらうことにしました。
試用環境はアップグレード手順の検証にも使えるので添付ファイル以外は移行して操作感を比べてもらうことにしました。

# 構成

最終的にRedmine 4.2に移行することにしました。
理由はいくつかありますが、大きくは以下の3つです。

- Redmine 5がリリースして間もなかったこと。
- Redmine 2.5で使っているプラグインの多くがRedmine 5で使えないこと。（Redmine 4では比較的動く）
- Redmine 4とRedmine 5で操作感にさほど違いがなく、旧環境で使っているプラグインが多く動く方を選択した。

この内、sidebar hideというプラグインについては、社内からの要望も大きそうだったのと、簡単に対応できそうだったので、まっとうなやり方かどうかはおいておいて、対応してみました。

https://gitlab.com/bdemirkir/sidebar_hide/-/merge_requests/52

本家の開発が結構前から止まっているみたいなので、マージされるかどうかは謎なところです。

と思ったのですが、後で調べたらすでに対応している人がいました。。。

https://github.com/nanego/redmine_hide_sidebar

データと添付ファイルは古いものから持ってくるのですが、結局動かすのはRedmine 4や5なので、それが動く環境を用意しなくてはいけません。
構成はRocky Linux 8、Apache 2.4、[Ruby Env](https://github.com/rbenv/rbenv)、[Phusion Passenger](https://www.phusionpassenger.com/)、MySQL 8。
Redmine的にはMySQL 5.7までの対応なのですが、問題なく使えるみたいです。

# インストール

構成のインストールに関しては[本家のインストール方法](https://www.redmine.org/projects/redmine/wiki/redmineinstall)を参考に、分からないところは適時ググってという感じです。
ApacheとPassengerの組み合わせではhttpd-devel、Railsのmysql2でエラーになるならmysql-develをインストールすれば解決できます。

以下は、個人的に新規インストールの検証をしたときのコマンドのログです。参考までに。
ちなみにnginx+unicornという組み合わせも考えたのですが、なにやら設定を記述が面倒そうなので、諦めました。

```
dnf install httpd httpd-devel mysql mysql-devel
git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
source ~/.bash_profile
type rbenv
git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
rbenv install 3.1.2
rbenv global 3.1.2
rbenv rehash
chmod o+x /root/ .rbenv/
rbenv init
source ~/.bash_profile
curl -fsSL https://github.com/rbenv/rbenv-installer/raw/main/bin/rbenv-doctor | bash
gem install bundler
rbenv exec gem install bundler -N
cd /var/www/
wget https://www.redmine.org/releases/redmine-5.0.0.tar.gz
tar xzvf redmine-5.0.0.tar.gz
cp /var/www/redmine-5.0.0/config/database.yml.example /var/www/redmine/config/database.yml
vi /var/www/redmine-5.0.0/config/database.yml
cp /var/www/redmine-5.0.0/config/configuration.yml.example /var/www/redmine/config/configuration.yml
vi /var/www/redmine-5.0.0/config/configuration.yml
cd /var/www/redmine-5.0.0/
bundle exec rake generate_secret_token
cd /var/www/
chown -R webmaster:webmaster /var/www
cp /var/www/redmine-5.0.0/public/htaccess.fcgi.example /var/www/redmine-5.0.0/public/.htaccess
gem install passenger
passenger-install-apache2-module
vi /etc/httpd/conf.d/00-passenger.conf
vi /etc/httpd/conf.d/vhost_01-redmine500.local.tom-gs.com.conf
apachectl configtest
apachectl restart
cd redmine-5.0.0/
RAILS_ENV=production bundle exec rake db:migrate
bundle install --without development test
apachectl restart
vi public/.htaccess
reboot
```

```/etc/httpd/conf.d/00-passenger.conf
LoadModule passenger_module /root/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/passenger-6.0.13/buildout/apache2/mod_passenger.so
<IfModule mod_passenger.c>
  PassengerRoot /root/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0/gems/passenger-6.0.13
  PassengerDefaultRuby /root/.rbenv/versions/3.1.2/bin/ruby
</IfModule>
```

```/etc/httpd/conf.d/vhost_01-redmine500.local.tom-gs.com.conf
<VirtualHost *:80>
    ServerAdmin test@localhost
    DocumentRoot /var/www/redmine-5.0.0/public
    ServerName redmine500.local.tom-gs.com
</VirtualHost>
```

```/var/www/redmine-5.0.0/public/.htaccess
# 以下をコメントアウト
#RewriteRule ^$ index.html [QSA]
#RewriteRule ^([^.]+)$ $1.html [QSA]
#RewriteCond %{REQUEST_FILENAME} !-f
```

# 移行

移行当日までに、添付ファイルを新しいサーバーの領域（NFSにしました）にrsyncしておきます。
メンテナンス日を社内に告知。結局休日部下と出社して対応しました。
メンテナンス当日にApacheの設定でアクセスをシャットアウトして、再度rsyncして差分アップデート（添付ファイルの移行時間の短縮）、DBデータのダンプとリストア、マイグレーションの実行を実施しました。

最後にDNSやロードバランサーの向き先の設定を変更。1ヶ月後に旧環境はバックアップして撤去しました。

# 今後

数年後にまたアップグレードしてほしいと言われたときは、使えるプラグインは減っているんだろうなぁと思いました。
その時は流石に色々諦めてもらうものもあるかなと思いました。