summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--docker/Dockerfile-workers4
-rwxr-xr-xdocker/configure_workers_and_start.py186
-rw-r--r--docker/worker.yaml.j215
-rw-r--r--docker/workers/log_config_templates/pusher_log.yaml30
-rw-r--r--docker/workers/log_config_templates/user_dir_log.yaml30
-rw-r--r--docker/workers/pusher.yaml13
-rw-r--r--docker/workers/user_dir.yaml13
7 files changed, 76 insertions, 215 deletions
diff --git a/docker/Dockerfile-workers b/docker/Dockerfile-workers

index 88efab95ab..5f1bbb0eae 100644 --- a/docker/Dockerfile-workers +++ b/docker/Dockerfile-workers
@@ -6,10 +6,10 @@ RUN apt-get update RUN apt-get install -y supervisor redis nginx # Copy the worker process and log configuration files -COPY ./docker/workers /conf/workers/ +COPY ./docker/worker.yaml.j2 /conf/worker.yaml.j2 # Expose nginx listener port -EXPOSE 8008/tcp +EXPOSE 80/tcp # Volume for user-editable config files, logs etc. VOLUME ["/data"] diff --git a/docker/configure_workers_and_start.py b/docker/configure_workers_and_start.py
index a1ae18f39a..ddd68ff7ad 100755 --- a/docker/configure_workers_and_start.py +++ b/docker/configure_workers_and_start.py
@@ -22,6 +22,32 @@ import sys import subprocess import jinja2 +DEFAULT_LISTENER_RESOURCES = ["client", "federation"] + +WORKERS_CONFIG = { + "pusher": { + "app": "synapse.app.pusher", + "listener_resources": DEFAULT_LISTENER_RESOURCES, + "endpoint_patterns": [], + "shared_extra_conf": "start_pushers: false" + }, + "user_dir": { + "app": "synapse.app.user_dir", + "listener_resources": DEFAULT_LISTENER_RESOURCES, + "endpoint_patterns": [ + "^/_matrix/client/(api/v1|r0|unstable)/user_directory/search$" + ], + "shared_extra_conf": "update_user_directory: false" + }, + "media_repository": { + "app": "synapse.app.user_dir", + "listener_resources": ["media"], + "endpoint_patterns": [ + "^/_matrix/media/.*$|^/_synapse/admin/v1/(purge_media_cache$|(room|user)/.*/media.*$|media/.*$|quarantine_media/.*$)" + ], + "shared_extra_conf": "enable_media_repo: false" + } +} # Utility functions def log(txt): @@ -44,6 +70,7 @@ def convert(src, dst, environ): with open(src) as infile: template = infile.read() rendered = jinja2.Template(template, autoescape=True).render(**environ) + print(rendered) with open(dst, "w") as outfile: outfile.write(rendered) @@ -81,7 +108,7 @@ redis: # TODO: remove before prod suppress_key_server_warning: true - """ +""" # The supervisord config supervisord_config = """ @@ -112,14 +139,14 @@ stderr_logfile_maxbytes=0 autorestart=unexpected exitcodes=0 - """ % (config_path,) +""" % (config_path,) # An nginx site config. Will live in /etc/nginx/conf.d nginx_config_template_header = """ server { # Listen on Synapse's default HTTP port number - listen 8008; - listen [::]:8008; + listen 80; + listen [::]:80; server_name localhost; """ @@ -127,7 +154,7 @@ server { nginx_config_template_end = """ # Send all other traffic to the main process location ~* ^(\/_matrix|\/_synapse) { - proxy_pass http://localhost:18008; + proxy_pass http://localhost:8008; proxy_set_header X-Forwarded-For $remote_addr; # TODO: Can we move this to the default nginx.conf so all locations are @@ -138,7 +165,7 @@ server { client_max_body_size 50M; } } - """ +""" # Read desired worker configuration from environment if "SYNAPSE_WORKERS" not in environ: @@ -147,135 +174,51 @@ server { worker_types = environ.get("SYNAPSE_WORKERS") worker_types = worker_types.split(",") + os.mkdir("/conf/workers") + + worker_port = 18009 for worker_type in worker_types: worker_type = worker_type.strip() - if worker_type == "pusher": - # Disable push handling from the main process - homeserver_config += """ -start_pushers: false - """ + # TODO handle wrong worker type + worker_config = WORKERS_CONFIG.get(worker_type).copy() - # Enable the pusher worker in supervisord - supervisord_config += """ -[program:synapse_pusher] -command=/usr/local/bin/python -m synapse.app.pusher \ - --config-path="%s" \ - --config-path=/conf/workers/shared.yaml \ - --config-path=/conf/workers/pusher.yaml -autorestart=unexpected -exitcodes=0 -stdout_logfile=/dev/stdout -stdout_logfile_maxbytes=0 -stderr_logfile=/dev/stderr -stderr_logfile_maxbytes=0 - """ % (config_path,) + # this is not hardcoded bc we want to be able to have several workers + # of each type ultimately (not supported for now) + worker_name = worker_type + worker_config.update({"name": worker_name}) - # This worker does not handle any REST endpoints + worker_config.update({"port": worker_port}) + worker_config.update({"config_path": config_path}) - elif worker_type == "appservice": - # Disable appservice traffic sending from the main process - homeserver_config += """ -notify_appservices: false - """ + homeserver_config += worker_config['shared_extra_conf'] # Enable the pusher worker in supervisord - supervisord_config += """ -[program:synapse_appservice] -command=/usr/local/bin/python -m synapse.app.appservice \ - --config-path="%s" \ + supervisord_config += """ +[program:synapse_{name}] +command=/usr/local/bin/python -m {app} \ + --config-path="{config_path}" \ --config-path=/conf/workers/shared.yaml \ - --config-path=/conf/workers/appservice.yaml + --config-path=/conf/workers/{name}.yaml autorestart=unexpected exitcodes=0 stdout_logfile=/dev/stdout stdout_logfile_maxbytes=0 stderr_logfile=/dev/stderr -stderr_logfile_maxbytes=0 - """ % (config_path,) - - # This worker does not handle any REST endpoints +stderr_logfile_maxbytes=0""".format_map(worker_config) - elif worker_type == "user_dir": - # Disable user directory updates on the main process - homeserver_config += """ -update_user_directory: false - """ - # Enable the user directory worker in supervisord - supervisord_config += """ -[program:synapse_user_dir] -command=/usr/local/bin/python -m synapse.app.user_dir \ - --config-path="%s" \ - --config-path=/conf/workers/shared.yaml \ - --config-path=/conf/workers/user_dir.yaml -autorestart=unexpected -exitcodes=0 -stdout_logfile=/dev/stdout -stdout_logfile_maxbytes=0 -stderr_logfile=/dev/stderr -stderr_logfile_maxbytes=0 - """ % (config_path,) - - # Route user directory requests to this worker + for pattern in worker_config['endpoint_patterns']: nginx_config_body += """ - location ~* ^/_matrix/client/(api/v1|r0|unstable)/user_directory/search$ { - proxy_pass http://localhost:8010; + location ~* %s { + proxy_pass http://localhost:%s; proxy_set_header X-Forwarded-For $remote_addr; } - """ - - elif worker_type == "federation_sender": - # Disable user directory updates on the main process - homeserver_config += """ -send_federation: False - """ - - # Enable the user directory worker in supervisord - supervisord_config += """ -[program:synapse_user_dir] -command=/usr/local/bin/python -m synapse.app.user_dir \ - --config-path="%s" \ - --config-path=/conf/workers/shared.yaml \ - --config-path=/conf/workers/user_dir.yaml -autorestart=unexpected -exitcodes=0 -stdout_logfile=/dev/stdout -stdout_logfile_maxbytes=0 -stderr_logfile=/dev/stderr -stderr_logfile_maxbytes=0 - """ % (config_path,) - - # This worker does not handle any REST endpoints - - elif worker_type == "media_repository": - # Disable user directory updates on the main process - homeserver_config += """ - update_user_directory: false - """ - - # Enable the user directory worker in supervisord - supervisord_config += """ - [program:synapse_user_dir] - command=/usr/local/bin/python -m synapse.app.user_dir \ - --config-path="%s" \ - --config-path=/conf/workers/shared.yaml \ - --config-path=/conf/workers/user_dir.yaml - autorestart=unexpected - exitcodes=0 - stdout_logfile=/dev/stdout - stdout_logfile_maxbytes=0 - stderr_logfile=/dev/stderr - stderr_logfile_maxbytes=0 - """ % (config_path,) - - # Route user directory requests to this worker - nginx_config_body += """ - location ~* (^/_matrix/media/.*$|^/_synapse/admin/v1/(purge_media_cache$|(room|user)/.*/media.*$|media/.*$|quarantine_media/.*$) { - proxy_pass http://localhost:8010; - proxy_set_header X-Forwarded-For $remote_addr; - } - """ +""" % (pattern, worker_port) + + convert("/conf/worker.yaml.j2", "/conf/workers/{name}.yaml".format(name=worker_name), worker_config) + + worker_port += 1 # Write out the config files @@ -300,17 +243,6 @@ stderr_logfile_maxbytes=0 with open("/etc/supervisor/conf.d/supervisord.conf", "w") as f: f.write(supervisord_config) - # Generate worker log config files from the templates. - # The templates are mainly there so that we can inject some environment variable - # values into them. - log_config_template_dir = "/conf/workers/log_config_templates/" - log_config_dir = "/conf/workers/" - for log_config_filename in os.listdir(log_config_template_dir): - template_path = log_config_template_dir + log_config_filename - out_path = log_config_dir + log_config_filename - - convert(template_path, out_path, environ) - # Ensure the logging directory exists log_dir = data_dir + "/logs" if not os.path.exists(log_dir): diff --git a/docker/worker.yaml.j2 b/docker/worker.yaml.j2 new file mode 100644
index 0000000000..e9c1ffb7f7 --- /dev/null +++ b/docker/worker.yaml.j2
@@ -0,0 +1,15 @@ +worker_app: "{{ app }}" +worker_name: "{{ name }}" + +# The replication listener on the main synapse process. +worker_replication_host: 127.0.0.1 +worker_replication_http_port: 9093 + +worker_listeners: + - type: http + port: {{ port }} + resources: + - names: +{%- for resource in listener_resources %} + - {{ resource }} +{%- endfor %} diff --git a/docker/workers/log_config_templates/pusher_log.yaml b/docker/workers/log_config_templates/pusher_log.yaml deleted file mode 100644
index c2563242a4..0000000000 --- a/docker/workers/log_config_templates/pusher_log.yaml +++ /dev/null
@@ -1,30 +0,0 @@ -version: 1 - -formatters: - precise: - format: '%(asctime)s - %(name)s - %(lineno)d - %(levelname)s - %(request)s - %(message)s' - -handlers: - file: - class: logging.handlers.TimedRotatingFileHandler - formatter: precise - filename: "{{ SYNAPSE_DATA_DIR or '/data' }}/logs/pusher1.log" - when: midnight - backupCount: 3 # Does not include the current log file. - encoding: utf8 - - console: - class: logging.StreamHandler - formatter: precise - -loggers: - synapse.storage.SQL: - # beware: increasing this to DEBUG will make synapse log sensitive - # information such as access tokens. - level: INFO - -root: - level: {{ SYNAPSE_LOG_LEVEL or "INFO" }} - handlers: [console] - -disable_existing_loggers: false \ No newline at end of file diff --git a/docker/workers/log_config_templates/user_dir_log.yaml b/docker/workers/log_config_templates/user_dir_log.yaml deleted file mode 100644
index c2563242a4..0000000000 --- a/docker/workers/log_config_templates/user_dir_log.yaml +++ /dev/null
@@ -1,30 +0,0 @@ -version: 1 - -formatters: - precise: - format: '%(asctime)s - %(name)s - %(lineno)d - %(levelname)s - %(request)s - %(message)s' - -handlers: - file: - class: logging.handlers.TimedRotatingFileHandler - formatter: precise - filename: "{{ SYNAPSE_DATA_DIR or '/data' }}/logs/pusher1.log" - when: midnight - backupCount: 3 # Does not include the current log file. - encoding: utf8 - - console: - class: logging.StreamHandler - formatter: precise - -loggers: - synapse.storage.SQL: - # beware: increasing this to DEBUG will make synapse log sensitive - # information such as access tokens. - level: INFO - -root: - level: {{ SYNAPSE_LOG_LEVEL or "INFO" }} - handlers: [console] - -disable_existing_loggers: false \ No newline at end of file diff --git a/docker/workers/pusher.yaml b/docker/workers/pusher.yaml deleted file mode 100644
index bf1ccf4135..0000000000 --- a/docker/workers/pusher.yaml +++ /dev/null
@@ -1,13 +0,0 @@ -worker_app: synapse.app.pusher -worker_name: pusher - -# The replication listener on the main synapse process. -worker_replication_host: 127.0.0.1 -worker_replication_http_port: 9093 - -worker_listeners: - - type: http - port: 8083 - resources: [] - -worker_log_config: /conf/workers/pusher_log.yaml \ No newline at end of file diff --git a/docker/workers/user_dir.yaml b/docker/workers/user_dir.yaml deleted file mode 100644
index 8f5deaf375..0000000000 --- a/docker/workers/user_dir.yaml +++ /dev/null
@@ -1,13 +0,0 @@ -worker_app: synapse.app.user_dir -worker_name: user_dir - -# The replication listener on the main synapse process. -worker_replication_host: 127.0.0.1 -worker_replication_http_port: 9093 - -worker_listeners: - - type: http - port: 8084 - resources: [] - -worker_log_config: /conf/workers/user_dir_log.yaml \ No newline at end of file