GW連休直前に職場のRedmineを2.2.2→2.3.0にアップデートしておきました。そしたら2.3.1がリリースされましたので、GW連休明けの運用前に2.3.0→2.3.1にするのに備えて自宅環境で確認をしておきます。
動作環境
アップデート手順
~$ cd /var/lib lib$ sudo tar xzf ~/redmine-2.3.1.tar.gz lib$
- 設定ファイル(database.yml、configuration.yml、unicorn.rb)をコピー
lib$ sudo cp redmine-2.3.0/config/{database,configuration}.yml redmine-2.3.1/config/ lib$ sudo cp redmine-2.3.0/config/unicorn.rb redmine-2.3.1/config/ lib$
- Gemfile.local(unicornが指定されている)をコピー
lib$ sudo cp redmine-2.3.0/Gemfile.local redmine-2.3.1/ lib$
- gemパッケージ群のインストール
lib$ cd redmine-2.3.1 redmine-2.3.1$ sudo bundle install --path vendor/bundler --without development test Fetching gem metadata from https://rubygems.org/......... :(中略) >= 1.9.2 : nothing to do! Yay! redmine-2.3.1$
- セッション生成用秘密鍵の生成
redmine-2.3.1$ sudo bundle exec rake generate_secret_token redmine-2.3.1$
- Unicornの停止
redmine-2.3.1$ sudo service unicorn stop /var/lib/redmine: Stopping redmine-2.3.1$
- MySQL DBのバックアップ(バージョンアップでトラブル時に元のバージョンで運用継続するため)
redmine-2.3.1$ pushd ~ ~ /var/lib/redmine-2.3.1 ~$ mysqldump -uroot -pxxxx redmine > mysql_redmine-`date +%Y%m%d`.dump ~$
- プラグイン一式をコピー
~$ popd /var/lib/redmine-2.3.1 redmine-2.3.1$ sudo cp -pr ../redmine-2.3.0/plugins/* plugins/ redmine-2.3.1$
- 添付ファイルディレクトリ以下を移動(容量が大きいため)
redmine-2.3.1$ sudo rm -r files redmine-2.3.1$ sudo mv ../redmine-2.3.0/files .
- 追加テーマをコピー
redmine-2.3.1$ sudo rsync -av --exclude alternate --exclude classic \ ../redmine-2.3.0/public/themes/ public/themes/ sending incremental file list ./ README farend_fancy/ :(中略) sent 52956 bytes received 696 bytes 107304.00 bytes/sec total size is 50549 speedup is 0.94 redmine-2.3.1$
- もう一回gemファイル群の更新(プラグインをコピーした兼ね合い)
redmine-2.3.1$ sudo bundle update Fetching gem metadata from https://rubygems.org/......... :(中略) Your bundle is updated! Use `bundle show [gemname]` to see where a bundled gem is installed. redmine-2.3.1$
- データベースの移行(マイグレーション)
redmine-2.3.1$ sudo bundle exec rake db:migrate RAILS_ENV=production redmine-2.3.1$
redmine-2.3.1$ sudo bundle exec rake redmine:plugins:migrate RAILS_ENV=production :(中略) redmine-2.3.1$
- パーミッションの設定
redmine-2.3.1$ sudo chown -R redmine.redmine . redmine-2.3.1$
- シンボリックリンクの書き換え
redmine-2.3.1$ cd .. lib$ sudo rm redmine lib$ sudo ln -s redmine-2.3.1 redmine lib$
- Unicornの起動
lib$ sudo service unicorn start /var/lib/redmine: Starting lib$
バージョンアップの補足
プラグインをコピーしている理由
こつというか、過去エラーになった状況を回避することですが、プラグインは可能なかぎりそのままコピーします。プラグインのバージョンを変えるとかもう使わないので削除するという場合も、いったんコピーしてRedmine全体のバージョンアップをしてから、個別にバージョンアップまたはアンインストール操作をします。
もし、Redmineのバージョンアップを妨げるようなプラグインが存在した場合は、前のバージョンでそのプラグインをアンインストール操作をしてからRedmineをバージョンアップするとよいでしょう。
以前、あるプラグインがRedmine標準のデータベーステーブルに列を追加しており、それがNOT NULL制約付きであり、そのプラグインをバージョンアップ時にコピーしなかったら以後そのテーブルに書き込みが発生するとInternal Errorとなる事態になってしまったことがありました。
そもそも、Redmine標準のテーブルスキーマを変えてしまうプラグインは設計としてどうなの? と思ったのですが、アンインストール操作をしない形だったので使う側の責なのでしょう・・・。
filesディレクトリをコピーではなく移動している理由
運用で使っているRedmineには、結構添付ファイルがたまっているので(数十GB以上)、コピーしていると容量がそれなりにバカにならないサイズになるためです。
数TBのHDD環境であれば気にしないのですが、仮想環境で運用しているので気にしてしまいます。
気にしない環境であればコピーでよいかもしれません。
仮想環境ならスナップショットとればMySQLバックアップいらないかも
いまさら気づいたのですが、仮想環境で動かしているのであれば、問題あれば戻ってやり直せるスナップショットを取っておけば、MySQLバックアップいらないですね。
保守のための運用停止期間のアナウンス
いままで、保守のために運用止めるときの効果的なアナウンス方法がなく困っていましたが(情報共有のためのWiki/掲示板にいろいろ情報を載せて都度URLを公開しているので、利用者が特定できない)、バナープラグインを知って重宝しました。(Redmine 2.3.0でのプラグイン動作メモ - torutkの日記参照)
予行演習
マイナーバージョンアップ以外は、事前に模擬環境を作ってそこでバージョンアップ作業をして問題を確認し、支障がないと判断したら本番環境のバージョンアップ作業をしています。
本番環境のMySQLバックアップとfiles、プラグイン一式から同じRedmineバージョンの模擬環境を作って、そこから新しいRedmineバージョンへのアップデートを行い確認します。
模擬環境として別マシン(別仮想マシン)が用意できないというときは、MySQLに別データベース名でコピーを作り、そこを使う設定で模擬環境を(同一マシン上に)作りました。そのときはPassengerでしたが、Passengerは複数立てるのが難しそうだったのでWEBrickで動作・確認しました。