~bzr-pqm/bzr/bzr.dev

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
Apache を使って Bazaar サーバーをたてる
=========================================

このドキュメントでは、 Apache 2.0 と FastCGI, mod_python, mod_wsgi の
どれかを利用して Bazaar の HTTP スマートサーバーをセットアップする方法を
説明します。

スマートサーバーに関する詳細な情報とそれを設定する他の方法に関しては、
`スマートサーバーのドキュメント <server.html>`_ を参照してください。

例
---

プレーンなHTTPで `/srv/example.com/www/code` を `http://example.com/code/...` として
すでに公開しているとします。これはbzrのブランチと `/srv/example.com/www/code/branch-one`
と `/srv/example.com/www/code/my-repo/branch-two` のようなディレクトリを含みます。
既存のHTTP形式のアクセス権限に加えてリードオンリーのスマートサーバーのアクセス権限を
これらのディレクトリに提供したい場合を考えます。

Apache 2.0を設定する
--------------------

FastCGI
~~~~~~~

最初に、mod_fastcgiを設定します。たとえば次の行をhttpd.confに追加します::

    LoadModule fastcgi_module /usr/lib/apache2/modules/mod_fastcgi.so
    FastCgiIpcDir /var/lib/apache2/fastcgi
    
我々の例では、`http://example.com/code` で `/srv/example.com/www/code` をすでに提供しているので
既存のApacheの設定は次のようになります::

    Alias /code /srv/example.com/www/code
    <Directory /srv/example.com/www/code>
        Options Indexes
        # ...
    </Directory>

.bzr/smartの形式で終わるURLに対するすべてのリクエストを扱うために
次のように変更する必要があります::

    Alias /code /srv/example.com/www/code
    <Directory /srv/example.com/www/code>
        Options Indexes FollowSymLinks
        RewriteEngine On
        RewriteBase /code
        RewriteRule ^(.*/)?\.bzr/smart$ /srv/example.com/scripts/bzr-smart.fcgi
    </Directory>
    
    # bzr-smart.fcgiはDocumentRootの元に存在しないので、実行されるように
    # AliasはこれをURLの名前空間のエイリアスにする。
    Alias /srv/example.com/scripts/bzr-smart.fcgi /srv/example.com/scripts/bzr-smart.fcgi
    <Directory /srv/example.com/scripts>
        Options ExecCGI
        <Files bzr-smart.fcgi>
            SetHandler fastcgi-script
        </Files>
    </Directory>
    
この設定はFastCGIを通して `/code` 内部の `/.bzr/smart` で終わるURLに対する
Bazaarのスマートサーバーへのリクエストを扱うようにApacheに指示します。

詳細な情報は mod_rewrite_ と mod_fastcgi_ のドキュメントを参照してください。

.. _mod_rewrite: http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html
.. _mod_fastcgi: http://www.fastcgi.com/mod_fastcgi/docs/mod_fastcgi.html

mod_python
~~~~~~~~~~

最初に、次のようなコードを httpd.conf に追加して mod_python を設定します::

    LoadModule python_module /usr/lib/apache2/modules/mod_python.so

FastCGI と同じ方法で mod_rewrite を用いて書き換えルールを定義します::

    RewriteRule ^(.*/)?\.bzr/smart$ /srv/example.com/scripts/bzr-smart.fcgi

変更は次のようになります::

    RewriteRule ^(.*/)?\.bzr/smart$ /srv/example.com/scripts/bzr-smart.py

mod_fastcgi のように、スクリプトがどのように扱われるのかも定義します::

    Alias /srv/example.com/scripts/bzr-smart.py /srv/example.com/scripts/bzr-smart.py
    <Directory /srv/example.com/scripts>
        <Files bzr-smart.py>
            PythonPath "sys.path+['/srv/example.com/scripts']"
            AddHandler python-program .py
            PythonHandler bzr-smart::handler
        </Files>
    </Directory>

