Commit Graph
100 Commits
Author SHA1 Message Date
Slavi Pantaleev 2daa19ea91 Remove dead metrics support from the mautrix-signal bridge
Bridges based on bridgev2 no longer expose a metrics endpoint, so the
playbook was publishing a Traefik route which could only ever yield an
HTTP 502.

Related to https://github.com/spantaleev/matrix-docker-ansible-deploy/issues/5487
2026-08-04 16:56:55 +03:00
Slavi Pantaleev 7571605fce Remove dead metrics support from the mautrix-linkedin bridge
Bridges based on bridgev2 no longer expose a metrics endpoint, so the
playbook was publishing a Traefik route which could only ever yield an
HTTP 502.

Related to https://github.com/spantaleev/matrix-docker-ansible-deploy/issues/5487
2026-08-04 16:56:08 +03:00
Slavi Pantaleev 904f17161b Remove dead metrics support from the mautrix-gvoice bridge
Bridges based on bridgev2 no longer expose a metrics endpoint, so the
playbook was publishing a Traefik route which could only ever yield an
HTTP 502.

Related to https://github.com/spantaleev/matrix-docker-ansible-deploy/issues/5487
2026-08-04 16:55:16 +03:00
Slavi Pantaleev fc7795a77e Remove dead metrics support from the mautrix-gmessages bridge
Bridges based on bridgev2 no longer expose a metrics endpoint, so the
playbook was publishing a Traefik route which could only ever yield an
HTTP 502.

Related to https://github.com/spantaleev/matrix-docker-ansible-deploy/issues/5487
2026-08-04 16:53:43 +03:00
Slavi Pantaleev 199fa3c432 Remove dead metrics support from the mautrix-bluesky bridge
Bridges based on bridgev2 no longer expose a metrics endpoint, so the
playbook was publishing a Traefik route which could only ever yield an
HTTP 502.

Related to https://github.com/spantaleev/matrix-docker-ansible-deploy/issues/5487
2026-08-04 16:52:24 +03:00
Slavi Pantaleev 034ccf15de Remove dead metrics support from the Steam bridge
The bridge does not expose a metrics endpoint, so the playbook was
publishing a Traefik route which could only ever yield an HTTP 502.

Fixes https://github.com/spantaleev/matrix-docker-ansible-deploy/issues/5487
2026-08-04 16:51:01 +03:00
Slavi PantaleevandClaude Opus 5 e5b8de8c2b Heal git checkout ownership in all roles cloning repositories on the server
6b4b7647e fixed this for synapse-usage-exporter only. A checkout owned by
a different user makes the git task fail from then on, either with a
permission error or with git's dubious-ownership protection, until
someone removes the directory on the host by hand. It gets into that
state when the matrix user's uid changes (a server migration or a restore
onto a differently numbered user), when an earlier clone ran as another
user, or when someone runs git as root inside the checkout.

Every other role cloning a repository onto the server was open to the
same failure, so ensure the checkout's ownership recursively before
updating it at the remaining 54 sites.

The three matrix-synapse ext clones also gain force=yes. They were the
only on-server clones without it, which left a checkout that an
interrupted run had half-written wedged, instead of repaired on the next
run.

matrix-matrixto used to clone as root into a directory that nothing ever
chowned, unlike every other role. It now becomes the matrix user too.

The Element Web and SchildiChat Web theme checkouts live on the Ansible
controller, where correcting ownership is not ours to do, so they merely
mark the checkout as a safe directory for git.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-07-31 19:01:52 +03:00
Slavi PantaleevandClaude Opus 5 118eb9019f Simplify the synapse-usage-exporter git ownership fix
The recursive chown in front of the git task already guarantees that git
operates on a checkout owned by the user it becomes, so marking the path
as a safe.directory on top of that protects against nothing. Drop the
environment variables and condense the comment to a single line.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-07-31 19:01:52 +03:00
Slavi PantaleevandClaude Opus 5 906e457fcb Document the base domain proxy host in the Nginx Proxy Manager example
The example only covered `matrix.example.com` and the federation stream,
so people who make the playbook serve the base domain were left without a
proxy host for it. Requests for the `/.well-known/matrix/*` files on the
base domain then never reach Traefik and Nginx Proxy Manager answers with
a 404 error of its own, breaking federation and client discovery.

The nginx example already covers this by listing `example.com` in its
`server_name` directive. Serving the base domain from the Matrix server
is optional though, so the new section says so and points people whose
base domain lives elsewhere to the server delegation documentation.

Also note that a `*.example.com` wildcard certificate does not cover the
base domain itself, which is easy to get wrong when setting this up.

Related to https://github.com/spantaleev/matrix-docker-ansible-deploy/issues/5465

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-07-28 23:01:46 +03:00
Slavi PantaleevandClaude Opus 5 00bafcc1a7 Credit the author in the beeper-line announcement
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-07-28 22:10:48 +03:00
Slavi Pantaleev e2342853f6 Merge pull request #5462 from c00/beeper-line
Add support for bridging to LINE via beeper-line

