Make systemd-with-workers doc official (#7234)
Simplify and update this documentation, and make it part of the core dist.
This commit is contained in:
parent
c11d24d48c
commit
cae4121484
|
@ -0,0 +1 @@
|
||||||
|
Update the contributed documentation on managing synapse workers with systemd, and bring it into the core distribution.
|
|
@ -1,150 +1,2 @@
|
||||||
# Setup Synapse with Workers and Systemd
|
The documentation for using systemd to manage synapse workers is now part of
|
||||||
|
the main synapse distribution. See [docs/systemd-with-workers](../../docs/systemd-with-workers).
|
||||||
This is a setup for managing synapse with systemd including support for
|
|
||||||
managing workers. It provides a `matrix-synapse`, as well as a
|
|
||||||
`matrix-synapse-worker@` service for any workers you require. Additionally to
|
|
||||||
group the required services it sets up a `matrix.target`. You can use this to
|
|
||||||
automatically start any bot- or bridge-services. More on this in
|
|
||||||
[Bots and Bridges](#bots-and-bridges).
|
|
||||||
|
|
||||||
See the folder [system](system) for any service and target files.
|
|
||||||
|
|
||||||
The folder [workers](workers) contains an example configuration for the
|
|
||||||
`federation_reader` worker. Pay special attention to the name of the
|
|
||||||
configuration file. In order to work with the `matrix-synapse-worker@.service`
|
|
||||||
service, it needs to have the exact same name as the worker app.
|
|
||||||
|
|
||||||
This setup expects neither the homeserver nor any workers to fork. Forking is
|
|
||||||
handled by systemd.
|
|
||||||
|
|
||||||
## Setup
|
|
||||||
|
|
||||||
1. Adjust your matrix configs. Make sure that the worker config files have the
|
|
||||||
exact same name as the worker app. Compare `matrix-synapse-worker@.service` for
|
|
||||||
why. You can find an example worker config in the [workers](workers) folder. See
|
|
||||||
below for relevant settings in the `homeserver.yaml`.
|
|
||||||
2. Copy the `*.service` and `*.target` files in [system](system) to
|
|
||||||
`/etc/systemd/system`.
|
|
||||||
3. `systemctl enable matrix-synapse.service` this adds the homeserver
|
|
||||||
app to the `matrix.target`
|
|
||||||
4. *Optional.* `systemctl enable
|
|
||||||
matrix-synapse-worker@federation_reader.service` this adds the federation_reader
|
|
||||||
app to the `matrix-synapse.service`
|
|
||||||
5. *Optional.* Repeat step 4 for any additional workers you require.
|
|
||||||
6. *Optional.* Add any bots or bridges by enabling them.
|
|
||||||
7. Start all matrix related services via `systemctl start matrix.target`
|
|
||||||
8. *Optional.* Enable autostart of all matrix related services on system boot
|
|
||||||
via `systemctl enable matrix.target`
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
After you have setup you can use the following commands to manage your synapse
|
|
||||||
installation:
|
|
||||||
|
|
||||||
```
|
|
||||||
# Start matrix-synapse, all workers and any enabled bots or bridges.
|
|
||||||
systemctl start matrix.target
|
|
||||||
|
|
||||||
# Restart matrix-synapse and all workers (not necessarily restarting bots
|
|
||||||
# or bridges, see "Bots and Bridges")
|
|
||||||
systemctl restart matrix-synapse.service
|
|
||||||
|
|
||||||
# Stop matrix-synapse and all workers (not necessarily restarting bots
|
|
||||||
# or bridges, see "Bots and Bridges")
|
|
||||||
systemctl stop matrix-synapse.service
|
|
||||||
|
|
||||||
# Restart a specific worker (i. e. federation_reader), the homeserver is
|
|
||||||
# unaffected by this.
|
|
||||||
systemctl restart matrix-synapse-worker@federation_reader.service
|
|
||||||
|
|
||||||
# Add a new worker (assuming all configs are setup already)
|
|
||||||
systemctl enable matrix-synapse-worker@federation_writer.service
|
|
||||||
systemctl restart matrix-synapse.service
|
|
||||||
```
|
|
||||||
|
|
||||||
## The Configs
|
|
||||||
|
|
||||||
Make sure the `worker_app` is set in the `homeserver.yaml` and it does not fork.
|
|
||||||
|
|
||||||
```
|
|
||||||
worker_app: synapse.app.homeserver
|
|
||||||
daemonize: false
|
|
||||||
```
|
|
||||||
|
|
||||||
None of the workers should fork, as forking is handled by systemd. Hence make
|
|
||||||
sure this is present in all worker config files.
|
|
||||||
|
|
||||||
```
|
|
||||||
worker_daemonize: false
|
|
||||||
```
|
|
||||||
|
|
||||||
The config files of all workers are expected to be located in
|
|
||||||
`/etc/matrix-synapse/workers`. If you want to use a different location you have
|
|
||||||
to edit the provided `*.service` files accordingly.
|
|
||||||
|
|
||||||
## Bots and Bridges
|
|
||||||
|
|
||||||
Most bots and bridges do not care if the homeserver goes down or is restarted.
|
|
||||||
Depending on the implementation this may crash them though. So look up the docs
|
|
||||||
or ask the community of the specific bridge or bot you want to run to make sure
|
|
||||||
you choose the correct setup.
|
|
||||||
|
|
||||||
Whichever configuration you choose, after the setup the following will enable
|
|
||||||
automatically starting (and potentially restarting) your bot/bridge with the
|
|
||||||
`matrix.target`.
|
|
||||||
|
|
||||||
```
|
|
||||||
systemctl enable <yourBotOrBridgeName>.service
|
|
||||||
```
|
|
||||||
|
|
||||||
**Note** that from an inactive synapse the bots/bridges will only be started with
|
|
||||||
synapse if you start the `matrix.target`, not if you start the
|
|
||||||
`matrix-synapse.service`. This is on purpose. Think of `matrix-synapse.service`
|
|
||||||
as *just* synapse, but `matrix.target` being anything matrix related, including
|
|
||||||
synapse and any and all enabled bots and bridges.
|
|
||||||
|
|
||||||
### Start with synapse but ignore synapse going down
|
|
||||||
|
|
||||||
If the bridge can handle shutdowns of the homeserver you'll want to install the
|
|
||||||
service in the `matrix.target` and optionally add a
|
|
||||||
`After=matrix-synapse.service` dependency to have the bot/bridge start after
|
|
||||||
synapse on starting everything.
|
|
||||||
|
|
||||||
In this case the service file should look like this.
|
|
||||||
|
|
||||||
```
|
|
||||||
[Unit]
|
|
||||||
# ...
|
|
||||||
# Optional, this will only ensure that if you start everything, synapse will
|
|
||||||
# be started before the bot/bridge will be started.
|
|
||||||
After=matrix-synapse.service
|
|
||||||
|
|
||||||
[Service]
|
|
||||||
# ...
|
|
||||||
|
|
||||||
[Install]
|
|
||||||
WantedBy=matrix.target
|
|
||||||
```
|
|
||||||
|
|
||||||
### Stop/restart when synapse stops/restarts
|
|
||||||
|
|
||||||
If the bridge can't handle shutdowns of the homeserver you'll still want to
|
|
||||||
install the service in the `matrix.target` but also have to specify the
|
|
||||||
`After=matrix-synapse.service` *and* `BindsTo=matrix-synapse.service`
|
|
||||||
dependencies to have the bot/bridge stop/restart with synapse.
|
|
||||||
|
|
||||||
In this case the service file should look like this.
|
|
||||||
|
|
||||||
```
|
|
||||||
[Unit]
|
|
||||||
# ...
|
|
||||||
# Mandatory
|
|
||||||
After=matrix-synapse.service
|
|
||||||
BindsTo=matrix-synapse.service
|
|
||||||
|
|
||||||
[Service]
|
|
||||||
# ...
|
|
||||||
|
|
||||||
[Install]
|
|
||||||
WantedBy=matrix.target
|
|
||||||
```
|
|
||||||
|
|
|
@ -1,19 +0,0 @@
|
||||||
[Unit]
|
|
||||||
Description=Synapse Matrix Worker
|
|
||||||
After=matrix-synapse.service
|
|
||||||
BindsTo=matrix-synapse.service
|
|
||||||
|
|
||||||
[Service]
|
|
||||||
Type=notify
|
|
||||||
NotifyAccess=main
|
|
||||||
User=matrix-synapse
|
|
||||||
WorkingDirectory=/var/lib/matrix-synapse
|
|
||||||
EnvironmentFile=/etc/default/matrix-synapse
|
|
||||||
ExecStart=/opt/venvs/matrix-synapse/bin/python -m synapse.app.%i --config-path=/etc/matrix-synapse/homeserver.yaml --config-path=/etc/matrix-synapse/conf.d/ --config-path=/etc/matrix-synapse/workers/%i.yaml
|
|
||||||
ExecReload=/bin/kill -HUP $MAINPID
|
|
||||||
Restart=always
|
|
||||||
RestartSec=3
|
|
||||||
SyslogIdentifier=matrix-synapse-%i
|
|
||||||
|
|
||||||
[Install]
|
|
||||||
WantedBy=matrix-synapse.service
|
|
|
@ -1,7 +0,0 @@
|
||||||
[Unit]
|
|
||||||
Description=Contains matrix services like synapse, bridges and bots
|
|
||||||
After=network.target
|
|
||||||
AllowIsolate=no
|
|
||||||
|
|
||||||
[Install]
|
|
||||||
WantedBy=multi-user.target
|
|
|
@ -0,0 +1,67 @@
|
||||||
|
# Setting up Synapse with Workers and Systemd
|
||||||
|
|
||||||
|
This is a setup for managing synapse with systemd, including support for
|
||||||
|
managing workers. It provides a `matrix-synapse` service for the master, as
|
||||||
|
well as a `matrix-synapse-worker@` service template for any workers you
|
||||||
|
require. Additionally, to group the required services, it sets up a
|
||||||
|
`matrix-synapse.target`.
|
||||||
|
|
||||||
|
See the folder [system](system) for the systemd unit files.
|
||||||
|
|
||||||
|
The folder [workers](workers) contains an example configuration for the
|
||||||
|
`federation_reader` worker.
|
||||||
|
|
||||||
|
## Synapse configuration files
|
||||||
|
|
||||||
|
See [workers.md](../workers.md) for information on how to set up the
|
||||||
|
configuration files and reverse-proxy correctly. You can find an example worker
|
||||||
|
config in the [workers](workers) folder.
|
||||||
|
|
||||||
|
Systemd manages daemonization itself, so ensure that none of the configuration
|
||||||
|
files set either `daemonize` or `worker_daemonize`.
|
||||||
|
|
||||||
|
The config files of all workers are expected to be located in
|
||||||
|
`/etc/matrix-synapse/workers`. If you want to use a different location, edit
|
||||||
|
the provided `*.service` files accordingly.
|
||||||
|
|
||||||
|
There is no need for a separate configuration file for the master process.
|
||||||
|
|
||||||
|
## Set up
|
||||||
|
|
||||||
|
1. Adjust synapse configuration files as above.
|
||||||
|
1. Copy the `*.service` and `*.target` files in [system](system) to
|
||||||
|
`/etc/systemd/system`.
|
||||||
|
1. Run `systemctl deamon-reload` to tell systemd to load the new unit files.
|
||||||
|
1. Run `systemctl enable matrix-synapse.service`. This will configure the
|
||||||
|
synapse master process to be started as part of the `matrix-synapse.target`
|
||||||
|
target.
|
||||||
|
1. For each worker process to be enabled, run `systemctl enable
|
||||||
|
matrix-synapse-worker@<worker_name>.service`. For each `<worker_name>`, there
|
||||||
|
should be a corresponding configuration file
|
||||||
|
`/etc/matrix-synapse/workers/<worker_name>.yaml`.
|
||||||
|
1. Start all the synapse processes with `systemctl start matrix-synapse.target`.
|
||||||
|
1. Tell systemd to start synapse on boot with `systemctl enable matrix-synapse.target`/
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
Once the services are correctly set up, you can use the following commands
|
||||||
|
to manage your synapse installation:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Restart Synapse master and all workers
|
||||||
|
systemctl restart matrix-synapse.target
|
||||||
|
|
||||||
|
# Stop Synapse and all workers
|
||||||
|
systemctl stop matrix-synapse.target
|
||||||
|
|
||||||
|
# Restart the master alone
|
||||||
|
systemctl start matrix-synapse.service
|
||||||
|
|
||||||
|
# Restart a specific worker (eg. federation_reader); the master is
|
||||||
|
# unaffected by this.
|
||||||
|
systemctl restart matrix-synapse-worker@federation_reader.service
|
||||||
|
|
||||||
|
# Add a new worker (assuming all configs are set up already)
|
||||||
|
systemctl enable matrix-synapse-worker@federation_writer.service
|
||||||
|
systemctl restart matrix-synapse.target
|
||||||
|
```
|
|
@ -0,0 +1,20 @@
|
||||||
|
[Unit]
|
||||||
|
Description=Synapse %i
|
||||||
|
|
||||||
|
# This service should be restarted when the synapse target is restarted.
|
||||||
|
PartOf=matrix-synapse.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=notify
|
||||||
|
NotifyAccess=main
|
||||||
|
User=matrix-synapse
|
||||||
|
WorkingDirectory=/var/lib/matrix-synapse
|
||||||
|
EnvironmentFile=/etc/default/matrix-synapse
|
||||||
|
ExecStart=/opt/venvs/matrix-synapse/bin/python -m synapse.app.generic_worker --config-path=/etc/matrix-synapse/homeserver.yaml --config-path=/etc/matrix-synapse/conf.d/ --config-path=/etc/matrix-synapse/workers/%i.yaml
|
||||||
|
ExecReload=/bin/kill -HUP $MAINPID
|
||||||
|
Restart=always
|
||||||
|
RestartSec=3
|
||||||
|
SyslogIdentifier=matrix-synapse-%i
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=matrix-synapse.target
|
|
@ -1,5 +1,8 @@
|
||||||
[Unit]
|
[Unit]
|
||||||
Description=Synapse Matrix Homeserver
|
Description=Synapse master
|
||||||
|
|
||||||
|
# This service should be restarted when the synapse target is restarted.
|
||||||
|
PartOf=matrix-synapse.target
|
||||||
|
|
||||||
[Service]
|
[Service]
|
||||||
Type=notify
|
Type=notify
|
||||||
|
@ -15,4 +18,4 @@ RestartSec=3
|
||||||
SyslogIdentifier=matrix-synapse
|
SyslogIdentifier=matrix-synapse
|
||||||
|
|
||||||
[Install]
|
[Install]
|
||||||
WantedBy=matrix.target
|
WantedBy=matrix-synapse.target
|
|
@ -0,0 +1,6 @@
|
||||||
|
[Unit]
|
||||||
|
Description=Synapse parent target
|
||||||
|
After=network.target
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
|
@ -10,5 +10,4 @@ worker_listeners:
|
||||||
resources:
|
resources:
|
||||||
- names: [federation]
|
- names: [federation]
|
||||||
|
|
||||||
worker_daemonize: false
|
|
||||||
worker_log_config: /etc/matrix-synapse/federation-reader-log.yaml
|
worker_log_config: /etc/matrix-synapse/federation-reader-log.yaml
|
|
@ -52,24 +52,20 @@ synapse process.)
|
||||||
|
|
||||||
You then create a set of configs for the various worker processes. These
|
You then create a set of configs for the various worker processes. These
|
||||||
should be worker configuration files, and should be stored in a dedicated
|
should be worker configuration files, and should be stored in a dedicated
|
||||||
subdirectory, to allow synctl to manipulate them. An additional configuration
|
subdirectory, to allow synctl to manipulate them.
|
||||||
for the master synapse process will need to be created because the process will
|
|
||||||
not be started automatically. That configuration should look like this:
|
|
||||||
|
|
||||||
worker_app: synapse.app.homeserver
|
|
||||||
daemonize: true
|
|
||||||
|
|
||||||
Each worker configuration file inherits the configuration of the main homeserver
|
Each worker configuration file inherits the configuration of the main homeserver
|
||||||
configuration file. You can then override configuration specific to that worker,
|
configuration file. You can then override configuration specific to that worker,
|
||||||
e.g. the HTTP listener that it provides (if any); logging configuration; etc.
|
e.g. the HTTP listener that it provides (if any); logging configuration; etc.
|
||||||
You should minimise the number of overrides though to maintain a usable config.
|
You should minimise the number of overrides though to maintain a usable config.
|
||||||
|
|
||||||
You must specify the type of worker application (`worker_app`). The currently
|
In the config file for each worker, you must specify the type of worker
|
||||||
available worker applications are listed below. You must also specify the
|
application (`worker_app`). The currently available worker applications are
|
||||||
replication endpoints that it's talking to on the main synapse process.
|
listed below. You must also specify the replication endpoints that it's talking
|
||||||
`worker_replication_host` should specify the host of the main synapse,
|
to on the main synapse process. `worker_replication_host` should specify the
|
||||||
`worker_replication_port` should point to the TCP replication listener port and
|
host of the main synapse, `worker_replication_port` should point to the TCP
|
||||||
`worker_replication_http_port` should point to the HTTP replication port.
|
replication listener port and `worker_replication_http_port` should point to
|
||||||
|
the HTTP replication port.
|
||||||
|
|
||||||
Currently, the `event_creator` and `federation_reader` workers require specifying
|
Currently, the `event_creator` and `federation_reader` workers require specifying
|
||||||
`worker_replication_http_port`.
|
`worker_replication_http_port`.
|
||||||
|
@ -90,8 +86,6 @@ For instance:
|
||||||
- names:
|
- names:
|
||||||
- client
|
- client
|
||||||
|
|
||||||
worker_daemonize: True
|
|
||||||
worker_pid_file: /home/matrix/synapse/synchrotron.pid
|
|
||||||
worker_log_config: /home/matrix/synapse/config/synchrotron_log_config.yaml
|
worker_log_config: /home/matrix/synapse/config/synchrotron_log_config.yaml
|
||||||
|
|
||||||
...is a full configuration for a synchrotron worker instance, which will expose a
|
...is a full configuration for a synchrotron worker instance, which will expose a
|
||||||
|
@ -101,7 +95,31 @@ by the main synapse.
|
||||||
Obviously you should configure your reverse-proxy to route the relevant
|
Obviously you should configure your reverse-proxy to route the relevant
|
||||||
endpoints to the worker (`localhost:8083` in the above example).
|
endpoints to the worker (`localhost:8083` in the above example).
|
||||||
|
|
||||||
Finally, to actually run your worker-based synapse, you must pass synctl the -a
|
Finally, you need to start your worker processes. This can be done with either
|
||||||
|
`synctl` or your distribution's preferred service manager such as `systemd`. We
|
||||||
|
recommend the use of `systemd` where available: for information on setting up
|
||||||
|
`systemd` to start synapse workers, see
|
||||||
|
[systemd-with-workers](systemd-with-workers). To use `synctl`, see below.
|
||||||
|
|
||||||
|
### Using synctl
|
||||||
|
|
||||||
|
If you want to use `synctl` to manage your synapse processes, you will need to
|
||||||
|
create an an additional configuration file for the master synapse process. That
|
||||||
|
configuration should look like this:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
worker_app: synapse.app.homeserver
|
||||||
|
```
|
||||||
|
|
||||||
|
Additionally, each worker app must be configured with the name of a "pid file",
|
||||||
|
to which it will write its process ID when it starts. For example, for a
|
||||||
|
synchrotron, you might write:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
worker_pid_file: /home/matrix/synapse/synchrotron.pid
|
||||||
|
```
|
||||||
|
|
||||||
|
Finally, to actually run your worker-based synapse, you must pass synctl the `-a`
|
||||||
commandline option to tell it to operate on all the worker configurations found
|
commandline option to tell it to operate on all the worker configurations found
|
||||||
in the given directory, e.g.:
|
in the given directory, e.g.:
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue