Trac と Mercurial の連携と Apache_mod_python の構築
今回は、勉強用にEC2を借りて、Ubuntuインスタンスを起動。
そこにTrac + Mercurial の連携、 Apache2のmod_python上での稼働設定をやるろころまで。
最近色々と導入したので、備忘録。
前回借りたAssemblaもいいんですが、プラグインが自由には入れられないし、
完全にプライベートなプロジェクトも作りたかった、さらにTracぐらいインストール出来ておきたい。
自分のマシンに載せるより外にサーバ借りようと思ったので、EC2を借りてみた。
少し高くつくけど、完全に自由に構築できるし、色々勉強になりました。
先に今回の流れを書いておきます。
- AWSアカウント取得とインスタンス起動
- 必要なパッケージの準備
- Tracの日本語版インストール
- Trac+SVNを連携
- Trac+SVNをApache_mod_pythonで起動
- 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
以下の中で必要なものを入れます。
- subversion :SVN-Tracとmercurialのプラグインを落とすのに必要だった
- mercurial :今回の最終目的となる分散SCM
- python-setuptools :Tracのインストールに必要
- unzip :wgetした日本語版Tracを解凍するのに使った
- python-subversion :python用のsubversionライブラリ
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
プラグイン導入
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をApache_mod_pythonで起動
TracをtracdではなくApache2の上で稼働します。
Apache2上での構成は、
と言う感じで、
機能的にもmod_pythonなapacheのより多くの話題が提供されています。
インストール
まずapache-mod-pythonをインストール。
apacheを単体で入れてもいいが、libapache2はインストール時にApacheもインストールしてくれます。
さらに最初に起動した段階で、設定もされているので楽です。
root@ip-xxx-xxx-xxx-xxx:~# sudo apt-get install libapache2-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+SVNをApache_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は単独でサーバ機能を持ってるので、それを使うのもありなんじゃないかと思います。
リポジトリをサーバで動かすのも、モジュール入れて設定を書くだけなので、必要なら他を参照すれば出来るでしょう。
もし僕が必要になってその設定をしたら、ここに書きたいと思います。