diff --git a/changelog.d/12826.misc b/changelog.d/12826.misc
new file mode 100644
index 0000000000..f5e91f1ed5
--- /dev/null
+++ b/changelog.d/12826.misc
@@ -0,0 +1 @@
+Support registering Application Services when running with workers under Complement.
\ No newline at end of file
diff --git a/docker/complement/conf-workers/start-complement-synapse-workers.sh b/docker/complement/conf-workers/start-complement-synapse-workers.sh
index a10b57a53f..b7e2444000 100755
--- a/docker/complement/conf-workers/start-complement-synapse-workers.sh
+++ b/docker/complement/conf-workers/start-complement-synapse-workers.sh
@@ -36,6 +36,11 @@ export SYNAPSE_WORKER_TYPES="\
appservice, \
pusher"
+# Add Complement's appservice registration directory, if there is one
+# (It can be absent when there are no application services in this test!)
+if [ -d /complement/appservice ]; then
+ export SYNAPSE_AS_REGISTRATION_DIR=/complement/appservice
+fi
# Generate a TLS key, then generate a certificate by having Complement's CA sign it
# Note that both the key and certificate are in PEM format (not DER).
diff --git a/docker/conf-workers/shared.yaml.j2 b/docker/conf-workers/shared.yaml.j2
index f94b8c6aca..644ed788f3 100644
--- a/docker/conf-workers/shared.yaml.j2
+++ b/docker/conf-workers/shared.yaml.j2
@@ -6,4 +6,13 @@
redis:
enabled: true
-{{ shared_worker_config }}
\ No newline at end of file
+{% if appservice_registrations is not none %}
+## Application Services ##
+# A list of application service config files to use.
+app_service_config_files:
+{%- for path in appservice_registrations %}
+ - "{{ path }}"
+{%- endfor %}
+{%- endif %}
+
+{{ shared_worker_config }}
diff --git a/docker/configure_workers_and_start.py b/docker/configure_workers_and_start.py
index f46b9b675e..b6ad141173 100755
--- a/docker/configure_workers_and_start.py
+++ b/docker/configure_workers_and_start.py
@@ -21,6 +21,8 @@
# * SYNAPSE_REPORT_STATS: Whether to report stats.
# * SYNAPSE_WORKER_TYPES: A comma separated list of worker names as specified in WORKER_CONFIG
# below. Leave empty for no workers, or set to '*' for all possible workers.
+# * SYNAPSE_AS_REGISTRATION_DIR: If specified, a directory in which .yaml and .yml files
+# will be treated as Application Service registration files.
# * SYNAPSE_TLS_CERT: Path to a TLS certificate in PEM format.
# * SYNAPSE_TLS_KEY: Path to a TLS key. If this and SYNAPSE_TLS_CERT are specified,
# Nginx will be configured to serve TLS on port 8448.
@@ -32,6 +34,7 @@
import os
import subprocess
import sys
+from pathlib import Path
from typing import Any, Dict, List, Mapping, MutableMapping, NoReturn, Set
import jinja2
@@ -491,11 +494,23 @@ def generate_worker_files(
master_log_config = generate_worker_log_config(environ, "master", data_dir)
shared_config["log_config"] = master_log_config
+ # Find application service registrations
+ appservice_registrations = None
+ appservice_registration_dir = os.environ.get("SYNAPSE_AS_REGISTRATION_DIR")
+ if appservice_registration_dir:
+ # Scan for all YAML files that should be application service registrations.
+ appservice_registrations = [
+ str(reg_path.resolve())
+ for reg_path in Path(appservice_registration_dir).iterdir()
+ if reg_path.suffix.lower() in (".yaml", ".yml")
+ ]
+
# Shared homeserver config
convert(
"/conf/shared.yaml.j2",
"/conf/workers/shared.yaml",
shared_worker_config=yaml.dump(shared_config),
+ appservice_registrations=appservice_registrations,
)
# Nginx config
|