comparison doc/installation.txt @ 7464:82bbb95e5690 issue2550923_computed_property

merge from tip into issue2550923_computed_property
author John Rouillard <rouilj@ieee.org>
date Thu, 08 Jun 2023 00:10:32 -0400
parents feb970243b97
children a072331c843b
comparison
equal deleted inserted replaced
7045:ca90f7270cd4 7464:82bbb95e5690
17 17
18 18
19 Overview 19 Overview
20 ======== 20 ========
21 21
22 Broken out separately, there are several conceptual pieces to a 22 A Roundup installation is made up of several pieces.
23 Roundup installation: 23
24 Roundup scripts
25 These include the Roundup HTTP server, email gateway, administration
26 command-line interface, demo installer etc. These are usually placed
27 in a directory that is on your path.
28
29 Roundup core code
30 Is installed into your Python's lib directory. We recommend
31 using a virtual environment for your Roundup installation.
24 32
25 Roundup trackers 33 Roundup trackers
26 Trackers consist of issues (be they bug reports or otherwise), tracker 34 Trackers consist of issues (be they bug reports or otherwise). Each tracker
27 configuration file(s), web HTML files etc. Roundup trackers are initialised 35 is put in its own directory (called a tracker home) and has its own:
28 with a "Template" which defines the fields usable/assignable on a 36
29 per-issue basis. Descriptions of the provided templates are given in 37 * configuration files,
30 `choosing your template`_. 38 * HTML (web) files,
31 39 * database,
32 Roundup support code 40 * logic files (detectors, schema, ...)
33 Installed into your Python install's lib directory. 41
34 42 Roundup trackers are initialised with a "template" which defines the
35 Roundup scripts 43 fields usable/assignable on a per-issue basis. Descriptions of the
36 These include the email gateway, the roundup 44 provided templates are given in `choosing your template`_. Usually
37 HTTP server, the roundup administration command-line interface, etc. 45 you start with a template then modify the tracker to implement your
38 46 desired workflow. One Roundup instalation can support multiple
47 trackers with different look/feel and workflow.
48
49 For The Really Impatient
50 ========================
51
52 If you just want to give Roundup a whirl **Right Now**, follow these
53 directions to run ``demo.py``. Demo mode starts the `classic tracker`_
54 without installing Roundup on your system. If you have Docker
55 installed, you can run `demo mode using docker`_ instead.
56
57 This is also a way to spin up a development environment or even
58 deploy a tracker for a handful of users.
59
60 You can choose different templates and backend databases using demo
61 mode. For example replacing ``demo.py`` (or ``demo`` if you are using
62 docker) with::
63
64 demo jinja2 anydbm
65
66 will start the tracker using the jinja2 template with the dbm database
67 backend (rather then the default sqlite). See `Choosing Your
68 Template`_ for a description of available templates.
69
70 (In the directions below, replace ``-2.2.0`` with the version number
71 of the file you downloaded. On systems that don't have a ``python3``
72 program you can run ``python demo.py`` instead.)
73
74 .. _install the source:
75
76 1. ``python3 -m pip download roundup``
77 2. ``tar -xzvf roundup-2.2.0.tar.gz``
78
79 * if you don't have a tar command, ``python3 -c 'import tarfile, sys; tarfile.open(sys.argv[1]).extractall();' roundup-2.2.0.tar.gz`` can be used.
80
81 3. ``cd roundup-2.2.0``
82 4. ``python3 demo.py``
83
84 This will set up a classic demo tracker on your machine without
85 installing Roundup. [1]_ When it's done, it'll print out a URL for
86 your web browser at so you can explore a Roundup tracker. Three users
87 are set up:
88
89 1. anonymous - the "default" user with permission to do very little
90 2. demo (password "demo") - a normal user who may create issues
91 3. admin (password "admin") - an administrative user who has complete
92 access to the tracker
93
94 Note the demo tracker removes the detector (nosyreaction.py) that
95 sends email notifications. If you later convert your demo tracker to
96 production you will need to replace the detector to send notification
97 emails.
98
99 Once you install Roundup, you can use the ``roundup-demo`` command to
100 install new demo trackers.
101
102 .. [1] Demo tracker is set up to be accessed by localhost browser.
103 If you run demo on a server host, please stop the demo (using
104 Control-C) after it has shown the startup notice, open file
105 ``demo/config.ini`` with your editor, change host name in
106 the ``web`` option in section ``[tracker]``, save the file,
107 then re-run the demo.py program.
108
109 .. _demo mode using docker:
110
111 Running in Demo Mode with Docker
112 --------------------------------
113
114 You can either:
115
116 * use a published container from hub.docker.com with
117 ``rounduptracker/roundup:latest``
118
119 and start demo mode with::
120
121 docker run --rm -p 127.0.0.1:8917:8080 --name roundup_demo -v \
122 $PWD:/usr/src/app/tracker rounduptracker/roundup:latest demo
123
124 or
125
126 * Use steps 1-3 to `install the source`_ then
127
128 * build a local docker container using::
129
130 docker build -t roundup-app -f scripts/Docker/Dockerfile .
131
132 (see `Docker Support`_ and `Building a Docker Container`_ for more
133 details)
134
135 and start demo mode with::
136
137 docker run --rm -p 127.0.0.1:8917:8080 --name roundup_demo -v \
138 $PWD:/usr/src/app/tracker roundup-app:latest demo
139
140 This will create a ``demo`` subdirectory which is your tracker's
141 home. It will also print the URL for exploring your new tracker.
142
143 .. caution::
144 Removing ``127.0.0.1:`` will make the tracker accessible from any
145 host with network access to your system. However the URL's created by
146 Roundup will still reference ``localhost`` unless you modify the
147 ``web`` url in the ``tracker`` section of ``config.ini`` and restart
148 the container [1]_.
149
150 In the docker run command we used port 8917 for Roundup. When starting
151 Roundup, Docker may report a long error ending with: `bind: address
152 already in use.` This means that port 8917 is in use. When running
153 inside a Docker container, demo mode is unable to automatically find a
154 free port. You have to provide an unused port to ``-p``.
155
156 To fix this, you can change the change the port mapping provided
157 with ``-p``. If you do this you **must** set the docker PORT_8080
158 environment variable on the command line to match. (If Docker
159 ever fixes https://github.com/moby/moby/issues/3778 we won't need
160 to worry about this.)
161
162 For example::
163
164 docker run --rm -e PORT_8080=9090 -p 127.0.0.1:9090:8080 -v \
165 --name roundup_demo $PWD:/usr/src/app/tracker \
166 rounduptracker/roundup:latest demo
167
168 will run Roundup on port 9090 and Roundup will generate the correct
169 URL.
170
171 To shut down the tracker and get your shell back, use control-c. You
172 can remove the tracker using ``rm -f`` on the ``demo`` directory.
39 173
40 Prerequisites 174 Prerequisites
41 ============= 175 =============
42 176
43 Roundup requires Python 2.7 or 3.4 or newer with a functioning 177 Roundup requires Python 2.7 [3]_ or 3.6 or newer with a functioning anydbm
44 anydbm module. Download the latest version from https://www.python.org/. 178 or sqlite module. The version installed by most vendors should work if
45 It is highly recommended that users install the latest patch version 179 it meets the version requirements. If necessary, you can download the
46 of python as these contain many fixes to serious bugs. 180 latest version from https://www.python.org/. It is highly recommended
181 that users install the latest patch version of Python as these contain
182 many fixes to serious bugs.
47 183
48 Some variants of Linux will need an additional "python dev" package 184 Some variants of Linux will need an additional "python dev" package
49 installed for Roundup installation to work. Debian and derivatives, are 185 installed for Roundup installation to work. Debian and derivatives, are
50 known to require this. 186 known to require this.
51 187
52 Optional Components 188 Optional Components
53 =================== 189 ===================
54 190
55 You may optionally install and use: 191 You may optionally install and use:
192
193 An RDBMS
194 Sqlite, MySQL and Postgresql are all supported by Roundup and will be
195 used if available. One of these is recommended if you are anticipating a
196 large user base (see `choosing your backend`_ below). Sqlite should
197 always be available.
56 198
57 Timezone Definitions 199 Timezone Definitions
58 Full timezone support requires pytz_ module (version 2005i or later) 200 Full timezone support requires pytz_ module (version 2005i or later)
59 which brings the `Olson tz database`_ into Python. If pytz_ is not 201 which brings the `Olson tz database`_ into Python. If pytz_ is not
60 installed, timezones may be specified as numeric hour offsets only. 202 installed, timezones may be specified as numeric hour offsets only.
61 This is optional but strongly suggested. 203 This is optional but strongly suggested.
62 204
63 An RDBMS
64 Sqlite, MySQL and Postgresql are all supported by Roundup and will be
65 used if available. One of these is recommended if you are anticipating a
66 large user base (see `choosing your backend`_ below).
67
68 .. index:: roundup-admin:: reindex subcommand
69
70 Xapian full-text indexer 205 Xapian full-text indexer
71 The Xapian_ full-text indexer is also supported and will be used by 206 The Xapian_ full-text indexer is also supported and will be used by
72 default if it is available. This is strongly recommended if you are 207 default if it is available. This is strongly recommended if you are
73 anticipating a large number of issues (> 5000). 208 anticipating a large number of issues (> 5000).
74 209
78 213
79 Roundup requires Xapian 1.0.0 or newer. 214 Roundup requires Xapian 1.0.0 or newer.
80 215
81 Note that capitalization is not preserved by the Xapian search. 216 Note that capitalization is not preserved by the Xapian search.
82 This is required to make the porter stemmer work so that searching 217 This is required to make the porter stemmer work so that searching
83 for silent also returns documents with the word silently. Note that 218 for ``silent`` also returns documents with the word ``silently``.
84 the current stemming implementation is designed for English. 219 Note that the current stemming implementation is designed for English.
85 220
86 Whoosh full-text indexer 221 Whoosh full-text indexer
87 The Whoosh_ full-text indexer is also supported and will be used by 222 The Whoosh_ full-text indexer is also supported and will be used by
88 default if it is available (and Xapian is not installed). This is 223 default if it is available (and Xapian is not installed). This is
89 recommended if you are anticipating a large number of issues (> 5000). 224 recommended if you are anticipating a large number of issues (> 5000).
93 You may install Whoosh at any time, even after a tracker has been 228 You may install Whoosh at any time, even after a tracker has been
94 installed and used. You will need to run the "roundup-admin reindex" 229 installed and used. You will need to run the "roundup-admin reindex"
95 command if the tracker has existing data. 230 command if the tracker has existing data.
96 231
97 Roundup was tested with Whoosh 2.5.7, but earlier versions in the 232 Roundup was tested with Whoosh 2.5.7, but earlier versions in the
98 2.0 series may work. Whoosh is a pure python indexer so it is slower 233 2.0 series may work. Whoosh is a pure Python indexer so it is slower
99 than Xapian, but should be useful for moderately sized trackers. 234 than Xapian, but should be useful for moderately sized trackers.
100 It uses the StandardAnalyzer which is suited for Western languages. 235 It uses the StandardAnalyzer which is suited for Western languages.
101 236
102 pyopenssl 237 pyopenssl
103 If pyopenssl_ is installed the roundup-server can be configured 238 If pyopenssl_ is installed the roundup-server can be configured
114 jinja2 249 jinja2
115 To use the jinja2 template (may still be experimental, check out 250 To use the jinja2 template (may still be experimental, check out
116 its TEMPLATE-INFO.txt file) you need 251 its TEMPLATE-INFO.txt file) you need
117 to have the jinja2_ template engine installed. 252 to have the jinja2_ template engine installed.
118 253
119 pyjwt
120 To use jwt tokens for login (experimental), install `pyjwt`_
121 (v1.7.1, v2.0.1 tested). If you don't have it installed, jwt
122 tokens are not supported.
123
124 docutils 254 docutils
125 To use ReStructuredText rendering you need to have the `docutils`_ 255 To use ReStructuredText rendering you need to have the `docutils`_
126 package installed. 256 package installed.
127 257
128 markdown, markdown2 or mistune 258 markdown, markdown2 or mistune
132 zstd, brotli 262 zstd, brotli
133 To have roundup compress the returned data using one of these 263 To have roundup compress the returned data using one of these
134 algorithms, you can install one or more of zstd_ or brotli_. 264 algorithms, you can install one or more of zstd_ or brotli_.
135 Roundup's responses can always be compressed with gzip from the 265 Roundup's responses can always be compressed with gzip from the
136 Python standard library. Also nginx and various wsgi server can 266 Python standard library. Also nginx and various wsgi server can
137 compress the response from roundup as they transmit/proxy it to the 267 compress the response from Roundup as they transmit/proxy it to the
138 client. 268 client.
139 269
140 redis 270 redis
141 Storing ephemeral data: session keys, CSRF tokens etc. can be 271 Storing ephemeral data: session keys, CSRF tokens etc. can be
142 performance bottleneck. You can choose to deploy a Redis_ database 272 performance bottleneck. You can choose to deploy a Redis_ database
143 using the redis-py_ pypi package. See the section on 273 using the redis-py_ pypi package. See the section on
144 `Using Redis for Session Databases`_ in the `administration 274 `Using Redis for Session Databases`_ in the `administration
145 guide`_ for details. 275 guide`_ for details.
146 276
277 pyjwt
278 To use JWT (JSON web tokens) for login (experimental), install `pyjwt`_
279 (v1.7.1, v2.0.1 tested). If you don't have it installed, JWT's
280 are not supported.
281
147 Windows Service 282 Windows Service
148 You can run Roundup as a Windows service if pywin32_ is installed. 283 You can run Roundup as a Windows service if pywin32_ is installed.
149 Otherwise it must be started manually. 284 Otherwise it must be started manually.
150 285
286 requests
287 If you are using OAuth authentication with the roundup-mailgw
288 mail gateway you must install the requests_ library.
289
151 .. _Using Redis for Session Databases: 290 .. _Using Redis for Session Databases:
152 admin_guide.html#using-redis-for-session-databases 291 admin_guide.html#using-redis-for-session-databases
153 292
154 Getting Roundup 293 .. [3] Do not use Python 2 for new installs. The continuous
155 =============== 294 integration and other services used for developing Roundup
156 295 are dropping support for Python 2. Also optional packages
157 .. note:: 296 are dropping Python 2 support. As a result Python 2 may
158 Some systems, such as Gentoo and NetBSD, already have Roundup 297 not be supported for many more release cycles.
159 installed. Try running the command "roundup-admin" with no arguments, 298
160 and if it runs you may skip the `Basic Installation Steps`_ 299 Installing Roundup
161 below and go straight to `configuring your first tracker`_. 300 ==================
162 However they may install an old version, so you are probably 301
163 beter off installing it from the roundup web site or pypi. 302 To get a production installation running will take 15-30 minutes. If
164 303 you want to spend less than 5 minutes to test Roundup without
165 Download the latest version from https://www.roundup-tracker.org/. 304 installing it, see `For The Really Impatient`_.
166 305
167 For The Really Impatient 306 .. note:: Some systems, such as Gentoo and NetBSD, already have
168 ======================== 307 Roundup installed. Try running the command "roundup-admin
169 308 -v". If it runs and reports the current version, you may
170 If you just want to give Roundup a whirl Right Now, then simply unpack 309 skip the `Standard installation`_ below and go straight to
171 and run ``demo.py`` (it will be available as ``roundup-demo`` script 310 `configuring your first tracker`_. However it may be an old
172 after installation). (On systems that don't provide a ``python3`` 311 version. If so you should probably install it in a virtual
173 program you might need to run ``python demo.py``.) 312 environment from the Roundup web site or pypi.
174 313
175 This will set up a simple demo tracker on your machine. [1]_ 314 If Roundup is not installed on your system, or needs to be updated,
176 When it's done, it'll print out a URL to point your web browser at 315 there are multiple ways to install Roundup.
177 so you may start playing. Three users will be set up: 316
178 317 * `Standard installation`_ using pip in a Virtual Environment is the
179 1. anonymous - the "default" user with permission to do very little 318 recommended standard.
180 2. demo (password "demo") - a normal user who may create issues 319 * `Installing from downloaded source`_ allows more control over how
181 3. admin (password "admin") - an administrative user who has complete 320 things are installed (including overwriting a vendor install). But
182 access to the tracker 321 it also increases complexity as well.
183 322 * Use a prebuilt docker container from
184 .. [1] Demo tracker is set up to be accessed by localhost browser. 323 ``rounduptracker/roundup:latest`` and follow the steps in
185 If you run demo on a server host, please stop the demo when 324 `Running Your Container`_.
186 it has shown startup notice, open file ``demo/config.ini`` with 325 * Install in a docker container by downloading the source
187 your editor, change host name in the ``web`` option in section 326 and following the steps in `Docker Support`_.
188 ``[tracker]``, save the file, then re-run the demo.py program. 327
189 328 There are several steps to get Roundup serving a tracker:
190 Installation 329
191 ============ 330 1. Install using one of the methods listed above.
192 331 2. Configure your tracker following `configuring your first tracker`_
193 Set aside 15-30 minutes. There's several steps to follow in your 332 for all install methods.
194 installation: 333 3. Optionally `configure a web interface`_.
195 334 4. Optionally `configure an email interface`_.
196 1. `basic installation steps`_ if Roundup is not installed on your system 335 5. Follow `UNIX environment steps`_ to restrict local access to
197 2. `configuring your first tracker`_ that all installers must follow 336 Roundup if you're installing on a shared UNIX system.
198 3. then optionally `configure a web interface`_ 337
199 4. and optionally `configure an email interface`_ 338 For information about what Roundup installs, see the
200 5. `UNIX environment steps`_ to take if you're installing on a shared 339 `What does Roundup install`_ section in the `administration guide`_.
201 UNIX machine and want to restrict local access to roundup 340
202 341
203 For information about how Roundup installs, see the `administration 342 Standard Installation
204 guide`_. 343 ----------------------
205
206 The following assumes that you are using the source distribution.
207
208 Basic Installation Steps
209 ------------------------
210 344
211 Installation of Roundup using Python3 in a virtual environment is 345 Installation of Roundup using Python3 in a virtual environment is
212 probably the path of least resistance. Use:: 346 recommended. Use::
213 347
214 python3 -m venv /path/to/environment/roundup 348 python3 -m venv /path/to/environment/roundup
215 349
216 then proceed as below after activating (assuming a Bourne like shell) 350 Activate the Python environment (assuming a Bourne like shell)
217 the Python environment using:: 351 using::
218 352
219 . /path/to/environment/roundup/bin/activate 353 . /path/to/environment/roundup/bin/activate
220 354
221 then use the alias ``deactivate`` to return to the normal Python 355 To install the released Roundup core code into your Python tree and
222 environment. If you create the virtual envirnment as a non-root user, 356 Roundup scripts into ``/path/to/environment/roundup/usr/bin`` run::
223 you can install below using the same user. 357
224 358 python3 -m pip install roundup
225 To install the Roundup support code into your Python tree and Roundup 359
226 scripts into /usr/bin (substitute that path for whatever is 360 If everything went well, you should now be able to run::
227 appropriate on your system). You need to have write permissions for 361
228 these locations, so you may need to run wthese commands with ``sudo`` 362 roundup-admin help
229 if root permission is required:: 363
230 364 and see the help text.
231 python setup.py install 365
366 If you want to run Roundup commands in the future without
367 activating the virtual environment, just call the commands using the
368 full path. For example::
369
370 /path/to/environment/roundup/usr/bin/roundup-admin
371
372 You can use the command ``deactivate`` to return to the normal
373 Python environment. However, for now continue with
374 `configuring your first tracker`_.
375
376 .. _downloaded and unpacked the source:
377
378 Installing from downloaded source
379 ---------------------------------
380
381 In general you should be installing from a released Roundup version
382 into a virtual environment.
383
384 .. _current development version: ../code.html
385
386 If you are installing a `current development version`_ or are a
387 developer or are an expert you can use the manual installation method
388 from a source install. From the unpacked source distribution, run::
389
390 sudo python3 setup.py install
391
392 which will put the Roundup core code into your systems Python tree and
393 the command scripts into ``/usr/bin``
232 394
233 If you would like to place the Roundup scripts in a directory other 395 If you would like to place the Roundup scripts in a directory other
234 than ``/usr/bin``, then specify the preferred location with 396 than ``/usr/bin``, then specify the preferred location with
235 ``--install-scripts``. For example, to install them in 397 ``--install-scripts``. For example, to install them in
236 ``/opt/roundup/bin``:: 398 ``/opt/roundup/bin``::
237 399
238 python setup.py install --install-scripts=/opt/roundup/bin 400 sudo python setup.py install --install-scripts=/opt/roundup/bin
239 401
240 You can also use the ``--prefix`` option to use a completely different 402 You can also use the ``--prefix`` option to install roundup into a
241 base directory, if you do not want to use administrator rights. If you 403 completely different base directory. If you choose to do this, you
242 choose to do this, you may have to change Python's search path (sys.path) 404 will have to change Python's search path (sys.path) yourself.
243 yourself.
244
245 Docker Support
246 ~~~~~~~~~~~~~~
247
248 If you don't want to install it natively, you can create a Docker
249 container. This installs roundup using the `stand-alone web server`_
250 method. This is an http only install so we suggest putting an https
251 terminating proxy in front of it.
252
253 This is a work in progress and patches to improve it are welcome. You
254 can find the docker config files under the `scripts/Docker` directory
255 of the source tree.
256
257 The dockerized Roundup includes database drivers for anydbm, sqlite,
258 MySQL and Postgresql (Postgresl is untested). It also includes
259 additional libraries that are listed in
260 `scripts/Docker/requirements.txt`.
261
262 Email support is a work in progress. Outgoing email should work given
263 an external SMTP server. Receiving email should work by using a
264 scheduled (cron) job to access email:
265
266 * `As a regular job using a mailbox source`_
267 * `As a regular job using a POP source`_
268 * `As a regular job using an IMAP source`_
269
270 Patches for better email support are welcome.
271
272 If you want to use a MySQL backend, the `docker-compose.yml` file will
273 deploy a Roundup container and a MySQL container backend for use with
274 Roundup.
275
276 Building a Docker Container
277 ^^^^^^^^^^^^^^^^^^^^^^^^^^^
278
279 To build a docker container using the code in the current directory,
280 run this build command from the top of the source tree::
281
282 docker build -t roundup-app -f scripts/Docker/Dockerfile .
283
284 You can also build a container using the newest Roundup release on
285 PyPI, by running::
286
287 docker build -t roundup-app --build-arg="source=pypi" \
288 -f scripts/Docker/Dockerfile .
289
290 The docker declares a single volume mounted at
291 ``/usr/src/app/tracker`` inside the container. You will mount your
292 tracker home directory at this location. The ``/usr/src/app`` path can
293 be changed by using ``--build-arg="appdir=/new/path"``.
294
295 You can also add additional modules to the docker container by using
296 `--build-arg="pip_mod=requests setproctitle"`.
297
298 Because of deficiencies in the docker program (see:
299 https://github.com/moby/moby/issues/29110#issuecomment-1100676306),
300 there is no way to determine the version of Python inside the
301 container and make that available as part of the build process. If
302 your build fails because the ``pythonversion does not match``, add the
303 suggested ``--build-arg`` to the ``docker build`` command line.
304
305 By default the container runs Roundup using UID 1000. By setting
306 `--build-arg="roundup_uid=2000"` you can change the UID.
307
308 Configuring Roundup in the Container
309 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
310
311 Once the docker is created using one of the build commands above, run
312 an interactive session it with::
313
314 docker run -it --rm -p 9017:8080 \
315 -v $PWD/tracker:/usr/src/app/tracker roundup-app:latest
316
317 The ``-v`` option maps a directory from the host into the docker
318 container. Note that uid 1000 is used by roundup by default. The uid
319 of the directory (and all files under it) must match the uid. You can
320 set the UID at image build time, see above. This
321 example assumes your tracker configs are in the tracker
322 subdirectory. Replace ``$PWD/tracker`` with the full path name to the
323 directory where the tracker home(s) are to be stored.
324
325 The ``-p`` option maps an external port (9017) to proxy the roundup
326 server running at port 8080 to the outside.
327
328 If the tracker directory is empty, the docker container will prompt
329 you to install a tracker template and prompt you for the database
330 type.
331
332 Then you need to configure the tracker by editing
333 ``template/config.ini``. Make sure that the tracker web setting ends
334 in ``/issues/`` See `Configuring your first tracker` and the top of
335 ``config.ini`` for other settings.
336
337 Once you have configured the tracker, run another interactive session
338 with::
339
340 docker run --rm -it -p 9017:8080 \
341 -v $PWD/tracker:/usr/src/app/tracker roundup-app:latest
342
343 this will initialize the database and attempt to start the server. If
344 that is successful, use control-c to exit the server.
345
346 Now start the server non-interactively (note no `-it` option) with::
347
348 docker run -p 9017:8080 \
349 -v $PWD/tracker:/usr/src/app/tracker roundup-app:latest
350
351 Your tracker will be available at: ``http://yourhost:9017/issues/``.
352
353 If you need to access your container while the server is running you
354 can use::
355
356 docker exec -it c0d5 sh
357
358 where ``c0d5`` is the id prefix for the running container obtained
359 from ``docker container ls``.
360
361 If you add ``-e SHELL_DEBUG=1`` to the docker command, it sets the
362 ``SHELL_DEBUG`` environment variable which will enable debugging
363 output from the startup script.
364
365 Non-Guided Installation
366 '''''''''''''''''''''''
367
368 If you got a tracker installed using the automatic setup above, you
369 can skip this section. To manually install and initialize the
370 trackers, you can get a shell without starting the roundup-server
371 using::
372
373 docker run -it \
374 -v $PWD/tracker:/usr/src/app/tracker \
375 --entrypoint sh roundup-app:latest
376
377 Now you can configure your tracker using ``roundup-admin -i tracker``
378 using the directions for `Configuring your first tracker`.
379
380 Defining Multiple Trackers
381 ^^^^^^^^^^^^^^^^^^^^^^^^^^
382
383 If you want to run multiple trackers, create a subdirectory for each
384 tracker home under the volume mount point (``$PWD/tracker``). Then
385 invoke ``docker run`` passing the roundup-server tracker
386 specifications like::
387
388 docker run --rm -p 9017:8080 \
389 -v /.../issue.tracker:/usr/src/app/tracker \
390 roundup-app:latest tracker1=tracker/tracker1_home \
391 tracker2=tracker/tracker2_home
392
393 This will set up two trackers that can be reached at
394 ``http://yourhost:9017/tracker1/`` and ``http://yourhost:9017/tracker2/``.
395 The arguments after roundup-app:latest are tracker paths that are
396 passed to roundup-server.
397
398 Docker-compose Deployment
399 ^^^^^^^^^^^^^^^^^^^^^^^^^
400
401 If you want to run using the mysql backend, you can use docker-compose
402 with ``scripts/Docker/docker-compose.yml``. This will run Roundup and
403 MySQL in containers. Directions for building using docker-compose are
404 at the top of the yml file.
405 405
406 Configuring your first tracker 406 Configuring your first tracker
407 ------------------------------ 407 ==============================
408
409 Make sure the ``roundup-admin`` script location is on your ``PATH``
410 evironment variable. This is done automatically when you activate a
411 virtual environment. You can also specify the full path to the command
412 in the following steps.
408 413
409 1. To create a Roundup tracker (necessary to do before you can 414 1. To create a Roundup tracker (necessary to do before you can
410 use the software in any real fashion), you need to set up a "tracker 415 use the software in any real fashion), you need to set up a "tracker
411 home": 416 home":
412 417
414 under one top level directory which does not exist yet, 419 under one top level directory which does not exist yet,
415 you should create that directory now. Example:: 420 you should create that directory now. Example::
416 421
417 mkdir /opt/roundup/trackers 422 mkdir /opt/roundup/trackers
418 423
419 b. Either add the Roundup script location to your ``PATH``
420 environment variable or specify the full path to
421 the command in the next step.
422
423 .. index:: roundup-admin; install subcommand 424 .. index:: roundup-admin; install subcommand
424 425
425 c. Install a new tracker with the command ``roundup-admin install``. 426 b. Install a new tracker with the command ``roundup-admin install``.
426 You will be asked a series of questions. Descriptions of the provided 427 You will be asked a series of questions. Descriptions of the provided
427 templates can be found in `choosing your template`_ below. Descriptions 428 templates can be found in `choosing your template`_ below. Descriptions
428 of the available backends can be found in `choosing your backend`_ 429 of the available backends can be found in `choosing your backend`_
429 below. The questions will be something like (you may have more 430 below. The questions will be something like (you may have more
430 templates or backends available):: 431 templates or backends available)::
437 438
438 Note: "Back ends" selection list depends on availability of 439 Note: "Back ends" selection list depends on availability of
439 third-party database modules. Standard python distribution 440 third-party database modules. Standard python distribution
440 includes anydbm and sqlite module only. 441 includes anydbm and sqlite module only.
441 442
442 The "support" part of the tracker name can be anything you want - it 443 The "support" part of the tracker home can be anything you want - it
443 is going to be used as the directory that the tracker information 444 is the directory where the tracker information will be stored.
444 will be stored in.
445 445
446 You will now be directed to edit the tracker configuration and 446 You will now be directed to edit the tracker configuration and
447 initial schema. At a minimum, you must set "tracker :: web", 447 initial schema. At a minimum, you must set "tracker :: web"
448 (that's the "web" option in the "tracker" section),
448 "mail :: host", and "mail :: domain". You should also 449 "mail :: host", and "mail :: domain". You should also
449 set "main :: admin_email" (that's the "admin_email" option in 450 set "main :: admin_email" to your local admin address to get email
450 the "main" section) to your local admin address to get email
451 on unusual occurances. If you get stuck, 451 on unusual occurances. If you get stuck,
452 and get configuration file errors, then see the `tracker 452 and get configuration file errors, then see the `tracker
453 configuration`_ section of the `customisation documentation`_. 453 configuration`_ section of the `reference documentation`_.
454 454
455 If you just want to get set up to test things quickly (and follow 455 If you just want to get set up to test things quickly (and follow
456 the instructions in step 3 below), you can even just set the 456 the instructions in step 3 below), you can even just set the
457 "tracker :: web" variable to:: 457 "tracker :: web" variable to::
458 458
459 web = http://localhost:8080/support/ 459 web = http://localhost:8080/support/
460 460
461 The URL *must* end in a '/', or your web interface *will not work*. 461 The URL *must* end in a '/', or your web interface *will not work*.
462 See `Customising Roundup`_ for details on configuration and schema 462 See the `Roundup reference`_ for details on configuration and schema
463 changes. You may change any of the configuration after 463 changes. You may change any of the configuration after
464 you've initialised the tracker - it's just better to have valid values 464 you've initialised the tracker - it's just better to have valid values
465 for this stuff now. 465 for this stuff now.
466 466
467 .. index:: roundup-admin; initialise subcommand 467 .. index:: roundup-admin; initialise subcommand
468 468
469 d. Initialise the tracker database with ``roundup-admin initialise``. 469 c. Initialise the tracker database with ``roundup-admin initialise``.
470 You will need to supply an admin password at this step. You will be 470 You will need to supply an admin password at this step. You will be
471 prompted:: 471 prompted::
472 472
473 Admin Password: 473 Admin Password:
474 Confirm: 474 Confirm:
476 Note: running this command will *destroy any existing data in the 476 Note: running this command will *destroy any existing data in the
477 database*. In the case of MySQL and PostgreSQL, any existing database 477 database*. In the case of MySQL and PostgreSQL, any existing database
478 will be dropped and re-created. 478 will be dropped and re-created.
479 479
480 Once this is done, the tracker has been created. See the note in 480 Once this is done, the tracker has been created. See the note in
481 the user_guide on how to initialise a tracker without being 481 the `administration guide`_ on how to :ref:`initialise a
482 prompted for the password or exposing the password on the command 482 tracker without being prompted for the password <initpw>` or
483 line. 483 exposing the password on the command line.
484 484
485 2. At this point, your tracker is set up, but doesn't have a nice user 485 2. At this point, your tracker is set up, but doesn't have a nice user
486 interface. To set that up, we need to `configure a web interface`_ and 486 interface. To set that up, we need to `configure a web interface`_ and
487 optionally `configure an email interface`_. If you want to try your 487 optionally `configure an email interface`_. If you want to try your
488 new tracker out, assuming "tracker :: web" is set to 488 new tracker out, assuming the ``web`` setting in the
489 ``[tracker]`` [4]_ section of config.ini is set to
489 ``'http://localhost:8080/support/'``, run:: 490 ``'http://localhost:8080/support/'``, run::
490 491
491 roundup-server support=/opt/roundup/trackers/support 492 roundup-server support=/opt/roundup/trackers/support
492 493
493 then direct your web browser at: 494 then direct your web browser at:
495 http://localhost:8080/support/ 496 http://localhost:8080/support/
496 497
497 and you should see the tracker interface. 498 and you should see the tracker interface.
498 499
499 To run your tracker on some interface other than 127.0.0.1 and port 500 To run your tracker on some interface other than 127.0.0.1 and port
500 8080 (make sure you change the "tracker :: web" changes to match) use:: 501 8080 (make sure you change the "tracker :: web" option to match) use::
501 502
502 roundup-server -p 1080 -n 0.0.0.0 support=/opt/roundup/trackers/support 503 roundup-server -p 1080 -n 0.0.0.0 support=/opt/roundup/trackers/support
503 504
504 to run the server at port 1080 and bind to all ip addresses on your system. 505 to run the server at port 1080 and bind to all ip addresses on your system.
505 Then direct your web browser to ``http://your_host_name:1080/support``. 506 Then direct your web browser to ``http://your_host_name:1080/support/``.
507
508 .. [4] The rest of the documentation uses the abbreviated form "tracker ::
509 web" for specifying a section and setting.
506 510
507 Choosing Your Template 511 Choosing Your Template
508 ---------------------- 512 ----------------------
509 513
514 Roundup ships with 5 templates. A description of each follows. When
515 Roundup is installed, you can also get a description of available
516 templates using ``roundup-admin templates``. You can use this to view
517 additional templates that you create or download.
518
519 .. _classic tracker:
520
510 Classic Template 521 Classic Template
511 ~~~~~~~~~~~~~~~~ 522 ~~~~~~~~~~~~~~~~
512 523
513 The classic template is the one defined in the `Roundup Specification`_. It 524 The classic template is the one defined in the `Roundup
514 holds issues which have priorities and statuses. Each issue may also have a 525 Specification`_. It holds issues which have priorities and
515 set of messages which are disseminated to the issue's list of nosy users. 526 statuses. Each issue may also have a set of messages which are
527 disseminated to the issue's list of nosy users.
516 528
517 Minimal Template 529 Minimal Template
518 ~~~~~~~~~~~~~~~~ 530 ~~~~~~~~~~~~~~~~
519 531
520 The minimal template has the minimum setup required for a tracker 532 The minimal template has the minimum setup required for a tracker
521 installation. That is, it has the configuration files, defines a user database 533 installation. That is, it has the configuration files, defines a user
522 and the basic HTML interface to that. It's a completely clean slate for you to 534 database and the basic HTML interface to that. It's a completely clean
523 create your tracker on. 535 slate for you to create your tracker on.
536
537 Other Templates
538 ~~~~~~~~~~~~~~~
539
540 There are three other templates distributed with Roundup:
541
542 devel
543 This is a generic issue tracker that may be used to track bugs,
544 feature requests, project issues or any number of other types of
545 issues. Most users of Roundup will find that this template suits
546 them, with perhaps a few customisations.
547
548 responsive
549 This issue tracker uses the same schema as devel. The difference
550 between devel and responsive templates is the use of Twitter
551 bootstrap (https://github.com/twbs/bootstrap) in templates and
552 HTML5 markup. Make sure the "static_files" setting in your
553 config.ini of your instance is set to the directory where the
554 static files live (the subdirectory "static" in the default of the
555 template).
556
557 jinja2
558 This is a generic issue tracker based on classic schema. It uses
559 Jinja2 for templating and Twitter bootstrap for responsive markup.
560 You will need jinja and gettext for this to work. See the wiki
561 page https://wiki.roundup-tracker.org/Jinja2 for updates
562 between releases.
563
564 Also other people have listed their trackers for different needs at:
565 https://wiki.roundup-tracker.org/TrackerTemplates.
524 566
525 .. index:: database; choosing your backend 567 .. index:: database; choosing your backend
526 568
527 Choosing Your Backend 569 Choosing Your Backend
528 --------------------- 570 ---------------------
532 574
533 ========== =========== ===== ============================== 575 ========== =========== ===== ==============================
534 Name Speed Users Support 576 Name Speed Users Support
535 ========== =========== ===== ============================== 577 ========== =========== ===== ==============================
536 anydbm Slowest Few Always available 578 anydbm Slowest Few Always available
537 sqlite Fastest(*) Few May need install (PySQLite_) 579 sqlite Fastest Few Always available
538 postgresql Fast Many Needs install/admin (psycopg2_) 580 postgresql Fast Many Needs install/admin (psycopg2_)
539 mysql Fast Many Needs install/admin (MySQLdb_) 581 mysql Fast Many Needs install/admin (MySQLdb_)
540 ========== =========== ===== ============================== 582 ========== =========== ===== ==============================
541 583
542 **sqlite** 584 **sqlite**
575 In the case of MySQL and PostgreSQL you will need to have the appropriate 617 In the case of MySQL and PostgreSQL you will need to have the appropriate
576 privileges to create databases. 618 privileges to create databases.
577 619
578 620
579 Configure a Web Interface 621 Configure a Web Interface
580 ------------------------- 622 =========================
581 623
582 There are multiple web interfaces to choose from: 624 There are multiple ways to deploy the web interface. If your
625 tracker will be heavily used and accessible from the internet, we
626 suggest using Apache or Nginx in WSGI mode or as a reverse proxy
627 to the stand alone web server or WSGI server like Gunicorn.
628
629 A FastCGI deployment with an alternate web server is suitable for
630 lower traffic sites.
631
632 If you already run Zope, Roundup should deploy nicely in that
633 framework.
634
635 If you are internet accessible, but expect a few users, or are on
636 a hosted web server, using cgi-bin is a reasonable deployment.
637
638 Using a true HTTP server provide tools including: DOS prevention,
639 throttling, web application firewalls etc. that are worth having
640 in an internet facing application.
641
642 If you are running on an internal intranet, you can use the
643 stand alone server: roundup-server, but even in this environment,
644 using a real web server to serve static files and other resources
645 will perform better.
583 646
584 .. contents:: 647 .. contents::
585 :depth: 1 648 :depth: 1
586 :local: 649 :local:
587 650
590 configure your system in some way - see `platform-specific notes`_. 653 configure your system in some way - see `platform-specific notes`_.
591 654
592 .. index:: pair: web interface; cgi 655 .. index:: pair: web interface; cgi
593 656
594 Web Server cgi-bin 657 Web Server cgi-bin
595 ~~~~~~~~~~~~~~~~~~ 658 ------------------
596 659
597 A benefit of using the cgi-bin approach is that it's the easiest way to 660 A benefit of using the cgi-bin approach is that it's the easiest way to
598 restrict access to your tracker to only use HTTPS. Access will be slower 661 restrict access to your tracker to only use HTTPS. Access will be slower
599 than through the `stand-alone web server`_ though. 662 than through the `stand-alone web server`_ though.
600 663
601 If your Python isn't installed as "python" then you'll need to edit 664 If your Python isn't installed as "python" then you'll need to edit
602 the ``roundup.cgi`` script to fix the first line. 665 the ``roundup.cgi`` script to fix the first line.
603 666
667 .. index:: windows; IIS cgi installation
668
604 If you're using IIS on a Windows platform, you'll need to run this command 669 If you're using IIS on a Windows platform, you'll need to run this command
605 for the cgi to work (it turns on the PATH_INFO cgi variable):: 670 for the cgi to work (it turns on the PATH_INFO cgi variable)::
606 671
607 adsutil.vbs set w3svc/AllowPathInfoForScriptMappings TRUE 672 adsutil.vbs set w3svc/AllowPathInfoForScriptMappings TRUE
608 673
610 or ``c:\winnt\system32\inetsrv\adminsamples\`` or 675 or ``c:\winnt\system32\inetsrv\adminsamples\`` or
611 ``c:\winnt\system32\inetsrv\adminscripts\`` depending on your installation. 676 ``c:\winnt\system32\inetsrv\adminscripts\`` depending on your installation.
612 677
613 See: 678 See:
614 679
615 https://docs.microsoft.com/en-us/iis/web-dev-reference/server-variables 680 https://learn.microsoft.com/en-us/iis/web-dev-reference/server-variables
616 681
617 More information about ISS setup may be found at: 682 More information about ISS setup may be found at:
618 683
619 https://docs.microsoft.com/en-us/iis/ 684 https://docs.microsoft.com/en-us/iis/
620 685
621 Copy the ``frontends/roundup.cgi`` file to your web server's ``cgi-bin`` 686 Copy the ``share/roundup/cgi-bin/roundup-cgi``
622 directory. You will need to configure it to tell it where your tracker home 687 (``frontends/roundup.cgi`` in source tree) file to your web
623 is. You can do this either: 688 server's ``cgi-bin`` directory. You will need to configure it to
689 tell it where your tracker home is. You can do this either:
624 690
625 Through an environment variable 691 Through an environment variable
626 Set the variable TRACKER_HOMES to be a colon (":") separated list of 692 Set the variable TRACKER_HOMES to be a colon (":") separated list of
627 name=home pairs (if you're using apache, the SetEnv directive can do this) 693 name=home pairs (if you're using apache, the SetEnv directive can do this)
628 694
645 SetHandler cgi-script 711 SetHandler cgi-script
646 </Location> 712 </Location>
647 713
648 714
649 CGI-bin for Limited-Access Hosting 715 CGI-bin for Limited-Access Hosting
650 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 716 ----------------------------------
651 717
652 If you are running in a shared-hosting environment or otherwise don't have 718 If you are running in a shared-hosting environment or otherwise don't have
653 permission to edit the system web server's configuration, but can create a 719 permission to edit the system web server's configuration, but can create a
654 ``.htaccess`` file then you may be able to use this approach. 720 ``.htaccess`` file then you may be able to use this approach.
655 721
688 stub to get some debugging information. 754 stub to get some debugging information.
689 755
690 .. index:: pair: web interface; stand alone server 756 .. index:: pair: web interface; stand alone server
691 757
692 Stand-alone Web Server 758 Stand-alone Web Server
693 ~~~~~~~~~~~~~~~~~~~~~~ 759 ----------------------
694 760
695 This approach will give you faster response than cgi-bin. You may 761 This approach will give you faster response than cgi-bin. You may
696 investigate using ProxyPass or similar configuration in apache to have your 762 investigate using ProxyPass or similar configuration in apache to have your
697 tracker accessed through the same URL as other systems. 763 tracker accessed through the same URL as other systems.
698 764
765 The stand alone serveris used by the Docker image.
766
699 The stand-alone web server is started with the command ``roundup-server``. It 767 The stand-alone web server is started with the command ``roundup-server``. It
700 has several options - display them with ``roundup-server -h``. 768 has several options - display them with ``roundup-server -h``.
701 769
702 The tracker home configuration is similar to the cgi-bin - you may either edit 770 The tracker home configuration is similar to the cgi-bin - you may either edit
703 the script to change the TRACKER_HOMES variable or you may supply the 771 the script to change the TRACKER_HOMES variable or you may supply the
708 776
709 777
710 .. index:: pair: web interface; Zope 778 .. index:: pair: web interface; Zope
711 779
712 Zope Product - ZRoundup 780 Zope Product - ZRoundup
713 ~~~~~~~~~~~~~~~~~~~~~~~ 781 -----------------------
714 782
715 ZRoundup installs as a regular Zope product. Copy the ZRoundup directory to 783 ZRoundup installs as a regular Zope product. Copy the
716 your Products directory either in INSTANCE_HOME/Products or the Zope 784 ``share/roundup/frontends/ZRoundup`` (frontends/ZRoundup in the
717 code tree lib/python/Products. 785 source tree) directory to your Products directory either in
786 INSTANCE_HOME/Products or the Zope code tree lib/python/Products.
718 787
719 When you next (re)start up Zope, you will be able to add a ZRoundup object 788 When you next (re)start up Zope, you will be able to add a ZRoundup object
720 that interfaces to your new tracker. 789 that interfaces to your new tracker.
721 790
722 .. index:: ! triple: web interface; apache; mod_wsgi 791 .. index:: ! triple: web interface; apache; mod_wsgi
723 ! single: wsgi; apache 792 ! single: wsgi; apache
724 793
725 Apache HTTP Server with mod_wsgi 794 Apache HTTP Server with mod_wsgi
726 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 795 --------------------------------
727 796
728 This is a work in progress thanks to Garth Jensen. 797 This is a work in progress thanks to Garth Jensen.
729 798
730 See the main web site for `mod_wsgi`_ which include directions for 799 See the main web site for `mod_wsgi`_ which include directions for
731 using mod_wsgi-express which is easier if you are not used to apache 800 using mod_wsgi-express which is easier if you are not used to apache
732 configuration. Also there is the 801 configuration. Also there is the
733 `main mod_wsgi <https://modwsgi.readthedocs.io/en/develop/>`_ for more 802 `main mod_wsgi <https://modwsgi.readthedocs.io/en/develop/>`_ for more
734 detailed directions. 803 detailed directions.
735 804
736 Background 805 Background
737 ^^^^^^^^^^ 806 ~~~~~~~~~~
738 807
739 These notes were developed on a Microsoft Azure VM running Ubuntu 808 These notes were developed on a Microsoft Azure VM running Ubuntu
740 18.04 LTS. The instructions below assume: 809 18.04 LTS. The instructions below assume:
741 810
742 - python and roundup are already installed 811 - python and roundup are already installed
746 home directory of a user called ``admin``. Thus, the absolute path to 815 home directory of a user called ``admin``. Thus, the absolute path to
747 the tracker home directory is ``/home/admin/trackers/mytracker``. 816 the tracker home directory is ``/home/admin/trackers/mytracker``.
748 - the server has a static public IP address of 11.11.11.101 817 - the server has a static public IP address of 11.11.11.101
749 818
750 Install mod-wsgi 819 Install mod-wsgi
751 ^^^^^^^^^^^^^^^^ 820 ~~~~~~~~~~~~~~~~
752 821
753 You can install/build it using the python package manager pip, or 822 You can install/build it using the python package manager pip, or
754 install using the OS package manager (apt). 823 install using the OS package manager (apt).
755 824
756 Pip install of mod_wsgi 825 Pip install of mod_wsgi
789 4. For testing, open port 8000 for TCP on the server. For an Azure VM, 858 4. For testing, open port 8000 for TCP on the server. For an Azure VM,
790 this is done with Azure Portal under ``Networking`` > ``Add inbound port`` 859 this is done with Azure Portal under ``Networking`` > ``Add inbound port``
791 rule. 860 rule.
792 5. Test with ``mod_wsgi-express start-server``. This should serve 861 5. Test with ``mod_wsgi-express start-server``. This should serve
793 up content on localhost port 8000. You can then direct a browser on 862 up content on localhost port 8000. You can then direct a browser on
794 the server itself to http://localhost:8000/ or on another machine at 863 the server itself to ``http://localhost:8000/`` or on another machine at
795 the server's domain name or ip address followed by colon then 8000 864 the server's domain name or ip address followed by colon then 8000
796 (e.g. http://11.11.11.101:8000/). If successful, you should see a 865 (e.g. ``http://11.11.11.101:8000/``). If successful, you should see a
797 Malt Whiskey image. 866 Malt Whiskey image.
798 867
799 Package manager install of mod_wsgi 868 Package manager install of mod_wsgi
800 ''''''''''''''''''''''''''''''''''' 869 '''''''''''''''''''''''''''''''''''
801 870
812 881
813 You should make sure that the version you install is 3.5 or newer due 882 You should make sure that the version you install is 3.5 or newer due
814 to security issues in older releases. 883 to security issues in older releases.
815 884
816 Configure web interface via wsgi_handler 885 Configure web interface via wsgi_handler
817 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 886 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
818 887
819 1. In the tracker's home directory create a ``wsgi.py`` file with the 888 1. In the tracker's home directory create a ``wsgi.py`` file with the
820 following content (substituting ``/home/admin/trackers/mytracker`` 889 following content (substituting ``/home/admin/trackers/mytracker``
821 with the absolute path for your tracker's home directory): 890 with the absolute path for your tracker's home directory):
822 891
825 from roundup.cgi.wsgi_handler import RequestDispatcher 894 from roundup.cgi.wsgi_handler import RequestDispatcher
826 tracker_home = '/home/admin/trackers/mytracker' 895 tracker_home = '/home/admin/trackers/mytracker'
827 application = RequestDispatcher(tracker_home) 896 application = RequestDispatcher(tracker_home)
828 897
829 To run the tracker on Port 8000 as a foreground process 898 To run the tracker on Port 8000 as a foreground process
830 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 899 '''''''''''''''''''''''''''''''''''''''''''''''''''''''
831 900
832 1. Change the ``tracker.web`` url in ``config.ini`` to port 8000 at the 901 1. Change the ``tracker.web`` url in ``config.ini`` to port 8000 at the
833 server domain name or ip address (e.g. http://11.11.11.101:8000/). 902 server domain name or ip address (e.g. ``http://11.11.11.101:8000/``).
834 2. Open port 8000 for TCP on the server if you didn't already do so. 903 2. Open port 8000 for TCP on the server if you didn't already do so.
835 3. ``cd`` to your tracker home directory, then run 904 3. ``cd`` to your tracker home directory, then run
836 ``mod_wsgi-express start-server wsgi.py``. 905 ``mod_wsgi-express start-server wsgi.py``.
837 4. Test by directing a browser on another machine to the url you set 906 4. Test by directing a browser on another machine to the url you set
838 ``tracker.web`` to in ``config.ini``. 907 ``tracker.web`` to in ``config.ini``.
839 908
840 Run tracker as background daemon 909 Run tracker as background daemon
841 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 910 ''''''''''''''''''''''''''''''''
842 911
843 To run the tracker on Port 80 or as a background process, you'll need 912 To run the tracker on Port 80 or as a background process, you'll need
844 to configure a UNIX group with appropriate privileges as described in 913 to configure a UNIX group with appropriate privileges as described in
845 `UNIX environment steps`_. These steps are summarized here: 914 `UNIX environment steps`_. These steps are summarized here:
846 915
856 6. Make sure group can write to the database, and any new files created 925 6. Make sure group can write to the database, and any new files created
857 in the database will be owned by the group run: 926 in the database will be owned by the group run:
858 ``sudo chmod -R g+sw ~/trackers/mytracker/db`` 927 ``sudo chmod -R g+sw ~/trackers/mytracker/db``
859 928
860 To run mod_wsgi on PORT 80 929 To run mod_wsgi on PORT 80
861 ^^^^^^^^^^^^^^^^^^^^^^^^^^^ 930 ''''''''''''''''''''''''''
862 931
863 1. Change the ``tracker.web`` url in ``config.ini`` to the server url 932 1. Change the ``tracker.web`` url in ``config.ini`` to the server url
864 with no port designator. E.g. http://11.11.11.101. 933 with no port designator. E.g. ``http://11.11.11.101``.
865 2. Open port 80 on the server for TCP traffic if it isn't open already. 934 2. Open port 80 on the server for TCP traffic if it isn't open already.
866 3. Stop the system instance of Apache to make sure it isn't holding on 935 3. Stop the system instance of Apache to make sure it isn't holding on
867 to port 80 run: ``sudo service apache2 stop``. 936 to port 80 run: ``sudo service apache2 stop``.
868 937
869 To run as a foreground process 938 To run as a foreground process
870 '''''''''''''''''''''''''''''' 939 ++++++++++++++++++++++++++++++
871 940
872 1. From the tracker home directory, run 941 1. From the tracker home directory, run
873 ``sudo mod_wsgi-express start-server wsgi.py --port 80 --user admin --group mytrackergrp`` 942 ``sudo mod_wsgi-express start-server wsgi.py --port 80 --user admin --group mytrackergrp``
874 943
875 To run as a background process 944 To run as a background process
876 '''''''''''''''''''''''''''''' 945 ++++++++++++++++++++++++++++++
877 946
878 1. From the tracker home directory, bash 947 1. From the tracker home directory, bash
879 ``sudo mod_wsgi-express setup-server wsgi.py --port=80 --user admin --group mytrackergrp --server-root=/etc/mod_wsgi-express-80`` 948 ``sudo mod_wsgi-express setup-server wsgi.py --port=80 --user admin --group mytrackergrp --server-root=/etc/mod_wsgi-express-80``
880 2. Then, run ``sudo /etc/mod_wsgi-express-80/apachectl start`` 949 2. Then, run ``sudo /etc/mod_wsgi-express-80/apachectl start``
881 3. To stop, run ``sudo /etc/mod_wsgi-express-80/apachectl stop`` 950 3. To stop, run ``sudo /etc/mod_wsgi-express-80/apachectl stop``
914 983
915 Next, you have to add Roundup trackers configuration to apache config. 984 Next, you have to add Roundup trackers configuration to apache config.
916 Roundup apache interface uses the following options specified with 985 Roundup apache interface uses the following options specified with
917 ``PythonOption`` directives: 986 ``PythonOption`` directives:
918 987
919 TrackerHome: 988 TrackerHome:
920 defines the tracker home directory - the directory that was specified 989 defines the tracker home directory - the directory that was specified
921 when you did ``roundup-admin init``. This option is required. 990 when you did ``roundup-admin init``. This option is required.
922 991
923 TrackerLanguage: 992 TrackerLanguage:
924 defines web user interface language. mod_python applications do not 993 defines web user interface language. mod_python applications do not
925 receive OS environment variables in the same way as command-line 994 receive OS environment variables in the same way as command-line
926 programs, so the language cannot be selected by setting commonly 995 programs, so the language cannot be selected by setting commonly
927 used variables like ``LANG`` or ``LC_ALL``. ``TrackerLanguage`` 996 used variables like ``LANG`` or ``LC_ALL``. ``TrackerLanguage``
928 value has the same syntax as values of these environment variables. 997 value has the same syntax as values of these environment variables.
929 This option may be omitted. 998 This option may be omitted.
930 999
931 TrackerDebug: 1000 TrackerDebug:
932 run the tracker in debug mode. Setting this option to ``yes`` or 1001 run the tracker in debug mode. Setting this option to ``yes`` or
933 ``true`` has the same effect as running ``roundup-server -t debug``: 1002 ``true`` has the same effect as running ``roundup-server -t debug``:
934 the database schema and used html templates are rebuilt for each 1003 the database schema and used html templates are rebuilt for each
935 HTTP request. Values ``no`` or ``false`` mean that all html 1004 HTTP request. Values ``no`` or ``false`` mean that all html
936 templates for the tracker are compiled and the database schema is 1005 templates for the tracker are compiled and the database schema is
937 checked once at startup. This is the default behaviour. 1006 checked once at startup. This is the default behaviour.
938 1007
939 TrackerTiming: 1008 TrackerTiming:
940 has nearly the same effect as environment variable ``CGI_SHOW_TIMING`` 1009 has nearly the same effect as environment variable ``CGI_SHOW_TIMING``
941 for standalone roundup server. The difference is that setting this 1010 for standalone roundup server. The difference is that setting this
942 option to ``no`` or ``false`` disables timings display. Value 1011 option to ``no`` or ``false`` disables timings display. Value
943 ``comment`` writes request handling times in html comment, and 1012 ``comment`` writes request handling times in html comment, and
944 any other non-empty value makes timing report visible. By default, 1013 any other non-empty value makes timing report visible. By default,
945 timing display is disabled. 1014 timing display is disabled.
946 1015
947 In the following example we have two trackers set up in 1016 In the following example we have two trackers set up in
948 ``/var/db/roundup/support`` and ``/var/db/roundup/devel`` and accessed 1017 ``/var/db/roundup/support`` and ``/var/db/roundup/devel`` and accessed
949 as ``https://my.host/roundup/support/`` and ``https://my.host/roundup/devel/`` 1018 as ``https://my.host/roundup/support/`` and ``https://my.host/roundup/devel/``
950 respectively (provided Apache has been set up for SSL of course). 1019 respectively (provided Apache has been set up for SSL of course).
994 1063
995 Notice that the ``/var/db/roundup`` path shown above refers to the directory 1064 Notice that the ``/var/db/roundup`` path shown above refers to the directory
996 in which the tracker homes are stored. The actual value will thus depend on 1065 in which the tracker homes are stored. The actual value will thus depend on
997 your system. 1066 your system.
998 1067
1068 .. index:: windows; apache config
1069
999 On Windows the corresponding lines will look similar to these:: 1070 On Windows the corresponding lines will look similar to these::
1000 1071
1001 AliasMatch /roundup/(.+)/@@file/(.*) C:/DATA/roundup/$1/html/$2 1072 AliasMatch /roundup/(.+)/@@file/(.*) C:/DATA/roundup/$1/html/$2
1002 AliasMatch /roundup/([^/]+)/(?!@@file/)(.*) C:/DATA/roundup/$1/dummy.py/$2 1073 AliasMatch /roundup/([^/]+)/(?!@@file/)(.*) C:/DATA/roundup/$1/dummy.py/$2
1003 <Directory C:/DATA/roundup/*> 1074 <Directory C:/DATA/roundup/*>
1007 In this example the directory hosting all of the tracker homes is 1078 In this example the directory hosting all of the tracker homes is
1008 ``C:\DATA\roundup``. (Notice that you must use forward slashes in paths 1079 ``C:\DATA\roundup``. (Notice that you must use forward slashes in paths
1009 inside the httpd.conf file!) 1080 inside the httpd.conf file!)
1010 1081
1011 The URL for accessing these trackers then become: 1082 The URL for accessing these trackers then become:
1012 `http://<roundupserver>/roundup/support/`` and 1083 ``http://<roundupserver>/roundup/support/`` and
1013 ``http://<roundupserver>/roundup/devel/`` 1084 ``http://<roundupserver>/roundup/devel/``
1014 1085
1015 Note that in order to use https connections you must set up Apache for secure 1086 Note that in order to use https connections you must set up Apache for secure
1016 serving with SSL. 1087 serving with SSL.
1017 1088
1018 Nginx HTTP Server 1089 Nginx HTTP Server
1019 ~~~~~~~~~~~~~~~~~ 1090 -----------------
1020 1091
1021 This configuration uses gunicorn to run roundup behind an Nginx proxy. 1092 This configuration uses Gunicorn to run Roundup behind an Nginx proxy.
1022 The proxy also compresses the data using gzip. The url for the tracker 1093 The proxy also compresses the data using gzip. The url for the tracker
1023 in config.ini should be ``https://tracker.example.org``. 1094 in config.ini should be ``https://tracker.example.org``.
1024 1095
1025 .. code:: 1096 .. code::
1026 1097
1027 user nginx; 1098 user nginx;
1028 worker_processes auto; 1099 worker_processes auto;
1029 worker_rlimit_nofile 10000; 1100 worker_rlimit_nofile 10000;
1030 1101
1034 events { 1105 events {
1035 worker_connections 1024; 1106 worker_connections 1024;
1036 } 1107 }
1037 1108
1038 upstream tracker-tracker { 1109 upstream tracker-tracker {
1039 # gunicorn uses this socket for communication 1110 # Gunicorn uses this socket for communication
1040 server unix:/var/run/roundup/tracker.sock fail_timeout=0; 1111 server unix:/var/run/roundup/tracker.sock fail_timeout=0;
1041 } 1112 }
1042 1113
1043 http { 1114 http {
1044 include /etc/nginx/mime.types; 1115 include /etc/nginx/mime.types;
1128 } 1199 }
1129 } 1200 }
1130 1201
1131 1202
1132 FastCGI (Cherokee, Hiawatha, lighttpd) 1203 FastCGI (Cherokee, Hiawatha, lighttpd)
1133 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1204 --------------------------------------
1134 1205
1135 The Hiawatha and lighttpd web servers can run Roundup using FastCGI. 1206 The Hiawatha and lighttpd web servers can run Roundup using FastCGI.
1136 Cherokee can run FastCGI but it also supports wsgi directly using a 1207 Cherokee can run FastCGI but it also supports wsgi directly using a
1137 uWSGI, Gnuicorn etc. 1208 uWSGI, Gnuicorn etc.
1138 1209
1139 To run Roundup suing FastCGI, the flup_ package can be used under 1210 To run Roundup using FastCGI, the flup_ package can be used under
1140 Python 2 and Python 3. We don't have a detailed config for this, but 1211 Python 2 and Python 3. We don't have a detailed config for this, but
1141 the basic idea can be found at: 1212 the basic idea can be found at:
1142 https://flask.palletsprojects.com/en/2.0.x/deploying/fastcgi/ 1213 https://flask.palletsprojects.com/en/2.0.x/deploying/fastcgi/
1143 1214
1144 If you have deployed Roundup using FastCGI and flup we welcome example 1215 If you have deployed Roundup using FastCGI and flup we welcome example
1145 configuration files and instructions. 1216 configuration files and instructions.
1146 1217
1147 .. _flup: https://pypi.org/project/flup/ 1218 .. _flup: https://pypi.org/project/flup/
1148 1219
1149 WSGI Variations 1220 WSGI Variations
1150 ~~~~~~~~~~~~~~~ 1221 ---------------
1151 1222
1152 .. index:: triple: web interface; apache; mod_wsgi 1223 .. index:: triple: web interface; apache; mod_wsgi
1153 single: wsgi; apache 1224 single: wsgi; apache
1154 1225
1155 Apache Alternate 1226 Apache Alternate
1156 ^^^^^^^^^^^^^^^^ 1227 ~~~~~~~~~~~~~~~~
1157 1228
1158 This method from Thomas Arendsen Hein goes into a bit more detail and 1229 This method from Thomas Arendsen Hein goes into a bit more detail and
1159 is designed to allow you to run multiple roundup trackers each under 1230 is designed to allow you to run multiple roundup trackers each under
1160 their own user. 1231 their own user.
1161 1232
1173 Create a user roundup-foo, group roundup-foo to run the tracker. Add 1244 Create a user roundup-foo, group roundup-foo to run the tracker. Add
1174 the following apache config to 1245 the following apache config to
1175 /etc/apache2/sites-available/roundup-foo (under debian/Ubunutu, modify 1246 /etc/apache2/sites-available/roundup-foo (under debian/Ubunutu, modify
1176 as needed): 1247 as needed):
1177 1248
1178 .. code:: ApacheConf 1249 .. code:: ApacheConf
1179 1250
1180 ServerAdmin webmaster@example.com 1251 ServerAdmin webmaster@example.com
1181 ErrorLog /var/log/apache2/error.log 1252 ErrorLog /var/log/apache2/error.log
1182 1253
1183 LogLevel notice 1254 LogLevel notice
1212 1283
1213 The directory ~roundup-foo should have: 1284 The directory ~roundup-foo should have:
1214 1285
1215 * a ``db`` subdirectory where messages and files will be stored 1286 * a ``db`` subdirectory where messages and files will be stored
1216 * a symbolic link called ``instance`` to /srv/roundup/foo which has 1287 * a symbolic link called ``instance`` to /srv/roundup/foo which has
1217 been initialized using ``roundup-admin``. 1288 been initialised using ``roundup-admin``.
1218 1289
1219 The `Apache HTTP Server with mod_wsgi`_ section above has a simple 1290 The `Apache HTTP Server with mod_wsgi`_ section above has a simple
1220 WSGI handler. This is an enhanced version to be put into 1291 WSGI handler. This is an enhanced version to be put into
1221 ``/srv/roundup/foo/roundup.wsgi``. 1292 ``/srv/roundup/foo/roundup.wsgi``.
1222 1293
1223 .. code:: python 1294 .. code:: python
1224 1295
1225 import sys, os 1296 import sys, os
1226 sys.stdout = sys.stderr 1297 sys.stdout = sys.stderr
1227 1298
1228 enabled = True 1299 enabled = True
1252 1323
1253 One last change is needed. In the tracker's config.ini change the db 1324 One last change is needed. In the tracker's config.ini change the db
1254 parameter in the [main] section to be /home/roundup-foo/db. This will 1325 parameter in the [main] section to be /home/roundup-foo/db. This will
1255 put the files and messages in the db directory for the user. 1326 put the files and messages in the db directory for the user.
1256 1327
1257 .. index:: pair: web interface; gunicorn 1328 .. index:: pair: web interface; Gunicorn
1258 single: wsgi; gunicorn 1329 single: wsgi; Gunicorn
1259 1330
1260 Gunicorn Installation 1331 Gunicorn Installation
1261 ^^^^^^^^^^^^^^^^^^^^^ 1332 ~~~~~~~~~~~~~~~~~~~~~
1262 1333
1263 To run with gunicorn use pip to install gunicorn. This configuration 1334 To run with Gunicorn use ``pip install gunicorn``. This configuration
1264 uses a front end web server like nginx, hiawatha, apache configured as 1335 uses a front end web server like nginx, hiawatha, or apache configured as
1265 a reverse proxy. See your web server's documentation on how to set it 1336 a reverse proxy. See your web server's documentation on how to set it
1266 up as a reverse proxy. 1337 up as a reverse proxy.
1267 1338
1268 The file wsgi.py (obtained from ``frontends/wsgi.py``) should be in 1339 The file wsgi.py (obtained from ``frontends/wsgi.py``) should be in
1269 the current directory with the contents:: 1340 the current directory with the contents::
1277 from roundup.cgi.wsgi_handler import RequestDispatcher 1348 from roundup.cgi.wsgi_handler import RequestDispatcher
1278 tracker_home = '/path/to/tracker/install/directory' 1349 tracker_home = '/path/to/tracker/install/directory'
1279 1350
1280 app = RequestDispatcher(tracker_home) 1351 app = RequestDispatcher(tracker_home)
1281 1352
1282 Assuming the proxy forwards /tracker, run gunicorn as:: 1353 Assuming the proxy forwards /tracker, run Gunicorn as::
1283 1354
1284 SCRIPT_NAME=/tracker gunicorn --bind 127.0.0.1:8917 --timeout=10 wsgi:app 1355 SCRIPT_NAME=/tracker gunicorn --bind 127.0.0.1:8917 --timeout=10 wsgi:app
1285 1356
1286 this runs roundup at port 8917 on the loopback interface. You should 1357 this runs roundup at port 8917 on the loopback interface. You should
1287 configure the reverse proxy to talk to 127.0.0.1 at port 8917. 1358 configure the reverse proxy to talk to 127.0.0.1 at port 8917.
1291 1362
1292 .. index:: pair: web interface; uWSGI 1363 .. index:: pair: web interface; uWSGI
1293 single: wsgi; uWSGI 1364 single: wsgi; uWSGI
1294 1365
1295 uWSGI Installation 1366 uWSGI Installation
1296 ^^^^^^^^^^^^^^^^^^ 1367 ~~~~~~~~~~~~~~~~~~
1297 1368
1298 For a basic roundup install using uWSGI behind a front end server, 1369 For a basic roundup install using uWSGI behind a front end server,
1299 install uwsgi and the python3 (or python) plugin. Then run:: 1370 install uwsgi and the python3 (or python) plugin. Then run::
1300 1371
1301 uwsgi --http-socket 127.0.0.1:8917 \ 1372 uwsgi --http-socket 127.0.0.1:8917 \
1302 --plugin python3 --mount=/tracker=wsgi.py \ 1373 --plugin python3 --mount=/tracker=wsgi.py \
1303 --manage-script-name --callable app 1374 --manage-script-name --callable app
1304 1375
1305 using the same wsgi.py as was used for gunicorn. If you get path not 1376 using the same wsgi.py as was used for Gunicorn. If you get path not
1306 found errors, check the mount option. The /tracker entry must match 1377 found errors, check the mount option. The /tracker entry must match
1307 the path used for the [tracker] web value in the tracker's config.ini. 1378 the path used for the [tracker] web value in the tracker's config.ini.
1308 1379
1309 Configure an Email Interface 1380 Configure an Email Interface
1310 ---------------------------- 1381 ============================
1311 1382
1312 If you don't want to use the email component of Roundup, then remove the 1383 If you don't want to use the email component of Roundup, then remove the
1313 "``nosyreaction.py``" module from your tracker "``detectors``" directory. 1384 "``nosyreaction.py``" module from your tracker "``detectors``" directory.
1314 1385
1315 See `platform-specific notes`_ for steps that may be needed on your system. 1386 See `platform-specific notes`_ for steps that may be needed on your system.
1317 There are five supported ways to get emailed issues into the 1388 There are five supported ways to get emailed issues into the
1318 Roundup tracker. You should pick ONE of the following, all 1389 Roundup tracker. You should pick ONE of the following, all
1319 of which will continue my example setup from above: 1390 of which will continue my example setup from above:
1320 1391
1321 As a mail alias pipe process 1392 As a mail alias pipe process
1322 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1393 ----------------------------
1323 1394
1324 Set up a mail alias called "issue_tracker" as (include the quote marks): 1395 Set up a mail alias called "issue_tracker" as (include the quote marks):
1325 "``|/usr/bin/python /usr/bin/roundup-mailgw <tracker_home>``" 1396 "``|/usr/bin/python /usr/bin/roundup-mailgw <tracker_home>``"
1326 (substitute ``/usr/bin`` for wherever roundup-mailgw is installed). 1397 (substitute ``/usr/bin`` for wherever roundup-mailgw is installed).
1327 1398
1334 1405
1335 To test the mail gateway on unix systems, try:: 1406 To test the mail gateway on unix systems, try::
1336 1407
1337 echo test |mail -s '[issue] test' support@YOUR_DOMAIN_HERE 1408 echo test |mail -s '[issue] test' support@YOUR_DOMAIN_HERE
1338 1409
1339 Be careful that some mail systems (postfix for example) will impost a 1410 Be careful that some mail systems (postfix for example) will impose
1340 limits on processes they spawn. In particular postfix can set a file size 1411 limits on processes they spawn. In particular postfix can set a file
1341 limit. *This can cause your Roundup database to become corrupted.* 1412 size limit that is inherited by the mailgw. If the database files
1413 (anydbm, sqlite) exceed this limit, *this can cause your Roundup
1414 database to become corrupted.*
1342 1415
1343 1416
1344 As a custom router/transport using a pipe process (Exim4 specific) 1417 As a custom router/transport using a pipe process (Exim4 specific)
1345 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1418 ------------------------------------------------------------------
1346 1419
1347 The following configuration snippets for `Exim 4`_ configuration 1420 The following configuration snippets for `Exim 4`_ configuration
1348 implement a custom router & transport to accomplish mail delivery to 1421 implement a custom router & transport to accomplish mail delivery to
1349 roundup-mailgw. A configuration for Exim3 is similar but not 1422 roundup-mailgw. A configuration for Exim3 is similar but not
1350 included, since Exim3 is considered obsolete. 1423 included, since Exim3 is considered obsolete.
1351 1424
1352 .. _Exim 4: http://www.exim.org/ 1425 .. _Exim 4: https://www.exim.org/
1353 1426
1354 This configuration is similar to the previous section, in that it uses 1427 This configuration is similar to the previous section, in that it uses
1355 a pipe process. However, there are advantages to using a custom 1428 a pipe process. However, there are advantages to using a custom
1356 router/transport process, if you are using Exim. 1429 router/transport process, if you are using Exim.
1357 1430
1374 1447
1375 The following configuration has been tested on Debian Sarge with 1448 The following configuration has been tested on Debian Sarge with
1376 Exim4. 1449 Exim4.
1377 1450
1378 .. note:: 1451 .. note::
1379 Note that the Debian Exim4 packages don't allow pipes in alias files 1452 The Debian Exim4 packages don't allow pipes in alias files
1380 by default, so the method described in the section `As a mail alias 1453 by default, so the method described in the section `As a mail alias
1381 pipe process`_ will not work with the default configuration. However, 1454 pipe process`_ will not work with the default configuration. However,
1382 the method described in this section does. See the discussion in 1455 the method described in this section does. See the discussion in
1383 ``/usr/share/doc/exim4-config/README.system_aliases`` on any Debian 1456 ``/usr/share/doc/exim4-config/README.system_aliases`` on any Debian
1384 system with Exim4 installed. 1457 system with Exim4 installed.
1434 home_directory = ROUNDUP_HOME 1507 home_directory = ROUNDUP_HOME
1435 user = ROUNDUP_USER 1508 user = ROUNDUP_USER
1436 group = ROUNDUP_GROUP 1509 group = ROUNDUP_GROUP
1437 1510
1438 As a regular job using a mailbox source 1511 As a regular job using a mailbox source
1439 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1512 ---------------------------------------
1440 1513
1441 Set ``roundup-mailgw`` up to run every 10 minutes or so. For example 1514 Set ``roundup-mailgw`` up to run every 10 minutes or so. For example
1442 (substitute ``/usr/bin`` for wherever roundup-mailgw is installed):: 1515 (substitute ``/usr/bin`` for wherever roundup-mailgw is installed)::
1443 1516
1444 0,10,20,30,40,50 * * * * /usr/bin/roundup-mailgw /opt/roundup/trackers/support mailbox <mail_spool_file> 1517 0,10,20,30,40,50 * * * * /usr/bin/roundup-mailgw /opt/roundup/trackers/support mailbox <mail_spool_file>
1446 Where the ``mail_spool_file`` argument is the location of the roundup submission 1519 Where the ``mail_spool_file`` argument is the location of the roundup submission
1447 user's mail spool. On most systems, the spool for a user "issue_tracker" 1520 user's mail spool. On most systems, the spool for a user "issue_tracker"
1448 will be "``/var/mail/issue_tracker``". 1521 will be "``/var/mail/issue_tracker``".
1449 1522
1450 As a regular job using a POP source 1523 As a regular job using a POP source
1451 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1524 -----------------------------------
1452 1525
1453 To retrieve from a POP mailbox, use a *cron* entry similar to the mailbox 1526 To retrieve from a POP mailbox, use a *cron* entry similar to the mailbox
1454 one (substitute ``/usr/bin`` for wherever roundup-mailgw is 1527 one (substitute ``/usr/bin`` for wherever roundup-mailgw is
1455 installed):: 1528 installed)::
1456 1529
1457 0,10,20,30,40,50 * * * * /usr/bin/roundup-mailgw /opt/roundup/trackers/support pop <pop_spec> 1530 0,10,20,30,40,50 * * * * /usr/bin/roundup-mailgw /opt/roundup/trackers/support pop <pop_spec>
1458 1531
1459 where pop_spec is "``username:password@server``" that specifies the roundup 1532 where pop_spec is "``username:password@server``" that specifies the roundup
1460 submission user's POP account name, password and server. 1533 submission user's POP account name, password and server.
1461 1534
1462 On windows, you would set up the command using the windows scheduler. 1535 On windows, you would set up the command `using the windows scheduler`_.
1463 1536
1464 As a regular job using an IMAP source 1537 As a regular job using an IMAP source
1465 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1538 -------------------------------------
1466 1539
1467 To retrieve from an IMAP mailbox, use a *cron* entry similar to the 1540 To retrieve from an IMAP mailbox, use a *cron* entry similar to the
1468 POP one (substitute ``/usr/bin`` for wherever roundup-mailgw is 1541 POP one (substitute ``/usr/bin`` for wherever roundup-mailgw is
1469 installed):: 1542 installed)::
1470 1543
1476 "``imap username:password@server mailbox``". 1549 "``imap username:password@server mailbox``".
1477 1550
1478 If you have a secure (ie. HTTPS) IMAP server then you may use ``imaps`` 1551 If you have a secure (ie. HTTPS) IMAP server then you may use ``imaps``
1479 in place of ``imap`` in the command to use a secure connection. 1552 in place of ``imap`` in the command to use a secure connection.
1480 1553
1481 As with the POP job, on windows, you would set up the command using the 1554 As with the POP job, on windows, you would set up the command
1482 windows scheduler. 1555 `using the windows scheduler`_.
1483 1556
1484 1557
1485 UNIX Environment Steps 1558 UNIX Environment Steps
1486 ---------------------- 1559 ======================
1487 1560
1488 Each tracker ideally should have its own UNIX group, so create 1561 Each tracker ideally should have its own UNIX group, so create
1489 a UNIX group (edit ``/etc/group`` or your appropriate NIS map if 1562 a UNIX group (edit ``/etc/group`` or your appropriate NIS map if
1490 you're using NIS). To continue with my examples so far, I would 1563 you're using NIS). To continue with my examples so far, I would
1491 create the UNIX group 'support', although the name of the UNIX 1564 create the UNIX group 'support', although the name of the UNIX
1530 mysql or postgresql backend you may also need to update your policy to 1603 mysql or postgresql backend you may also need to update your policy to
1531 allow the web server to access the database socket. 1604 allow the web server to access the database socket.
1532 1605
1533 1606
1534 Public Tracker Considerations 1607 Public Tracker Considerations
1535 ----------------------------- 1608 =============================
1536 1609
1537 If you run a public tracker, you will eventually have to think about 1610 If you run a public tracker, you will eventually have to think about
1538 dealing with spam entered through both the web and mail interfaces. 1611 dealing with spam entered through both the web and mail interfaces.
1539 1612
1540 See the section on `Preventing SPAM`_ in the 1613 See the section on `Preventing SPAM`_ in the
1541 `customisation documentation`_ that has a simple detector 1614 `customisation documentation`_ that has a simple detector
1542 that will block lot of spam attempts. 1615 that will block lot of spam attempts.
1543 1616
1617 Docker Support
1618 ==============
1619
1620 If you don't want to install Roundup on a host, you can create a
1621 Docker container. This installs Roundup using the `stand-alone web
1622 server`_ method. This image only supports http. We suggest putting an
1623 https terminating proxy in front of it.
1624
1625 This is a work in progress and patches to improve it are welcome. You
1626 can find the docker config files under the `scripts/Docker` directory
1627 of the source tree.
1628
1629 The dockerized Roundup is based on a 64 bit Alpine distribution. It
1630 includes database drivers for anydbm, sqlite, MySQL and Postgresql
1631 (Postgresl is untested). It also includes additional libraries that
1632 are listed in `scripts/Docker/requirements.txt` (including redis).
1633
1634 Email support is a work in progress. Outgoing email to an external
1635 SMTP server should work. Receiving email should work by using a
1636 scheduled (cron) job to access email:
1637
1638 * `As a regular job using a mailbox source`_
1639 * `As a regular job using a POP source`_
1640 * `As a regular job using an IMAP source`_
1641
1642 However running cron in a container is problematic (running
1643 busybox crond as root vs. non-root, requiring setgrp privs
1644 etc). Patches for implementing email support are welcome.
1645
1646 If you want to use a MySQL backend, see `Docker-compose
1647 Deployment`_ to deploy a Roundup container and a MySQL container
1648 backend for use with Roundup.
1649
1650 We recommend you follow the `OSWAP Docker Security practices`_ for your
1651 production Roundup instance.
1652
1653 .. _OSWAP Docker Security practices:
1654 https://cheatsheetseries.owasp.org/cheatsheets/Docker_Security_Cheat_Sheet.html
1655
1656 Building a Docker Container
1657 ---------------------------
1658
1659 You can build a docker container in one of 4 modes defined by the
1660 ``source`` build-arg.
1661
1662 ``--build-arg="source=local"``
1663 the default if no source is defined. Build using the version in
1664 the source tree by running ``setup.py install``.
1665
1666 ``--build-arg="source=pypi"``
1667 build the newest production release version deployed to pypi.
1668 If you want to build using a pre-release, you can append
1669 `pip version specifiers
1670 <https://peps.python.org/pep-0440/#version-specifiers>`_ to
1671 `pypi` without embedding any spaces. For example::
1672
1673 # install 2.2.0 if available or 2.2.0b1 or 2.2.0b2 etc.
1674 --build-arg="source=pypi~=2.2.0b1"
1675
1676 # install only a 2.2.0 beta
1677 --build-arg="source=pypi~=2.2.0b1,!=2.2.0"
1678
1679 Note that versions of Roundup before 2.2 may not run correctly
1680 in a Docker container.
1681
1682 ``--build-arg="source=pip_local"``
1683 Build using the version in the source tree by running ``pip
1684 install``. This places some files (e.g. man pages, templates) in
1685 different directories from the `local` install but is preferred
1686 by some Python users.
1687
1688 ``--build-arg="source=pip_sdist"``
1689 This is meant for maintainer/developer use. It installs using
1690 pip from a source distribution (sdist) tarball built by
1691 following the RELEASE.txt. It is meant for testing
1692 releases. Normal users/admins should not use it.
1693
1694 Build a docker container using the code in the current directory,
1695 with this build command from the top of the source tree::
1696
1697 docker build -t roundup-app -f scripts/Docker/Dockerfile .
1698
1699 Build a container using the newest production (non pre-release)
1700 Roundup release on PyPI, by running::
1701
1702 docker build -t roundup-app --build-arg="source=pypi" \
1703 -f scripts/Docker/Dockerfile .
1704
1705 Change the ``build-arg`` for building in other modes.
1706
1707 The Dockerfile declares a single volume mounted at
1708 ``/usr/src/app/tracker`` inside the container. You will mount
1709 your tracker home directory at this location. The
1710 ``/usr/src/app`` path can be changed by adding::
1711
1712 --build-arg="appdir=/new/path"
1713
1714 You can also add additional modules to the docker container by
1715 using::
1716
1717 --build-arg="pip_mod=requests setproctitle"
1718
1719 Because of deficiencies in the docker program (see:
1720 https://github.com/moby/moby/issues/29110#issuecomment-1100676306),
1721 there is no way to determine the version of Python inside the
1722 container and make that available as part of the build process. If
1723 your build fails because the ``pythonversion does not match``, add the
1724 suggested ``--build-arg`` to the ``docker build`` command line.
1725
1726 .. _UID at image build time:
1727
1728 By default the container runs Roundup using UID 1000. By setting
1729 ``--build-arg="roundup_uid=2000"`` you can change the UID and
1730 GID.
1731
1732 Configuring Roundup in the Container
1733 ------------------------------------
1734
1735 .. caution::
1736
1737 Docker modifies iptables firewall rules. This allows access to the
1738 container from your local network. `See the official documentation
1739 for details
1740 <https://docs.docker.com/engine/reference/commandline/run/#publish>`_.
1741 UFW rules are known to be be ignored (see:
1742 https://github.com/moby/moby/issues/4737). Use ``-p
1743 127.0.0.1:ext_port:container_port`` in your docker run commands or
1744 implement suggestions like: https://github.com/chaifeng/ufw-docker.
1745
1746 Once the docker image is created using one of the build commands
1747 above, run an interactive session with::
1748
1749 docker run -it --rm -p 127.0.0.1:9017:8080 \
1750 -v $PWD/tracker:/usr/src/app/tracker roundup-app:latest
1751
1752 The ``-v`` option maps a directory from the host into the docker
1753 container. Note that uid 1000 is used by roundup by default. The uid
1754 of the directory (and all files under it) must match the uid. You can
1755 set the `UID at image build time`_. This
1756 example assumes your tracker configs are in the tracker
1757 subdirectory. Replace ``$PWD/tracker`` with the full path name to the
1758 directory where the tracker home(s) are to be stored.
1759
1760 The ``-p`` option maps an external port (9017) to proxy the roundup
1761 server running at port 8080 to the outside. Note if you remove
1762 ``127.0.0.1:`` from the -p argument, *any host* on the network will be
1763 able to access the tracker at port 9017.
1764
1765 If the tracker directory is empty, the docker container will prompt
1766 you to `install a tracker template`_ (step 3) and prompt you for the
1767 database type.
1768
1769 .. _install a tracker template: #configuring-your-first-tracker
1770
1771 Then you need to configure the tracker by editing
1772 ``template/config.ini``. Make sure that the tracker web setting ends
1773 in ``/issues/`` See `Configuring your first tracker`_ and the top of
1774 ``config.ini`` for other settings.
1775
1776 Once you have configured the tracker, run another interactive session
1777 to `initialise the tracker`_ (step 4) with::
1778
1779 docker run -it --rm -p 127.0.0.1:9017:8080 \
1780 -v $PWD/tracker:/usr/src/app/tracker roundup-app:latest
1781
1782 this will initialise the database and attempt to start the server. If
1783 that is successful, use control-c to exit the server.
1784
1785 .. _initialise the tracker: #configuring-your-first-tracker
1786
1787 Now start the server non-interactively (note no `-it` option) with::
1788
1789 docker run -p 9017:8080 -d \
1790 -v $PWD/tracker:/usr/src/app/tracker roundup-app:latest
1791
1792 Your tracker will be available at: ``http://yourhost:9017/issues/``.
1793
1794 If you need to access your container while the server is running you
1795 can use::
1796
1797 docker exec -it c0d5 sh
1798
1799 where ``c0d5`` is the id prefix for the running container obtained
1800 from ``docker container ls``.
1801
1802 You should place a web server in front of Roundup (in reverse proxy
1803 mode) for production use. See the proxy_pass example below:
1804
1805 * `Nginx HTTP Server`_
1806
1807 You can expose the port directly to your intranet by removing ``127.0.0.1``
1808 from the ``-p`` option. See `Stand-alone Web Server`_ for more details.
1809
1810
1811 Running Your Container
1812 ----------------------
1813
1814 .. note::
1815 The examples below use the locally built docker container
1816 specification: ``roundup-app``. You can replace it with the
1817 docker hub specification ``rounduptracker/roundup:latest``
1818 (provided latest is newer than 2.3.0).
1819
1820 As of version 2.3.0 the Docker container has multiple entry points.
1821
1822 Guided install
1823 ~~~~~~~~~~~~~~
1824
1825 By default, running::
1826
1827 docker run -it --rm -p 127.0.0.1:9017:8080 \
1828 -v $PWD/tracker:/usr/src/app/tracker roundup-app:latest
1829
1830 3 times will install, initialize and serve a Roundup tracker at
1831 ``..../issues/`` using ``$PWD/tracker`` as the tracker home. This is the
1832 "guided install" method described in `Configuring Roundup in the
1833 Container`_.
1834
1835 Arguments for roundup-server
1836 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1837
1838 Once you have initialized your tracker, any arguments placed at the
1839 end of the ``docker run`` command are passed to the ``roundup-server``.
1840 These arguments **replace** the default arguments of ``issues=tracker``.
1841
1842 Invoking a Shell
1843 ~~~~~~~~~~~~~~~~
1844
1845 You can invoke a shell inside the container without exec'ing into the
1846 container using::
1847
1848 docker run -it \
1849 -v $PWD/tracker:/usr/src/app/tracker \
1850 roundup-app:latest shell
1851
1852 Then you can manually configure your tracker using ``roundup-admin -i
1853 tracker`` using the directions for `Configuring your first tracker`_.
1854 This is also how you would access tools like ``roundup-gettext`` which
1855 do not have direct entry points like ``admin`` for ``roundup-admin``
1856 and ``demo`` for ``roundup-demo``.
1857
1858 Invoke roundup-admin
1859 ~~~~~~~~~~~~~~~~~~~~
1860
1861 You can run ``roundup-admin`` directly by using::
1862
1863 docker run -it \
1864 -v $PWD/tracker:/usr/src/app/tracker \
1865 roundup-app:latest admin -i tracker/tracker1
1866
1867 to start ``roundup-admin`` using the directory
1868 ``$PWD/tracker/tracker1``. This is one way to create multiple trackers
1869 in subdirectories. It is no different from starting a shell and
1870 invoking ``roundup-admin`` manually.
1871
1872 One possibly useful command is::
1873
1874
1875 docker run -it \
1876 -v $PWD/tracker:/usr/src/app/tracker \
1877 roundup-app:latest admin templates
1878
1879 to list description of all the installed templates.
1880
1881 Invoke roundup-demo
1882 ~~~~~~~~~~~~~~~~~~~
1883
1884 Lastly you can::
1885
1886 docker run -it -p 127.0.0.1:8917:8080 \
1887 -v $PWD/tracker:/usr/src/app/tracker \
1888 roundup-app:latest demo anydbm responsive
1889
1890 to create a directory ``$PWD/tracker/demo`` and autoconfigure a server
1891 using the anydbm backend based on the responsive tracker template.
1892 See `demo mode using docker`_ for steps to change the server port.
1893
1894 Debugging
1895 ~~~~~~~~~
1896
1897 If you add ``-e SHELL_DEBUG=1`` to the docker command, it sets the
1898 ``SHELL_DEBUG`` environment variable which will enable debugging
1899 output from the startup script.
1900
1901 Running Multiple Trackers
1902 --------------------------
1903
1904 If you want to run multiple trackers, create a subdirectory for each
1905 tracker home under the volume mount point (``$PWD/tracker``). Then
1906 invoke ``docker run`` passing the roundup-server tracker
1907 specifications like::
1908
1909 docker run --rm -p 9017:8080 \
1910 -v /.../issue.tracker:/usr/src/app/tracker \
1911 roundup-app:latest tracker1=tracker/tracker1_home \
1912 tracker2=tracker/tracker2_home
1913
1914 This will set up two trackers that can be reached at
1915 ``http://yourhost:9017/tracker1/`` and
1916 ``http://yourhost:9017/tracker2/``. The arguments after
1917 ``roundup-app:latest`` are arguments including tracker paths that are
1918 passed to ``roundup-server``.
1919
1920 Docker-compose Deployment
1921 -------------------------
1922
1923 If you want to run using the mysql backend, you can use docker-compose
1924 with ``scripts/Docker/docker-compose.yml``. This will run Roundup and
1925 MySQL in containers. Directions for building using docker-compose are
1926 at the top of the yml file.
1927
1928 Tags for Dockerhub Docker Images
1929 --------------------------------
1930
1931 The docker images available from
1932 https://hub.docker.com/r/rounduptracker/roundup are tagged with:
1933 version-build, version, and ``latest`` tags. Only production
1934 releases (not pre-releases) are tagged this way. For example, the
1935 tags when 2.3.0 is released will be:
1936
1937 ``rounduptracker/roundup:latest``
1938 is a moving tag that tracks the latest build
1939 with the newest version of Roundup.
1940
1941 ``rounduptracker/roundup:2.3.0``
1942 is a moving tag that tracks the latest build
1943 of version 2.3.0 of Roundup. The Roundup software in this
1944 build will match the 2.3.0 version released on PyPi, but the
1945 underlying Alpine image or versions of the supporting Python
1946 libraries (redis, xapian, psycopg2, ...) will change.
1947
1948 ``rounduptracker/roundup:2.3.0-1``
1949 is a static tag and marks the first build of the version
1950 2.3.0 docker image. When a new release of the image is done,
1951 it will get the tag ``2.3.0-2`` etc. This is an alternative to
1952 pulling using a sha256 sum. However it is possible to
1953 overwrite this image/tag. So it **does not** provide the same
1954 security guarantees that using a sha256 sum does.
1955
1956 In addition to the release tags, there may be one or more
1957 development tags available. All tags will start with `devel`. For
1958 example: ``rounduptracker/roundup:2.3.0b1-devel``,
1959 ``rounduptracker/roundup:devel``
1960
1961 You should not assume that any ``devel`` tag is static. They are
1962 mainly for use by Roundup developer/maintainer for testing. There
1963 may be alternate tags ending with ``-devel`` to indicate builds
1964 from specific Mercurial versions/hashes. Also the tag may be
1965 overwritten to change the underlying Python libraries or
1966 images. Unless you like the bleeding edge, these should not be
1967 used in production.
1544 1968
1545 Maintenance 1969 Maintenance
1546 =========== 1970 ===========
1547 1971
1548 Read the separate `administration guide`_ for information about how to 1972 Read the `Tasks section of the administration guide
1549 perform common maintenance tasks with Roundup. 1973 <admin_guide.html#tasks>`_ for information about how to perform
1974 common maintenance tasks on Roundup.
1550 1975
1551 1976
1552 Upgrading 1977 Upgrading
1553 ========= 1978 =========
1554 1979
1560 Further Reading 1985 Further Reading
1561 =============== 1986 ===============
1562 1987
1563 If you intend to use Roundup with anything other than the default 1988 If you intend to use Roundup with anything other than the default
1564 templates, if you would like to hack on Roundup, or if you would 1989 templates, if you would like to hack on Roundup, or if you would
1565 like implementation details, you should read `Customising Roundup`_. 1990 like implementation details, you should read `Customising
1991 Roundup`_ and the `Roundup reference`_.
1566 1992
1567 1993
1568 Running Multiple Trackers 1994 Running Multiple Trackers
1569 ========================= 1995 =========================
1570 1996
1583 2009
1584 2010
1585 Platform-Specific Notes 2011 Platform-Specific Notes
1586 ======================= 2012 =======================
1587 2013
2014 .. index:: windows; add Roundup to path
2015
1588 Windows command-line tools 2016 Windows command-line tools
1589 -------------------------- 2017 --------------------------
1590 2018
1591 To make the command-line tools accessible in Windows, you need to update 2019 To make the command-line tools accessible in Windows, you need to update
1592 the "Path" environment variable in the Registry via a dialog box. 2020 the "Path" environment variable in the Registry via a dialog box.
1614 -------------- 2042 --------------
1615 2043
1616 To have the Roundup web server start up when your machine boots up, there 2044 To have the Roundup web server start up when your machine boots up, there
1617 are two different methods, the scheduler and installing the service. 2045 are two different methods, the scheduler and installing the service.
1618 2046
2047 .. index:: windows; use scheduler for email integration
2048
2049 .. _Using the Windows scheduler:
1619 2050
1620 1. Using the Windows scheduler 2051 1. Using the Windows scheduler
1621 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2052 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1622 2053
1623 Set up the following in Scheduled Tasks (note, the following is for a 2054 Set up the following in Scheduled Tasks (note, the following is for a
1624 cygwin setup): 2055 cygwin setup):
1625 2056
1626 **Run** 2057 Run
1627 2058 ``c:\cygwin\bin\bash.exe -c "roundup-server TheProject=/opt/roundup/trackers/support"``
1628 ``c:\cygwin\bin\bash.exe -c "roundup-server TheProject=/opt/roundup/trackers/support"`` 2059
1629 2060 Start In
1630 **Start In** 2061 ``C:\cygwin\opt\roundup\bin``
1631 2062
1632 ``C:\cygwin\opt\roundup\bin`` 2063 Schedule
1633 2064 At System Startup
1634 **Schedule**
1635
1636 At System Startup
1637 2065
1638 To have the Roundup mail gateway run periodically to poll a POP email address, 2066 To have the Roundup mail gateway run periodically to poll a POP email address,
1639 set up the following in Scheduled Tasks: 2067 set up the following in Scheduled Tasks:
1640 2068
1641 **Run** 2069 Run
1642 2070 ``c:\cygwin\bin\bash.exe -c "roundup-mailgw /opt/roundup/trackers/support pop roundup:roundup@mail-server"``
1643 ``c:\cygwin\bin\bash.exe -c "roundup-mailgw /opt/roundup/trackers/support pop roundup:roundup@mail-server"`` 2071
1644 2072 Start In
1645 **Start In** 2073 ``C:\cygwin\opt\roundup\bin``
1646 2074
1647 ``C:\cygwin\opt\roundup\bin`` 2075 Schedule
1648 2076 Every 10 minutes from 5:00AM for 24 hours every day
1649 **Schedule** 2077
1650 2078 Stop the task if it runs for 8 minutes
1651 Every 10 minutes from 5:00AM for 24 hours every day 2079
1652 2080
1653 Stop the task if it runs for 8 minutes 2081 .. index:: windows; setup Roundup a service
1654
1655 2082
1656 2. Installing the roundup server as a Windows service 2083 2. Installing the roundup server as a Windows service
1657 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2084 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1658 2085
1659 This is more Windows oriented and will make the Roundup server run as 2086 This is more Windows oriented and will make the Roundup server run as
1741 must have at least the rights to create and drop databases. 2168 must have at least the rights to create and drop databases.
1742 Documentation: details on `adding MySQL users`_, 2169 Documentation: details on `adding MySQL users`_,
1743 for PostgreSQL you want to call the ``createuser`` command with the 2170 for PostgreSQL you want to call the ``createuser`` command with the
1744 ``-d`` option to allow database creation. 2171 ``-d`` option to allow database creation.
1745 2172
1746 This can only be done if you downloaded and unpacked the source 2173 This can only be done if you `install the source`_ distribution
1747 distrbution. It will not work if you used `pip install` as the test 2174 (steps 1-3) or from a `mercurial checkout
1748 suite is not installed. Once you've unpacked roundup's source, if you 2175 <../code.html#get-sources>`_. It will not work if you used `pip
1749 have pytest installed, run ``python -m pytest test`` in the source 2176 install` as the test suite is not installed. Once you've unpacked
1750 directory and make sure there are no errors. If there are errors, 2177 roundup's source, if you have pytest installed, run ``python -m
1751 please let us know! 2178 pytest test`` in the Roundup source directory and make sure there
2179 are no errors. If there are errors, please let us know!
2180
2181 Note that redis tests uses database 15 of the redis server running on
2182 localhost.The tests verify that the database is empty before the redis
2183 tests start. If you use a password on your redis database it can be
2184 specified in the ``pytest_redis_pw`` environment variable when you run
2185 the test.
1752 2186
1753 .. _`user guide`: user_guide.html 2187 .. _`user guide`: user_guide.html
1754 .. _`roundup specification`: spec.html 2188 .. _`roundup specification`: spec.html
1755 .. _`tracker configuration`: customizing.html#tracker-configuration 2189 .. _`tracker configuration`: reference.html#tracker-configuration
1756 .. _`customisation documentation`: customizing.html 2190 .. _`customisation documentation`: customizing.html
2191 .. _`Roundup reference`: reference.html
2192 .. _`reference documentation`: reference.html
1757 .. _`preventing spam`: customizing.html#preventing-spam 2193 .. _`preventing spam`: customizing.html#preventing-spam
1758 .. _`Adding a new field to the classic schema`: 2194 .. _`Adding a new field to the classic schema`:
1759 customizing.html#adding-a-new-field-to-the-classic-schema 2195 customizing.html#adding-a-new-field-to-the-classic-schema
1760 .. _`Tracking different types of issues`: 2196 .. _`Tracking different types of issues`:
1761 customizing.html#tracking-different-types-of-issues 2197 customizing.html#tracking-different-types-of-issues
1762 .. _`customising roundup`: customizing.html 2198 .. _`customising roundup`: customizing.html
1763 .. _`upgrading document`: upgrading.html 2199 .. _`upgrading document`: upgrading.html
1764 .. _`administration guide`: admin_guide.html 2200 .. _`administration guide`: admin_guide.html
2201 .. _`What does Roundup install`: admin_guide.html#what-does-roundup-install
1765 .. _`doc/postgresql.txt`: postgresql.html 2202 .. _`doc/postgresql.txt`: postgresql.html
1766 .. _`doc/mysql.txt`: mysql.html 2203 .. _`doc/mysql.txt`: mysql.html
1767 2204
1768 2205
1769 .. _External hyperlink targets: 2206 .. _External hyperlink targets:
1791 .. _pysqlite: https://pysqlite.org/ 2228 .. _pysqlite: https://pysqlite.org/
1792 .. _pytz: https://pypi.org/project/pytz/ 2229 .. _pytz: https://pypi.org/project/pytz/
1793 .. _pywin32: https://pypi.org/project/pywin32/ 2230 .. _pywin32: https://pypi.org/project/pywin32/
1794 .. _Redis: https://redis.io 2231 .. _Redis: https://redis.io
1795 .. _redis-py: https://pypi.org/project/redis/ 2232 .. _redis-py: https://pypi.org/project/redis/
1796 .. _Whoosh: https://whoosh.readthedocs.org/en/latest 2233 .. _requests: https://requests.readthedocs.io/en/latest/
2234 .. _Whoosh: https://whoosh.readthedocs.io/en/latest/
1797 .. _Xapian: https://xapian.org/ 2235 .. _Xapian: https://xapian.org/
1798 .. _zstd: https://pypi.org/project/zstd/ 2236 .. _zstd: https://pypi.org/project/zstd/

Roundup Issue Tracker: http://roundup-tracker.org/