Closes #1334
2026-07-28 22:10:02 +03:00
Slavi PantaleevandClaude Opus 5 0c11a254ad Correct beeper-line's login instructions
Logging in does not involve approving a session from the LINE mobile app.
The bridge shows a PIN code, which needs to be entered into the LINE
mobile app instead.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-07-28 21:54:33 +03:00
Slavi PantaleevandClaude Opus 5 1dad6f331e Complete beeper-line's configuration template
The template was missing the public_media and direct_media sections, as
well as the bridge.phone_numbers_in_profile, bridge.relay.displayname_format
and backfill.threads.max_initial_messages settings.

Their absence made the bridge fall back to zero values instead of the
defaults that upstream ships (most notably disabling thread backfilling).
The template now matches the configuration that the bridge generates
itself, key for key.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-07-28 21:54:33 +03:00
Slavi PantaleevandClaude Opus 5 fa59dde084 Explain where the beeper-line container image comes from
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-07-28 21:54:33 +03:00
Slavi PantaleevandClaude Opus 5 4e95cecf81 Document why beeper-line is pinned to a commit hash
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-07-28 21:54:33 +03:00
Slavi PantaleevandClaude Opus 5 6481da0aa9 Link to authors and repositories in the mautrix-linkedin announcement
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-07-28 17:07:31 +03:00
Slavi PantaleevandClaude Opus 5 ec47f46681 Shorten the mautrix-linkedin changelog entry
Brings it in line with the style of previous bridge announcements.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-07-28 16:59:02 +03:00
Slavi PantaleevandClaude Opus 5 8942e6a99e Use a more consistent salt for the mautrix-linkedin database password
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-07-28 16:58:29 +03:00
Slavi PantaleevandClaude Opus 5 4267ed8e0b Mark the beeper-linkedin bridge as unmaintained
Its upstream repository has been archived and has not seen a change
since March 2025. mautrix-linkedin now covers the same use case.

The bridge remains installable, but as with other deprecated and
unmaintained components, it is no longer listed in the README and has
been moved to the deprecated services section of the documentation.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-07-28 16:58:29 +03:00
Slavi PantaleevandClaude Opus 5 790956dce3 Reword parts of the mautrix-linkedin documentation page
Replaces the question-and-answer troubleshooting format (which no other
documentation page uses) with regular subsections, and clarifies why the
request needs to come from a Chrome-based browser.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-07-28 16:58:29 +03:00
Slavi PantaleevandClaude Opus 5 b78871ef79 Reword the mautrix-linkedin changelog entry
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-07-28 16:58:29 +03:00
Slavi PantaleevandClaude Opus 5 4d319ab2fc Remove extra blank line between group_vars sections
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-07-28 16:58:05 +03:00
Slavi PantaleevandClaude Opus 5 e63870ff76 Make mautrix-linkedin honor matrix_bridge_mautrix_linkedin_command_prefix
The variable was defined, but the configuration template hardcoded the
command prefix, so changing the variable had no effect.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-07-28 16:58:05 +03:00
Slavi PantaleevandClaude Opus 5 eeabc623d7 Make mautrix-gmessages honor matrix_bridge_mautrix_gmessages_command_prefix
The variable was defined, but the configuration template hardcoded the
command prefix, so changing the variable had no effect.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-07-28 16:53:26 +03:00
Slavi PantaleevandClaude Opus 5 e30809a8fc Make mautrix-gvoice honor matrix_bridge_mautrix_gvoice_command_prefix
The variable was defined, but the configuration template hardcoded the
command prefix, so changing the variable had no effect.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-07-28 16:53:26 +03:00
Slavi Pantaleev 1c3b609799 Add changelog entry about ntfy users now being declared with hashed passwords 2026-07-28 16:37:17 +03:00
Slavi Pantaleev e01582bd87 Upgrade ntfy (v2.26.3-1 -> v2.26.3-2) 2026-07-28 16:22:50 +03:00
Slavi PantaleevandClaude Opus 5 7a8105dc47 Expose synapse-usage-exporter metrics like the metrics of other services
The playbook exposes service metrics under a single endpoint
(`https://matrix.example.com/metrics/*`), controlled by
`matrix_metrics_exposure_enabled` and friends. synapse-usage-exporter was
not wired into this at all, so its metrics could only be scraped by the
integrated Prometheus and were unreachable for an external one.

The role had no metrics router whatsoever. Its only Traefik router (for
the `/report-usage-stats/push` ingestion endpoint) was gated on
`matrix_synapse_usage_exporter_container_labels_traefik_enabled`, which
defaulted to `matrix_synapse_usage_exporter_proxying_enabled`. Adding a
metrics router under that same switch would have meant that exposing
metrics also publishes the ingestion endpoint, so the master switch now
defaults to `true` and each router carries its own conditional.

Despite its generic name, `matrix_synapse_usage_exporter_proxying_enabled`
only ever concerned the endpoint that Synapse pushes usage statistics
**to**, never the metrics endpoint that Prometheus reads **from**. The
documentation now says so explicitly.

