Commit Graph
6443 Commits
Author SHA1 Message Date
Slavi Pantaleev 3ff0c8a87c Test matrix-bridge-mautrix-googlechat with Molecule 2026-08-31 08:31:35 +03:00
Slavi Pantaleev b90c8bb00f Test matrix-bridge-beeper-line with Molecule 2026-08-31 08:31:18 +03:00
Slavi Pantaleev 506b21f76c Use the managed Steam registration 2026-08-31 08:29:26 +03:00
Slavi Pantaleev e876d7f842 Mount LinkedIn configuration read-only 2026-08-31 08:29:17 +03:00
Slavi Pantaleev 1451483908 Mount Google Voice configuration read-only 2026-08-31 08:29:08 +03:00
Slavi Pantaleev 06b7368aec Mount Google Chat configuration read-only 2026-08-31 08:28:59 +03:00
Slavi Pantaleev 83b4cb235d Use Docker CLI for the LiveKit OpenID fixture 2026-08-31 07:19:30 +03:00
Slavi Pantaleev 96f3d4fbba Configure FluffyChat's internal HTTP port 2026-08-31 06:55:31 +03:00
Slavi Pantaleev a6a9f3fbb3 Mount GMessages configuration read-only 2026-08-31 06:54:01 +03:00
Slavi Pantaleev 7a85db0134 Fix Bluesky display-name template rendering 2026-08-31 06:53:46 +03:00
Slavi Pantaleev 7e1ef70e01 Test matrix-bridge-mautrix-bluesky with Molecule 2026-08-31 06:46:58 +03:00
Slavi Pantaleev 7311dae72d Test matrix-livekit-jwt-service with Molecule 2026-08-31 06:45:36 +03:00
Slavi Pantaleev 4872046c14 Test matrix-client-fluffychat with Molecule 2026-08-31 06:45:16 +03:00
Slavi Pantaleev afa14079ff Test matrix-bridge-mautrix-slack with Molecule 2026-08-31 06:44:57 +03:00
Slavi Pantaleev 09c6ad9364 Test matrix-bridge-mautrix-gmessages with Molecule 2026-08-31 06:44:32 +03:00
Slavi Pantaleev d9997550f9 Test matrix-bot-honoroit with Molecule 2026-08-31 06:44:08 +03:00
Slavi Pantaleev ff90752790 Use the standard LiveKit JWT extra arguments variable 2026-08-31 06:43:22 +03:00
Slavi Pantaleev 92c7d216c8 Configure Honoroit's listener port 2026-08-31 06:43:07 +03:00
Slavi Pantaleev b961732fe8 Fix Honoroit metrics Traefik routing 2026-08-31 06:41:14 +03:00
Slavi Pantaleev 17a0094813 Test matrix-bot-meowlnir with Molecule 2026-08-30 19:41:56 +03:00
Slavi Pantaleev 2347d99b86 Test matrix-element-admin with Molecule 2026-08-30 19:40:41 +03:00
Slavi Pantaleev 8cf346b9ec Test matrix-synapse-auto-compressor with Molecule 2026-08-30 18:07:46 +03:00
Slavi Pantaleev 8d50b2c735 Test matrix-static-files with Molecule 2026-08-30 18:06:31 +03:00
Slavi Pantaleev e6b8a335f0 Test matrix-authentication-service with Molecule 2026-08-30 18:05:20 +03:00
Slavi Pantaleev 89bd2b717b Fix static-files base-domain routing path 2026-08-30 18:02:17 +03:00
Slavi Pantaleev 055b981e92 Fix static-files RTC foci detection 2026-08-30 18:01:15 +03:00
Slavi Pantaleev 61cd97c105 Test matrix-bot-draupnir with Molecule 2026-08-29 16:45:23 +03:00
Slavi Pantaleev abd3edb669 Test mautrix-meta-instagram with Molecule 2026-08-29 16:45:05 +03:00
Slavi Pantaleev 494589c5af Test matrix-bot-maubot with Molecule 2026-08-29 16:44:48 +03:00
Slavi Pantaleev dec548eb6a Fix Maubot custom URL prefixes 2026-08-29 16:17:09 +03:00
Slavi Pantaleev d8ab746f69 Fix Draupnir for all uninstall path 2026-08-29 16:11:43 +03:00
Slavi Pantaleev 7ce8338281 Fix Draupnir's default Traefik network 2026-08-29 16:10:27 +03:00
Slavi Pantaleev a01df4cc7d Test matrix-client-element with Molecule 2026-08-29 12:55:45 +03:00
Slavi Pantaleev e6ac1dfb94 Test matrix-ketesa with Molecule 2026-08-29 12:54:39 +03:00
Slavi Pantaleev 3f52a5fac7 Test matrix-synapse with Molecule 2026-08-29 12:53:30 +03:00
Slavi Pantaleev f6d33e25ea Use Element's configured port in Traefik labels 2026-08-29 12:17:29 +03:00
Slavi Pantaleev c7ac899e0b Test matrix-bridge-mautrix-telegram with Molecule 2026-08-29 08:55:29 +03:00
Slavi Pantaleev 893a3eff4b Test matrix-bridge-mautrix-signal with Molecule 2026-08-29 08:55:29 +03:00
Slavi Pantaleev c5ca73ec93 Test matrix-bridge-postmoogle with Molecule 2026-08-29 08:55:29 +03:00
Slavi PantaleevandClaude Opus 5 5e9a20a3d2 Correct what the baibot OpenAI API key comment claims
It read "The API key is intentionally not required. Some OpenAI-compatible APIs
do not require a key", while validate_config.yml fails when the key is empty and
the provider is enabled. Enabling the provider against a keyless endpoint stopped
with "You need to define a required configuration setting".