この設定は mod_python を通して `/code` 内部の `/.bzr/smart` で終わるURLに対するリクエストを
Bazaar のスマートサーバーに渡すように指示します。

注: bzrlib が PATH の中に存在しない場合、次の行を変更する必要があります::

            PythonPath "sys.path+['/srv/example.com/scripts']"

変更後は次のようになります::

            PythonPath "['/path/to/bzr']+sys.path+['/srv/example.com/scripts']"


詳細な情報は mod_python_ のドキュメントを参照してください。

.. _mod_python: http://www.modpython.org/


mod_wsgi
~~~~~~~~

最初に、 a2enmod wsgi などで mod_wsgi を有効にしておきます。
次に、 `.bzr/smart` で終わる全ての URL に対するリクエストを mod_wsgi 経由
で処理するように設定します。設定例は次のようになります。 ::

    WSGIScriptAliasMatch ^/code/.*/\.bzr/smart$ /srv/example.com/scripts/bzr.wsgi

    #The three next lines allow regular GETs to work too
    RewriteEngine On
    RewriteCond %{REQUEST_URI} !^/code/.*/\.bzr/smart$
    RewriteRule ^/code/(.*/\.bzr/.*)$ /srv/example.com/www/code/$1 [L]

    <Directory /srv/example.com/www/code>
        WSGIApplicationGroup %{GLOBAL}
    </Directory>

この設定では、 Apache は `/code` 以下の `/.bzr/smart` で終わる URL に
対する全てのリクエストを WSGI 経由で Bazaar のスマートサーバーに渡し、
それ以外の全てのリクエストは Apache が直接扱うようにしています。

詳細は mod_wsgi_ のドキュメントを参照してください。

.. _mod_wsgi: http://code.google.com/p/modwsgi/

Bazaarを設定する
-----------------

FastCGI
~~~~~~~

`/srv/example.com/scripts/bzr-smart.fcgi` でスマートサーバーを実行するためにApacheを設定しました。
これはスマートサーバーを設定するために書く必要のある単なるシンプルなスクリプトで
サーバーをFastCGIのゲートウェイに結びつけます。次のようになります::

    import fcgi
    from bzrlib.transport.http import wsgi

    smart_server_app = wsgi.make_app(
        root='/srv/example.com/www/code',
        prefix='/code/',
        path_var='REQUEST_URI',
        readonly=True,
        load_plugins=True,
        enable_logging=True)

    fcgi.WSGIServer(smart_server_app).run()
        
 `fcgi` のモジュールはhttp://svn.saddi.com/py-lib/trunk/fcgi.pyで見つかります。
これは flup_ の一部です。

.. _flup: http://www.saddi.com/software/flup/

mod_python
~~~~~~~~~~

`/srv/example.com/scripts/bzr-smart.py` でスマートサーバーを実行するためにApacheを設定しました。
これはスマートサーバーを設定するために書く必要のあるシンプルなスクリプトでサーバーをmod_pythonの
ゲートウェイに結びつけます。次のようになります::

    import modpywsgi
    from bzrlib.transport.http import wsgi

    smart_server_app = wsgi.make_app(
        root='/srv/example.com/www/code',
        prefix='/code/',
        path_var='REQUEST_URI',
        readonly=True,
        load_plugins=True,
        enable_logging=True)

    def handler(request):
        """Handle a single request."""
        wsgi_server = modpywsgi.WSGIServer(smart_server_app)
        return wsgi_server.run(request)
        
`modpywsgi` モジュールは
http://ice.usq.edu.au/svn/ice/trunk/apps/ice-server/modpywsgi.py で見つかります。
これは pocoo_ の一部でした。 modpywsgi.py を bzr-smart.py と同じディレクトリ
(すなわち/srv/example.com/scripts/)に設置していることを確認してください。

.. _pocoo: http://dev.pocoo.org/projects/pocoo/


mod_wsgi
~~~~~~~~

