Trac on Windows(2)

複数プロジェクトのハンドリングを考えてみる。まず参考にしたのが

たしかにこれとSVNParentPathを組み合わせれば、Apacheの再起動なしでプロジェクトが追加できる。ただ「プロジェクト」=「開発案件」なので、アクセスできる人はプロジェクト毎に制御しなければならない。内部の人間は全案件アクセス可でも良いが、外注さんはそういうわけにいかん。そうなるとパスワードファイルを分ける必要が出てくる。またTracのサーバは外部セグメントに置く予定なので、認証に成功したらTopページを表示するようにしないとまずい。anonymousの閲覧を許すわけにはいかん。

ということを念頭に、ちょっと設定を考えてみる。今回想定した環境は次のようなもの。プロジェクトとしてProj1, Proj2, Proj3を作成する。Subversionはc:\svnrepos, Tracはc:\tracリポジトリ置き場とする。

     c:\svnrepos                 c:\trac
          |                           |
          +-- \Proj1                  +-- \Proj1
          |                           |
          +-- \Proj2                  +-- \Proj2
          |                           |
          +-- \Proj3                  +-- \Proj3

各プロジェクトのパスワードファイルと登録ユーザは次のようにする。

プロジェクトパスワードファイルユーザパスワード
Proj1c:\svnrepos\conf\Proj1_passwduser1user1
Proj2c:\svnrepos\conf\Proj2_passwduser2user2
Proj3c:\svnrepos\conf\Proj3_passwduser3user3

では、複数のプロジェクト用にApacheを設定するを参考に設定してみる。

Tracプロジェクトのディレクトリ作成

Apacheのドキュメントルート、つまりhttpd.confのDocumentRootで定義されたディレクトリ下にTrac用のディレクトリprojectsを作成する。手順としては、もし

DocumentRoot "C:/www"

となっているなら

mkdir c:\www\projetcts

とするか、エクスプロラーでc:\wwwの下に新規フォルダprojetcts作成。そしてこのprojetctsの下に

  1. index.htmlファイル(この時点では空っぽで良い)
  2. C:\Python23\share\trac\cgi-bin\trac.cgiをここへコピー

する。

Subversionリポジトリの作成

Proj1, Proj2, Proj3に対応するリポジトリを作成する。ここでは以下のようなコマンドで作成。各プロジェクトにはproj1.txt, proj2.txt, proj3.txtをimportしておく。これはこのあとTracでアクセスしたとき、所定のSubversionリポジトリをアクセスできているか確認しやすくするためdummyで登録したもの。深い意味は無い。

SET SVN_EDITOR=notepad.exe
svnadmin create c:/svnrepos/Proj1
svn mkdir file:///c:/svnrepos/Proj1/trunk file:///c:/svnrepos/Proj1/branches file:///c:/svnrepos/Proj1/tags
mkdir Proj1_temp
echo "This is Proj1" > Proj1_temp\proj1.txt
svn import -m "importing Proj1" Proj1_temp  file:///c:/svnrepos/Proj1/trunk

svnadmin create c:/svnrepos/Proj2
svn mkdir file:///c:/svnrepos/Proj2/trunk file:///c:/svnrepos/Proj2/branches file:///c:/svnrepos/Proj2/tags
mkdir Proj2_temp
echo "This is Proj2" > Proj2_temp\proj2.txt
svn import -m "importing Proj2" Proj2_temp  file:///c:/svnrepos/Proj2/trunk

svnadmin create c:/svnrepos/Proj3
svn mkdir file:///c:/svnrepos/Proj3/trunk file:///c:/svnrepos/Proj3/branches file:///c:/svnrepos/Proj3/tags
mkdir Proj3_temp
echo "This is Proj3" > Proj3_temp\proj3.txt
svn import -m "importing Proj3" Proj3_temp  file:///c:/svnrepos/Proj3/trunk

Tracリポジトリの作成

手順はC:\Python23\Scriptsへcdしてadminを実行する。

(1)python trac-admin c:/trac/Proj1 initenv

(2)Project Name [My Project]> に対して Proj1

(3)Database connection string [sqlite:db/trac.db]> に sqlite:db/Proj1.db

(4)Path to repository [/var/svn/test]> に c:/svnrepos/proj1/trunk

(5)Templates directory [C:\Python23\share\trac\templates]> は ENTERのみ

続けてProj2, Proj3も定義。上記Proj1の部分を、それぞれProj2, Proj3に変えて実行すればOK。

パスワードファイルの作成

各プロジェクト用パスワードファイルを作成。このファイルでアクセスできるユーザを定義する。手順としてはApacheBasic認証用ファイルを作るのと同じ。

