From ff1338e0036e4d97fcb7d41d584afdb78449fe5c Mon Sep 17 00:00:00 2001 From: Slavi Pantaleev Date: Tue, 14 Feb 2023 08:31:26 +0200 Subject: [PATCH] Add support for hosting Element (on Traefik) at a subpath --- .../matrix-client-element/defaults/main.yml | 4 +++- .../tasks/validate_config.yml | 20 +++++++++++++++++++ .../matrix-client-element/templates/labels.j2 | 11 ++++++++++ 3 files changed, 34 insertions(+), 1 deletion(-) diff --git a/roles/custom/matrix-client-element/defaults/main.yml b/roles/custom/matrix-client-element/defaults/main.yml index 890bc473..3ebed056 100644 --- a/roles/custom/matrix-client-element/defaults/main.yml +++ b/roles/custom/matrix-client-element/defaults/main.yml @@ -38,7 +38,9 @@ matrix_client_element_container_http_host_bind_port: '' matrix_client_element_container_labels_traefik_enabled: true matrix_client_element_container_labels_traefik_docker_network: "{{ matrix_client_element_container_network }}" matrix_client_element_container_labels_traefik_hostname: "{{ matrix_server_fqn_element }}" -matrix_client_element_container_labels_traefik_rule: "Host(`{{ matrix_client_element_container_labels_traefik_hostname }}`)" +# The path prefix must either be `/` or not end with a slash (e.g. `/element`). +matrix_client_element_container_labels_traefik_path_prefix: / +matrix_client_element_container_labels_traefik_rule: "Host(`{{ matrix_client_element_container_labels_traefik_hostname }}`){% if matrix_client_element_container_labels_traefik_path_prefix != '/' %} && PathPrefix(`{{ matrix_client_element_container_labels_traefik_path_prefix }}`){% endif %}" matrix_client_element_container_labels_traefik_entrypoints: web-secure matrix_client_element_container_labels_traefik_tls: "{{ matrix_client_element_container_labels_traefik_entrypoints != 'web' }}" matrix_client_element_container_labels_traefik_tls_certResolver: default # noqa var-naming diff --git a/roles/custom/matrix-client-element/tasks/validate_config.yml b/roles/custom/matrix-client-element/tasks/validate_config.yml index 0e252db8..658542fb 100644 --- a/roles/custom/matrix-client-element/tasks/validate_config.yml +++ b/roles/custom/matrix-client-element/tasks/validate_config.yml @@ -26,3 +26,23 @@ when: "vars | dict2items | selectattr('key', 'match', item.old) | list | items2dict" with_items: - {'old': 'matrix_riot_web_.*', 'new': 'matrix_client_element_.*'} + +- when: matrix_client_element_container_labels_traefik_enabled | bool + block: + - name: Fail if required matrix-client-element Traefik settings not defined + ansible.builtin.fail: + msg: >- + You need to define a required configuration setting (`{{ item }}`). + when: "vars[item] == ''" + with_items: + - matrix_synapse_admin_container_labels_traefik_hostname + - matrix_client_element_container_labels_traefik_path_prefix + + # We ensure it doesn't end with a slash, because we handle both (slash and no-slash). + # Knowing that `matrix_client_element_container_labels_traefik_path_prefix` does not end with a slash + # ensures we know how to set these routes up without having to do "does it end with a slash" checks elsewhere. + - name: Fail if matrix_client_element_container_labels_traefik_path_prefix ends with a slash + ansible.builtin.fail: + msg: >- + matrix_client_element_container_labels_traefik_path_prefix (`{{ matrix_client_element_container_labels_traefik_path_prefix }}`) must either be `/` or not end with a slash (e.g. `/element`). + when: "matrix_client_element_container_labels_traefik_path_prefix != '/' and matrix_client_element_container_labels_traefik_path_prefix[-1] == '/'" diff --git a/roles/custom/matrix-client-element/templates/labels.j2 b/roles/custom/matrix-client-element/templates/labels.j2 index 5f5cd751..33fb28e1 100644 --- a/roles/custom/matrix-client-element/templates/labels.j2 +++ b/roles/custom/matrix-client-element/templates/labels.j2 @@ -7,6 +7,17 @@ traefik.docker.network={{ matrix_client_element_container_labels_traefik_docker_ {% set middlewares = [] %} +{% if matrix_client_element_container_labels_traefik_path_prefix != '/' %} +traefik.http.middlewares.matrix-client-element-slashless-redirect.redirectregex.regex=({{ matrix_client_element_container_labels_traefik_path_prefix | quote }})$ +traefik.http.middlewares.matrix-client-element-slashless-redirect.redirectregex.replacement=${1}/ +{% set middlewares = middlewares + ['matrix-client-element-slashless-redirect'] %} +{% endif %} + +{% if matrix_client_element_container_labels_traefik_path_prefix != '/' %} +traefik.http.middlewares.matrix-client-element-strip-prefix.stripprefix.prefixes={{ matrix_client_element_container_labels_traefik_path_prefix }} +{% set middlewares = middlewares + ['matrix-client-element-strip-prefix'] %} +{% endif %} + {% if matrix_client_element_container_labels_traefik_additional_response_headers.keys() | length > 0 %} {% for name, value in matrix_client_element_container_labels_traefik_additional_response_headers.items() %} traefik.http.middlewares.matrix-client-element-add-headers.headers.customresponseheaders.{{ name }}={{ value }}