Self-Hosting with systemd
Running as a service
It is recommended to host cactus-appservice with docker as described here.
This page describes an experimental approach for running the appservice as a systemd service using Python’s virtualenv. If you have any suggestions for how to improve this, please don’t hesitate to contribute!
Prerequisites
You need a host that uses systemd as a service manager. You’ll also need Python 3.9 or newer and pip.
Configuration
Basic self-host configuration
Please follow the configuration steps of the main self-host document, except of course the docker part.
Setup the appservice’s directory
You need to decide where to store the appservice. Reasonable parent folder examples are /opt, /srv/www, /var/www/.
Assuming you are in the chosen folder, first clone the repo:
$ git clone https://gitlab.com/cactus-comments/cactus-appservice
$ cd cactus-appservice
Second, create a python virtualenv, and activate it:
$ virtualenv env
$ source env/bin/activate
Third, install the dependencies in the virtualenv:
$ pip install -r requirements.txt
You can leave the virtualenv now:
$ deactivate
Adjust the environment file
Create the environment file as described in the self host page.
To make the setup self-contained (and separate from the git repo), move the file to the env folder created by virtualenv (which is .gitignored), and name it appservice.env. It should be readable only by the user running systemd daemon: root!
$ mv <path-to-created-env-file> env/appservice.env
$ chown root. $_
$ chmod o-rwx $_
Next, set $PATH in the environment file, so that it points to <chekout-path>/env/bin.
The extended file could look like this (if you chose /srv/www as the repo’s parent folder):
PATH=/srv/www/cactus-appservice/env/bin
CACTUS_HS_TOKEN=b3b05236568ab46f0d98a978936c514eac93d8f90e6d5cd3895b3db5bb8d788b
CACTUS_AS_TOKEN=a2d7789eedb3c5076af0864f4af7bef77b1f250ac4e454c373c806876e939cca
CACTUS_HOMESERVER_URL=http://localhost:8008
CACTUS_USER_ID=@cactusbot:example.com
Copy and adjust systemd service file
There is a systemd unit file in the appservice repo, that is almost ready-to-use out of the box.
Install it so systemd can find it with cp:
$ sudo cp cactus-comments.example.service /etc/systemd/system/cactus-comments.service
You need to change the following parameters (marked by # Adjust this!) in the service file:
- set
EnvironmentFileto the full path ofappservice.env(the file you adjusted previously) - set
WorkingDirectoryto the full path of the local appservice repo.
For example the new file’s first lines should look like this (if you chose /srv/www as the repo’s parent folder):
[Unit]
Description=Cactus Comments appservice: Matrix powered embeddable comment backend
[Service]
Type=simple
ExecStart=/bin/bash -c 'gunicorn -w 4 -b 127.0.0.1:5000 --timeout 500 "app:create_app_from_env()"'
Restart=always
# Adjust this!
EnvironmentFile=/srv/www/cactus-appservice/env/appservice.env
# Adjust this!
WorkingDirectory=/srv/www/cactus-appservice
...
Save your changes, then let systemd know about the new service:
$ sudo systemctl daemon-reload
Start the service!
If you’ve also configured synapse, Cactus Comments should be ready to run as a service! You can enable and start the service in one fell swoop:
$ sudo systemctl enable --now cactus-comments
Check the logs:
$ sudo journalctl -u cactus-comments
The last lines should be something like:
Apr 06 01:04:27 example.com bash[5189]: [2022-04-06 01:04:27,041] INFO in app: Created application!
Hooray! It runs!