We've configured Apache to run the smart server at
`/srv/example.com/scripts/bzr.wsgi`.  This is just a simple script we need
to write to configure a smart server, and glue it to the WSGI gateway.
Here's what it looks like::

    from bzrlib.transport.http import wsgi

    def application(environ, start_response):
        app = wsgi.make_app(
            root="/srv/example.com/www/code/",
            prefix="/code",
            readonly=True,
            enable_logging=False)
        return app(environ, start_response)

クライアント
------------

これで `bzr+http://` 形式のURLやただの `http://` のURLを利用できます::

    bzr log bzr+http://example.com/code/my-branch

プレーンなHTTP形式のアクセスも持続します::

    bzr log http://example.com/code/my-branch


高度な設定
-----------

BazaarのHTTPスマートサーバーはWSGIアプリケーションなので、
WSGI標準に準拠するサードパーティのWSGIのミドルウェアもしくはサーバーで利用できます。
唯一の要件は以下のとおりです:

  * `SmartWSGIApp` をコンストラクトするためには、それが提供する **root transport** を指定する必要があります。
  * それぞれのリクエストの `environ` dict は **'bzrlib.relpath'** 変数の設定を持たなければなりません。

この例で使われている `make_app` ヘルパーは それに渡される `root` パスに基づいたトランスポートを伴う
`SmartWSGIApp` をコンストラクトし、引数 `prefix` と`path_var` に基づくそれぞれのリクエストに対する
 `bzrlib.relpath` を算出します。
上記の例において、これは (Apacheによって設定される)'REQUEST_URI' を取り、接頭辞の '/code/' と接尾辞の '/.bzr/smart' 
をはぎ取り、それを 'bzrlib.relpath' として設定するので、 '/code/foo/bar/.bzr/smart' に対するリクエストは
'foo/bzr' の 'bzrlib.relpath' になります。

`SmartWSGIApp` を直接コンストラクトすることで、ローカルではないトランスポートに対して
スマートサーバーを設定するもしくは任意任意のパスの変換を行うことは可能です。
詳細な情報に関しては `bzrlib.transport.http.wsgi` のdocstringsと `WSGI標準`_ を参照してください。

.. _WSGI標準: http://www.python.org/dev/peps/pep-0333/


HTTP スマートサーバー経由で push する
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

HTTP スマートサーバーを通してデータをプッシュすることは可能です。
これを行うための最も簡単な方法は、 ``wsgi.make_app()`` コールに ``readonly=False`` を
提供するだけです。ただし、スマートプロトコルは認証機能が含まれないので注意してください。
書き込みのサポートを有効にする場合、
実際にシステム上のデータを書き込みできる人を制限するために、 ``.bzr/smart``
URLへの権限を制限するとよいでしょう。例えば Apache で次のような設定を
します。 ::

    <Location /code>
        AuthType Basic
        AuthName "example"
        AuthUserFile /srv/example.com/conf/auth.passwd
        <LimitExcept GET>
            Require valid-user
        </LimitExcept>
    </Location>


現時点では、同じURLに対して読み込み限定の人と読み込みと書き込みの人を
分けることはできません。
(認証を行う)HTTPレイヤーにおいて、すべては単なるPOSTリクエストだからです。
しかしながら、HTTPSアクセスの場合に認証が必要な書き込みサーバーを使い、
プレーンなHTTPは読み込み限定のアクセスを許可することはできます。

HTTPS サイトに対してアクセスしたときに bzr が次のようなエラーを表示する
場合::

  bzr: ERROR: Connection error: curl connection error (server certificate verification failed.
  CAfile:/etc/ssl/certs/ca-certificates.crt CRLfile: none)

You can workaround it by using ``https+urllib`` rather than ``http`` in your
URL, or by uninstalling pycurl.  See `bug 82086`_ for more details.

URL に ``https`` の代わりに ``https+urllib`` を使うことで問題を回避
できます。
詳細については `bug 82086`_ を参照してください。

.. _bug 82086: https://bugs.launchpad.net/bzr/+bug/82086


.. 
   vim: ft=rst tw=74 et