Block Rockin’ Codes

back with another one of those block rockin' codes

Trac と Mercurial の連携と Apache_mod_python の構築

今回は、勉強用にEC2を借りて、Ubuntuインスタンスを起動。
そこにTrac + Mercurial の連携、 Apache2のmod_python上での稼働設定をやるろころまで。
最近色々と導入したので、備忘録。


前回借りたAssemblaもいいんですが、プラグインが自由には入れられないし、
完全にプライベートなプロジェクトも作りたかった、さらにTracぐらいインストール出来ておきたい。


自分のマシンに載せるより外にサーバ借りようと思ったので、EC2を借りてみた。
少し高くつくけど、完全に自由に構築できるし、色々勉強になりました。

 先に今回の流れを書いておきます。

  1. AWSアカウント取得とインスタンス起動
  2. 必要なパッケージの準備
  3. Tracの日本語版インストール
  4. Trac+SVNを連携
  5. Trac+SVNApache_mod_pythonで起動
  6. Trac+Mercurial on Apacheが完成

という感じで行きます。
実は最初いきなり、5をやろうとして設定が良くわからなくなり、
一端インスタンスを捨ててやり直しました。
(それが出来るのもEC2のいいところ)


2回目はとにかく常に動く状態を保ちながら、
少しづつ設定を足して行く感じでやったので、遠回りしています。

AWSアカウントを取得し、EC2にUbuntuを起動。

まずはEC2です。アカウントを取るところからやりましたが、その辺は流れだけにして簡単にまとめます。

アカウント取得と起動
  • アカウントを登録
  • カード登録
  • 電話がかかってくる
  • キーペアを作る
  • Elasticfoxを入れる
  • 認証のpemを2個入手
  • インスタンス起動

今回インスタンスは、ubuntu-9.04-jaunty-baseを選びました。

起動するところまでは、この辺の連載企画を見れば出来ます。

起動したUbuntuにログイン

この時点で、.pemファイルは3つあるはずです。
この3つのpemをパーミッション400にします。

% chmod 400 xxxxxxxxx.pem


そしてこの鍵を使ってログイン
ちなみにMac標準のSSHクライアントです。

% ssh -i xxxxxxx.pem root@ec2-xxx.us-west-1.compute.amazonaws.com 

とりあえずパスワードだけ変更して抜ける。

% passwd root
Enter new UNIX password: 
Retype new UNIX password: 
passwd: password updated successfully
% exit
logout
証明書転送

X.509証明書は、ログインで使ったpem以外の2つのpemです。
こちらもパーミッションは400にしておきます。

scpコマンドでインスタンスに転送をするんですが、ここのやりかただと上手く行きませんでした。

% scp pk-xxx.pem root@ec2-xxx.us-west-1.compute.amazonaws.com:/mnt [Enter]

詳しくはこちらを参照
X.509証明書を Amazon EC2に転送する - ハリネズミハックス
正しくは?こう

% scp -i xxx.pem pk-XXX.pem root@ec2-xxx.amazonaws.com:/mnt 


これに従いpkとcertをインスタンスに送る。

% scp -i xxx.pem pk-xxx.pem root@xxx.us-west-1.compute.amazonaws.com:/mnt

pk-xxx.pem       100%  926     0.9KB/s   00:00    

% scp -i xxx.pem cert-xxx.pem root@xxx.us-west-1.compute.amazonaws.com:/mnt 

cert-xxx.pem     100%  916     0.9KB/s   00:00    


再度ログインして、転送できているか確認。

root@ip-xxx:# cd /mnt/
root@ip-xxx:/mnt# ls
cert-xxx.pem
lost+found
pk-xxx.pem

送った.pemがあれば良い。


次にずれいている時間を修正

root@ip-xxx-xxx-xxx-xxx:/# cp /usr/share/zoneinfo/Japan /etc/localtime
root@ip-xxx-xxx-xxx-xxx:/# date

dateコマンドで時間を確認。

必要なパッケージやディレクトリの準備

以下は設定項目を主に書くので、先に必要なパッケージを一通り入れてしまいます。


その前にapt-getとaptitudeをアップグレードしておくといいでしょう。

$apt-get update
$apt-get upgrade
$apt-get check
$sudo aptitude update
$sudo aptitude safe-upgrade

実はいくつかは違いが良くわかってないですが、やっておいて損は無いはずw


以下の中で必要なものを入れます。

root@ip-xxx-xxx-xxx-xxx:/# sudo apt-get install subversion
root@ip-xxx-xxx-xxx-xxx:/# sudo apt-get install mercurial
root@ip-xxx-xxx-xxx-xxx:/# sudo apt-get install python-setuptools
root@ip-xxx-xxx-xxx-xxx:/# sudo apt-get install unzip
root@ip-xxx-xxx-xxx-xxx:/# sudo apt-get install python-subversion


そして今回の作業はこんな感じでディレクトリを構成しています。

/usr/local/src/trac               #Tracのソースを格納
/usr/local/src/Mercurial-plugin   #Mercurialプラグインのソースを格納