C:\Program Files\Apache Group\Apache2\bin>htpasswd -c -m Proj1_passwd user1
New password: *****
Re-type new password: *****
Adding password for user user1

同様にProj2, Proj3用も作成。そしてこれらファイル(=Proj[123]_passwdのことね)をc:\svnrepos\confへmoveする。

httpd.confの調整

以上の内容をもとにhttpd.confへ定義を追加する。すでにSubversion, Tracに関する設定が記載されている場合は、それらと干渉しないか確認。

# Subversion
<Location /svnrepos/Proj1>
 DAV svn
 SVNPath c:\svnrepos\Proj1
 AuthType Basic
 AuthName "svn Proj1"
 AuthUserFile c:\svnrepos\conf\Proj1_passwd
 Require valid-user
</Location>

<Location /svnrepos/Proj2>
 DAV svn
 SVNPath c:\svnrepos\Proj2
 AuthType Basic
 AuthName "svn Proj2"
 AuthUserFile c:\svnrepos\conf\Proj2_passwd
 Require valid-user
</Location>

<Location /svnrepos/Proj3>
 DAV svn
 SVNPath c:\svnrepos\Proj3
 AuthType Basic
 AuthName "svn Proj3"
 AuthUserFile c:\svnrepos\conf\Proj3_passwd
 Require valid-user
</Location>

# Trac
<Directory "C:/Python23/share/trac/htdocs">
  Options Indexes MultiViews
  AllowOverride None
  Order allow,deny
  Allow from all
</Directory>

RewriteEngine on
RewriteRule ^/projects/+$			/projects/index.html [L]
RewriteCond c:/trac/$1			-d
RewriteRule ^/projects/([[:alnum:]]+)(/?.*)	/projects/trac.cgi$2 [S=1,E=TRAC_ENV:c:/trac/$1]
RewriteRule ^/projects/(.*)			/projects/index.html

<Directory "c:/www/projects">
	AllowOverride None
	Options ExecCGI -MultiViews +SymLinksIfOwnerMatch
	AddHandler cgi-script .cgi
	Order allow,deny
	Allow from all
</Directory>

<Location "/projects/Proj1">
	AuthType Basic
	AuthName "trac Proj1"
	AuthUserFile c:\svnrepos\conf\Proj1_passwd
	Require valid-user
</Location>

<Location "/projects/Proj2">
	AuthType Basic
	AuthName "trac Proj2"
	AuthUserFile c:\svnrepos\conf\Proj2_passwd
	Require valid-user
</Location>

<Location "/projects/Proj3">
	AuthType Basic
	AuthName "trac Proj3"
	AuthUserFile c:\svnrepos\conf\Proj3_passwd
	Require valid-user
</Location>

SubversionTracリポジトリは同じパスワードファイルを使いBasic認証させます。

最後にrewrite_moduleを有効にします。

#LoadModule rewrite_module modules/mod_rewrite.so
                 ↓
LoadModule rewrite_module modules/mod_rewrite.so

これでApacheを再起動すれば準備OK。

プロジェクトへログイン

上記の設定により各プロジェクトはhttp://[サーバ名]/projects/[プロジェクト名]でアクセスできます。

  • http://[サーバ名]/projects/Proj1
  • http://[サーバ名]/projects/Proj2
  • http://[サーバ名]/projects/Proj3

このときBasic認証のダイアログが表示されるので、所定のユーザ名/パスワードを入力します。ログイン後、リポジトリブラウザをクリックするとimportしたtxtファイルが表示されるます(Proj2ならproj2.txt)。

index.htmlの作成

以上で一応使えるようになりますが、index.htmlもあったほうが便利かな。上記の設定では、http://[サーバ名]/projectsがアクセスされるとc:\www\projects\index.htmlがブラウザに返されます。そこで以下のような内容にしておくと、ポータルっぽくなります。

<html>
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=ISO-2022-JP">
	<title>Trac projects center</title>
</head>
<body>	
	<p>Trac projects center</p>
	<ul>
		<li><a href="Project">http://localhost/projects/Proj1">Project 1</a>
		<li><a href="Project">http://localhost/projects/Proj2">Project 2</a>
		<li><a href="Project">http://localhost/projects/Proj3">Project 3</a>
	</ul>
</body>
</html>

ただ不特定多数がアクセス可能なところにサーバを置く場合は、あまり詳しく書くのはまずいだろう。そういう運用にしたいときは、このページ自体をBasic認証の保護下にすべきなんだろうけど、パスワードが問題か。2回入力させるのもね~。各プロジェクトのパスワードファイルの最大公約数的なものを使うようにすればいいんだろうけど、維持管理がめんどくさそうな。このindex.htmlは使わない運用がスマートかも(をぃ。