/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
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(
135
        root='/srv/example.com/code',
136
        prefix='/code/',
2190.1.4 by John Arbash Meinel
Add ability to enable writeable bzr+http access.
137
        path_var='REQUEST_URI',
138
        readonly=True)
2018.4.1 by Andrew Bennetts
Add WSGI smart server.
139
140
    fcgi.WSGIServer(smart_server_app).run()
141
        
142
The `fcgi` module can be found at http://svn.saddi.com/py-lib/trunk/fcgi.py.  It
143
is part of flup_.
144
145
.. _flup: http://www.saddi.com/software/flup/
146
2180.2.1 by Andrew Bennetts
Describe smart server configuration with mod_python.
147
mod_python
148
~~~~~~~~~~
149
150
We've configured Apache to run the smart server at
151
`/srv/example.com/scripts/bzr-smart.py`.  This is just a simple script we need
152
to write to configure a smart server, and glue it to the mod_python gateway.
153
Here's what it looks like::
154
155
    import modpywsgi
156
    from bzrlib.transport.http import wsgi
157
158
    smart_server_app = wsgi.make_app(
159
        root='/srv/example.com/code',
160
        prefix='/code/',
2190.1.4 by John Arbash Meinel
Add ability to enable writeable bzr+http access.
161
        path_var='REQUEST_URI',
162
        readonly=True)
2180.2.1 by Andrew Bennetts
Describe smart server configuration with mod_python.
163
2190.1.1 by John Arbash Meinel
Update the documentation so the smart server actually works with mod python.
164
    def handler(request):
165
        """Handle a single request."""
166
        wsgi_server = modpywsgi.WSGIServer(smart_server_app)
167
        return wsgi_server.run(request)
2180.2.1 by Andrew Bennetts
Describe smart server configuration with mod_python.
168
        
169
The `modpywsgi` module can be found at http://trac.pocoo.org/wiki/ModPyWsgi.  It
2706.1.3 by Aaron Bentley
Style tweakage and NEWS
170
is part of pocoo_.
171
You sould make sure you place modpywsgi.py in the same directory as
2706.1.1 by Martin Albisetti
updated smart server documentation
172
bzr-smart.py (ie. /srv/example.com/scripts/).
2180.2.1 by Andrew Bennetts
Describe smart server configuration with mod_python.
173
174
.. _pocoo: http://trac.pocoo.org/wiki/
175
2018.4.1 by Andrew Bennetts
Add WSGI smart server.
176
Clients
177
-------
178
179
Now you can use `bzr+http://` URLs, e.g.::
180
181
    bzr log bzr+http://example.com/code/my-branch
182
183
Plain HTTP access should continue to work::
184
185
    bzr log http://example.com/code/my-branch
186
187
188
Advanced configuration
2977.1.1 by Ian Clatworthy
First cut at new look User Guide including chapters 1 and 2
189
----------------------
2018.4.1 by Andrew Bennetts
Add WSGI smart server.
190
191
Because the Bazaar HTTP smart server is a WSGI application, it can be used with
192
any 3rd-party WSGI middleware or server that conforms the WSGI standard.  The
193
only requirements are:
194
195
  * to construct a `SmartWSGIApp`, you need to specify a **root transport** that it
196
    will serve.
197
  * each request's `environ` dict must have a **'bzrlib.relpath'** variable set.
198
199
The `make_app` helper used in the example constructs a `SmartWSGIApp` with a
200
transport based on the `root` path given to it, and calculates the
201
'bzrlib.relpath` for each request based on the `prefix` and `path_var`
202
arguments.  In the example above, it will take the 'REQUEST_URI' (which is set
203
by Apache), strip the '/code/' prefix and the '/.bzr/smart' suffix, and set that
204
as the 'bzrlib.relpath', so that a request for '/code/foo/bar/.bzr/smart' will
205
result in a 'bzrlib.relpath' of 'foo/bzr'.
206
207
It's possible to configure a smart server for a non-local transport, or that
208
does arbitrary path translations, etc, by constructing a `SmartWSGIApp`
209
directly.  Refer to the docstrings of `bzrlib.transport.http.wsgi` and the `WSGI
210
standard`_ for further information.
211
212
.. _WSGI standard: http://www.python.org/dev/peps/pep-0333/
213
2190.1.4 by John Arbash Meinel
Add ability to enable writeable bzr+http access.
214
215
Pushing over ``bzr+http://``
2977.1.1 by Ian Clatworthy
First cut at new look User Guide including chapters 1 and 2
216
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2190.1.4 by John Arbash Meinel
Add ability to enable writeable bzr+http access.
217
218
It is possible to allow pushing data over the http smart server. The
219
easiest way to do this, is to just supply ``readonly=False`` to the
220
``wsgi.make_app()`` call. But be careful, because the smart protocol does
221
not contain any Authentication. So if you enable write support, you will
222
want to restrict access to ``.bzr/smart`` URLs to restrict who can
223
actually write data on your system.  At this time, it is not possible to
224
allow some people to have read-only access and others to have read-write
225
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.
226
Authenticating), everything is just a POST request.  However, it would
227
certainly be possible to have HTTPS require authentication and use a
228
writable server, and plain HTTP allow read-only access.
229
2190.1.4 by John Arbash Meinel
Add ability to enable writeable bzr+http access.
230
2190.1.1 by John Arbash Meinel
Update the documentation so the smart server actually works with mod python.
231
.. 
232
   vim: ft=rst tw=74 et