/var/trac/svn-project             #Trac-SVNのプロジェクト
/var/trac/hg-project              #Trac-HGのプロジェクト

/var/svn/svn-repo                 #SVNのリポジトリ
/var/hg/hg-repo                   #HGのリポジトリ

Tracの日本語版インストール

日本語化されたTracインタアクト株式会社--業務内容--公開資料から配布されています。
これを/usr/local/src/trac/に落とし、解凍し、インストールします。

root@ip-xxx-xxx-xxx-xxx:/# cd /usr/local/src/
root@ip-xxx-xxx-xxx-xxx:/usr/local/src# mkdir trac
root@ip-xxx-xxx-xxx-xxx:/usr/local/src# cd trac
root@ip-xxx-xxx-xxx-xxx:/usr/local/src/trac# wget http://www.i-act.co.jp/project/products/downloads/Trac-0.11.7.ja1.zip
root@ip-xxx-xxx-xxx-xxx:/usr/local/src/trac# unzip Trac-0.11.7.ja1.zip 
root@ip-xxx-xxx-xxx-xxx:/usr/local/src/trac/Trac-0.11.7.ja1# sudo python setup.py install

これで、Tracのインストールは終わりです。


Trac+SVNを連携

/var/svn/svn-repoにSVNリポジトリを作成します。

root@ip-xxx-xxx-xxx-xxx:/var/svn/myrepo# svnadmin create .

次に/var/trac/svn-projectにプロジェクトを作成します。

root@ip-xxx-xxx-xxx-xxx:/var/trac/svn-project# trac-admin ./ initenv

#質問に答える。

#プロジェクト名をつける。
Project Name [My Project]> svn-project

#プロジェクトデータのDB、省略するとsqliteになる。
Database connection string [sqlite:db/trac.db]> 

#リポジトリのタイプ、省略するとsvn
Repository type [svn]> 

#リポジトリのパス
Path to repository [/path/to/repos]> /var/svn/svn-repo

ためしにtracdで起動、この起動はプロジェクト作成後設定無しで動く。

#tracd --port 8000 /var/trac/svn-project/

 
ちなみに、ec2の場合は、8000番ポートを開ける設定をお忘れなく。


ここで以下のような「svnが見えない」とのエラーが出る場合は、python-subversionを忘れている可能性がある。

Unsupported version control system "svn": "No module named svn"

以下のように入れればいい。再起動が必要な場合もあるようです。

sudo apt-get install python-subversion

SVNと連携はできました。一応このまま次のプラグインをやっておくといいでしょう。

プラグイン導入

twitterでつぶやいたところ、id:hirokinkoさんが助言を下さったので、その通りやる。

「俺的にここが一番大事。 「trac-admin <project name> permission add anonymous TRAC_ADMIN」でanonymousユーザーに管理者権限を付与。」
root@ip-xxx-xxx-xxx-xxx:/var/trac/svn-project# trac-admin /var/trac/svn-project permission add anonymous TRAC_ADMIN
AccountManagerPlugin(http://trac-hacks.org/wiki/AccountManagerPlugin)と
 (続き) IniAdminPlugin(http://trac-hacks.org/wiki/IniAdminPlugin)を入れる。
root@ip-xxx-xxx-xxx-xxx:/usr/local/src/trac# easy_install http://trac-hacks.org/svn/accountmanagerplugin/0.11
root@ip-xxx-xxx-xxx-xxx:/usr/local/src/trac# sudo easy_install http://trac-hacks.org/svn/iniadminplugin/0.11
root@ip-xxx-xxx-xxx-xxx:/var/trac/project-svn/conf# emacs trac.ini
#以下を足す。
[components]
iniadmin.iniadmin.iniadminplugin = enabled

再起動すると、管理の項目にtrac.iniが現れる。

ここまでで、Trac-SVNプラグイン構築完了。


Trac+SVNApache_mod_pythonで起動

TracをtracdではなくApache2の上で稼働します。
Apache2上での構成は、

と言う感じで、
機能的にもmod_pythonapacheのより多くの話題が提供されています。

 

インストール

まずapache-mod-pythonをインストール。
apacheを単体で入れてもいいが、libapache2はインストール時にApacheもインストールしてくれます。
さらに最初に起動した段階で、設定もされているので楽です。

root@ip-xxx-xxx-xxx-xxx:~# sudo apt-get install libapache2-mod-python

これでApacheとmod-pythonが一緒に入る。


tracのプジェクトにapacheがアクセスできるようにする。
要するにApacheのユザーに権限をふる。今回はeduのwww-data

root@ip-xxx-xxx-xxx-xxx:~# chown www-data.www-data -R /var/trac/svn-project
設定

/etc/apache2/httpd.conf に対して設定。

<Location /trac>
   SetHandler mod_python
   PythonHandler trac.web.modpython_frontend 
   PythonOption TracEnvParentDir /var/trac
   PythonOption TracUriRoot /trac
</Location>

これでapacheを再起動すれば
http://host/tracでアクセスできる。

再起動

#/etc/init.d/apache2 stop
#/etc/init.d/apache2 start

(reloadではうまく行かない場合もあるらしい。)

アクセスしてみる。

しかし、

[Errno 13] Permission denied: '/var/trac/.egg-cache'

とのこと

egg-cache用にディレクトリが必要とのことなので作成。
tracのプロジェクトの下に

root@ip-xxx-xxx-xxx-xxx:~# mkdir /var/trac/svn-project/egg-cache

忘れずに権限をふる。
egg-cacheにだけふればいいんだけど、念のためプロジェクトフォルダごとふり直す。

root@ip-xxx-xxx-xxx-xxx:/etc/apache2/sites-available# chown www-data.www-data -R /var/trac/svn-project/

一行加えてegg-cacheを有効に。

<Location /trac>
   SetHandler mod_python
   PythonHandler trac.web.modpython_frontend 
   PythonOption TracEnvParentDir /var/trac
   PythonOption TracUriRoot /trac
   PythonOption PYTHON_EGG_CACHE /var/trac/project-svn/egg-cache
</Location>
認証ファイルを作ってBASIC認証

ファイルを格納するディレクトリ作成

root@ip-xxx-xxx-xxx-xxx:/var# mkdir auth

認証ファイルを作る。
ファイルは.をつけて隠しファイルにしておく。

root@ip-xxx-xxx-xxx-xxx:/var/auth# sudo htpasswd -c .project-hg hg-repo


認証の設定を行う。

/etc/apache2/httpd.comf

<Location /trac>
   SetHandler mod_python
   PythonHandler trac.web.modpython_frontend 
   PythonOption TracEnvParentDir /var/trac
   PythonOption TracUriRoot /trac
   PythonOption PYTHON_EGG_CACHE /var/trac/project-svn/egg-cache
</Location> 

<LocationMatch /trac>
    AuthType Basic
    AuthName "hg-repo"
    AuthUserFile /var/auth/.project-hg
    Require valid-user
</LocationMatch>

これで再起動すると、しょっぱなでログインを聞かれる。
今回は完全に隠したいのでこうする。

tracのログインとからめたいなら。

などとする方が使い勝手はいいかも。


これでTrac+SVNApache_mod_pythonまで完成!

おまけバーチャルホスト設定

おまけで仮想サーバでの設定。
httpd.confではなく、
以下のディレクトリのdefaultファイルを書き換えてしまうと楽。

root@ip-xxx-xxx-xxx-xxx:/etc/apache2/sites-available# emacs default

このdefaultを以下のように書き換えてしまう。

<VirtualHost *:80>

    DocumentRoot /var/trac

    ServerName ec2-204-236-185-210.us-west-1.compute.amazonaws.com

    <Location />

    SetHandler mod_python
    PythonInterpreter main_interpreter
    PythonHandler trac.web.modpython_frontend
    PythonOption TracUriRoot /
	
    PythonOption TracEnvParentDir /var/trac
	PythonOption PYTHON_EGG_CACHE /var/trac/project-svn/egg-cache

    </Location>

</VirtualHost>

Trac + Mercurial

mercurial-pluginを入れる。

svn co http://svn.edgewall.org/repos/trac/plugins/0.11/mercurial-plugin
root@ip-xxx-xxx-xxx-xxx:/usr/local/src# cd mercurial-plugin/
root@ip-xxx-xxx-xxx-xxx:/usr/local/src/mercurial-plugin# sudo python setup.py install

リポジトリを作る
今回は/var/hg/hg-repo を作成してそこに作ります。

#聞かれるのは3つ
#プロジェクト名
Project Name [My Project]> hg-project

#ここは無視
Database connection string [sqlite:db/trac.db]> 		

#ここでhgを入力するとmercurialを指定できる
Repository type [svn]> hg
root@ip-xxx-xxx-xxx-xxx:/var# cd /var/trac/hg-repo/conf/
のtrac.iniに以下を追記
[components]
tracext.hg.* = enabled

#これは書いてあった。
[trac]
repository_type = hg
repository_dir = /home/chrysolite/local/var/hg/hg-repo

[hg]
node_format = short
show_rev = yes

文字化け対策
Trac + Mercurial + Apacheの文字化け対策 - monospace blog
これになれって。
root@ip-xxx-xxx-xxx-xxx:/usr/local/src/mercurial-plugin/tracext/hg#
ここにあるbackend.pyの30行目あたり(importが終わるあたり)に、以下を書く

os.environ["HGENCODING"] = "UTF-8" 


作成したプロジェクトにwww-dataをchownしとく!!!
 

これでApacheを再起動すれば、先ほど作ったSVNと今作ったHGのプロジェクトが両方アクセスできるはずです。
どちらもリポジトリブラウザからリポジトリの中も見られるはずです。

この状態でTracはサーバ上で稼働しましたが、リポジトリはサーバ上ではないので、アクセスはSSHとかが必要です。
また今回はHGをメインで使いたいのですが、Mercurialは単独でサーバ機能を持ってるので、それを使うのもありなんじゃないかと思います。

リポジトリをサーバで動かすのも、モジュール入れて設定を書くだけなので、必要なら他を参照すれば出来るでしょう。
もし僕が必要になってその設定をしたら、ここに書きたいと思います。