baibot is the authority here, and it agrees with the validation rather than the
comment: `openai::Config` takes `api_key: String`, whereas the provider whose key
really is optional is a different one, `openai_compat`, with
`api_key: Option<String>`. So the comment described a real baibot feature, just
not this provider's.

The validation stays as it is; the comment now says what the code does, and
points at the provider the keyless case belongs to.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SEH3vxYSQ5SV4N5z61eyGT
2026-08-27 21:39:26 +03:00
Slavi PantaleevandClaude Opus 5 928f5d9525 Drop the unreachable Instagram branch from the mautrix-meta-messenger image tag
The image tag prefixed `ig-` when `..._meta_mode` was `instagram`, but this role
does not accept that mode any more: `..._database_suffix` and
`..._bridge_username_prefix` map only `facebook`, `facebook-tor` and `messenger`,
so `instagram` raises an undefined-key error long before the tag is rendered.

Instagram has been a separate bridge since v26.07 and is handled by
matrix-bridge-mautrix-meta-instagram, which hardcodes the prefix. Left over from
before that split.

The comment stays, reworded: both bridges still share a container image
repository, so an `ig-` prefix on a tag here would mean this role had pulled the
other bridge's image - which is what the Molecule scenario asserts against.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SEH3vxYSQ5SV4N5z61eyGT
2026-08-27 18:40:35 +03:00
Slavi PantaleevandClaude Opus 5 15429f4a90 Fix the Draupnir Renovate annotations so updates are found again
The annotation read `depName=depName=ghcr.io/...`, so Renovate looked up a
package literally named `depName=ghcr.io/the-draupnir-project/draupnir` and found
nothing. Both Draupnir roles have been invisible to Renovate since v3.0.0 landed
in April, and the dependency dashboard has been reporting it as a repository
problem the whole time:

  Failed to look up docker package
  depName=ghcr.io/the-draupnir-project/draupnir: no-result

Checked every other annotation under roles/custom/ for the same shape; these two
were the only ones.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SEH3vxYSQ5SV4N5z61eyGT
2026-08-27 18:19:02 +03:00
Slavi PantaleevandClaude Opus 5 85f80a3c7e Test the Molecule scenarios against Postgres rather than sqlite
`group_vars/matrix_servers` selects postgres whenever postgres is enabled, which
is the default, so postgres is what essentially every deployment runs. The
scenarios were testing sqlite - a path almost nobody is on.

How little that path is used is not a guess: the mautrix-meta bridges could not
start at all under sqlite, and nobody reported it. Testing the engine users are
actually on is worth more than keeping coverage of the one they are not, so no
scenario is left behind on sqlite.

Four of the eight scenarios have a database and are converted; the other four
have none and are untouched.

molecule-shared/tasks/postgres.yml stands Postgres up on the scenario's network,
with the data directory on a tmpfs since it is thrown away with the container.
The image is pinned at the major the postgres role deploys to new installations
and left to Renovate: when a new major lands, the PR bumping that pin runs every
scenario against it, which is the earliest warning we get that a component does
not cope.

Each scenario gives its database and user names that differ from the role's
defaults, so the component reaching the database proves the role built its
connection string out of them. The assertions moved from "a file appeared at the
path we configured" to "these tables exist", which is strictly stronger: tables
can only appear once the component has resolved the hostname, authenticated with
the credentials the role rendered, and run its migrations to completion.

Costs about 10 seconds per affected scenario (115s to 125s locally for
mautrix-whatsapp), on jobs that run in parallel.

Gotcha worth recording: since Postgres 18 the image puts PGDATA in a versioned
subdirectory and refuses to start if it finds a mount at the old
/var/lib/postgresql/data, so the tmpfs is mounted at /var/lib/postgresql.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SEH3vxYSQ5SV4N5z61eyGT
2026-08-27 18:02:53 +03:00
Slavi PantaleevandClaude Opus 5 c447e1528b Reword the Molecule scenario comments
They were hard-wrapped at 80 characters, broke mid-parenthesis, and spent lines
restating what the code below them does.

Rewrapped at natural boundaries instead, with the narration dropped and only the
reasons, gotchas and surprises kept. Section dividers stay - they delineate long
plays rather than narrate them.

