daybreaksnow's diary

私を私と呼びたい

[Redmine]Redmineのマイグレーションを行う

CentOS6からCentOS7にRedmineマイグレーションし、利用するDBMSMySQLからPostgreSQLに変更した際の作業。

マイグレーション
  • CentOS6
  • Redmine2.4
  • MySQL 14.14
マイグレーション
  • CentOS7
  • Redmine3.4.2
  • PostgreSQL9.2

手順

マイグレーションに失敗してもよいよう、検証用マシンを用意して以下の手順で行った。

Redmineのアップグレード

1. 検証機にマイグレーション元と同じRedmineの環境を用意、DBのダンプ、添付ファイルを復元
過去の記事の通り
[Linux]RedmineのDBのバックアップを取る - daybreaksnow's diary
2. 検証機のRedmineマイグレーション先のRedmineのバージョンにアップグレード
こちらを参考
アップグレード — Redmine Guide 日本語訳
2-1. Redmineのダウンロード、解凍、配置

wget http://www.redmine.org/releases/redmine-3.2.4.tar.gz
tar xvzf redmine-3.2.4.tar.gz
mv redmine-3.2.4 /var/lib/redmine-3.2.4

2-2. DB設定のコピー

cp -a /var/lib/redmine/config/configuration.yml /var/lib/redmine-3.2.4/config/configuration.yml
cp -a /var/lib/redmine/config/database.yml /var/lib/redmine-3.2.4/config/database.yml 

2-3. 添付ファイルコピー

cp -ar /var/lib/redmine/files/ /var/lib/redmine-3.2.4/

2-4. プラグインコピー

cp -ar /var/lib/redmine/plugins/ /var/lib/redmine-3.2.4/ 

2-5. 依存するツールをインストール

bundle install --without development test
bundle exec rake generate_secret_token

2-6. DBのマイグレーション

bundle exec rake db:migrate RAILS_ENV=production

2-7. プラグイン用DBのマイグレーション

bundle exec rake redmine:plugins:migrate RAILS_ENV=production

2-8. キャッシュクリア

bundle exec rake tmp:cache:clear tmp:sessions:clear

2-9.「RackBaseURI /redmine-3.2.4」の行を追加

vi /etc/httpd/conf.d/passenger.conf

2-10. httpdに公開

ln -s /var/lib/redmine-3.2.4/public redmine-3.2.4

2-7.のプラグイン用DBのマイグレーションでタグ付けプラグインがこけたので、そのプラグインは削除して実行した(対して使っていなかったので)

データベースの移行

MySQLダンプをPostgreSQL用に変換して取得することを考えていたが、RailsのDBはyaml_dbを使うとプレインテキストでバックアップが取れるということなのでyaml_dbを使った。
参考:
yaml_dbを使ってMySQLからPostgreSQLにRedmineを移行した - 烏龍茶より麦茶派です

1. yaml_dbのインストール
1-1. /var/lib/redmine/Gemfileに以下の行を追加

gem "yaml_db"

1-2. /var/lib/redmineで以下のコマンドを実行

bundle update
bundle install --without development test

2. yaml_dbでダンプを取る

RAILS_ENV=production bundle exec rake db:data:dump

これでredmine/db/data.ymlができる。これをマイグレーション先の同ディレクトリに持っていく
3. マイグレーション先で復元

RAILS_ENV=production bundle exec rake db:data:load

ここで2-7.で削除したプラグインが使っていたテーブルが復元できないと言われたので、手動でdata.ymlからそのテーブルの情報を削除した。

[Subversive]削除された履歴を復元する

削除→新規追加などしてしまい、過去の履歴が辿れなくなった場合の対応。
逆マージを使う。

状況

リビジョン20でファイル追加
リビジョン21でファイル更新
リビジョン22でファイル削除&同名ファイルを新規追加

1.逆マージ

チーム→マージを選択して、改訂で取り消したいリビジョン(22)を選択
f:id:daybreaksnow:20140411184549p:plain

