Commit Graph
14682 Commits
Author SHA1 Message Date
dependabot[bot] 6e5802350d chore(deps-dev): bump brace-expansion
Bumps the npm_and_yarn group with 1 update in the / directory: [brace-expansion](https://github.com/juliangruber/brace-expansion).


Updates `brace-expansion` from 5.0.9 to 5.0.12
- [Release notes](https://github.com/juliangruber/brace-expansion/releases)
- [Commits](https://github.com/juliangruber/brace-expansion/compare/v5.0.9...v5.0.12)

---
updated-dependencies:
- dependency-name: brace-expansion
  dependency-version: 5.0.12
  dependency-type: indirect
  dependency-group: npm_and_yarn
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-10-02 15:43:46 +00:00
kevinveenbirkenbach d90f1e8ed6 Merge pull request #756 from kevinveenbirkenbach/fix/svc-db-postgres/pgdg-bullseye-archived
fix(svc-db-postgres): build on postgres 18 since PGDG archived bullseye
2026-10-02 17:41:28 +02:00
kevinveenbirkenbach e9e83e36de Merge pull request #429 from AlejandroRomanIbanez/feature/role-stalwart-mail-swarm
feat(web-app-stalwart): Stalwart mail provider on the Swarm base (#403 + feature/swarm-nfs)
2026-10-02 17:40:32 +02:00
kevinveenbirkenbach aa55c8c8bd Merge branch 'main' into feature/role-stalwart-mail-swarm 2026-10-02 17:40:09 +02:00
evangelostsak 152588b511 perf(mesh): retune the multiplexer for the hosts the mesh switches
The pass that runs over the mesh reaches every host by SSH where the
pass before it used the container connection, and it pays that difference
once per task. Measured in a container: an exec through a warm multiplexer
costs 7ms, a fresh connection 85ms, and 165ms once sudo asks for the
password every task demands. The pass runs thousands of tasks.

Two settings threw the multiplexer away. A persist window of 20s closes the
master whenever a host waits longer than that for its next task, which in a
linear play is most of them; and the named ControlPath points at a directory
nothing creates, so a master that cannot open its socket reconnects per task
without reporting it.

Neither is retuned for the repository. The tool that moves a host onto the
mesh now writes that host's own ssh_args, derived from the repository's
value so every other option is kept and only the window and the socket
differ. A host the mesh never touches keeps exactly what it had.

Confirmed against the built command: a switched host gets ControlPersist=600s
and a ControlPath under the directory Ansible creates, while a host beside it
keeps the repository's own.
2026-10-02 16:35:29 +02:00
evangelostsak 47bd514569 fix(swarm-test): converge the backup node only in the round that deploys it
Only the first round deploys the backup host, so a later round meets a
container that has never been provisioned: the mesh role is the first thing
to reach it, and installing the tooling fails because nothing has populated
its package index. Every meshed variant above zero died there.

The converge now takes the sibling inventory only when the round brought
that node up, which is the only round whose data plane has a second spoke
to carry.

Reverts the apt refresh added for the same symptom. It reported the index
fresh on exactly the host that had none, so it never addressed this and the
rounds that do deploy the backup node were already converging without it.
2026-10-02 10:01:34 +02:00
evangelostsak bcbb4f2a48 fix(mesh): refresh the apt index before the play installs the tooling
Converging the mesh over the backup inventory reaches a host the deploy
passes never touch, and that host carries no apt index: every node the
earlier pass installed answers the install task with ok, while the backup
node fails with 'No package matching wireguard-tools is available'.

The play prepares apt already; it now refreshes an index that is missing or
older than an hour, so the first apt consumer on a host does not depend on
some earlier play having refreshed it.
2026-10-02 08:49:38 +02:00
evangelostsak 35c6777f24 fix(tests): read EPEL availability from mdapi instead of a mirror listing
The probe scraped a directory listing under dl.fedoraproject.org, which
redirects to whichever mirror is near the caller. A mirror that does not
carry the directory answers 404, and 404 is not retried, so every EPEL
package came back uncheckable and the suite failed on runners whose nearest
mirror is incomplete -- twice in a row, while the same URLs answer 200 from
elsewhere.

mdapi already backs the Fedora probe and serves the epel10 branch from a
single host. Routing EPEL through it removes the mirror roulette and keeps
the verdict sharp: a name it does not know is still reported absent rather
than unknown.

Checked against the live branch: ShellCheck and keepassxc resolve, an
invented name reports absent, and the suite passes.
2026-10-02 02:57:01 +02:00
evangelostsak 9948d8adae fix(constructor): create the mesh administrator only where the mesh runs
`WIREGUARD_ENABLED` is `DEPLOYMENT_MODE == 'swarm'`, so it is true on
both arms of the vpn axis and the account the mesh transport needs was
created on every swarm node whether or not a mesh was coming.

It now asks the same question the bootstrap below it asks -- whether this
host deploys svc-net-wireguard at all -- so the account appears only where
the second pass has to log in over the tunnel.
2026-10-02 02:29:32 +02:00
evangelostsak 1e66266b36 fix(svc-storage-nfs-server): keep the mesh pools out of a mesh-off export
`WIREGUARD_ENABLED` is `DEPLOYMENT_MODE == 'swarm'`, so it is true on
both arms of the vpn axis and the export ACL carried the mesh pools even on
a run that deploys no mesh at all.

The NFS host joins `svc-net-wireguard` only when the mesh is on, so its own
membership is the discriminator the ACL needs.
2026-10-02 02:11:57 +02:00
evangelostsak fa04452395 fix(svc-net-wireguard): stop the deploy when a spoke never handshakes
Tightening the retry condition was not enough. `failed_when: false` is
evaluated after the retry loop, so a task that runs out of attempts reports
`failed_when_result: false` and ends ok: the role carried on past a spoke
that never handshaked, and past a `wg show` that failed outright, whenever
the MTU probe was skipped.

The explicit failure is back, with the condition the wait now uses, so the
verdict is taken from the registered results rather than from the retry
outcome.

Measured on a three-case play, exit status of the run: a reported handshake
continues (0), '\t0' stops it (2), and a probe exiting non-zero with no
output stops it (2).
2026-10-02 01:13:23 +02:00
evangelostsak f84030756e fix(swarm-test): converge the rotated mesh on the backup node too
The converge ran over devices.yml alone, so the backup host kept the
identity it was deployed with while the hub had already been told the new
one. Nothing caught it: the backup node is not a spoke of any play that runs
after the seam, so its half of the data plane went quiet without failing.
The play forces the axis on, so reaching it through the sibling inventory is
independent of the backup deploy's own mesh state.
2026-10-02 00:54:20 +02:00
evangelostsak ff75343aba fix(ci): stop a held mesh axis deleting priority rows
The pin narrowed the cross product after the axis was resolved, so a row
pinned against an enforced or disabled run lost every combination and left
the matrix entirely -- while a regular row with the same pin was simply moved
onto the held side. A priority row now takes the same precedence a regular
row already took: the run's axis first, the pin second.
2026-10-02 00:54:20 +02:00
evangelostsak dc14e8a3a8 fix(mesh): keep every member on the address it already holds
The offset came from the spoke's position in a sorted list, so a host that
sorts earlier renumbered every member behind it. `wg syncconf` carries keys
and peers onto a live interface and never its address, so a renumbered member
keeps answering on the old address while the peers and the inventory have
moved to the new one -- and the address it gave up can be handed to a new
member while the old owner still holds it.

The planner now reuses the addresses already on disk and allocates only an
unseen member, from the lowest free offset. A value outside the subnet, a
duplicate, and the hub's own offset are refused, so a mirrored host_vars
cannot hand a spoke the hub's address. Rotation keeps addresses: it replaces
identities, not addresses.

The routing assertions re-planned the mesh and compared the result with
itself, so a writer that stored the mesh subnet in place of the routed range
would have passed; they now read the entry off disk, which is what the role
reads.
2026-10-02 00:54:20 +02:00
evangelostsak f61567fd4c fix(svc-net-wireguard): close the handshake gate on a failed probe
`wg show latest-handshakes` ran with `failed_when: false`, so a failed probe
left stdout empty. An empty string carries no '\t0' to match, the `until`
condition was satisfied on the first attempt, and the gate passed on a host
that never reported a handshake at all. The task meant to catch that could
not: Jinja's `default` replaces an undefined value, not an empty one, and
exhausted retries fail the task before a later task runs, so it was
unreachable in every case that mattered.

The wait now requires a zero exit code and a non-empty result as well as a
handshake, and the exhausted retry is the hard failure.

Verified with a local play over three cases: a reported handshake passes,
'\t0' fails, and a probe exiting non-zero with no output fails -- the last
of which passed under the previous condition.
2026-10-02 00:54:19 +02:00
evangelostsak a300abd94f perf(constructor): carry the SPOT through the mesh bootstrap
The merge block drops its carrier and the stage-wide one is parked after the
add_host tasks, so svc-net-wireguard bootstraps in the window between them
with no carrier at all. A block-scoped one spans just that role and is
dropped again, leaving every later stage to re-render as before.
2026-10-01 22:52:17 +02:00
evangelostsak 9c9cf0d162 perf(mesh): carry the applications SPOT through the mesh play
Ansible forks a worker per task, so the render cache of lookup('applications')
is cold in every task unless something parks it where later workers inherit
it. Without that, a task of this play that only evaluates a when and skips
cost 100s on a slow arm, while the wg syncconf it guards cost 0.7s.

The converge and the controller join spent 1219s of a Taiga round between
them, almost all of it re-rendering the same tree.
2026-10-01 22:51:11 +02:00
kevinveenbirkenbachandClaude Opus 5.5 807cfbcefe fix(postgres): raise max_locks_per_transaction to 256
GitLab's migration on its dedicated postgres sidecar failed with "ERROR: out of shared memory" and the hint to raise max_locks_per_transaction. The default of 64 locks per transaction cannot cover a schema that locks thousands of tables and indexes in one transaction: a reproduction on postgres:18 failed at table 7453 with the default and held 20000 tables at 256.

The value sits next to the other postgres tuning constants in group_vars/all/17_resource.yml and reaches both the central svc-db-postgres command and the per-app sidecar. The sidecar's new command keeps the image entrypoint and only adds the flag. The shared lock table grows to about 256 x max_connections entries, roughly 30 MB at the 400-connection cap.

Ported from 7690d2ca6d on feature/store-i18n, which kept the constant in the resource lookup that main no longer has.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-01 22:19:10 +02:00
kevinveenbirkenbach 30417d2515 fix(svc-db-postgres): build on the official multi-arch postgres 18 image
postgis/postgis publishes amd64 only, so every postgres consumer failed
on arm64. The official postgres image serves both architectures and
already ships the contrib extensions bloom, pg_trgm and unaccent.

PostGIS moves into the postgres_libraries registry and is installed from
PGDG (postgresql-18-postgis-3) only for a consumer that declares it as
an extension, which is mobilizon alone. apt update reads every source
list again, because the PostGIS package depends on GDAL from Debian
main, which a PGDG-only update left without an install candidate.

Postgres 18 keeps its cluster in /var/lib/postgresql/18/docker and its
entrypoint treats a volume at the former /var/lib/postgresql/data as an
old database, so the central and the dedicated data volume both mount at
/var/lib/postgresql. Existing 17 clusters are not migrated: their data
directory trips the entrypoint's old-data check and the container
refuses to start.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
(cherry picked from commit f78ebe46a4)
2026-10-01 22:19:09 +02:00
evangelostsak cd2ff90402 Merge remote-tracking branch 'origin/main' into feature/svc-net-wireguard
# Conflicts:
#	roles/web-app-mailu/README.md
2026-10-01 21:39:17 +02:00
kevinveenbirkenbach b93eef9605 Merge pull request #754 from infinito-nexus/update/docker-image-versions-web-app-socialhome-20261001-77e5443
update(images): update Docker image versions (web-app-socialhome)
2026-10-01 20:27:30 +02:00
infinito-nexus-updater[bot] 5382303151 update(images): update Docker image versions (web-app-socialhome) 2026-10-01 14:41:01 +00:00
kevinveenbirkenbach c88202bc22 Merge pull request #748 from infinito-nexus/update/docker-image-versions-web-app-keycloak-20261001-53fc434
update(images): update Docker image versions (web-app-keycloak)
2026-10-01 16:18:48 +02:00
kevinveenbirkenbach 90024c5074 Merge pull request #750 from infinito-nexus/update/collection-source-20261001-2023d07
update(galaxy): retune the preferred collection source
2026-10-01 13:14:43 +02:00
infinito-nexus-updater[bot] 5e86e8e4d8 update(galaxy): retune the preferred collection source 2026-10-01 10:55:20 +00:00
infinito-nexus-updater[bot] b193f88135 update(images): update Docker image versions (web-app-keycloak) 2026-10-01 09:34:56 +00:00
kevinveenbirkenbach 22e3b719e6 Merge pull request #743 from infinito-nexus/update/docker-image-versions-svc-runner-20260930-76c9a38
update(images): update Docker image versions (svc-runner)
2026-10-01 10:47:41 +02:00
kevinveenbirkenbach 968aefa95a Merge pull request #747 from infinito-nexus/update/repository-refs-web-app-bluesky-20261001-3654b5b
update(repos): bump git refs to latest semver tags (web-app-bluesky)
2026-10-01 10:46:59 +02:00
infinito-nexus-updater[bot] 4d57670a21 update(repos): bump git refs to latest semver tags (web-app-bluesky) 2026-10-01 04:08:44 +00:00
kevinveenbirkenbach 68f93919e9 Merge branch 'main' of github.com:infinito-nexus/core 2026-10-01 05:13:34 +02:00
kevinveenbirkenbach ae4416f551 Merge pull request #742 from infinito-nexus/update/docker-image-versions-web-app-xwiki-20260930-6d9ae25
update(images): update Docker image versions (web-app-xwiki)
2026-10-01 05:11:24 +02:00
kevinveenbirkenbach 3393d6b532 Merge pull request #741 from infinito-nexus/update/docker-image-versions-web-app-snipe-it-20260930-662949b
update(images): update Docker image versions (web-app-snipe-it)
2026-10-01 04:30:02 +02:00
kevinveenbirkenbach 20069be4cb Merge pull request #736 from infinito-nexus/update/docker-image-versions-web-app-socialhome-20260930-81b294b
update(images): update Docker image versions (web-app-socialhome)
2026-10-01 02:39:16 +02:00
kevinveenbirkenbach 41790606a5 Merge pull request #737 from infinito-nexus/update/docker-image-versions-web-svc-xmpp-20260930-60d4da8
update(images): update Docker image versions (web-svc-xmpp)
2026-10-01 02:38:32 +02:00
kevinveenbirkenbach 7ed0f1acb8 Merge pull request #735 from infinito-nexus/update/docker-image-versions-web-app-shopware-20260930-fbbe9c6
update(images): update Docker image versions (web-app-shopware)
2026-10-01 02:38:03 +02:00
infinito-nexus-updater[bot] 53d5408284 update(images): update Docker image versions (svc-runner) 2026-09-30 23:09:31 +00:00
kevinveenbirkenbach b3386830b5 Merge pull request #729 from infinito-nexus/update/docker-image-versions-web-app-matrix-20260930-cd56e16
update(images): update Docker image versions (web-app-matrix)
2026-10-01 00:53:19 +02:00
infinito-nexus-updater[bot] 2ac15a87eb update(images): update Docker image versions (web-app-xwiki) 2026-09-30 21:51:53 +00:00
infinito-nexus-updater[bot] 5c1e896863 update(images): update Docker image versions (web-app-snipe-it) 2026-09-30 21:51:46 +00:00
kevinveenbirkenbach 4962411c9f Merge pull request #734 from infinito-nexus/update/docker-image-versions-web-app-seaweedfs-20260930-54983de
update(images): update Docker image versions (web-app-seaweedfs)
2026-09-30 23:41:47 +02:00
kevinveenbirkenbach 29d85dd169 Merge pull request #728 from infinito-nexus/update/docker-image-versions-web-app-magento-20260930-23613c7
update(images): update Docker image versions (web-app-magento)
2026-09-30 23:22:30 +02:00
kevinveenbirkenbach 08f0f54b6a Merge pull request #731 from infinito-nexus/update/docker-image-versions-web-app-odoo-20260930-76ba242
update(images): update Docker image versions (web-app-odoo)
2026-09-30 23:17:55 +02:00
kevinveenbirkenbach 4437351081 Merge pull request #732 from infinito-nexus/update/docker-image-versions-web-app-peertube-20260930-cc73b11
update(images): update Docker image versions (web-app-peertube)
2026-09-30 21:05:02 +02:00
kevinveenbirkenbach f19bcbd50e Merge pull request #723 from infinito-nexus/update/docker-image-versions-web-app-erpnext-20260930-130d261
update(images): update Docker image versions (web-app-erpnext)
2026-09-30 21:02:47 +02:00
kevinveenbirkenbach ec65eec6c1 Merge pull request #721 from infinito-nexus/update/docker-image-versions-svc-ai-ollama-20260930-88d6946
update(images): update Docker image versions (svc-ai-ollama)
2026-09-30 21:01:58 +02:00
kevinveenbirkenbach 2e97b25a08 Merge pull request #724 from infinito-nexus/update/docker-image-versions-web-app-espocrm-20260930-629aeed
update(images): update Docker image versions (web-app-espocrm)
2026-09-30 21:00:45 +02:00
kevinveenbirkenbach cce596639d Merge pull request #727 from infinito-nexus/update/docker-image-versions-web-app-joomla-20260930-8918cff
update(images): update Docker image versions (web-app-joomla)
2026-09-30 20:57:29 +02:00
kevinveenbirkenbachandClaude Opus 5.5 95061fcf70 chore(coderabbit): review draft pull requests too
CodeRabbit skipped draft PRs ("Draft PRs are not automatically reviewed
by default"), so a change got its first review only once it was marked
ready. The repository had no CodeRabbit YAML, and every run reported
"Configuration used: defaults".

The new file enables reviews.auto_review.drafts. inheritance: true asks
CodeRabbit to take every key the file leaves unset from the parent
levels; today those are plain defaults, so draft review is the only
change. CodeRabbit reads the file from the PR's head branch, so older
feature branches pick it up once they merge main.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-30 18:39:32 +02:00
infinito-nexus-updater[bot] 458ab28b84 update(images): update Docker image versions (web-svc-xmpp) 2026-09-30 14:59:39 +00:00
infinito-nexus-updater[bot] 82b50c212c update(images): update Docker image versions (web-app-socialhome) 2026-09-30 14:59:31 +00:00