Comments only; no scenario behaviour changes.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SEH3vxYSQ5SV4N5z61eyGT
2026-08-27 18:02:53 +03:00
Slavi PantaleevandClaude Opus 5 6ad1c9b031 Stop calling hookshot a mautrix bridge in a task name
Hookshot is not one; the name was copied from a mautrix role.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SEH3vxYSQ5SV4N5z61eyGT
2026-08-27 18:02:53 +03:00
Slavi PantaleevandClaude Opus 5 1751246cd1 Point the hookshot jira_oauth_uri deprecation at the right variable
The renamed-variable table mapped `matrix_bridge_hookshot_jira_oauth_uri` to
`..._jira_oauth_client_secret`, the entry above it. Anyone hitting the
deprecation was told to rename their setting to a variable that means something
else entirely; the URI's replacement is `..._jira_oauth_redirect_uri`.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SEH3vxYSQ5SV4N5z61eyGT
2026-08-27 18:02:53 +03:00
Slavi PantaleevandClaude Opus 5 0500127456 Fix the sqlite database URI for the mautrix-meta bridges
Both roles derived `..._appservice_database_uri` as `'sqlite:///' + <path>`.
mautrix-go hands that string to go-sqlite3 as a filename rather than parsing it
as a URL, so the bridge cannot open its database and dies at startup:

  FTL Failed to initialize database
      error="... unable to open database file: no such file or directory"

Every other mautrix bridge role here passes the bare in-container path.

This has stayed hidden because group_vars/matrix_servers selects postgres
whenever postgres is enabled, which is the default - so almost nobody reaches
the sqlite branch. Anyone who does gets a bridge that never starts.

Found by the mautrix-meta-messenger Molecule scenario, which runs sqlite
deliberately. The scenario's override is dropped and its assertion now compares
the rendered URI against the path the role defines, so the derived value is
what is under test rather than the scenario's own.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SEH3vxYSQ5SV4N5z61eyGT
2026-08-27 18:02:53 +03:00
Slavi PantaleevandClaude Opus 5 dc092d3545 Build mautrix-discord's double puppet server map from its own variables
`matrix_bridge_mautrix_discord_bridge_double_puppet_server_map_default` was
built from `matrix_bridge_beeper_linkedin_homeserver_domain` and
`..._homeserver_address` - a different role's variables, copy-pasted along with
the expression.

No user is affected today: group_vars/matrix_servers points both roles'
`homeserver_address` at `matrix_addons_homeserver_client_api_url` and both
domains at `matrix_domain`, so the rendered value is identical either way. It
only diverges for someone who overrides beeper-linkedin's homeserver settings,
where mautrix-discord would silently follow them.

It does not survive mautrix-discord being used without beeper-linkedin's
defaults in scope, which is how the Molecule scenario found it: with only the
one role loaded, the template fails on the undefined name. The scenario's
neutralising override is dropped in the same commit, so the expression is now
exercised rather than bypassed.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SEH3vxYSQ5SV4N5z61eyGT
2026-08-27 18:02:53 +03:00
Slavi PantaleevandClaude Opus 5 fe2fa6eaca Don't reset Hookshot's crypto store on a run that selects no tags
`tasks/main.yml` opens with a block tagged `reset-hookshot-encryption`, and
Ansible runs tagged tasks unless tags are actually selected. A run that selects
no tags therefore reaches `tasks/reset_encryption.yml`: on a host where the
service does not exist yet it fails outright, and on one where it does it stops
the bridge and resets its crypto store without being asked to.

Users of the playbook are shielded from this only because the documented way to
run it always passes `--tags=setup-all,start`.

Adding `never` makes the block reachable only when its tag is explicitly
selected, which is what `--tags=reset-hookshot-encryption` in
docs/configuring-playbook-bridge-hookshot.md already does - that keeps working
unchanged, as selecting a tag by name overrides `never`.

The Molecule scenario no longer needs its `skip-tags` workaround, which is what
makes this verifiable: the scenario runs with no tags selected, and is green
with the workaround gone.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SEH3vxYSQ5SV4N5z61eyGT
2026-08-27 18:02:53 +03:00
Slavi PantaleevandClaude Opus 5 705f561777 Give each Molecule scenario its own Ansible home
Scenarios install their Galaxy dependencies with `force: true`, so two roles
running at once re-extract the same collections and roles into ~/.ansible and
pull them out from under each other mid-play. It surfaces as a collection that
was working moments earlier going missing:

  the connection plugin 'community.docker.docker' was not found

Found while running five scenarios in parallel, where it cost a run.

ANSIBLE_HOME relocates both `collections/` and `roles/`, so one variable covers
both halves; the scenarios' ANSIBLE_ROLES_PATH workaround now follows it rather
than hardcoding ~/.ansible/roles. Left alone if already set, and unset in CI,
where each role runs in its own job and has nothing to collide with.

Verified by removing var/molecule-ansible-home entirely and running
matrix-alertmanager-receiver from cold: green through idempotence, with the
collections and roles landing under the per-role directory - which also shows
nothing was quietly relying on the shared ~/.ansible being populated.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SEH3vxYSQ5SV4N5z61eyGT
2026-08-27 18:02:53 +03:00