Reverse mergeにチェックし、OK
f:id:daybreaksnow:20140411184601p:plain

成功すると、対象ファイルのマークが変わる
f:id:daybreaksnow:20140411184746p:plain

2.修正を反映

マージされたファイルにrev22の修正を反映

3.コミット

履歴を確認すると、20,21,23となっている。

f:id:daybreaksnow:20140411185029p:plain

なお、逆マージのコマンドは以下の通りとなる。

svn merge -c -8 .

[SVN]さくらのVPSにSVNリポジトリを立てる

参考:
Subversion環境をCentOSで構築 - 無理なものは無理
10分で作る、Subversionレポジトリ (CentOS 版) - ishikawa84g's blog

mod_dav_svnのインストール

必要なパッケージがインストールされているか確認

yum list installed | grep subversion
yum list installed | grep mod_dav_svn

subversionはインストール済みだったが、mod_dav_svnはなかった。

インストールする。

yum install mod_dav_svn

SVNリポジトリの作成

テスト用にsandboxというリポジトリを作る。trunkとかbranchはひとまず無視。

mkdir /var/www/svn
svnadmin create /var/www/svn/sandbox
chown -R apache:apache /var/www/svn

Apache の設定(Basic 認証)

BASIC認証用のユーザ、パスワード設定

htpasswdコマンドを使って、ユーザ、パスワードを設定する

htpasswd -c /etc/httpd/.htpasswd ユーザ名 

実行後、パスワードが聞かれるので入力。
パスワードはデフォルトではcrypt関数で暗号化されて保存される。(Cのcrypt関数のこと?)

  • cは新規ファイル作成という意味なので、複数ユーザを追加する際は、-cは除く。

-cが付いていると、既存のファイルがあっても上書きされてしまうので注意。

apacheSVNの連携

mod_dav_svnのインストールにより、以下のファイルが作成されている。これを編集する。

/etc/httpd/conf.d/subversion.conf

・Locationタグをコメントアウト
・Locationタグのパスを、アクセスしたいURLにする(reposをsvnに変更した)
・AuthUserFileのパスをさっき作ったパスに変更

<Location /svn>
   DAV svn
   SVNParentPath /var/www/svn

#   # Limit write permission to list of valid users.
#   <LimitExcept GET PROPFIND OPTIONS REPORT>
#      # Require SSL connection for password protection.
#      # SSLRequireSSL

      AuthType Basic
      AuthName "Authorization Realm"
      AuthUserFile /etc/httpd/.htpasswd
      Require valid-user
#   </LimitExcept>
</Location>

httpdを再起動すれば終わり。

今回の例だと、http://(IPアドレス)/svn/sandboxにアクセスすればリポジトリの中身が見える。

[Redmine]同一PCで二つRedmineを動かす

同一マシンでRedmineを二つ動かした。
しかし、単純にpassenger.confに二つ目のRedmineへのパスを通すだけだと、複数のRedmineに同時にログインできない。

以下の通り書き換える。
参考:http://qiita.com/yteraoka/items/72b111e69511f254f97e

redmine/config/application.rb
修正前:config.session_store :cookie_store, :key => '_redmine_session'
修正後:config.session_store :cookie_store, :key => '_redmine_session', :path => config.relative_url_root

redmine/config/configuration.yml
修正前:autologin_cookie_path:
修正後:autologin_cookie_path: Redmine::Utils.relative_url_root


それ以外の既存の手順

[Linux]さくらVPSのCentOSにRedmineをインストール - daybreaksnow's diaryのものと同じ。

・DBの用意
create database db_redmine_2 default character set utf8;
grant all on db_redmine_2.* to user_redmine_2 identified by 'パスワード';
flush privileges;

Redmineのインストール
tarballを解凍して、一つ目とはredmineとは別のディレクトリ名にして、/var/libに配置

・DB、メール設定を適当に設定する
/var/lib/redmine_2/config/database.yml
/var/lib/redmine_2/config/configuration.yml

・必要ライブラリのインストール
bundle install

秘密鍵作成
bundle exec rake generate_secret_token
RAILS_ENV=production bundle exec rake db:migrate

・権限付与
chown -R apache:apache /var/lib/redmine_2

・アクセス可能に
ln -s /var/lib/redmine_2/public /var/www/html/redmine_2

・/etc/httpd/conf.d/passenger.confに以下を追記
RackBaseURI /redmine_2

[Redmine]タグ付けを可能にするプラグインを入れる

Redmineのバージョン:2.4.3 (2014-02-08)
Ruby:2.0.0
Rails:3.2.16

プラグインURL:friflaj/redmine_tagging · GitHub

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

HPの手順だと以下の通りだが、これは古い。(rails3だと、redmine/script/pluginは存在しない)

script/plugin install git://github.com/friflaj/redmine_tagging.git
bundle install

代わりに、redmineのインストールディレクトリで、以下を実行する。

./script/rails plugin install git://github.com/friflaj/redmine_tagging.git

ここで、以下のようなDB接続エラーが出た。

/usr/local/lib/ruby/gems/2.0.0/gems/mysql2-0.3.15/lib/mysql2/client.rb:67:in `connect': Access denied for user 'root'@'localhost' (using password: NO) (Mysql2::Error)


どうやら、database.ymlのdevelopmentモードの設定を使っているので、MySQLに接続できないようだ。
開発モード用にDBをコピーし、database.ymlをdevelopment時はそちらに接続するように書き換える。

create database db_redmine_dev default character set utf8;
grant all on db_redmine_dev.* to user_redmine;
flush privileges;

mysqldump -u root -p db_redmine | mysql -u root -p db_redmine_dev

再度rails pluginを実行、正常終了。

Initialized empty Git repository in /var/lib/redmine-comp/vendor/plugins/redmine_tagging/.git/
remote: Counting objects: 74, done.
remote: Compressing objects: 100% (64/64), done.
remote: Total 74 (delta 4), reused 53 (delta 3)
Unpacking objects: 100% (74/74), done.
From git://github.com/friflaj/redmine_tagging
 * branch            HEAD       -> FETCH_HEAD

上記をよく見ると、プラグインredmine/pluginsではなく、redmine/vendor/pluginsに展開されてしまっている。
これではプラグインとして認識されないので、redmine/pluginsに移動する

その後、redmineのインストールディレクトリで、bundle installを実行。
ここでもエラーが出た。

Updating git://github.com/Undev/rails_sql_views.git
Fetching gem metadata from https://rubygems.org/.......
Fetching additional metadata from https://rubygems.org/..
Resolving dependencies...
Bundler could not find compatible versions for gem "rake":
  In snapshot (Gemfile.lock):
    rake (10.2.2)

  In Gemfile:
    rails_sql_views (>= 0) ruby depends on
      rake (~> 0.9.2) ruby

Running `bundle update` will rebuild your snapshot from scratch, using only
the gems in your Gemfile, which may resolve the conflict.

よく分からんがbundle updateしろと言われているので、その通りにする。


タグ利用のmigrationファイルの生成

HPの手順

rails generate acts_as_taggable_on:migration

正常終了した。

      create  db/migrate/20140408024608_acts_as_taggable_on_migration.rb
DBのマイグレーション

HPの手順。

rake db:migrate RAILS_ENV=production
rake db:migrate_plugins RAILS_ENV=production

rakeだと共通ライブラリを使ってしまうので、bundle exec rakeを使う。

一行目。

# bundle exec rake db:migrate RAILS_ENV=production
==  ActsAsTaggableOnMigration: migrating ======================================
-- create_table(:tags)
   -> 0.0106s
-- create_table(:taggings)
   -> 0.0038s
-- add_index(:taggings, :tag_id)
   -> 0.0098s
-- add_index(:taggings, [:taggable_id, :taggable_type, :context])
   -> 0.0212s
==  ActsAsTaggableOnMigration: migrated (0.0458s) =============================

二行目。

Migrating redmine_tagging (Redmine Tagging plugin)...
==  CreateViews: migrating ====================================================
-- create_view(:issue_tags, "select taggings.id, tags.name as tag, taggings.taggable_id as issue_id from taggings join tags on taggings.tag_id = tags.id where taggable_type = 'Issue'")
   -> 0.0149s
-- create_view(:wiki_page_tags, "select taggings.id, tags.name as tag, taggings.taggable_id as wiki_page_id from taggings join tags on taggings.tag_id = tags.id where taggable_type = 'WikiPage'")
   -> 0.0035s
==  CreateViews: migrated (0.0187s) ===========================================

==  ScrubBody: migrating ======================================================
==  ScrubBody: migrated (0.0049s) =============================================

==  RecreateViews: migrating ==================================================
-- drop_view(:issue_tags)
   -> 0.0010s
-- drop_view(:wiki_page_tags)
   -> 0.0004s
-- create_view(:issue_tags, "select taggings.id as id, tags.name as tag, taggings.taggable_id as issue_id from taggings join tags on taggings.tag_id = tags.id where taggable_type = 'Issue'")
   -> 0.0021s
-- create_view(:wiki_page_tags, "select taggings.id as id, tags.name as tag, taggings.taggable_id as wiki_page_id from taggings join tags on taggings.tag_id = tags.id where taggable_type = 'WikiPage'")
   -> 0.0016s
==  RecreateViews: migrated (0.0054s) =========================================

==  FixTaggingContexts: migrating =============================================
==  FixTaggingContexts: migrated (0.0053s) ====================================

==  FixBrokenIssueAndWikiContexts: migrating ==================================
==  FixBrokenIssueAndWikiContexts: migrated (0.0022s) =========================

==  FixTagsWithBackslash: migrating ===========================================
==  FixTagsWithBackslash: migrated (0.0016s) ==================================


Note: The rake task db:migrate_plugins has been deprecated, please use the replacement version redmine:plugins:migrate
redmineの起動

手順が終わったので、httpdを再起動し、redmineにアクセス。
ここで、エラーが出てページが表示できなかった。

It looks like Bundler could not find a gem. Maybe you didn't install all the gems that this application needs. To install your gems, please run:

bundle install
If that didn't work, then the problem is probably caused by your application being run under a different environment than it's supposed to. Please check the following:

Is this app supposed to be run as the apache user?
Is this app being run on the correct Ruby interpreter? Below you will see which Ruby interpreter Phusion Passenger attempted to use.
-------- The exception is as follows: -------

git://github.com/Undev/rails_sql_views.git (at master) is not yet checked out. Run `bundle install` first. (Bundler::GitError)
  /usr/local/lib/ruby/gems/2.0.0/gems/bundler-1.5.3/lib/bundler/source/git.rb:179:in `rescue in load_spec_files'

