~bzr-pqm/bzr/bzr.dev

2018.4.1 by Andrew Bennetts
Add WSGI smart server.
1
Serving Bazaar with FastCGI
2
===========================
3
2293.1.6 by Brad Crittenden
post review changes
4
This document describes one way to set up a Bazaar HTTP smart server,
5
using Apache 2.0 and FastCGI or mod_python.
2018.4.1 by Andrew Bennetts
Add WSGI smart server.
6
2601.1.2 by James Westby
Add a reference to the main smart server documentation.
7
For more information on the smart server, and other ways to configure it
8
see the main `smart server documentation`_.
9
3104.2.5 by Ian Clatworthy
fix some broken links and make doc more Windows user friendly
10
.. _smart server documentation: #running-a-smart-server
2601.1.2 by James Westby
Add a reference to the main smart server documentation.
11
2018.4.1 by Andrew Bennetts
Add WSGI smart server.
12
Example
2977.1.1 by Ian Clatworthy
First cut at new look User Guide including chapters 1 and 2
13
-------
2018.4.1 by Andrew Bennetts
Add WSGI smart server.
14
15
You have a webserver already publishing `/srv/example.com/www/code` as
16
`http://example.com/code/...` with plain HTTP.  It contains bzr branches and
17
directories like `/srv/example.com/www/code/branch-one` and
2018.4.2 by Andrew Bennetts
Add security warning to http_smart_server.txt.
18
`/srv/example.com/www/code/my-repo/branch-two`.  You want to provide read-only
19
smart server access to these directories in addition to the existing HTTP
20
access.
2018.4.1 by Andrew Bennetts
Add WSGI smart server.
21
22
Configuring Apache 2.0
23
----------------------
24
2180.2.1 by Andrew Bennetts
Describe smart server configuration with mod_python.
25
FastCGI
26
~~~~~~~
27
2018.4.1 by Andrew Bennetts
Add WSGI smart server.
28
First, configure mod_fastcgi, e.g. by adding lines like these to your
29
httpd.conf::
30
31
    LoadModule fastcgi_module /usr/lib/apache2/modules/mod_fastcgi.so
32
    FastCgiIpcDir /var/lib/apache2/fastcgi
33
    
34
In our example, we're already serving `/srv/example.com/www/code` at
35
`http://example.com/code`, so our existing Apache configuration would look
36
like::
37
38
    Alias /code /srv/example.com/www/code
39
    <Directory /srv/example.com/www/code>
40
        Options Indexes
41
        # ...
42
    </Directory>
43
44
We need to change it to handle all requests for URLs ending in `.bzr/smart`.  It
45
will look like::
46
47
    Alias /code /srv/example.com/www/code
48
    <Directory /srv/example.com/www/code>
2706.1.1 by Martin Albisetti
updated smart server documentation
49
        Options Indexes FollowSymLinks
2018.4.1 by Andrew Bennetts
Add WSGI smart server.
50
        RewriteEngine On
51
        RewriteBase /code
2190.1.2 by John Arbash Meinel
Need the correct rewrite rule to get .bzr at the root of the exposed directory.
52
        RewriteRule ^(.*/|)\.bzr/smart$ /srv/example.com/scripts/bzr-smart.fcgi
2018.4.1 by Andrew Bennetts
Add WSGI smart server.
53
    </Directory>
54
    
2018.4.5 by Andrew Bennetts
Improvement thanks to John's review.
55
    # bzr-smart.fcgi isn't under the DocumentRoot, so Alias it into the URL
56
    # namespace so it can be executed.
2018.4.1 by Andrew Bennetts
Add WSGI smart server.
57
    Alias /srv/example.com/scripts/bzr-smart.fcgi /srv/example.com/scripts/bzr-smart.fcgi
58
    <Directory /srv/example.com/scripts>
59
        Options ExecCGI
60
        <Files bzr-smart.fcgi>
61
            SetHandler fastcgi-script
62
        </Files>
63
    </Directory>
64
    
65
This instructs Apache to hand requests for any URL ending with `/.bzr/smart`
66
inside `/code` to a Bazaar smart server via FastCGI.
67
68
Refer to the mod_rewrite_ and mod_fastcgi_ documentation for further
69
information.
70
71
.. _mod_rewrite: http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html
72
.. _mod_fastcgi: http://www.fastcgi.com/mod_fastcgi/docs/mod_fastcgi.html
73
2180.2.1 by Andrew Bennetts
Describe smart server configuration with mod_python.
74
mod_python
75
~~~~~~~~~~
76
77
First, configure mod_python, e.g. by adding lines like these to your
78
httpd.conf::
79
80
    LoadModule python_module /usr/lib/apache2/modules/mod_python.so
