Redmine設定メモ

出典: Wikimura

目次

Redmineホスティング環境構築

Redmineは一度構築してしまえば、プロジェクトの作成、対応するリポジトリの作成、ユーザの管理などがブラウザから行える。 Unixを知らない人でも、管理ツールの管理者に頼らず利用できる点で、大学の研究室での利用にメリットがある気がする。 そんなわけで、研究室に勝手にRedmineを導入した。

しかし単一のRedmineで複数のプロジェクトを管理できるらしいが、それでも各人が1つのRedmineを利用するのは問題がありそうだ。 ファイル名やプロジェクト名で制限を受けるし、管理が面倒になる気がする。 そこで、メンバやグループに対して1つのRedmineを提供できるよう、Redmineホスティングサービスを作ろうと考えた。

提供するもの

  • File-server(192.168.11.101)の50000番ポートから、Redmineを利用できるようにする
  • Redmineは複数設置できるようにする
    • Redmine: [1]
    • Subversion: [2]


使用するもの

  • Apacheの50000番ポートでバーチャルホストを設定する
  • MySQLサーバ複数起動メモ に書いたとおり、Redmine用のMySQLサーバを50001番ポートに開く


共通設定

ディレクトリ構造

Redmine、SVN、設定ファイル、シンボリックリンクそれぞれについてディレクトリを設け、それ以下に並べることにした。

個別のRedmine用ディレクトリを作り、配下にredmine本体、svn等を設置したかったが、Apacheの制約でできなかった。 LocationMatchで同じ設定を正規表現を使って一気に適用しようと考えたが、後方参照(マッチした部分を後で利用する)が使えなかった。 SVNParentPathなど、Apache設定ファイルのディレクティブにシェル風に変数を入れても、結局置換されなかった。

こうしたApacheの制約から、全ての設定を個別に行うことになり、Redmine設置ごとにconfを書く必要がでてきた。 また、RubyアプリケーションをApacheから利用する際、Rubyアプリケーションのpublicディレクトリをドキュメントルートにするという制約がある。 ドキュメントルートは1つしか設定できないので、複数のRedmineを動かしたい場合、バーチャルホストを作ってポートを分けるか、 [1] に書かれているようにシンボリックリンクを使用する必要がある。 (ポートを使うのはもったいないのでダメ)


以下は3つのRedmine「AAA」「BBB」「CCC」を設置した場合のディレクトリを表したもの。 以降、Redmineのディレクトリ名を「Redmine名」と呼ぶことにする。

/usr/local/share/WebDAV/Redmine             Redmine関係の基底
    redmine.d                               Redmineのソースを置くディレクトリ
        AAA                                 個別のRedmine(Redmine名: AAA)
        BBB
        CCC
    symlink.d                               個別のRedmineへのシンボリックリンクを置くディレクトリ(兼DocumentRoot)
        AAA >> ../redmine.d/AAA/public
        BBB >> ../redmine.d/BBB/public
        CCC >> ../redmine.d/CCC/public
    svn.d                                   個別のRedmineに対応するリポジトリの親ディレクトリを置くディレクトリ
        AAA
            repo1
            repo2
        BBB
            repo1
            repo2
        CCC
            repo1
            repo2
    conf.d                                  個別RedmineのApache設定ファイル
        AAA.conf
        BBB.conf
        CCC.conf
    database                                データベース関連のディレクトリ
        db                                  データベースファイルを格納
    script                                  作業用スクリプト
    log
cd /usr/local/share/WebDAV/Redmine
mkdir conf.d redmine.d svn.d symlink.d script template

データベース設定

Redmineは1つにつき1つのデータベースを使用する。データベースは1つのデータベースファイルに複数設置できる。 Redmine関係のデータベースを1つにまとめてあるので、1つのデータベースユーザで全てにアクセスできるようにしておく。 (いちいち設定するのは面倒)

パスワードはどうせ設定ファイルに書かないといけないので、簡単なもので統一する。

  • データベース名: rm_(Redmine名)
  • データベースユーザ名: redmine
  • データベースパスワード: redmine
  • ユーザホスト: 127.0.0.1
create database (データベース名) character set utf8;
grant all privileges on (データベース名).* to '(データベースユーザ名)'@'(ユーザホスト)' identified by '(データベースパスワード)' with grant option;

Apache共通設定ファイル

