Mercurial > p > roundup > code
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/ |