81
82
Define the rewrite rules with mod_rewrite the same way as for FastCGI, except
83
change::
84
2190.1.2 by John Arbash Meinel
Need the correct rewrite rule to get .bzr at the root of the exposed directory.
85
    RewriteRule ^(.*/|)\.bzr/smart$ /srv/example.com/scripts/bzr-smart.fcgi
2180.2.1 by Andrew Bennetts
Describe smart server configuration with mod_python.
86
87
to::
88
2190.1.2 by John Arbash Meinel
Need the correct rewrite rule to get .bzr at the root of the exposed directory.
89
    RewriteRule ^(.*/|)\.bzr/smart$ /srv/example.com/scripts/bzr-smart.py
2180.2.1 by Andrew Bennetts
Describe smart server configuration with mod_python.
90
91
Like with mod_fastcgi, we also define how our script is to be handled::
92
93
    Alias /srv/example.com/scripts/bzr-smart.py /srv/example.com/scripts/bzr-smart.py
94
    <Directory /srv/example.com/scripts>
95
        <Files bzr-smart.py>
96
            PythonPath "sys.path+['/srv/example.com/scripts']"
97
            AddHandler python-program .py
2190.1.1 by John Arbash Meinel
Update the documentation so the smart server actually works with mod python.
98
            PythonHandler bzr-smart::handler
2180.2.1 by Andrew Bennetts
Describe smart server configuration with mod_python.
99
        </Files>
100
    </Directory>
101
102
This instructs Apache to hand requests for any URL ending with `/.bzr/smart`
103
inside `/code` to a Bazaar smart server via mod_python.
104
2706.1.3 by Aaron Bentley
Style tweakage and NEWS
105
NOTE: If you don't have bzrlib in your PATH, you will be need to change the
106
following line::
2706.1.1 by Martin Albisetti
updated smart server documentation
107
108
            PythonPath "sys.path+['/srv/example.com/scripts']"
109
2706.1.3 by Aaron Bentley
Style tweakage and NEWS
110
To::
2706.1.1 by Martin Albisetti
updated smart server documentation
111
112
            PythonPath "['/path/to/bzr']+sys.path+['/srv/example.com/scripts']"
113
114
2180.2.1 by Andrew Bennetts
Describe smart server configuration with mod_python.
115
Refer to the mod_python_ documentation for further information.
116
117
.. _mod_python: http://www.modpython.org/
118
119
2018.4.1 by Andrew Bennetts
Add WSGI smart server.
120
Configuring Bazaar
121
------------------
122
2180.2.1 by Andrew Bennetts
Describe smart server configuration with mod_python.
123
FastCGI
124
~~~~~~~
125
2018.4.1 by Andrew Bennetts
Add WSGI smart server.
126
We've configured Apache to run the smart server at
127
`/srv/example.com/scripts/bzr-smart.fcgi`.  This is just a simple script we need
128
to write to configure a smart server, and glue it to the FastCGI gateway.
129
Here's what it looks like::
130
131
    import fcgi
132
    from bzrlib.transport.http import wsgi
133
134
    smart_server_app = wsgi.make_app(
3702.3.1 by Jonathan Lange
Update the location of modpywsgi and the location of pocoo.
135
        root='/srv/example.com/www/code',
2018.4.1 by Andrew Bennetts
Add WSGI smart server.
136
        prefix='/code/',
2190.1.4 by John Arbash Meinel
Add ability to enable writeable bzr+http access.
137
        path_var='REQUEST_URI',
3708.1.3 by Marius Kruger
note extra options to wsgi.make_app in docs
138
        readonly=True,
139
        load_plugins=True, 
140
        enable_logging=True)
2018.4.1 by Andrew Bennetts
Add WSGI smart server.
141
142
    fcgi.WSGIServer(smart_server_app).run()
143
        
144
The `fcgi` module can be found at http://svn.saddi.com/py-lib/trunk/fcgi.py.  It
145
is part of flup_.
146
147
.. _flup: http://www.saddi.com/software/flup/
148
2180.2.1 by Andrew Bennetts
Describe smart server configuration with mod_python.
149
mod_python
150
~~~~~~~~~~
151
152
We've configured Apache to run the smart server at
153
`/srv/example.com/scripts/bzr-smart.py`.  This is just a simple script we need
154
to write to configure a smart server, and glue it to the mod_python gateway.
155
Here's what it looks like::
156
157
    import modpywsgi
158
    from bzrlib.transport.http import wsgi
159
160
    smart_server_app = wsgi.make_app(
3702.3.1 by Jonathan Lange
Update the location of modpywsgi and the location of pocoo.
161
        root='/srv/example.com/www/code',
2180.2.1 by Andrew Bennetts
Describe smart server configuration with mod_python.
162
        prefix='/code/',
2190.1.4 by John Arbash Meinel
Add ability to enable writeable bzr+http access.
163
        path_var='REQUEST_URI',
3708.1.3 by Marius Kruger
note extra options to wsgi.make_app in docs
164
        readonly=True,
165
        load_plugins=True, 
166
        enable_logging=True)