Redmine全体の設定を行う。DocumentRootには、先に作ったシンボリックリンクのみのディレクトリ「symlink.d」を指定する。 個別Redmine用の設定ファイル名は「Redmine名.conf」で統一することで、そのファイルがどのRedmineに対応するかを表すことにした。 設定ファイルはIncludeディレクティブでまとめて読み込むようにしている。

なお、リポジトリの認証に使用するため、Perlモジュール「Redmine.pm」を読み込んでいる。 これはRedmineのソースに含まれているので、予めPerlがロードできるところにコピーしておく(最新のが1つあれば良い?)

/etc/httpd/conf.d/redmine.conf
--------------------------------------------------------------------------------
<IfModule !passenger_module>
    LoadModule passenger_module /usr/local/pkg/ruby-1.8.7/lib/ruby/gems/1.8/gems/passenger-2.2.5/ext/apache2/mod_passenger.so
    PassengerRoot /usr/local/pkg/ruby-1.8.7/lib/ruby/gems/1.8/gems/passenger-2.2.5
    PassengerRuby /usr/local/pkg/ruby-1.8.7/bin/ruby
</IfModule>

<IfModule !dav_svn_module>
    LoadModule dav_svn_module	/usr/lib64/httpd/modules/mod_dav_svn.so
</IfModule>

<IfModule !authz_svn_module>
    LoadModule authz_svn_module	/usr/lib64/httpd/modules/mod_authz_svn.so
</IfModule>

