URAMIRAIKAN

1020のなれの果て (since 2005.6.19)

Mercurialサーバの構築

 以前から、個人的に「Mercurial」をローカルで使用していました。(きっかけは何だったかな?)
 自分はプログラマとかではないのですが、それでも業務では簡単なスクリプトとかはよく作ります。また、Linuxではテキストベースの設定ファイルが多いので、こういったものの変更履歴にもバージョン管理システムが非常に便利だと感じていました。
 で、最近は会社でシンクライアントであったり作業用PCであったり、いろいろな端末を使い分けることが多くなりました。そうなると、気をつけないと作ったファイルとかが分散されていってしまいます。
 通常のファイルは会社のファイルサーバとOffice 365(OneDrive for Business)でやり取りしていますが、前述のスクリプト等の既にMercurialでバージョン管理しているものは、サーバを構築してPushしておけばどこからでも利用できるしバージョン情報も引き継げるので便利じゃないかなと。

 そんなこともあって、サーバを構築した時のメモです。
 (基本的にはネットで見つけた情報そのままですが。)

 基本的にLinux上に構築することにします。
 適当にOSをインストールして、レポジトリ公開に使用するので"Apache"を入れておきます。(自分はCentOS 6.5を使用したので、"yum install httpd httpd-tools mod_ssl"等で入れています。)

 Mercurialはこの辺から最新版が手に入りますが、今回はMercurial自体をインストールするのが目的ではないので、以下のように端折ります。
 (ちなみにyumでもインストールできるのですが、バージョンがちょっと古い。)

# yum install -y gcc python-devel python-setuptools
# easy_install mercurial

 これで"hg"コマンドが使えるようになったので、適当なディレクトリを作成して空のレポジトリを作成します。

# mkdir -p /opt/hg/private_repos
# hg init /opt/hg/private_repos

 作成したレポジトリが外部からの変更(push)を受け入れられるように、"<レポジトリのパス>/.hg/hgrc"に設定ファイルを作成して以下の内容を記述。
 前述のレポジトリなら"/opt/hg/private_repos/.hg/hgrc"ですね。

[web] allow_push=*

 とりあえずレポジトリの準備は完了です。

 続いて公開用にApacheの設定です。
 Mercurialは、pushの時にデフォルトだとSSLが必要です。前述の"hgrc"に「push_ssl=false」とか記載すればSSLなしでも大丈夫なようですが、なんとなく恐いのでSSLは有効にします(証明書はオレオレ証明書で)。

 "httpd.conf"とかの設定は事前にやっておきます。(Mercurialと関係ない部分は省略)
 CGIを使うので"mod_cgi"とかはロードしたり、「AddHandler cgi-script .cgi」を有効にしたり等々(もちろんSSL関係も)。

 Mercurial自体もWEBサーバ機能を持っているのですが、Apache等と連携する場合はCGIを使うみたいです。ここから"hgweb.cgi"をダウンロードしてApacheの公開ディレクトリに配置。
 ファイル中の「config = "/path/to/repo/or/config"」の部分は設定ファイルのパスなので、適当に変更。
 (ここでは"/etc/hgweb.conf"にしておく。)

 設定ファイル"/etc/hgweb.conf"には公開するレポジトリのパスなどを以下のように記載。

[web] encoding = UTF-8 [paths] private_repos = /opt/hg/private_repos

 Apacheがレポジトリをいじれるようにオーナーを変更

# chown -R apache:apache /opt/hg

 あとはApacheで"hgweb.cgi"を公開するための設定を記述します。この時、ただ公開すると誰でも使えてしまうので、BASIC認証をかけます(なので、"htpasswd"でパスワードファイルを適当に作成)。
 いろいろ考えて、バーチャルホストで公開方法を2つに分けて設定しました。レポジトリもいくつか作っています。
 (関係するところのみ抜粋)

# 完全に個人用 DocumentRoot "/opt/www/private_html" ServerName <ホスト名>:443 ErrorLog logs/private-error_log CustomLog logs/private-access_log combined SSLEngine on SSLCertificateFile /etc/httpd/conf/ssl/private_host.crt SSLCertificateKeyFile /etc/httpd/conf/ssl/private_host.key SSLProtocol all -SSLv2 SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW SSLOptions +StdEnvVars AuthUserFile /opt/www/.htpasswd AuthName "Please Enter Your [Mercurial] User Password" AuthType Basic Require valid-user Options Indexes ExecCGI All AllowOverride All Order allow,deny Allow from all SetEnvIf User-Agent ".*MSIE.*" \ nokeepalive ssl-unclean-shutdown \ downgrade-1.0 force-response-1.0 # 公開用(ただしpushのみ認証) DocumentRoot "/opt/www/public_html" ServerName <ホスト名>:443 ErrorLog logs/public-error_log CustomLog logs/public-access_log combined SSLEngine on SSLCertificateFile /etc/httpd/conf/ssl/public_host.crt SSLCertificateKeyFile /etc/httpd/conf/ssl/public_host.key SSLProtocol all -SSLv2 SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW SSLOptions +StdEnvVars AuthUserFile /opt/www/.htpasswd AuthName "Please Enter Your [Mercurial] Public Password" AuthType Basic Require valid-user Options Indexes ExecCGI All AllowOverride All Order allow,deny Allow from all SetEnvIf User-Agent ".*MSIE.*" \ nokeepalive ssl-unclean-shutdown \ downgrade-1.0 force-response-1.0

 これで一応、自分が想定している動作はしているっぽい。
 ただ、"httpd.conf"や"hgrc"は割と適当にやっているので、後でもうちょっと調べながら変更しようと思います。

 あと、自己証明書はやはりデフォルトだと受け付けてくれないので、pushとかクローンとかの時は"hg push --insecure ~"とか"hg clone --insecure ~"とかが必要(TortoiseHgでも同様のオプションがある)。

 しかし世の中では(少なくとも自分の周りでは)gitの方が人気あるのかな?