Fixes https://github.com/spantaleev/matrix-docker-ansible-deploy/issues/5467

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-07-28 15:14:39 +03:00
Slavi PantaleevandClaude Opus 5 11e65ed2fd Document SSH host key and passphrase prompts breaking with Ansible 2.21
Since Ansible 2.21, forked workers call `setsid()` and thus lose the
controlling terminal, so SSH can no longer ask about unknown host keys or
prompt for the passphrase of an SSH key.

Reported in https://github.com/spantaleev/matrix-docker-ansible-deploy/issues/5472

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-07-28 07:57:07 +03:00
Slavi PantaleevandClaude Opus 5 d2c62fa9f6 Upgrade devture/ansible (14.0.0-r0-0 -> 14.0.0-r0-1)
The new image restores the ability of SSH to ask about unknown host keys
and to prompt for the passphrase of an SSH key, which Ansible 2.21 broke
by having forked workers run session-isolated.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-07-28 07:56:16 +03:00
Slavi PantaleevandClaude Opus 5 e3dfcbad79 Scrape ntfy metrics with the integrated Prometheus
Until now, ntfy metrics could only be collected by an external Prometheus
server. Enabling the integrated Prometheus (`prometheus_enabled: true`)
now also has it scrape ntfy, like it does for the other services.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-07-28 07:23:05 +03:00
Slavi PantaleevandClaude Opus 5 d38573a9eb Expose ntfy metrics like the metrics of other services
The playbook exposes service metrics under a single endpoint
(`https://matrix.example.com/metrics/*`), controlled by
`matrix_metrics_exposure_enabled` and friends. ntfy was not wired into
this at all, so enabling metrics exposure did not expose ntfy's metrics
and enabling Basic Authentication did not protect them.

We have ntfy serve its metrics on a dedicated port, instead of on its
regular HTTP port. Serving them on the regular HTTP port also makes them
reachable at `https://ntfy.example.com/metrics`, where nothing protects
them, as ntfy does not apply its own access-control rules to the metrics
endpoint.

