Commit Graph
14682 Commits
Author SHA1 Message Date
kevinveenbirkenbach f05d405945 Merge remote-tracking branch 'origin/main' into update/galaxy-pins-20261005-e2ea21d 2026-10-06 02:42:32 +02:00
dependabot[bot] 39f2bfb87c chore(deps-dev): bump eslint from 10.10.0 to 10.12.0
Bumps [eslint](https://github.com/eslint/eslint) from 10.10.0 to 10.12.0.
- [Release notes](https://github.com/eslint/eslint/releases)
- [Commits](https://github.com/eslint/eslint/compare/v10.10.0...v10.12.0)

---
updated-dependencies:
- dependency-name: eslint
  dependency-version: 10.12.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-10-06 00:38:12 +00:00
evangelostsak 874aea328c docs(037): record the prologue and the two passes over the tunnel
Renames the mesh-only first pass to the prologue it always was, since
PASS 1 and PASS 2 now both name application deploys, and states why the
credential reset cannot move to the direct arm's slot.
2026-10-06 02:35:55 +02:00
evangelostsak 25e828bfcf revert(stages): restore the unconditional Playwright gate
No pass is thrown away by the drill any more, so nothing needs to hold
the browser suite back from one.
2026-10-06 02:35:55 +02:00
evangelostsak 6b27280644 feat(swarm-test): run both arms of the axis through the same round
The meshed round was its own shape: a mesh-only first pass, one
application deploy, and a second only when a drill needed one. Comparing it
with the direct arm meant adjusting for a missing pass and a stripped browser
suite, and every timing answer carried a caveat.

Both arms now run deploy, converge, drill, redeploy, converge, verify. What
the mesh needs moves into a prologue that installs no role: tunnel up on every
node, keys rotated, controller joined, transport switched. Both application
passes then run over the tunnel and both print their PASS banner, so a meshed
row and a direct row differ only in how they were reached.

The credential reset stays in the prologue rather than moving to the direct
arm's slot between the passes. Its mirror copies the manager's host_vars over
every other host, keeping only applications.svc-net-wireguard, so after the
switch every worker would inherit the manager's mesh address and three
connections would land on one node.

The drill probe now gates both arms. A backup host deployed for an application
with no NFS-flagged volume is several minutes spent on a drill that skips
itself, and that was true on the direct arm before this branch existed.
2026-10-06 02:35:54 +02:00
kevinveenbirkenbach be800e8741 Merge pull request #803 from infinito-nexus/fix/sys-ctl-hlth-msmtp/empty-reply-is-transient/790
fix(mail): retry a connection the mail server drops before its greeting
2026-10-06 02:28:06 +02:00
kevinveenbirkenbach 88418016ba Merge pull request #788 from kevinveenbirkenbach/fix/ci-fork-image-wait/784
fix(ci): keep the fork image wait alive and let it find its privileged run
2026-10-06 01:36:54 +02:00
kevinveenbirkenbachandClaude Opus 5.5 89b95d751c fix(update): stop bumping pins of eol roles
The update bot opened a version PR for web-app-jira (#821) although the role is end of life: none of the updaters looked at the lifecycle. utils.update.base.is_maintained now answers that question once, and the collectors for image versions, declared version sources, pip pins, repository refs and the addon check skip a role whose lifecycle is eol.

The lint that requires every semver pin to be watched shares that scope, otherwise it would report the pins of the eol roles as unwatched. Every other stage, deprecated included, stays in the update scope.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-06 01:09:10 +02:00
infinito-nexus-updater[bot] e07f617f0f update(images): update Docker image versions (web-app-jira) 2026-10-05 20:56:20 +00:00
infinito-nexus-updater[bot] 33fdcd1d65 update(images): update Docker image versions (svc-db-qdrant) 2026-10-05 20:56:14 +00:00
infinito-nexus-updater[bot] d827b0575f update(versions): update pins with a declared source (web-app-xwiki) 2026-10-05 19:20:55 +00:00
infinito-nexus-updater[bot] ac6bd94bc6 update(galaxy): bump pinned Ansible collections 2026-10-05 19:20:51 +00:00
infinito-nexus-updater[bot] a86eae8740 update(versions): update pins with a declared source (web-app-wordpress) 2026-10-05 19:20:50 +00:00
infinito-nexus-updater[bot] 9e1392fc44 update(versions): update pins with a declared source (web-app-stalwart) 2026-10-05 19:20:40 +00:00
infinito-nexus-updater[bot] caf2f1832d update(versions): update pins with a declared source (web-app-prometheus) 2026-10-05 19:20:36 +00:00
infinito-nexus-updater[bot] 4c699f9f7c update(versions): update pins with a declared source (web-app-n8n) 2026-10-05 19:20:31 +00:00
infinito-nexus-updater[bot] 2da51d1b78 update(versions): update pins with a declared source (web-app-moodle) 2026-10-05 19:20:27 +00:00
infinito-nexus-updater[bot] 9b746233f9 update(versions): update pins with a declared source (web-app-hugo) 2026-10-05 19:20:21 +00:00
infinito-nexus-updater[bot] 2e2b42c9b3 update(versions): update pins with a declared source (web-app-gitea) 2026-10-05 19:20:16 +00:00
infinito-nexus-updater[bot] bd9bdd7048 update(versions): update pins with a declared source (web-app-flowise) 2026-10-05 19:20:11 +00:00
kevinveenbirkenbach fb32756d4f Merge pull request #789 from infinito-nexus/update/onlyoffice-nextcloud-connector
feat(update): bump pinned versions and addons from declared sources
2026-10-05 21:17:30 +02:00
evangelostsak 996febdc89 revert(swarm-test): drill the meshed arm in full again
Narrowing the meshed drill to its backup half bought budget by giving
up the recovery legs over the mesh. The budget overrun is worth measuring
before it is designed around, so the pre-drill pass and the full teardown and
recover come back. Reverts a27b093c4.
2026-10-05 18:06:41 +02:00
kevinveenbirkenbachandClaude Opus 5.5 517d40484e test(mail): select autoescape for the rendered alarm script
The unit test of the alarm script built its Jinja environment with
autoescape switched off, which code scanning reports as a possible XSS
sink and fails the PR on. The template is a shell script, so
select_autoescape() leaves it unescaped exactly as before, and the finding
no longer applies.

Refs #790

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-05 17:19:56 +02:00
kevinveenbirkenbach 787830fbde Merge remote-tracking branch 'origin/main' into fix/sys-ctl-hlth-msmtp/empty-reply-is-transient/790 2026-10-05 13:59:56 +02:00
kevinveenbirkenbach a811f5364e Merge remote-tracking branch 'origin/main' into update/onlyoffice-nextcloud-connector 2026-10-05 13:59:42 +02:00
kevinveenbirkenbach 1c440eb908 Merge remote-tracking branch 'origin/main' into fix/ci-fork-image-wait/784 2026-10-05 13:59:30 +02:00
kevinveenbirkenbach 6a322dab49 Merge pull request #801 from infinito-nexus/update/docker-image-versions-web-app-stalwart-20261005-0d4b285
update(images): update Docker image versions (web-app-stalwart)
2026-10-05 13:57:43 +02:00
evangelostsak d4b2f72946 docs(037): record the meshed arm's backup-half drill
The drill is no longer an exception to deploying once, and the probe's
tie-break now costs the backup host's deploy rather than a full one.
2026-10-05 13:27:29 +02:00
evangelostsak 82be0ec6e0 revert(stages): restore the unconditional Playwright gate
SWARM_DR_PREPASS existed to keep the browser suite out of a pass that
was about to be torn down. There is no such pass any more.
2026-10-05 13:27:29 +02:00
evangelostsak a27b093c44 fix(swarm-test): drill the meshed arm without a second deploy
The pre-drill pass cost a whole deploy so the drill would have a stack
to tear down and a later pass to bring it back. n8n variant 0 spent 11970s in
that pass alone and hit the 20400s budget before the real deploy started.

The meshed round now deploys once, as the rest of the branch does, and runs
the backup half of the drill after it: backup host plus DRILL_STAGE=backup,
around 550s against roughly 12000s. Teardown, the recover CLI and the bring-up
onto the recovered export are transport-agnostic and the direct arm proves
them on every application the axis rotates there. What the meshed half adds is
the backup host joining the data mesh and running its units over the tunnel.

Step 3b, which caught the Nextcloud volume-repo failure, is inside the half
that is kept.
2026-10-05 13:27:29 +02:00
evangelostsak b2134826bb feat(swarm-test): let the drill stop at the encrypted device
DRILL_STAGE=backup returns once the marker has travelled from the live
export through the deployed units to the LUKS device, before step 6 tears the
stack down. The loop device is closed on the way out, which the full path does
inline at step 7. Default stays full, so the direct arm is unchanged.
2026-10-05 13:27:29 +02:00
kevinveenbirkenbachandClaude Opus 5.5 4c955d080f feat(update): fail a declared update source whose pin is not a semver
The version-source resolver orders upstream versions by semver. A pin that
is not one, such as `latest` or a branch name, has no depth, so no candidate
ever matches it and the declaration never moves anything. Nothing reported
that: the watched-pins lint only looks at values that already are a semver.

test_version_keys now fails on an `update:` block whose pinned key does not
hold a semver. A monitored addon the resolver does not read is held to the
same rule as soon as it pins a `version`, because the catalog check skips a
non-semver pin just as silently. An addon without a `version` keeps tracking
the app default and is left alone.

The Stalwart README no longer asks for `webui_version` to be bumped by hand
next to the image tag. Its `update:` block names the upstream tags, the
server itself follows `releases/latest` of the bundle, and the resolver
plans v1.0.5 to v1.0.11 for it.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-05 12:48:22 +02:00
evangelostsak 8c84f5a271 docs(tests): drop the EPEL mirror comment
The probe reads one host either way. The mirror history belongs to the
commit that moved it.
2026-10-05 12:43:23 +02:00
evangelostsak 3ce1fc90bc docs(swarm-test): drop the drill probe comment
What the probe answers is its output; why the caller asks is in the
round that asks.
2026-10-05 12:43:23 +02:00
evangelostsak 385cadc7fa docs(user): drop the interactive-guard comment
The guard is the line every distribution's own bashrc opens with.
2026-10-05 12:43:23 +02:00
evangelostsak ece2d2ff61 docs(mesh): drop the bootstrap ordering comment
The order the roles are listed in is the statement.
2026-10-05 12:43:23 +02:00
evangelostsak d04144eaa5 docs(svc-net-wireguard): drop the contract header
The file is the contract. Why a validator wants one is not the
contract's business.
2026-10-05 12:43:23 +02:00
evangelostsak b25dc7f667 docs(svc-net-wireguard): drop the syncconf rationale
Why the interface is reconfigured in place rather than restarted is
recorded in requirement 037; the task file only has to do it.
2026-10-05 12:43:23 +02:00
evangelostsak cf9803a8a8 docs(ci): reduce the vpn variant docstrings to summary and Args
The axis is documented with the other axes, not per function.
2026-10-05 12:43:23 +02:00
evangelostsak c63876de84 docs(swarm-test): reduce the matrix docstrings to summary and Args
The drill probe and the pre-drill pass are explained in requirement 037;
the functions only have to name their inputs.
2026-10-05 12:43:23 +02:00
evangelostsak 18bcf1bde7 docs(swarm-test): reduce the mesh helper docstrings to summary and Args
The two-phase bootstrap is described once, in the requirement.
2026-10-05 12:43:23 +02:00
evangelostsak c70c8dac5e docs(mesh-cli): reduce the entrypoint docstrings to summary and Args
Each command's docstring now states what it does and what it takes.
2026-10-05 12:43:23 +02:00
evangelostsak b84f57799e docs(mesh-cli): reduce the transport docstrings to summary and Args
The ControlPersist value and the disabled tty are decisions, not
documentation; requirement 037 carries the reasoning.
2026-10-05 12:43:23 +02:00
evangelostsak 4a5845b54b docs(mesh-cli): reduce the writer docstrings to summary and Args
Why mirrored entries are skipped when reading existing addresses belongs
in the commit that introduced the skip.
2026-10-05 12:43:23 +02:00
evangelostsak 379dface8c docs(mesh-cli): reduce the planner docstrings to summary and Args
The prose explaining why offsets are reused and how the hub keeps index
zero is recorded in requirement 037. A reader of plan.py needs the signature,
not the history.
2026-10-05 12:43:23 +02:00
evangelostsak 4e44d7fb84 Merge remote-tracking branch 'upstream/main' into feature/svc-net-wireguard
No conflicts. Two files were touched by both sides and both kept each
side: the Makefile, where upstream retires the mcp-audit target and this
branch pins the throwaway cluster's vpn axis, and requirement 035, where
the role table keeps the single svc-net-wireguard row.

Incoming carries the fixes for two applications this branch's last run
failed on -- penpot probing its frontend without curl, and mobilizon's
postgres 18 migrations -- plus dependency bumps and a lint repair.

Gates on the merged tree: unit 6202, lint 523, integration 330,
ansible-lint clean.
2026-10-05 12:17:12 +02:00
kevinveenbirkenbach 0ebfc9e58b Merge remote-tracking branch 'origin/main' into update/onlyoffice-nextcloud-connector 2026-10-05 12:07:34 +02:00
kevinveenbirkenbachandClaude Opus 5.5 7c7b895ae9 fix(ci): match the privileged run of a fork PR by its number as well
The wait job picks the newest privileged run on the head commit of the
PR. Two fork PRs that share a head repository, branch and commit but
target different bases each start such a run, and the commit alone cannot
tell them apart. A failed run of the other PR would then end the wait of
this one while its images are still being built.

The run name of the workflow carries the PR number, so the match now
requires it next to the head commit. A run without that name matches
nothing, and the wait does what it does whenever no run is found: it
keeps polling for the images until they exist or the wait times out.

Raised by the CodeRabbit review of this PR.

Refs #784

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-05 12:07:14 +02:00
evangelostsak 0486cc0c36 docs(ci): label the vpn input with the mesh glyph
Same glyph the matrix rows now carry, so the input and its rows read as
one axis.
2026-10-05 12:00:06 +02:00
evangelostsak 3672965398 feat(ci): carry the mesh glyphs into the run name
The run name builds its own string rather than reading the glossary, so
the two axis glyphs are spelled out here and have to follow.
2026-10-05 12:00:06 +02:00