diff --git a/type/__matrix_synapse_worker/files/matrix-synapse-worker@.service b/type/__matrix_synapse_worker/files/matrix-synapse-worker@.service new file mode 100644 index 0000000..cb5ac0a --- /dev/null +++ b/type/__matrix_synapse_worker/files/matrix-synapse-worker@.service @@ -0,0 +1,25 @@ +[Unit] +Description=Synapse %i +AssertPathExists=/etc/matrix-synapse/workers/%i.yaml + +# This service should be restarted when the synapse target is restarted. +PartOf=matrix-synapse.target + +# if this is started at the same time as the main, let the main process start +# first, to initialise the database schema. +After=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.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 diff --git a/type/__matrix_synapse_worker/files/worker.yaml.sh b/type/__matrix_synapse_worker/files/worker.yaml.sh new file mode 100755 index 0000000..0d24636 --- /dev/null +++ b/type/__matrix_synapse_worker/files/worker.yaml.sh @@ -0,0 +1,25 @@ +#!/bin/sh + +cat << EOF +worker_app: "${WORKER_APP:?}" +worker_name: "${WORKER_NAME:?}" + +# The replication listener on the main synapse process. +worker_replication_host: "${WORKER_REPLICATION_HOST:?}" +worker_replication_http_port: "${WORKER_REPLICATION_PORT:?}" + +worker_listeners: + - type: http + port: "${WORKER_PORT:?}" + resources: + - names: +EOF + +for resource in ${WORKER_RESOURCES:?}; do +echo " - \"$resource\"" +done + +cat << EOF + +worker_log_config: "${WORKER_LOG_CONFIG:?}" +EOF diff --git a/type/__matrix_synapse_worker/man.rst b/type/__matrix_synapse_worker/man.rst new file mode 100644 index 0000000..c8150f6 --- /dev/null +++ b/type/__matrix_synapse_worker/man.rst @@ -0,0 +1,77 @@ +cdist-type__matrix_synapse(7) +====================== + +NAME +---- +cdist-type__matrix_synapse_worker - Configure a synapse worker + + +DESCRIPTION +----------- +This type configures and start a matrix worker. This type does not install +synapse: `cdist-type__matrix_synapse(7) <cdist-type__matrix_synapse.html>`_ +type must be run first. + +It is also recommended to take a look at: + + - `upstream's high-level overview on workers (matrix.org blog post) <https://matrix.org/blog/2020/11/03/how-we-fixed-synapses-scalability>`_ + - `upstream's documentation on workers <https://github.com/matrix-org/synapse/blob/develop/docs/workers.md>`_ + +REQUIRED PARAMETERS +------------------- +app + Worker application to be used. A detailed list is available on `upstream's + documentation + <https://github.com/matrix-org/synapse/blob/master/docs/workers.md#available-worker-applications>`_. + +port + Port on which this worker will listen. + +resource + Resources to be served by this worker. Can be specified multiple times. + +OPTIONAL PARAMETERS +------------------- +replication-host + Replication endpoint host of your main synapse process. Defaults to + localhost. + +replication-port + Replication endpoint port of your main synapse process. Defaults to 9093. + +log-config + Path to log configuration. Defaults to synapse's main process log + configuration. + +EXAMPLES +-------- + +.. code-block:: sh + + __matrix_synapse --server-name ungleich.ch \ + --base-url https://matrix.ungleich.ch \ + --database-engine sqlite3 \ + --database-name /var/lib/matrix-syanpse/homeserver.db \ + --worker-mode + require="__matrix_synapse" __matrix_synapse_worker generic \ + --app 'synapse.app.generic_worker' \ + --port 8083 \ + --resource 'federation' \ + --resource 'client' + +SEE ALSO +-------- +- `cdist-type__matrix_synapse(7) <cdist-type__matrix_synapse.html>`_ + + +AUTHORS +------- +Timothée Floure <timothee.floure@ungleich.ch> + + +COPYING +------- +Copyright \(C) 2019-2021 Timothée Floure. You can redistribute it +and/or modify it under the terms of the GNU General Public License as +published by the Free Software Foundation, either version 3 of the +License, or (at your option) any later version. diff --git a/type/__matrix_synapse_worker/manifest b/type/__matrix_synapse_worker/manifest new file mode 100755 index 0000000..c1867ed --- /dev/null +++ b/type/__matrix_synapse_worker/manifest @@ -0,0 +1,67 @@ +#!/bin/sh + +# TODO: check if matrix-synapse package is installed (fail if not - it's not +# this type's job to install it). + +name=$__object_id +os=$(cat "$__global/explorer/os") + +case "$os" in + debian) + synapse_conf_dir='/etc/synapse' + synapse_workers_conf_dir="$synapse_conf_dir/workers" + + # Synapse log configuration on debian - default value of config-log + # parameter. + WORKER_LOG_CONFIG="$synapse_conf_dir/log.yaml" + + # As of writing, debian's matrix-synapse package does not install the + # matrix-synapse-worker@.service systemd unit. + systemd_worker_service_override=present + systemd_worker_service="matrix-synapse-worker@$name" + ;; + *) + printf "Your operating system (%s) is currently not supported by this type (%s)\n" "$os" "${__type##*/}" >&2 + printf "Please contribute an implementation for it if you can.\n" >&2 + exit 1 + ;; +esac + +# Type parameters. +WORKER_NAME=$__object_id +WORKER_APP=$(cat "$__object/parameter/app") +WORKER_PORT=$(cat "$__object/parameter/port") +WORKER_RESOURCES=$(cat "$__object/parameter/resource") + +export WORKER_APP WORKER_NAME WORKER_PORT + +if [ -f "$__object/parameter/log-config" ]; then + WORKER_LOG_CONFIG=$(cat "$__object/parameter/log-config") +fi +export WORKER_LOG_CONFIG + +WORKER_REPLICATION_HOST=$(cat "$__object/parameter/replication-host") +WORKER_REPLICATION_PORT=$(cat "$__object/parameter/replication-port") +export WORKER_REPLICATION_HOST WORKER_REPLICATION_PORT + +# Generate and deploy configuration files. +mkdir -p "$__object/files" +"$__type/files/worker.yaml.sh" > "$__object/files/worker.yaml" + +__directory "$synapse_workers_conf_dir" --parents +require="__directory/$synapse_workers_conf_dir" \ + __file "$synapse_workers_conf_dir/$name.yaml" \ + --source "$__object/files/worker.yaml" \ + --mode 0644 + +__file "/etc/systemd/systemd/matrix-synapse-worker@.service" \ + --source "$__type/files/matrix-synapse-worker@.service" \ + --mode 0644 \ + --state $systemd_worker_service_override + +# Start service, enable at boot. +require="__file/$synapse_workers_conf_dir/$name.yaml \ + __file/etc/systemd/systemd/matrix-synapse-worker@.service" \ + __service "$systemd_worker_service" --action start +require="__service/$systemd_worker_service" \ + __start_on_boot "$systemd_worker_service" diff --git a/type/__matrix_synapse_worker/parameter/default/replication-host b/type/__matrix_synapse_worker/parameter/default/replication-host new file mode 100644 index 0000000..2fbb50c --- /dev/null +++ b/type/__matrix_synapse_worker/parameter/default/replication-host @@ -0,0 +1 @@ +localhost diff --git a/type/__matrix_synapse_worker/parameter/default/replication-port b/type/__matrix_synapse_worker/parameter/default/replication-port new file mode 100644 index 0000000..ed91c92 --- /dev/null +++ b/type/__matrix_synapse_worker/parameter/default/replication-port @@ -0,0 +1 @@ +9093 diff --git a/type/__matrix_synapse_worker/parameter/optional b/type/__matrix_synapse_worker/parameter/optional new file mode 100644 index 0000000..2f61487 --- /dev/null +++ b/type/__matrix_synapse_worker/parameter/optional @@ -0,0 +1,3 @@ +replication-host +replication-port +log-config diff --git a/type/__matrix_synapse_worker/parameter/optional_multiple b/type/__matrix_synapse_worker/parameter/optional_multiple new file mode 100644 index 0000000..91e75c6 --- /dev/null +++ b/type/__matrix_synapse_worker/parameter/optional_multiple @@ -0,0 +1 @@ +resource diff --git a/type/__matrix_synapse_worker/parameter/required b/type/__matrix_synapse_worker/parameter/required new file mode 100644 index 0000000..62d5bd6 --- /dev/null +++ b/type/__matrix_synapse_worker/parameter/required @@ -0,0 +1,3 @@ +app +name +port