エラーメッセージでググったところ、bundle installをrootでやっていると、redmineを起動しているユーザ(apache)で使えないようだ。
参考:http://stackoverflow.com/questions/6648870/is-not-checked-out-bundle-install-does-not-fix-help

以下のように、deploymentを付けて、再度bundle installを実行する。

bundle install --deployment

httpdを再起動して、アクセスすると、正常に表示され、タグの追加も可能となった。

[Redmine]チケットの変更履歴を非表示にするプラグインのインストール

※2016/12/10 追記
Redmine3.2.4に下記プラグインを入れたところ、Redmineの言語が英語になってしまった


Redmineのバージョン:2.4.3 (2014-02-08)
Ruby:2.0.0
Rails:3.2.16

1.以下のサイトからDownloadZipでzipを落とす
 プラグインURL:GitHub - vividtone/redmine_comment_only: This is a plugin for redmine. Only comments are displayed at issue's history.
2.転送、解凍
3.redmineのインストールディレクトリのplugin以下に置く。
 /var/lib/radmine/plugin/redmine_comment_only/appのような階層になる。
 プラグインディレクトリ名は、init.rb内のPlugin.registerの名前に合わせる。
4.apacheの再起動をして反映。




・履歴非表示時
f:id:daybreaksnow:20140326175204p:plain