Fixes https://github.com/spantaleev/matrix-docker-ansible-deploy/issues/5468

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-07-28 07:23:05 +03:00
Slavi PantaleevandClaude Opus 5 ea1003fd18 Upgrade ntfy (v2.26.3-0 -> v2.26.3-1)
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-07-28 07:23:05 +03:00
Slavi PantaleevandClaude Fable 5 dd1e3ea46d Fix Synapse usage statistics reporting when synapse-usage-exporter is not used
Since the introduction of the synapse-usage-exporter role (55f869254, #3442), group_vars/matrix_servers was overriding matrix_synapse_report_stats_endpoint with an empty string whenever synapse-usage-exporter was disabled, clobbering the role's matrix.org default.

For deployments that enable matrix_synapse_report_stats, Synapse would then try reporting statistics to an empty URL, failing with:

> synapse.app.homeserver - 210 - WARNING - phone_stats_home-0 - Error reporting stats: Invalid URI b''

The default endpoint URL now lives in a dedicated matrix_synapse_report_stats_endpoint_default variable, which group_vars/matrix_servers falls back to when synapse-usage-exporter is not enabled.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-22 08:16:13 +03:00
Slavi PantaleevandClaude Fable 5 654aea79b2 Remove obsolete Synapse experimental feature flags (msc3266, msc4140, msc4429)
None of these flags exist in current Synapse:

- msc3266_enabled: MSC3266 support was stabilized in Synapse v1.153.0 and the room summary API is now always enabled

- msc4140_enabled: this was never a Synapse configuration setting in any released version. Delayed events have always been controlled by the `max_event_delay_duration` setting, which the playbook was emitting alongside the flag. The toggle is now named `matrix_synapse_delayed_events_enabled`.

- msc4429_enabled: MSC4429 support has not landed in any released Synapse version, so this flag never had any effect

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-22 07:56:17 +03:00
Slavi PantaleevandClaude Fable 5 6b0a635454 Ensure experimental_features is never null in the Synapse configuration (Synapse v1.157.0 compatibility)
When no experimental features were enabled (e.g. Matrix RTC and Matrix Authentication Service both disabled), the generated homeserver.yaml contained `experimental_features: null`, which Synapse v1.157.0+ does not tolerate and crashes on startup.

The `experimental_features` configuration is now constructed via a dedicated `matrix_synapse_experimental_features` variable (split into `_default`, `_auto` and `_custom`, as is customary), which always yields a mapping (potentially an empty one).

Fixes https://github.com/spantaleev/matrix-docker-ansible-deploy/issues/5455

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-22 07:46:49 +03:00
Slavi PantaleevandClaude Fable 5 3af3a59529 Add Content-Type hint for manually-copied well-known files
Some web servers (notably shared hosting) serve extensionless files
as plain text or offer them as downloads, which breaks stricter
clients such as Element X.

Related to https://github.com/spantaleev/matrix-docker-ansible-deploy/issues/4763

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-21 07:47:47 +03:00
Slavi Pantaleev c5eca70bac Upgrade systemd_service_manager (v3.2.0-0 -> v3.2.1-0) 2026-07-21 07:41:14 +03:00
Slavi Pantaleev 7406383fae Upgrade devture/ansible (11.6.0-r0-0 -> 14.0.0-r0-0) 2026-07-18 15:15:38 +03:00
Slavi Pantaleev 72833abf38 Use -no-tui for agru to avoid losing its output
`agru` likes to open a TUI by default and shows what is done there,
then auto-closes and you don't get to see what it did.
2026-07-18 08:24:37 +03:00
Slavi Pantaleev 3c0f15a6f8 Fix indentation in justfile 2026-07-18 08:24:05 +03:00
Slavi PantaleevandClaude Fable 5 21194daaf2 Upgrade livekit-server role (v1.13.3-2 -> v1.13.3-3)
LiveKit Server configuration validation now requires an explicit choice
between an RTC port range and a multiplexed UDP port, instead of
silently rendering the default udp_port alongside a user-defined port
range (which LiveKit ignores). See the CHANGELOG entry for details.

Related to https://github.com/spantaleev/matrix-docker-ansible-deploy/issues/5344

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-18 07:11:00 +03:00
Slavi PantaleevandClaude Fable 5 cb574c88ee Add AGENTS.md with guidance for AI agents
Points AI coding agents at the new style guide and summarizes the
repository layout and the conventions that are easy to get wrong
(roles/galaxy being auto-managed, group_vars wiring boundaries,
variable deprecation).

Related to #3631

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-18 06:14:54 +03:00
Slavi PantaleevandClaude Fable 5 924c471497 Add style guide for playbook developers
Codifies the conventions the playbook and its documentation already follow:
language and Markdown style, placeholder values for examples, the structure
of component documentation pages, and the checklist for adding a new
component (including where a component should live: this playbook, an
external MASH role, or mash-playbook).

Fixes #3631

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-18 06:14:12 +03:00
Slavi PantaleevandClaude Fable 5 aa8c74a8f5 Upgrade prometheus-nginxlog-exporter role (v1.10.0-4 -> v1.10.0-5) and fix its metric names
The exporter's configuration used to ship a leftover "myprefix" placeholder
as the metric name prefix, so the bundled Grafana dashboard (which queries
unprefixed metric names) could never show any data.

Metric names are now unprefixed and the namespace label value changed from
matrix to nginx. See the CHANGELOG entry for details.

Fixes https://github.com/spantaleev/matrix-docker-ansible-deploy/issues/3380

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-17 08:17:35 +03:00
Slavi PantaleevandClaude Fable 5 c254bd8932 Add CHANGELOG entry for the bridge variable renames
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 16:14:16 +03:00
Slavi PantaleevandClaude Fable 5 0b5b472425 Catch and report bridge variables that use pre-rename prefixes
A single prefix-level catch in matrix_playbook_migration covers all
renamed bridge variable prefixes at once. It always runs (unlike the
per-role validate_config tasks, which only run when a role is enabled),
so a stale old-style _enabled variable cannot silently disable a bridge.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 16:12:14 +03:00
Slavi PantaleevandClaude Fable 5 24f5d66d4d Update generic bridge variable references for the new naming scheme
Renames the matrix_mautrix_SERVICENAME_* placeholders in the common
mautrix bridges guide to matrix_bridge_mautrix_SERVICENAME_*, and fixes
prose in the matrix-bridge-steam role that referred to the old variable
prefix and to a misspelled (underscore-styled) systemd service name.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 16:12:14 +03:00
Slavi PantaleevandClaude Fable 5 e3faabf125 Rename matrix_wechat_* variables to matrix_bridge_wechat_*
Part of adopting a uniform naming policy for bridge variables,
where the variable prefix matches the role directory name.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 16:12:14 +03:00
Slavi PantaleevandClaude Fable 5 129f5fda20 Rename matrix_steam_bridge_* variables to matrix_bridge_steam_*
Part of adopting a uniform naming policy for bridge variables,
where the variable prefix matches the role directory name.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 16:12:14 +03:00
Slavi PantaleevandClaude Fable 5 a77b8f6eab Rename matrix_sms_bridge_* variables to matrix_bridge_sms_*
Part of adopting a uniform naming policy for bridge variables,
where the variable prefix matches the role directory name.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 16:12:14 +03:00
Slavi PantaleevandClaude Fable 5 267d578393 Rename matrix_rustpush_bridge_* variables to matrix_bridge_rustpush_*
Part of adopting a uniform naming policy for bridge variables,
where the variable prefix matches the role directory name.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 16:12:14 +03:00
Slavi PantaleevandClaude Fable 5 b68674d5da Rename matrix_postmoogle_* variables to matrix_bridge_postmoogle_*
Part of adopting a uniform naming policy for bridge variables,
where the variable prefix matches the role directory name.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 16:12:14 +03:00
Slavi PantaleevandClaude Fable 5 ceb178008f Rename matrix_mx_puppet_steam_* variables to matrix_bridge_mx_puppet_steam_*
Part of adopting a uniform naming policy for bridge variables,
where the variable prefix matches the role directory name.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 16:12:14 +03:00
Slavi PantaleevandClaude Fable 5 7380cbdc3c Rename matrix_mx_puppet_groupme_* variables to matrix_bridge_mx_puppet_groupme_*
Part of adopting a uniform naming policy for bridge variables,
where the variable prefix matches the role directory name.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 16:12:14 +03:00
Slavi PantaleevandClaude Fable 5 97077e2f13 Rename matrix_meshtastic_relay_* variables to matrix_bridge_meshtastic_relay_*
Part of adopting a uniform naming policy for bridge variables,
where the variable prefix matches the role directory name.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 16:12:14 +03:00
Slavi PantaleevandClaude Fable 5 4d6b68a5da Rename matrix_mautrix_whatsapp_* variables to matrix_bridge_mautrix_whatsapp_*
Part of adopting a uniform naming policy for bridge variables,
where the variable prefix matches the role directory name.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 16:12:14 +03:00
Slavi PantaleevandClaude Fable 5 54020894b4 Rename matrix_mautrix_twitter_* variables to matrix_bridge_mautrix_twitter_*
Part of adopting a uniform naming policy for bridge variables,
where the variable prefix matches the role directory name.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 16:12:14 +03:00
Slavi PantaleevandClaude Fable 5 e751673b0d Rename matrix_mautrix_telegram_* variables to matrix_bridge_mautrix_telegram_*
Part of adopting a uniform naming policy for bridge variables,
where the variable prefix matches the role directory name.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 16:12:14 +03:00
Slavi PantaleevandClaude Fable 5 ace4edb01b Rename matrix_mautrix_slack_* variables to matrix_bridge_mautrix_slack_*
Part of adopting a uniform naming policy for bridge variables,
where the variable prefix matches the role directory name.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 16:12:14 +03:00
Slavi PantaleevandClaude Fable 5 bb225546bd Rename matrix_mautrix_signal_* variables to matrix_bridge_mautrix_signal_*
Part of adopting a uniform naming policy for bridge variables,
where the variable prefix matches the role directory name.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 16:12:14 +03:00
Slavi PantaleevandClaude Fable 5 ca301ffde0 Rename matrix_mautrix_meta_messenger_* variables to matrix_bridge_mautrix_meta_messenger_*
Part of adopting a uniform naming policy for bridge variables,
where the variable prefix matches the role directory name.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 16:12:14 +03:00
Slavi PantaleevandClaude Fable 5 ba0fd18361 Rename matrix_mautrix_meta_instagram_* variables to matrix_bridge_mautrix_meta_instagram_*
Part of adopting a uniform naming policy for bridge variables,
where the variable prefix matches the role directory name.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 16:12:14 +03:00
Slavi PantaleevandClaude Fable 5 5d19e75236 Rename matrix_mautrix_gvoice_* variables to matrix_bridge_mautrix_gvoice_*
Part of adopting a uniform naming policy for bridge variables,
where the variable prefix matches the role directory name.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 16:12:14 +03:00
Slavi PantaleevandClaude Fable 5 b2fb403d31 Rename matrix_mautrix_googlechat_* variables to matrix_bridge_mautrix_googlechat_*
Part of adopting a uniform naming policy for bridge variables,
where the variable prefix matches the role directory name.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 16:12:13 +03:00
Slavi PantaleevandClaude Fable 5 5ff45d47c3 Rename matrix_mautrix_gmessages_* variables to matrix_bridge_mautrix_gmessages_*
Part of adopting a uniform naming policy for bridge variables,
where the variable prefix matches the role directory name.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 16:12:13 +03:00
Slavi PantaleevandClaude Fable 5 2241a2dedb Rename matrix_mautrix_discord_* variables to matrix_bridge_mautrix_discord_*
Part of adopting a uniform naming policy for bridge variables,
where the variable prefix matches the role directory name.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 16:12:13 +03:00
Slavi PantaleevandClaude Fable 5 6768ada899 Rename matrix_mautrix_bluesky_* variables to matrix_bridge_mautrix_bluesky_*
Part of adopting a uniform naming policy for bridge variables,
where the variable prefix matches the role directory name.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 16:12:13 +03:00
Slavi PantaleevandClaude Fable 5 7ccc9c515e Rename matrix_hookshot_* variables to matrix_bridge_hookshot_*
Part of adopting a uniform naming policy for bridge variables,
where the variable prefix matches the role directory name.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 16:12:13 +03:00
Slavi PantaleevandClaude Fable 5 6e4992a2fe Rename matrix_heisenbridge_* variables to matrix_bridge_heisenbridge_*
Part of adopting a uniform naming policy for bridge variables,
where the variable prefix matches the role directory name.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 16:12:13 +03:00
Slavi PantaleevandClaude Fable 5 62b5375815 Rename matrix_beeper_linkedin_* variables to matrix_bridge_beeper_linkedin_*
Part of adopting a uniform naming policy for bridge variables,
where the variable prefix matches the role directory name.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 16:12:13 +03:00
Slavi PantaleevandClaude Fable 5 98269653b2 Rename matrix_appservice_irc_* variables to matrix_bridge_appservice_irc_*
Part of adopting a uniform naming policy for bridge variables,
where the variable prefix matches the role directory name.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 16:12:13 +03:00
Slavi PantaleevandClaude Fable 5 dc16f09e78 Rename matrix_appservice_discord_* variables to matrix_bridge_appservice_discord_*
Part of adopting a uniform naming policy for bridge variables,
where the variable prefix matches the role directory name.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 16:12:13 +03:00
Slavi PantaleevandClaude Fable 5 d9bee18ddd Rename matrix_mautrix_wsproxy_* variables to matrix_bridge_mautrix_wsproxy_*
Part of adopting a uniform naming policy for bridge variables,
where the variable prefix matches the role directory name.

The companion appservice variables defined by this role are folded
under the role prefix as well: matrix_mautrix_androidsms_* becomes
matrix_bridge_mautrix_wsproxy_androidsms_* and matrix_mautrix_imessage_*
becomes matrix_bridge_mautrix_wsproxy_imessage_*.

matrix_mautrix_signal_wsproxy_syncproxy_connection_string becomes
matrix_bridge_mautrix_wsproxy_syncproxy_connection_string, aligning it
with the sibling matrix_bridge_mautrix_wsproxy_syncproxy_* variables.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 16:12:13 +03:00
Slavi PantaleevandClaude Fable 5 84a0053191 Upgrade ansible-role-backup_borg (v1.4.4-2.1.6-1 -> v1.4.4-2.1.6-2) and wire via _auto variables
The new role version splits backup_borg_location_exclude_patterns into
auto/custom components, following the existing split for
backup_borg_location_source_directories. The playbook now wires its
computed values into the _auto variables for both, so users can append
their own entries via the _custom variables instead of redefining the
whole lists and accidentally dropping playbook-provided values.
Previously, redefining backup_borg_location_exclude_patterns dropped
the postgres_data_path exclusion (making borg walk live Postgres data
and fail with warning exit codes), and the playbook's own
source_directories wiring made the role's _custom variable a no-op.

Related to #5092

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 14:36:06 +03:00
Slavi PantaleevandClaude Fable 5 73a52c8a24 Make postgres_max_connections scale with the Synapse worker count
With workers enabled, every Synapse process (the main one and each
worker) maintains its own database connection pool of up to
matrix_synapse_database_cp_max (default: 10) connections. The previous
fixed limit of 500 left little headroom on setups running many workers,
where exhausting it manifests as degraded performance and, reportedly,
E2EE misbehavior.

Size the limit as a 200-connection baseline (for everything else that
talks to Postgres) plus cp_max connections per Synapse process, never
going below the previous value of 500. The stock worker presets stay at
500; setups that raise worker counts (or cp_max) get a limit that grows
accordingly. The new matrix_synapse_workers_total_count variable
reflects what the matrix_synapse_workers_*_count variables ask for; it
does not reflect a manually populated
matrix_synapse_workers_enabled_list, and such setups should override
postgres_max_connections themselves.

Fixes #4442

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 14:20:12 +03:00
Slavi PantaleevandClaude Fable 5 a1cdd367f5 Upgrade ansible-role-livekit-server (v1.13.3-1 -> v1.13.3-2)
The new version supports defining a multiplexed UDP port pool (e.g.
'7882-7892') in livekit_server_config_rtc_udp_port. Previously, the
role's configuration template silently mangled such values into
udp_port: 0. It also gains early validation of the port value.

Related to #5344

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 07:42:48 +03:00
Slavi PantaleevandClaude Fable 5 23783f87bc Clarify when disabling the federation port applies in the CDN guide
The CDN section of the federation documentation tells users to set
matrix_synapse_federation_port_enabled: false, which only works because
that recipe moves federation traffic to the client port. Followed
partially (keeping federation on the dedicated federation port behind a
fronting reverse proxy), the same line removes the federation route
entirely and breaks federation. Say so explicitly.

Fixes #4475

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-15 13:31:41 +03:00
Slavi PantaleevandClaude Fable 5 eb0af09bf5 Remove the appservice-kakaotalk bridge
The bridge could only be installed by self-building its source code,
and its upstream repository (on src.miscworks.net) has become
unreachable (the Internet Archive last saw it alive in May 2026),
making installation impossible. The bridge was also based on the
long-unmaintained node-kakao library and carried a warning that using
it may get KakaoTalk accounts banned.

The playbook catches leftover matrix_appservice_kakaotalk_* variables
and points users to the manual uninstallation instructions.

Related to #5068

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-15 13:31:41 +03:00
Slavi PantaleevandClaude Fable 5 376786b997 Upgrade ansible-role-livekit-server (v1.13.3-0 -> v1.13.3-1)
The new version adds livekit_server_config_rtc_ips_includes and
livekit_server_config_rtc_ips_excludes variables, controlling LiveKit's
rtc.ips.includes/excludes CIDR filters for RTC IP addresses.

Related to #4958

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-15 07:31:52 +03:00
Slavi PantaleevandClaude Fable 5 de1ba73f40 Add dedicated CAPTCHA variables to matrix-authentication-service
Matrix Authentication Service supports CAPTCHA protection (ReCaptcha
v2, Cloudflare Turnstile, hCaptcha) for certain operations like
self-service password registration, but configuring it required going
through matrix_authentication_service_configuration_extension_yaml.
Expose it via dedicated variables
(matrix_authentication_service_config_captcha_service, _site_key and
_secret_key), validate the service value and key presence, and document
the setup in the captcha documentation page, which so far only covered
Synapse and Dendrite.

Related to #5344

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-15 07:29:35 +03:00
Slavi PantaleevandClaude Fable 5 d2f1fa74cc Document homeserver requirements for hookshot's end-to-bridge encryption
Enabling matrix_hookshot_encryption_enabled configures the bridge side
correctly (registration flags, Valkey cache), but hookshot's encryption
also needs the homeserver to support and enable MSC2409 and MSC3202,
which are typically experimental features disabled by default. Nothing
documented that, so the resulting setup silently did not work.

Reference the MSCs in the variable's comment, and show the exact Synapse
settings in the hookshot documentation page. The playbook deliberately
does not auto-enable them: they are experimental homeserver-wide
features, and flipping them from a bridge toggle would be surprising.

Fixes #3861

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-15 06:01:27 +03:00
Slavi PantaleevandClaude Fable 5 62792b3670 Fix double-slash in Jitsi's Etherpad integration URLs
etherpad_base_url always ends with a trailing slash, and the playbook
passed it verbatim to jitsi_etherpad_base, which the Jitsi role appends
path segments to (e.g. /p/). The generated Jitsi configuration therefore
contained URLs like https://etherpad.example.com//p/, which can 404
depending on the web server. Strip trailing slashes when wiring.

Fixes #3471

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 15:16:31 +03:00
Slavi PantaleevandClaude Fable 5 a039cc5982 Upgrade ansible-role-grafana (v13.0.2-0 -> v13.0.2-1) and use grafana_dashboard_download_urls_auto
The new role release splits grafana_dashboard_download_urls into
default/auto/custom components. Wire the playbook's automatic dashboard
list via the auto component, so users can add their own dashboards
through grafana_dashboard_download_urls_custom without clobbering it.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 14:59:18 +03:00
Slavi PantaleevandClaude Fable 5 5a9e34c563 Document that Synapse cache autotuning limits apply per process
The autotuning defaults are derived from total system RAM, but every
Synapse process (the main one and each worker) applies the configured
limits independently, so worker setups multiply the theoretical
aggregate cache memory usage.

Fixes #3336

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 14:56:48 +03:00
Slavi PantaleevandClaude Fable 5 534631c1e7 Document Synapse database restore pitfalls per the official backup guide
Add the two remaining hints from the official Synapse backup guide:

- never import a dump into a database that already has tables present
  (at best it errors, at worst it causes subtle inconsistencies)
- when restoring a backup older than the server's current state,
  truncate e2e_one_time_keys_json before starting Synapse, so used
  one-time keys are not re-issued (which causes decryption errors);
  our pg_dumpall-based backup commands include that table

Fixes #4004

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 14:34:45 +03:00
Slavi PantaleevandClaude Fable 5 c7819f576a Remove the custom Element Web welcome page
Element Web redesigned its welcome page into a built-in component
(element-hq/element-web#33211, first released in spring 2026) and no
longer falls back to loading welcome.html. The custom page the playbook
installed had therefore silently stopped having any effect, and it was a
fork of an upstream file that upstream has deleted (its button icon
assets are already missing from current Element Web builds).

Remove the welcome.html shipping and the variables that only applied to
it (matrix_client_element_welcome_headline, _welcome_text,
_welcome_logo_link, _page_template_welcome_path), rejecting them in
validate_config.yml with pointers to the alternatives. Logo and
background customization keep working through Element Web's branding
options, which the new welcome page still honors. A fully custom page
can be self-hosted and wired via embedded_pages.welcome_url.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 07:49:39 +03:00
Slavi PantaleevandClaude Fable 5 a03faef70f Stop excluding Synapse's local_thumbnails from BorgBackup
Synapse only generates thumbnails of local media at upload time (unless
dynamic_thumbnails is enabled, which the playbook does not do) and no
tooling exists to regenerate them, so restoring a backup left all
previously uploaded local images without thumbnails permanently. The
official Synapse backup guide recommends backing this directory up.

Related to #4004.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-13 21:18:43 +03:00
Slavi PantaleevandClaude Fable 5 94d8e28306 Support readonly datastores for matrix-media-repo
The configuration template only rendered a datastore when its for_kinds
list was non-empty, even though the inline documentation (matching
upstream's) describes forKinds: [] as the way to make a datastore
readonly. That made the documented migration scenario impossible: moving
media between the file and s3 datastores while keeping the old one
readable.

Introduce matrix_media_repo_datastore_file_enabled and
matrix_media_repo_datastore_s3_enabled, which default to the previous
kinds-based behavior. A readonly datastore is now expressed by enabling
the datastore explicitly while assigning it no kinds.

Fixes #4303

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-13 21:17:09 +03:00
Slavi PantaleevandClaude Fable 5 6b4b7647e4 Fix synapse-usage-exporter self-build failing on git ownership checks
synapse-usage-exporter is self-built by default (no upstream image is
published), so every user enabling it runs the git clone/update task. A
docker-src checkout whose files are owned by a different user (e.g. left
behind by an earlier clone) made that task fail: either with a
permission error, or with git's dubious-ownership protection, which
ignores the repository's own configuration and surfaces as a confusing
"'origin' does not appear to be a git repository" error.

Ensure the checkout's ownership recursively before updating it, and mark
the path as a safe.directory for the git invocation itself (via
GIT_CONFIG_* environment variables), so the ownership check cannot
misfire regardless of which user git effectively runs as.

Fixes #5065

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-13 19:25:34 +03:00
Slavi PantaleevandClaude Fable 5 90d486c4f6 Correct CORS guidance for 302-redirect based well-known setup
The docs claimed that reverse-proxying "or simply a 302 redirect" needs
no CORS headers. That is only true for reverse-proxying: browsers apply
CORS checks to every response in a redirect chain, so a redirect
response itself must also carry Access-Control-Allow-Origin, otherwise
web clients fail even though the final destination sets the header.

Fixes #4650

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-13 16:35:07 +03:00
Slavi PantaleevandClaude Fable 5 2d436491c6 Escape mautrix-meta username prefix in registration regexes
The user-namespace regexes in the mautrix-meta-messenger and
mautrix-meta-instagram registration templates interpolated
the bridge username prefix without regex-escaping it, unlike the
neighboring homeserver domain and appservice username values. The
default prefixes are regex-safe, but a customized prefix containing
regex metacharacters would produce a wrong (too broad or invalid)
appservice user namespace.

Related to the registration regex discussion in #5096.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-13 16:34:31 +03:00
Slavi PantaleevandClaude Fable 5 8b9fe4ce37 Make Element welcome page text readable on the dark theme
The playbook-shipped welcome.html hardcoded #2e2f32 for the headline and
welcome text, which is nearly invisible on the dark background Element
renders when the dark theme is active. Element Web's default
use_system_theme behavior keys the theme off the system color scheme, so
switch the text to Element's dark-theme text color (#ebeef2) under a
prefers-color-scheme: dark media query.

Fixes #4838

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-13 16:33:55 +03:00
Slavi PantaleevandClaude Fable 5 639996d3a0 Upgrade ansible-role-backup_borg (v1.4.4-2.1.4-1 -> v1.4.4-2.1.6-1)
Pulls in borgmatic 2.1.6, fixing the 2.1.4 JSON parsing regression
(borgmatic-collective/borgmatic#1294) where warnings on stderr, such as
OpenSSH post-quantum key exchange notices, broke parsing of borg's JSON
output and failed the backup run.

Fixes #5188

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-13 16:33:03 +03:00
Slavi PantaleevandClaude Fable 5 f8539f4cbf Fix Traefik router name in SRV server delegation docs
The wildcard certificate examples attached tls.domains labels to a
router named matrix-synapse-federation-api, but the Synapse role
actually names it matrix-synapse-public-federation-api (see
templates/synapse/labels.j2), so the documented labels matched nothing
and the certificate configuration silently did not apply.

Fixes #3129

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-13 15:30:58 +03:00
Slavi PantaleevandClaude Fable 5 a4915c0b9e Remove never-implemented appservice-discord self-build variable
matrix_appservice_discord_container_image_self_build only switched the
image registry prefix to localhost/, but the role never had any build
tasks, so enabling it always ended in an image pull failure. Remove the
variable and reject it in validate_config.yml with a hint that the
prebuilt image is amd64-only and that mautrix-discord is the better
option on other architectures.

Fixes #2379

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-13 15:03:51 +03:00
Slavi PantaleevandClaude Fable 5 deb19c46a8 Document rsync as a server-side prerequisite for media store import
The import-synapse-media-store task synchronizes the media store with
ansible.posix.synchronize delegated to the server itself, which requires
the rsync binary on the server. Nothing in the playbook installs it, so
the import failed on minimal systems with "Failed to find required
executable rsync". Document the prerequisite.

Fixes #2551

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-13 15:03:05 +03:00
Slavi PantaleevandClaude Fable 5 2fe710bdb4 Document Caddy directive-order pitfall for well-known reverse-proxying
Caddy evaluates directives according to its own fixed directive order,
not their order in the Caddyfile. redir runs before reverse_proxy, so a
redirect elsewhere in the same site block silently shadows the
/.well-known/matrix reverse-proxying. Add a note and a handle-block
example that enforces the intended priority.

Fixes #1080

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-13 15:02:20 +03:00
Slavi PantaleevandClaude Fable 5 ee38b3aac2 Grant pg_monitor to the prometheus-postgres-exporter database user
The exporter's wal collector (enabled by default) calls pg_ls_waldir(),
which Postgres restricts to superusers and members of the pg_monitor
role. The exporter user is created as a plain managed-database user, so
scraping logged "permission denied for function pg_ls_waldir" on every
run.

Grant pg_monitor via the managed database's additional_sql_queries,
which the Postgres role applies both on initial creation and on
subsequent runs, covering existing installations too.

Fixes #3039

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-13 13:21:19 +03:00
Slavi PantaleevandClaude Opus 4.8 506d4ab4c9 Upgrade ansible-role-postgres (v18.4-0 -> v18.4-1)
Pulls in the pgloader connection string handling fix, which keeps the
Postgres password out of the command line and Ansible error output.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-13 09:01:00 +03:00