Просмотр исходного кода

matrix-tuwunel: add labels to expose the /_tuwunel API path

The /_tuwunel namespace carries Tuwunel's ad-hoc routes (server_version,
local_user_count) and its native OpenID Connect provider endpoints
(/_tuwunel/oidc/...), which a reverse proxy must route for OIDC login
to work. Add public (enabled by default, like the client API) and
internal Traefik label groups.
create-pull-request/i18n
Jason Volk 1 день назад
committed by Slavi Pantaleev
Родитель
Сommit
e1d40fd831
5 измененных файлов: 96 добавлений и 0 удалений
  1. +11
    -0
      CHANGELOG.md
  2. +11
    -0
      docs/configuring-playbook-tuwunel.md
  3. +1
    -0
      group_vars/matrix_servers
  4. +20
    -0
      roles/custom/matrix-tuwunel/defaults/main.yml
  5. +53
    -0
      roles/custom/matrix-tuwunel/templates/labels.j2

+ 11
- 0
CHANGELOG.md Просмотреть файл

@@ -1,3 +1,14 @@
# 2026-07-19

## Tuwunel now exposes its administration and /_tuwunel API paths

The [Tuwunel](docs/configuring-playbook-tuwunel.md) role previously routed only the `/_matrix` path through the reverse proxy. It now also exposes the two other API paths that Tuwunel serves.

The Synapse-compatible administration API (`/_synapse/admin`) powers administration dashboards and moderation bots. As with Synapse and Dendrite, the playbook now exposes it automatically when such a tool is installed: publicly for [Ketesa](docs/configuring-playbook-ketesa.md) or [Element Admin](docs/configuring-playbook-element-admin.md), and on the internal entrypoint for [Draupnir](docs/configuring-playbook-bot-draupnir.md). To expose it yourself, set `matrix_tuwunel_container_labels_public_client_synapse_admin_api_enabled: true` (or the `internal_` variant).

Tuwunel also serves first-party routes under `/_tuwunel`, including its native OpenID Connect provider endpoints, which the reverse proxy must route for OIDC login to work. This path is now routed on the public entrypoint by default. To keep it off the public entrypoint, set `matrix_tuwunel_container_labels_public_tuwunel_api_enabled: false`.


# 2026-07-18

## LiveKit Server port configuration must be unambiguous now


+ 11
- 0
docs/configuring-playbook-tuwunel.md Просмотреть файл

@@ -180,6 +180,17 @@ When enabled, rooms with a valid `m.room.policy` state event have outgoing event