・履歴表示時
f:id:daybreaksnow:20140326175212p:plain

[Linux]RedmineのDBのバックアップを取る

参考:
データのバックアップ方法 — Redmine.JP

添付ファイル以外のデータはすべてDBに入っている。
添付ファイルはRedmineインストールディレクトリのfiles以下にある。
(今回は/var/lib/redmine/files)

添付ファイルバックアップスクリプト(attach_file_backup.sh)

#!/bin/sh
SRC=/var/lib/redmine
BACKUP_DIR=/home/hoge/backup/redmine/daily_backup
BACKUP_FILE=files

cp -ar ${SRC}/${BACKUP_FILE} ${BACKUP_DIR}
tar cvzf ${BACKUP_DIR}/${BACKUP_FILE}.tar.gz -C $BACKUP_DIR $BACKUP_FILE
rm -r ${BACKUP_DIR}/${BACKUP_FILE}

DBバックアップスクリプト(db_backup.sh)

#!/bin/sh
DAILY_BACKUP_DIR=/home/hoge/backup/redmine/daily_backup
DUMP_FILE=db_redmine.dump
DB_USER_NAME=hoge
DB_PASSWORD=piyo

mysqldump -u ${DB_USER_NAME} -p{DB_PASSWORD} db_redmine > ${DAILY_BACKUP_DIR}/${DUMP_FILE}

日次バックアップスクリプト(daily_backup.sh)

#!/bin/sh
#このシェルのパスを取得
DIR=$(cd $(dirname $0); pwd)
#echo $DIR

#DBのバックアップ取得
${DIR}/db_backup.sh
#添付ファイルのバックアップ取得
${DIR}/attach_file_backup.sh

月次バックアップスクリプト(monthly_backup.sh)

#!/bin/sh
DAILY_BACKUP_DIR=/home/hoge/backup/redmine/daily_backup
MONTHLY_BACKUP_DIR_BASE=/home/hoge/backup/redmine/monthly_backup
MONTHLY_BACKUP_DIR=${MONTHLY_BACKUP_DIR_BASE}`date +\%y\%m\%d`

#echo  ${MONTHLY_BACKUP_DIR}
mkdir ${MONTHLY_BACKUP_DIR}
cp -ar ${DAILY_BACKUP_DIR} ${MONTHLY_BACKUP_DIR}

cronの設定

MAILTO=''
#redmineのバックアップ(毎日午前3時)
0 3 * * * /home/hoge/backup/redmine/sh/daily_backup.sh
#redmineのバックアップのコピー(毎月1日午前5時)
0 5 1 * * /home/hoge/backup/redmine/sh/monthly_backup.sh

DBのリストア

db_redmine_restoreに復元する例

SQL(create_db_restore.sql)

drop database db_redmine_restore;
create database db_redmine_restore default character set utf8;
grant all on db_redmine_restore.* to user_redmine;

・シェル

#!/bin/sh
#このシェルのパスを取得
DIR=$(cd $(dirname $0); pwd)
DAILY_BACKUP_DIR=/home/hoge/backup/redmine/daily_backup
DUMP_FILE=db_redmine.dump
DB_ROOT_USER=root
DB_ROOT_PASSWORD=fuga
DB_USER=user_redmine
DB_PASSWORD=piyo
RESTORE_DB=db_redmine_restore

mysql -u ${DB_ROOT_USER} -p${DB_ROOT_PASSWORD} < ${DIR}/create_db_restore.sql
mysql -u  ${DB_USER} -p${DB_PASSWORD} ${RESTORE_DB} < ${DAILY_BACKUP_DIR}/${DUMP_FILE}

リストア

添付ファイルの復旧後は、filesのオーナーをapacheに戻す。

sudo chown -R apache:apahce files

操作ユーザになっていると、ファイルアップロード時にpermission deniedが発生し、Internal Server Errorが表示される。