# Common Settings
Listen 50000
<VirtualHost *:50000>
	PerlLoadModule Apache::Redmine
	DocumentRoot /usr/local/share/WebDAV/Redmine/symlink.d
	Include	     /usr/local/share/WebDAV/Redmine/conf.d/*.conf
</VirtualHost>
--------------------------------------------------------------------------------


個別設定ファイル

[2]を参考に、 Redmine個別のリポジトリ認証設定を行う。

Redmineごとのデータベースにアクセスするための設定が必要。

  • database: データベース名
  • host: MySQLサーバ(自身なのでlocalhostだが、mysqld_multiではlocalhostが使えないらしい)
  • port: MySQLサーバのポート(Redmine用に作った50001を指定)
RailsBaseURI /(Redmine名)
<Location "/svn/(Redmine名)">
        DAV svn
        SVNListParentPath on
        SVNParentPath /usr/local/share/WebDAV/Redmine/svn.d/(Redmine名)

        AuthType Basic
        AuthName redmine
        Require valid-user

        PerlAccessHandler Apache::Authn::Redmine::access_handler
        PerlAuthenHandler Apache::Authn::Redmine::authen_handler

        RedmineDSN "DBI:mysql:database=(データベース名);host=127.0.0.1;port=50001"
        RedmineDbUser "redmine"
        RedmineDbPass "redmine"
</Location>


リポジトリ自動生成

Redmineは登録されたプロジェクト用のリポジトリを自動的に生成する機能がある。 reposman.rbというスクリプトを、cronで定期的に実行するよう設定しておけばよい。

[3] [4] を参考に設定する。

ただし、[5] に書かれているように、reposman.rbをcronから実行するとエラーが起こる。定数が定義されていないとか何とか... reposman.rbに以下の1行を全てのrequireの前に付け加えると解消する。

require 'rdoc/ri/ri_paths'

Redmineが複数あるので、以下のスクリプトを介して「redmine.d」以下のディレクトリに対して処理を行わせる。 (とりあえず動く程度のもの)

vi /usr/local/share/WebDAV/Redmine/script/createrepos.sh
--------------------------------------------------------------------------------
#!/bin/bash
BASE_DIR=/usr/local/share/WebDAV/Redmine
REDMINE_DIR=$BASE_DIR/redmine.d
SVN_DIR=$BASE_DIR/svn.d
HOST=localhost:50000
RUBY=/usr/local/pkg/ruby-1.8.7/bin/ruby

for redmine in $REDMINE_DIR/*
do
	if [ -d $redmine ];
	then
		REDMINE_NAME=`echo $redmine | sed -e "s/.*\/\(.*$\)/\1/"`
		$RUBY $redmine/extra/svn/reposman.rb --redmine $HOST/$REDMINE_NAME --svn-dir $SVN_DIR/$REDMINE_NAME --owner apache --url http://$HOST/svn/$REDMINE_NAME/ --verbose
	fi
done
--------------------------------------------------------------------------------

これをcronへ登録する。この作業はrootで行うこと。 エディタが起動するので、線で囲まれた部分を入力する。

crontab -e -u root
--------------------------------------------------------------------------------
0,15,30,45 * * * * /usr/local/share/WebDAV/Redmine/script/createrepos.sh >> /usr/local/share/WebDAV/Redmine/log/createrepos.log
--------------------------------------------------------------------------------

Redmine設置作業

新しくRedmineを設置する際の作業を示す。

データベース作成

Redmine用データベースを作る。

mysql -u root -p -P 50001 -h 127.0.0.1
create database (データベース名) character set utf8;
grant all privileges on (データベース名).* to 'redmine'\@'127.0.0.1' identified by 'redmine' with grant option;
exit;

Redmineダウンロード

svnからソースをチェックアウトする。 正しい設定は分からないが、所有者とパーミッションを変更しないと、500 Internal Server Errorに出くわす。 Apacheの実行ユーザ(apache:apache)にして、770を与えるとエラーが出なくなった。

cd /usr/local/share/WebDAV/Redmine/redmine.d
svn co http://redmine.rubyforge.org/svn/trunk ./(Redmine名)
chown -R apache:apache (Redmine名)
chmod -R 770 (Redmine名)

trunkから持ってくれば、アップグレードが容易らしい[6]。 ただ、最新は怖いので安定版を使う。


database.yml設定

database.ymlに、データベースへのアクセスを行うユーザとそのパスワードを記述する(これは共通にしてある)。 また、データベースのポートも設定する。

vi (Redmineディレクトリ)/config/database.yml
------------------------------------------------------------
production:
  adapter: mysql
  database: (データベース名)
  host: 127.0.0.1
  username: redmine
  password: redmine
  encoding: utf8
  port: 50001
------------------------------------------------------------


Redmineデータベース構築

Redmineのディレクトリにおいて、rake(makeのruby版)を行う。(特殊な場所に入れたので以下のようになっている) これが終われば、Redmineへアクセスできるようになる。

/usr/local/pkg/ruby-1.8.7/bin/rake db:migrate RAILS_ENV=production
/usr/local/pkg/ruby-1.8.7/bin/rake redmine:load_default_data RAILS_ENV=production


その他の設定

  • シンボリックリンクを張る
  • リポジトリを設置する場所を作る。Apacheからアクセスできるよう、所有者とパーミッションを設定しておく。
ln /usr/local/share/WebDAV/Redmine/redmine.d/(redmine名)/public /usr/local/share/WebDAV/Redmine/symlink.d/(redmine名)

cd /usr/local/share/WebDAV/Redmine/svn.d
mkdir (redmine名)
chmod 770 (redmine名)
chown root:apache (redmine名)


リポジトリ自動生成設定

Redmineの管理者でログインし、自動生成を有効化する設定を行っておくこと。

  • 管理 -> 設定 -> リポジトリ -> リポジトリ管理用のWeb Serviceを有効にする
  • 初期状態での管理者名: admin
  • 初期状態でのパスワード: admin


スクリプト

新規Redmine設置

/usr/local/share/WebDAV/Redmine/script/new.sh
--------------------------------------------------------------------------------
#!/bin/bash
REDMINE_NAME=$1

DB_ADMIN_USER=root
DB_ADMIN_PASS=redmine
DB_HOST=127.0.0.1
DB_USER=redmine
DB_PASS=redmine
DB_PORT=50001
DB_PREFIX=rm_

BASE_DIR=/usr/local/share/WebDAV/Redmine
RAKE=/usr/local/pkg/ruby-1.8.7/bin/rake
REDMINE_REPO=http://redmine.rubyforge.org/svn/tags/0.8.6

# ディレクトリ名
REDMINE_DIR=$BASE_DIR/redmine.d
SVN_DIR=$BASE_DIR/svn.d
SYMLINK_DIR=$BASE_DIR/symlink.d
CONFIG_DIR=$BASE_DIR/conf.d
SCRIPT_DIR=$BASE_DIR/script

REDMINE=$REDMINE_DIR/$REDMINE_NAME
SYMLINK=$SYMLINK_DIR/$REDMINE_NAME
SVN=$SVN_DIR/$REDMINE_NAME

DBCONFIG=$REDMINE/config/database.yml
HTTPDCONFIG=$CONFIG_DIR/$REDMINE_NAME.conf

DB_NAME=$DB_PREFIX$REDMINE_NAME

# REDMINE_NAMEが空ではないことを確認
if [ -z "$REDMINE_NAME" ]
then
        echo "enter project name"
        exit -1
fi

# 既に存在しないことを確認
if [ -e $REDMINE ]
then
        echo "Already exists."
        exit -1
fi

# 最新のソースをチェックアウト
svn co $REDMINE_REPO $REDMINE
chmod -R 770 $REDMINE
chown -R apache:apache $REDMINE

# シンボリックリンク作成(相対でなくても可?)
ln -s $REDMINE/public $SYMLINK

# SVNリポジトリ用ディレクトリ作成
mkdir $SVN
chmod -R 770 $SVN
chown -R root:apache $SVN

# データベース設定ファイルを作成
$SCRIPT_DIR/database.pl $DB_HOST $DB_PORT $DB_NAME $DB_USER $DB_PASS > $DBCONFIG

# apache設定ファイルを作成
$SCRIPT_DIR/httpd_conf.pl $REDMINE_NAME $DB_HOST $DB_PORT $DB_NAME $DB_USER $DB_PASS $SVN > $HTTPDCONFIG

# データベース設置
$SCRIPT_DIR/db.pl $DB_HOST $DB_NAME $DB_USER $DB_PASS | mysql -P $DB_PORT -h $DB_HOST -u $DB_ADMIN_USER --password="$DB_ADMIN_PASS"

PREV_DIR=`pwd`
cd $REDMINE
$RAKE db:migrate RAILS_ENV=production
$RAKE redmine:load_default_data RAILS_ENV=production
cd $PREV_DIR
--------------------------------------------------------------------------------


データベース設定ファイルテンプレート

/usr/local/share/WebDAV/Redmine/script/database.pl
--------------------------------------------------------------------------------
#!/usr/bin/perl
$db_host = $ARGV[0];
$db_port = $ARGV[1];
$db_name = $ARGV[2];
$db_user = $ARGV[3];
$db_pass = $ARGV[4];

print << "EOF";
production:
  adapter: mysql
  host: $db_host
  port: $db_port
  database: $db_name
  username: $db_user
  password: $db_pass
  encoding: utf8
EOF
--------------------------------------------------------------------------------

Apache設定ファイルテンプレート

/usr/local/share/WebDAV/Redmine/script/httpd_conf.pl
--------------------------------------------------------------------------------
#!/usr/bin/perl
$redmine  = $ARGV[0];
$db_host  = $ARGV[1];
$db_port  = $ARGV[2];
$db_name  = $ARGV[3];
$db_user  = $ARGV[4];
$db_pass  = $ARGV[5];
$svn      = $ARGV[6];

print << "EOF";
RailsBaseURI /$redmine
<Location "/svn/$redmine">
        DAV svn
        SVNListParentPath on
        SVNParentPath $svn

        AuthType Basic
        AuthName redmine
        Require valid-user

        PerlAccessHandler Apache::Authn::Redmine::access_handler
        PerlAuthenHandler Apache::Authn::Redmine::authen_handler

        RedmineDSN "DBI:mysql:database=$db_name;host=$db_host;port=$db_port"
        RedmineDbUser "$db_user"
        RedmineDbPass "$db_pass"
</Location>
EOF
--------------------------------------------------------------------------------

MySQLコマンドテンプレート

/usr/local/share/WebDAV/Redmine/script/db.pl
--------------------------------------------------------------------------------
#!/usr/bin/perl
$db_host  = $ARGV[0];
$db_name  = $ARGV[1];
$db_user  = $ARGV[2];
$db_pass  = $ARGV[3];

print << "EOF";
create database $db_name character set utf8;
grant all privileges on $db_name.* to '$db_user'\@'$db_host' identified by '$db_pass' with grant option;
EOF
--------------------------------------------------------------------------------

0.8.6用インストール後処理

/usr/local/share/WebDAV/Redmine/script/patch-0.8.6.sh
--------------------------------------------------------------------------------
#!/bin/bash
REDMINE_NAME=$1

BASE_DIR=/usr/local/share/WebDAV/Redmine

# ディレクトリ名
REDMINE_DIR=$BASE_DIR/redmine.d
SVN_DIR=$BASE_DIR/svn.d
SYMLINK_DIR=$BASE_DIR/symlink.d
CONFIG_DIR=$BASE_DIR/conf.d
SCRIPT_DIR=$BASE_DIR/script
PATCH_DIR=$BASE_DIR/patch

REDMINE=$REDMINE_DIR/$REDMINE_NAME
SYMLINK=$SYMLINK_DIR/$REDMINE_NAME
SVN=$SVN_DIR/$REDMINE_NAME

patch $REDMINE/extra/svn/reposman.rb < $PATCH_DIR/reposman-0.8.6.patch
--------------------------------------------------------------------------------

0.8.6 reposman.rb用パッチ

cronでリポジトリ自動生成を行おうとすると、なぜかエラーがでるのを防ぐ。 [7]を参考にした。

  • 追記: なくても大丈夫かもしれない...
/usr/local/share/WebDAV/Redmine/patch/reposman-0.8.6.patch
--------------------------------------------------------------------------------
57c57
<
---
> require 'rdoc/ri/ri_paths'
--------------------------------------------------------------------------------

バックアップ

自分のRedmineを自宅サーバなどでバックアップする際の方法を示す。 バックアップするものは、Redmineデータベース(ここではmysql)、添付ファイル、SVNリポジトリの3点。 これらをSSH上でバックアップする。

Redmineデータベースのバックアップ

[8]を参考に、SSH接続でmysqlサーバに接続し、ダンプしたデータを持ってくる。

SSHクライアント設定

何度もコマンドで設定するのは面倒なので、SSHクライアントの設定ファイルを用意しておく。

コマンド

sshはホスト名の後に、接続先で実行したいコマンドを書くことができる。 コマンドはリモートで実行するときの書き方で良いらしい。 バックアップはmysqldumpを実行し、その結果をローカルに持ってくる。

ssh -F ~/.ssh/ssh_config Kimura-lab.net mysqldump -P 50001 -u root --password='パスワード' -h 127.0.0.1 'データベース名' | gzip > /usr/local/share/WebDAV/Redmine/backup/myredmine_`date +%y_%m_%d`.gz

もしデータベース全体をダンプするなら、[9]にあるように、データベースを指定しなければ良い。

'リポジトリバックアップ

SSH_CONFIGでトンネリング設定

以下のように設定しておくと楽。

vi ~/.ssh/ssh_config
---------------------------------------------------
Host Kimura-lab.net     (研究室のホスト)
User (ログインユーザ)
IdentityFile (リモートでの公開鍵)
Tunnel yes
LocalForward 50002 localhost:50000 (ローカルの50002番ポートを、リモート自身の50000版ポートへ)
---------------------------------------------------

スクリプト

予めSVNリポジトリをローカルで作成しておき、svnsync initをしているものとする。また、非公開リポジトリについてはパスワードが必要になる。 svnsyncについては[10]参照。

スクリプトはローカルの50002版ポートをリモートの50000番ポートへ接続する(このポートはWebDAVを提供するポート)。 SSHはバックグラウンドで実行しておき、svnsyncを実行する。 処理を終えたらSSHプロセスを終了する。

プロセスを終了するためにPIDが必要なので、起動時に取り出しておく。やり方が正しいかは不明だが、一応うまくいっている。

#!/bin/bash
ssh -N -F ~/.ssh/ssh_config Kimura-lab.net &
TUNNEL_PID=$!
sleep (接続にかかる時間以上待機)
svnsync sync file://(ローカルにあるリポジトリ)
kill $TUNNEL_PID

これをcronに登録すれば、定期的に同期をとれる。

参考文献

  1. Apache上でRuby on Railsアプリケーションを動かす(Passenger)
  2. Repositories access control with apache mod dav svn and mod perl
  3. Automating repository creation
  4. HowTo configure Redmine for advanced Subversion integration
  5. How To Install Redmine on Centos 5.2 Update
  6. Redmineアップグレード
  7. How To Install Redmine on Centos 5.2 Update
  8. ssh経由で別サーバーからデータベース(MySQL)をバックアップコピ
  9. Redmineのインストール
  10. Subversionリポジトリのバックアップ( svnsync )

追記

  • 0.9.3 では、new.shで以下のようにする必要があるようです。
PREV_DIR=`pwd`
cd $REDMINE
$RAKE config/initializers/session_store.rb     # 追加箇所
$RAKE db:migrate RAILS_ENV=production
$RAKE redmine:load_default_data RAILS_ENV=production
cd $PREV_DIR
個人用ツール