redmineのアップデート3.1から4.2

ダメ元でやってみようと思ってやってみたらできた｡笑

（当初は､【STEP1】マイナー更新（3.4.x）【STEP2】メジャーの一番古いのに更新(4.0.x)【STEP3】メジャー最新(4.2.x)に順次更新していけるところまでいってみようと考えてましたが､Redmine､Ruby､Railsの関係とかややこしかったので面倒になりました｡幸運でした｡)

# 環境（移行元､移行先）

| # | 移行元 | 移行先 |
|:-|:-|:-|
| Redmine  | 3.1.0  | 4.2.2  |
| Ruby  | 2.0.0  | 2.7.4  |
| Rails  | 4.2.3   | 5.2.6  |
| Webサーバ | Apache2.4 | Apache2.4 |
| Appサーバ | passenger 5.0.30 | Unicorn 6.0.0 |
| OS  | Amazon Linux2(x86_64)  | Amazon Linux2(ARM64)  |
| DB  | RDS/MySQL8.0  | RDS/MySQL8.0 |

※プラグインは､[view_customize](https://github.com/onozaty/redmine-view-customize)のみ
※Themeは､[bleuclair](https://github.com/farend/redmine_theme_farend_bleuclair/blob/master/README.ja.md)
※【追記】さほど期待してなかったのですが､かなり高速になって喜んでもらってます｡（体感では､チケット更新の時間が3秒から0.5秒くらい）｡PassengerとUnicornはそんな違いが出るものではない（マイクロ秒の世界）といいますし､Rubyの性能向上はRailsのような巨大フレームワークでは体感できるレベルではないといいますし､システム（CPUがIntelからARM/Gravion)の性能向上はAWSの説明では40%といいますし､データベースは同じです｡するとRedmineの実装が最適化された?

# 謝辞

以下の記事にとてもお世話になりました｡感謝です
一部読み替え（サブディレクトリアクセスでなくドメインルートでアクセス）がありましたが､ほぼコピペでできました｡

[Amazon Linux 2でRedmineを立ち上げる方法 | 森林ソフト](https://forest-soft.xyz/blog/detail?id=30)

# 手順

## Apacheインストール

省略

## MySQLインストール

省略

## データベースバックアップ（複製）

当方は､ダンプ取得して､それを同じDBサーバ上の違うデータベースにリストアしました｡

## rbenvとruby-buildをインストール

準備

```bash
yum -y install git gcc openssl-devel mysql-devel
```

rbenvインストール

```bash
git clone https://github.com/rbenv/rbenv.git /var/lib/rbenv
cd /var/lib/rbenv && src/configure && make -C src
echo 'export RBENV_ROOT=/var/lib/rbenv' >> ~/.bash_profile
echo 'export PATH="$RBENV_ROOT/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
# いったんExitしてbash_profile設定読み込み
exit
sudo su -
```

ruby-buildインストール

```bash
mkdir -p "$(rbenv root)"/plugins
git clone https://github.com/rbenv/ruby-build.git "$(rbenv root)"/plugins/ruby-build
```

rbenv-doctorを実行してrbenvのインストール完了

```bash
curl -fsSL https://github.com/rbenv/rbenv-installer/raw/main/bin/rbenv-doctor | bash
```

## Rubyインストール

現時点（2021年9月20日）では､RedmineはRuby3.x系に対応していないので2系の最新を利用することとする｡

[Redmineと対応Rubyバージョン — Redmine.JP](https://redmine.jp/tech_note/supported-rubies/)

インストール可能なRubyを確認

```bash
rbenv install --list-all | grep 2.7.
```

2.7.4があったのでインストール

```bash
rbenv install 2.7.4
rbenv global 2.7.4
ruby -v
```
## Redmineインストール/設定

### ダウンロード

公式サイトから圧縮されたRedmineファイル一式をダウンロードします｡ruby2.7.4はRedmineの現時点の最新版(4.2.2)にしました｡

- [redmine.org(公式)](https://www.redmine.org/projects/redmine/wiki/Download)

なお､rubyとredmineの互換性は[Ruby and Ruby on Rails version compatibility](https://www.hmallett.co.uk/2018/08/ruby-and-ruby-on-rails-version-compatibility/)で確認しました｡

### 配置(`/var/lib/redmine`)

移行の設定の記述はダウンロードしたファイルを解凍してルートディレクトリ名を`redmine`にリネームして､`/var/lib/`の下に配置した前提の記述です｡

### データベース接続設定(`/config/database.yml`)

```bash
cd /var/lib/redmine/config
cp database.yml.example database.yml
vi database.yml
```

### Unicornインストール

```bash
cd /var/lib/redmine
echo 'gem "unicorn"' >> Gemfile.local

gem install bundler
bundle install --without development test

gem list | grep unicorn
```

### ImageMagickインストール

```bash
yum -y install ImageMagick
```

### セッションCookie用のトークンを作成する/Session store secret generation

```bash
bundle exec rake generate_secret_token
```

### データベースMigration

以下のコマンドを実行します｡3.1と4.2.2はかなりスキーマに差分があるので､多くのSQLが実行されました｡

```bash
RAILS_ENV=production bundle exec rake db:migrate
```

### アップロードファイル用のディレクトリ等のパーミッションを変更/File system permissions

```bash
cd /var/lib/redmine
mkdir -p tmp tmp/pdf public/plugin_assets
chown -R apache:apache files log tmp public/plugin_assets
chmod -R 755 files log tmp public/plugin_assets
```

### 動作確認/Test the installation

```bash
bundle exec rails server webrick -e production
```

上記を実行するとポート3000で待受けされるので､curlでリクエストして応答（301リダイレクトでした）があればOKです

```
curl localhost:3000
```

## RedmineをUnicornで動かせるようにする。

### Unicornの設定ファイルを作成

```bash
cd /var/lib/redmine
vi config/unicorn.rb
```

```rb:unicorn.rb
listen 3000
worker_processes 2
pid "/var/lib/redmine/log/unicorn.pid"
stderr_path "/var/lib/redmine/log/unicorn.log"
stdout_path "/var/lib/redmine/log/unicorn.log"
```

## Redmineをサービス化する

```bash
vi /etc/systemd/system/redmine.service

```conf:redmine.service
[Unit]
Description=Redmine
After=mysqld.service

[Service]
WorkingDirectory=/var/lib/redmine
Environment=RAILS_ENV=production
SyslogIdentifier=redmine
PIDFile=/var/lib/redmine/tmp/pids/unicorn.pid

ExecStart=/var/lib/rbenv/shims/bundle exec "unicorn_rails -c config/unicorn.rb -E production --path=/★"
ExecStop=/usr/bin/kill -QUIT $MAINPID
ExecReload=/bin/kill -USR2 $MAINPID

[Install]
WantedBy=multi-user.target
```

開始

```bash
systemctl start redmine
```

永続化

```bash
systemctl enable redmine
```

## Apache設定

httpアクセスはhttpsにリダイレクトしています｡
LetsEncrypt使っているので以下のような感じになります｡

```conf:httpd.conf
<IfModule mod_ssl.c>
  <VirtualHost *:80>
    ServerName ドメイン
    RewriteEngine on
    RewriteCond %{SERVER_NAME} =ドメイン
    RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
  </VirtualHost>
  <VirtualHost *:443>
    ServerName ドメイン
    ProxyPass        / http://localhost:3000/
    ProxyPassReverse / http://localhost:3000/
    SSLCertificateFile /etc/letsencrypt/live/ドメイン/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/ドメイン/privkey.pem
    Include /etc/letsencrypt/options-ssl-apache.conf
  </VirtualHost>
</IfModule>```

## view_customize プラグインのインストール

[GitHub - onozaty/redmine-view-customize: View customize plugin for Redmine](https://github.com/onozaty/redmine-view-customize)

```
cd /var/lib/redmine/plugins
git clone https://github.com/onozaty/redmine-view-customize.git view_customize
cd ../
bundle install --without development test
bundle exec rake redmine:plugins:migrate RAILS_ENV=production
```

## Themeファイルのインストール

Redmine4.2の場合

```bash
git clone -b redmine4.2  https://github.com/farend/redmine_theme_farend_bleuclair.git public/themes/bleuclair
```

※Redmineにログインして「管理」>「設定」>「表示」画面内の項目「テーマ」で「Bleuclair」を選択して「保存」

## 移行元のファイルをコピー

Redmineルートディレクトリ直下の`files`ディレクトリを移行先に全て移動します｡

## ファイルのパーミッション変更

Webサーバ（この場合はApache）に権限を付与します｡

```
chown -R apache:apache /var/lib/redmine
```

## HTTPサーバ再起動

```
apachectl configtest
systemctl restart httpd
```

# トラブルシューティング

｢ARM版だと足りないパッケージがあるのでは?｣｢データベースマイグレーションでエラーでるだろうな｡｣
と心配していましたが､何事もありませんでした｡

唯一デザイン崩れがありましたが､Chromeの開発者ツールをひらいて｢Disable Cache｣にチェックしてページをリロードしたら修正されました｡

# 付録

## Rubyのバージョンアップ(2.7.4->2.7.7)

### リストの最新化

```bash
# cd /var/lib/rbenv/plugins/ruby-build/
# git pull
# rbenv install --list-all | grep 2.7.7 
2.7.7
```
### インストール

```
# ruby -v
2.7.4
# rbenv install 2.7.7
# rbenv global 2.7.7
# ruby -v
2.7.7
```

### RedmineのGemアップデート

```
# cd /var/lib/redmine
# bundle install --without development test
```

### 再起動

```bash
# systemctl restart redmine httpd
```