The role sets `default_room_version: '12'`, so newly created rooms default to Matrix [room version 12](https://github.com/matrix-org/matrix-spec-proposals/pull/4289) ("Hydra"). Override `matrix_tuwunel_config_default_room_version` if you need an earlier version for client compatibility.

### The `/_tuwunel` API path

Besides `/_matrix`, Tuwunel serves its own first-party routes under `/_tuwunel`. This namespace carries ad-hoc endpoints such as `/_tuwunel/server_version` and `/_tuwunel/local_user_count`, and the [native OpenID Connect provider](https://matrix-construct.github.io/tuwunel/authentication/oidc-server.html) endpoints (`/_tuwunel/oidc/...`) that clients use when Tuwunel handles OIDC login itself, rather than delegating to an upstream provider as described above. The role routes `/_tuwunel` on the public entrypoint by default so these features work out of the box.

To keep this namespace off the public entrypoint and expose it only on the internal one, set:

```yaml
matrix_tuwunel_container_labels_public_tuwunel_api_enabled: false
matrix_tuwunel_container_labels_internal_tuwunel_api_enabled: true
```

### Exposing the Administration API

Tuwunel serves a Synapse-compatible Administration API under the `/_synapse/admin` path, so administration dashboards (such as synapse-admin and ketesa) and moderation bots (such as Draupnir and Meowlnir) work against it. The served endpoints are listed on the [Tuwunel Synapse Admin API page](https://matrix-construct.github.io/tuwunel/development/compliance/synapse-admin.html).


+ 1
- 0
group_vars/matrix_servers Просмотреть файл

@@ -5829,6 +5829,7 @@ matrix_tuwunel_container_labels_public_federation_api_traefik_tls: "{{ matrix_fe

matrix_tuwunel_container_labels_internal_client_api_enabled: "{{ matrix_playbook_internal_matrix_client_api_traefik_entrypoint_enabled }}"
matrix_tuwunel_container_labels_internal_client_api_traefik_entrypoints: "{{ matrix_playbook_internal_matrix_client_api_traefik_entrypoint_name }}"
matrix_tuwunel_container_labels_internal_tuwunel_api_traefik_entrypoints: "{{ matrix_playbook_internal_matrix_client_api_traefik_entrypoint_name }}"

matrix_tuwunel_config_well_known_livekit_url: "{{ matrix_livekit_jwt_service_public_url if matrix_livekit_jwt_service_enabled else '' }}"



+ 20
- 0
roles/custom/matrix-tuwunel/defaults/main.yml Просмотреть файл

@@ -106,6 +106,26 @@ matrix_tuwunel_container_labels_public_federation_api_traefik_entrypoints: ''
matrix_tuwunel_container_labels_public_federation_api_traefik_tls: true
matrix_tuwunel_container_labels_public_federation_api_traefik_tls_certResolver: "{{ matrix_tuwunel_container_labels_traefik_tls_certResolver }}" # noqa var-naming

# Controls whether labels will be added that expose Tuwunel's first-party API (`/_tuwunel`) on a public Traefik entrypoint.
# This namespace carries ad-hoc routes such as `/_tuwunel/server_version` and `/_tuwunel/local_user_count`, as well as the
# native OpenID Connect provider endpoints (`/_tuwunel/oidc/...`) that clients use when Tuwunel performs OIDC login itself.
# It is enabled by default because the reverse proxy must route it for those features to work.
matrix_tuwunel_container_labels_public_tuwunel_api_enabled: true
matrix_tuwunel_container_labels_public_tuwunel_api_traefik_hostname: "{{ matrix_tuwunel_hostname }}"
matrix_tuwunel_container_labels_public_tuwunel_api_traefik_path_prefix: /_tuwunel
matrix_tuwunel_container_labels_public_tuwunel_api_traefik_rule: "Host(`{{ matrix_tuwunel_container_labels_public_tuwunel_api_traefik_hostname }}`) && PathPrefix(`{{ matrix_tuwunel_container_labels_public_tuwunel_api_traefik_path_prefix }}`)"
matrix_tuwunel_container_labels_public_tuwunel_api_traefik_priority: 0
matrix_tuwunel_container_labels_public_tuwunel_api_traefik_entrypoints: "{{ matrix_tuwunel_container_labels_traefik_entrypoints }}"
matrix_tuwunel_container_labels_public_tuwunel_api_traefik_tls: "{{ matrix_tuwunel_container_labels_public_tuwunel_api_traefik_entrypoints != 'web' }}"
matrix_tuwunel_container_labels_public_tuwunel_api_traefik_tls_certResolver: "{{ matrix_tuwunel_container_labels_traefik_tls_certResolver }}" # noqa var-naming

# Controls whether labels will be added that expose Tuwunel's first-party API (`/_tuwunel`) on the internal Traefik entrypoint.
matrix_tuwunel_container_labels_internal_tuwunel_api_enabled: false
matrix_tuwunel_container_labels_internal_tuwunel_api_traefik_path_prefix: /_tuwunel
matrix_tuwunel_container_labels_internal_tuwunel_api_traefik_rule: "PathPrefix(`{{ matrix_tuwunel_container_labels_internal_tuwunel_api_traefik_path_prefix }}`)"
matrix_tuwunel_container_labels_internal_tuwunel_api_traefik_priority: 0
matrix_tuwunel_container_labels_internal_tuwunel_api_traefik_entrypoints: ""

# Controls whether labels will be added that expose the Synapse-compatible Administration API (`/_synapse/admin`) on a public Traefik entrypoint.
# Tuwunel serves this API so that administration dashboards (synapse-admin, ketesa) and moderation bots (Draupnir, Meowlnir) work against it.
# Every endpoint requires an administrator access token. It is disabled by default; you may prefer to expose it only on the internal entrypoint below.


+ 53
- 0
roles/custom/matrix-tuwunel/templates/labels.j2 Просмотреть файл

@@ -136,6 +136,59 @@ traefik.http.routers.matrix-tuwunel-public-federation-api.tls.certResolver={{ ma
{% endif %}


{% if matrix_tuwunel_container_labels_public_tuwunel_api_enabled %}
############################################################
# #
# Public Tuwunel API (/_tuwunel) #
# #
############################################################

traefik.http.routers.matrix-tuwunel-public-tuwunel-api.rule={{ matrix_tuwunel_container_labels_public_tuwunel_api_traefik_rule }}

{% if matrix_tuwunel_container_labels_public_tuwunel_api_traefik_priority | int > 0 %}
traefik.http.routers.matrix-tuwunel-public-tuwunel-api.priority={{ matrix_tuwunel_container_labels_public_tuwunel_api_traefik_priority }}
{% endif %}

traefik.http.routers.matrix-tuwunel-public-tuwunel-api.service=matrix-tuwunel
traefik.http.routers.matrix-tuwunel-public-tuwunel-api.entrypoints={{ matrix_tuwunel_container_labels_public_tuwunel_api_traefik_entrypoints }}

traefik.http.routers.matrix-tuwunel-public-tuwunel-api.tls={{ matrix_tuwunel_container_labels_public_tuwunel_api_traefik_tls | to_json }}
{% if matrix_tuwunel_container_labels_public_tuwunel_api_traefik_tls %}
traefik.http.routers.matrix-tuwunel-public-tuwunel-api.tls.certResolver={{ matrix_tuwunel_container_labels_public_tuwunel_api_traefik_tls_certResolver }}
{% endif %}

############################################################
# #
# /Public Tuwunel API (/_tuwunel) #
# #
############################################################
{% endif %}


{% if matrix_tuwunel_container_labels_internal_tuwunel_api_enabled %}
############################################################
# #
# Internal Tuwunel API (/_tuwunel) #
# #
############################################################

traefik.http.routers.matrix-tuwunel-internal-tuwunel-api.rule={{ matrix_tuwunel_container_labels_internal_tuwunel_api_traefik_rule }}

{% if matrix_tuwunel_container_labels_internal_tuwunel_api_traefik_priority | int > 0 %}
traefik.http.routers.matrix-tuwunel-internal-tuwunel-api.priority={{ matrix_tuwunel_container_labels_internal_tuwunel_api_traefik_priority }}
{% endif %}

traefik.http.routers.matrix-tuwunel-internal-tuwunel-api.service=matrix-tuwunel
traefik.http.routers.matrix-tuwunel-internal-tuwunel-api.entrypoints={{ matrix_tuwunel_container_labels_internal_tuwunel_api_traefik_entrypoints }}

############################################################
# #
# /Internal Tuwunel API (/_tuwunel) #
# #
############################################################
{% endif %}


{% if matrix_tuwunel_container_labels_public_client_synapse_admin_api_enabled %}
############################################################
# #


Загрузка…
Отмена
Сохранить