Redmine設定メモ
出典: Wikimura
目次 |
Redmineホスティング環境構築
Redmineは一度構築してしまえば、プロジェクトの作成、対応するリポジトリの作成、ユーザの管理などがブラウザから行える。 Unixを知らない人でも、管理ツールの管理者に頼らず利用できる点で、大学の研究室での利用にメリットがある気がする。 そんなわけで、研究室に勝手にRedmineを導入した。
しかし単一のRedmineで複数のプロジェクトを管理できるらしいが、それでも各人が1つのRedmineを利用するのは問題がありそうだ。 ファイル名やプロジェクト名で制限を受けるし、管理が面倒になる気がする。 そこで、メンバやグループに対して1つのRedmineを提供できるよう、Redmineホスティングサービスを作ろうと考えた。
提供するもの
- File-server(192.168.11.101)の50000番ポートから、Redmineを利用できるようにする
- Redmineは複数設置できるようにする
使用するもの
- 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で定期的に実行するよう設定しておけばよい。
ただし、[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に登録すれば、定期的に同期をとれる。
参考文献
- ↑ Apache上でRuby on Railsアプリケーションを動かす(Passenger)
- ↑ Repositories access control with apache mod dav svn and mod perl
- ↑ Automating repository creation
- ↑ HowTo configure Redmine for advanced Subversion integration
- ↑ How To Install Redmine on Centos 5.2 Update
- ↑ Redmineアップグレード
- ↑ How To Install Redmine on Centos 5.2 Update
- ↑ ssh経由で別サーバーからデータベース(MySQL)をバックアップコピ
- ↑ Redmineのインストール
- ↑ 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