2180.2.1 by Andrew Bennetts
Describe smart server configuration with mod_python.
167
2190.1.1 by John Arbash Meinel
Update the documentation so the smart server actually works with mod python.
168
    def handler(request):
169
        """Handle a single request."""
170
        wsgi_server = modpywsgi.WSGIServer(smart_server_app)
171
        return wsgi_server.run(request)
2180.2.1 by Andrew Bennetts
Describe smart server configuration with mod_python.
172
        
3702.3.1 by Jonathan Lange
Update the location of modpywsgi and the location of pocoo.
173
The `modpywsgi` module can be found at
174
http://dev.pocoo.org/projects/pocoo/browser/pocoo/wrappers/modpy.py. It is
175
part of pocoo_. You sould make sure you place modpywsgi.py in the same
176
directory as bzr-smart.py (ie. /srv/example.com/scripts/).
2180.2.1 by Andrew Bennetts
Describe smart server configuration with mod_python.
177
3702.3.1 by Jonathan Lange
Update the location of modpywsgi and the location of pocoo.
178
.. _pocoo: http://dev.pocoo.org/projects/pocoo/
2180.2.1 by Andrew Bennetts
Describe smart server configuration with mod_python.
179
2018.4.1 by Andrew Bennetts
Add WSGI smart server.
180
Clients
181
-------
182
183
Now you can use `bzr+http://` URLs, e.g.::
184
185
    bzr log bzr+http://example.com/code/my-branch
186
187
Plain HTTP access should continue to work::
188
189
    bzr log http://example.com/code/my-branch
190
191
192
Advanced configuration
2977.1.1 by Ian Clatworthy
First cut at new look User Guide including chapters 1 and 2
193
----------------------
2018.4.1 by Andrew Bennetts
Add WSGI smart server.
194
195
Because the Bazaar HTTP smart server is a WSGI application, it can be used with
196
any 3rd-party WSGI middleware or server that conforms the WSGI standard.  The
197
only requirements are:
198
199
  * to construct a `SmartWSGIApp`, you need to specify a **root transport** that it
200
    will serve.
201
  * each request's `environ` dict must have a **'bzrlib.relpath'** variable set.
202
203
The `make_app` helper used in the example constructs a `SmartWSGIApp` with a
204
transport based on the `root` path given to it, and calculates the
205
'bzrlib.relpath` for each request based on the `prefix` and `path_var`
206
arguments.  In the example above, it will take the 'REQUEST_URI' (which is set
207
by Apache), strip the '/code/' prefix and the '/.bzr/smart' suffix, and set that
208
as the 'bzrlib.relpath', so that a request for '/code/foo/bar/.bzr/smart' will
209
result in a 'bzrlib.relpath' of 'foo/bzr'.
210
211
It's possible to configure a smart server for a non-local transport, or that
212
does arbitrary path translations, etc, by constructing a `SmartWSGIApp`
213
directly.  Refer to the docstrings of `bzrlib.transport.http.wsgi` and the `WSGI
214
standard`_ for further information.
215
216
.. _WSGI standard: http://www.python.org/dev/peps/pep-0333/
217
2190.1.4 by John Arbash Meinel
Add ability to enable writeable bzr+http access.
218
219
Pushing over ``bzr+http://``
2977.1.1 by Ian Clatworthy
First cut at new look User Guide including chapters 1 and 2
220
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2190.1.4 by John Arbash Meinel
Add ability to enable writeable bzr+http access.
221
222
It is possible to allow pushing data over the http smart server. The
223
easiest way to do this, is to just supply ``readonly=False`` to the
224
``wsgi.make_app()`` call. But be careful, because the smart protocol does
225
not contain any Authentication. So if you enable write support, you will
226
want to restrict access to ``.bzr/smart`` URLs to restrict who can
227
actually write data on your system.  At this time, it is not possible to
228
allow some people to have read-only access and others to have read-write
229
access to the same urls. Because at the HTTP layer (which is doing the
2190.1.7 by John Arbash Meinel
Comment that https:// is a good way to have a writable URL next to a read-only http:// url.
230
Authenticating), everything is just a POST request.  However, it would
231
certainly be possible to have HTTPS require authentication and use a
232
writable server, and plain HTTP allow read-only access.
233
2190.1.4 by John Arbash Meinel
Add ability to enable writeable bzr+http access.
234
2190.1.1 by John Arbash Meinel
Update the documentation so the smart server actually works with mod python.
235
.. 
236
   vim: ft=rst tw=74 et