Commit Graph
14116 Commits
Author SHA1 Message Date
kevinveenbirkenbachandClaude Opus 5.5 b055eece05 feat(ci): keep GitHub-hosted runner labels current through the updater
The workflows pin `runs-on: ubuntu-NN.NN`, so no job moves to a new Ubuntu
release behind our back, but nothing raised the pin either. A sixth job of
`🔄 Update versions` closes that: `utils/update/runner.py` reads the image
table of actions/runner-images, takes the newest x64 Ubuntu label whose
image carries no preview or beta badge, and raises every older bare
`runs-on: ubuntu-NN.NN` to it; arch-suffixed labels stay untouched. The job
opens the change as one PR over `.github/workflows`, so its CI run tests
the new image before it reaches main.

This commit carries the updater's first result: every job now runs on
ubuntu-26.04 (49 `runs-on`).

actionlint 1.7.12, the newest release, does not know `ubuntu-26.04` yet
(rhysd/actionlint#682, fix proposed in rhysd/actionlint#743), so
`.github/actionlint.yaml` declares the label until a release knows it.

act maps each `ubuntu-NN.NN` label the workflows use to the local platform
image, derived from `.github/workflows`, instead of a fixed list that did
not know ubuntu-26.04.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-19 16:56:52 +02:00
kevinveenbirkenbachandClaude Opus 5.5 52ad8549e0 fix(ci): pin GitHub-hosted runners to ubuntu-24.04
`ubuntu-latest` moved from ubuntu-24.04 to ubuntu-26.04 on its own
schedule, in the middle of run 39166850273, and every job that landed on
the new image met a different OS: sudo-rs instead of sudo, no ip_tables
loaded, and now the NFS probe-write of svc-storage-nfs-client failing on
26.04 swarm nodes. The same branch went red without a code change.

Every `runs-on` now names `ubuntu-24.04`. GitHub still rebuilds that image
weekly, so patches and tool updates keep arriving; only the release jump
becomes a deliberate change of the label. The CodeQL job drops its dead
swift/macos-latest branch, since no swift language is in its matrix. act
already maps ubuntu-24.04 to the local platform image.

A lint rejects any job whose `runs-on` contains a `*-latest` label.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-19 15:57:12 +02:00
kevinveenbirkenbachandClaude Opus 5.5 155ca9a8a9 fix(web-app-wazuh): declare the empty mesh membership
#414 merged web-app-wazuh with a meta/networks.yml that carries only
`local`, and test_mesh_subnet_pool.py requires every stack role to ship
`meshes: []` so a compose host can join meshes through it. main's
test-lint has been red since d0698daa5e:

    AssertionError: 'meshes' not found in {'local': {'subnet': '192.168.81.0/24'}}

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-19 15:57:12 +02:00
kevinveenbirkenbach bfd7febe5c Merge pull request #1020 from infinito-nexus/update/docker-image-versions-web-app-pixelfed-20261019-c89532b
update(images): update Docker image versions (web-app-pixelfed)
2026-10-19 15:20:51 +02:00
kevinveenbirkenbach 2520efa3f8 Merge pull request #1019 from infinito-nexus/fix/svc-storage-nfs-client/node-local-backups
fix(svc-storage-nfs-client): keep swarm backups node-local
2026-10-19 15:17:04 +02:00
kevinveenbirkenbach 6cf1c8f95b Merge remote-tracking branch 'origin/main' into fix/svc-storage-nfs-client/node-local-backups 2026-10-19 15:16:06 +02:00
kevinveenbirkenbachandClaude Opus 5.5 13c482cd70 docs(svc-storage-nfs-client): note generations stranded on the share
Generations a swarm node wrote to the NFS share before the node-local
bind stay under the export's backup/ directory, hidden from the nodes,
outside every cleanup and pull. No production swarm install carries any,
so the README states the manual removal instead of migrating.

Refs #1012

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-19 15:16:06 +02:00
kevinveenbirkenbachandClaude Opus 5.5 c73079613b fix(svc-storage-nfs-client): keep the backup user's access and the state remount
Two holes in the node-local backup bind, both reproduced with the role's
own tasks against a ganesha NFSv4.2 mount:

- The store was created with mode 0700. The role runs twice per deploy
  (constructor svc-storage group, then 02_server), and between the runs
  user-backup and the two cleanup roles converge the same inode to
  root:root 0755. The second run then chmodded it to root:root 0700, the
  backup user lost access (`ls` rc=2), and the backup host's pull would
  list no repositories and exit 0. The store now uses 0755, the mode the
  cleanup roles converge it to, so the second run changes nothing.

- A changed NFS mount line (options, version, server) makes
  ansible.posix.mount fall back from `mount -o remount` to a plain
  `umount`, which the child bind now blocks: `umount.nfs4: device is
  busy`. A check-mode pass detects the pending change and unmounts the
  bind first; the bind task mounts it again afterwards.

Refs #1012

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-19 15:16:06 +02:00
kevinveenbirkenbach d0698daa5e Merge pull request #414 from pragepani/feature/web-app-wazuh/add-role
feat(web-app-wazuh): add Wazuh SIEM role with OIDC/LDAP RBAC
2026-10-19 14:35:24 +02:00
infinito-nexus-updater[bot] 628f835d86 update(images): update Docker image versions (web-app-pixelfed) 2026-10-19 11:36:40 +00:00
kevinveenbirkenbach 32216cc199 Merge pull request #999 from infinito-nexus/fix/compose/primary-net-ip-range
fix(compose): keep dynamic addresses off the stack's static IPs
2026-10-19 13:34:52 +02:00
kevinveenbirkenbachandClaude Opus 5.5 ad70e3de1e fix(svc-storage-nfs-client): keep swarm backups node-local
On swarm nodes /var/lib/infinito is the ganesha NFSv4.2 state share, so
every backup repository landed on it. ganesha 6.5 refuses user.* extended
attributes, and baudolo 7.1.x copies volumes with `rsync -aHAX`, so the
volume backup of OpenCloud (user.oc.* metadata) failed with
`fsetxattr(... "user.oc.id") failed: Operation not supported (95)`.

After the state mount the client role now binds the node's own
/var/lib/infinito-backup over /var/lib/infinito/backup. Every consumer
keeps its path; the data stays on local disk with its attributes, and the
backup host pulls each provider over ssh as before. The bind carries
_netdev: without it, systemd-fstab-generator puts the bind into
local-fs.target below its NFS parent in remote-fs.target, and the boot
transaction cycles. The DR drill remounts the bind after its lazy remount
of the state share, because `umount -l` on the parent detaches it.

Closes #1012

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-19 13:28:45 +02:00
kevinveenbirkenbach d014c8dab1 Merge pull request #1018 from infinito-nexus/fix/ci/sudo-rs-preserve-env
fix(ci): keep main green on ubuntu-26.04 runners (sudo-rs env, fedora iptables-nft)
2026-10-19 13:16:44 +02:00
kevinveenbirkenbach 97a03a1194 Merge remote-tracking branch 'origin/main' into fix/compose/primary-net-ip-range 2026-10-19 13:07:26 +02:00
kevinveenbirkenbachandClaude Opus 5.5 c4f340d7b4 fix(sys-svc-container): install iptables-nft with docker on RedHat
On Fedora 44, dnf satisfies docker-ce's `(iptables-nft or iptables)`
requirement with iptables-legacy. The legacy backend needs the ip_tables
module, which ubuntu-26.04 runners no longer have loaded, and the compose
container cannot load it because it mounts no /lib/modules. The MSS clamp
task then failed with `modprobe: FATAL: Module ip_tables not found` and
`can't initialize iptables table 'mangle'` (Nextcloud#10, Gitea#0,
Jellyfin#0 on fedora). CentOS 10 already resolves to iptables-nft from the
same plan and deploys green on the same image.

Naming iptables-nft in the docker transaction makes Fedora use the
nf_tables backend as well.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-19 13:07:18 +02:00
kevinveenbirkenbachandClaude Opus 5.5 281a9cce9b fix(ci): name the preserved environment for sudo-rs runners
ubuntu-latest is rolling over to ubuntu-26.04, whose sudo is sudo-rs. It
ignores `-E` ("preserving the entire environment is not supported") and
hands the child only the explicit `env` assignments, so the swarm matrix
died at import with `KeyError: 'INFINITO_SRC_DIR'` before any inventory
existed (PR #1009, Nextcloud#0). Jobs that landed on ubuntu-24.04 kept
passing.

Every `sudo -E` now passes the caller's exported names through
`--preserve-env="$(compgen -e | paste -sd, -)"`, which both classic sudo
and sudo-rs honour. A lint rejects `sudo -E` and bare `--preserve-env`.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-19 13:07:18 +02:00
kevinveenbirkenbach 4018a2114c Merge pull request #1016 from infinito-nexus/update/docker-image-versions-web-app-stalwart-20261019-4598c08
update(images): update Docker image versions (web-app-stalwart)
2026-10-19 12:15:37 +02:00
infinito-nexus-updater[bot] 1d98616895 update(images): update Docker image versions (web-app-stalwart) 2026-10-19 09:11:08 +00:00
kevinveenbirkenbach 3705615000 Merge pull request #1014 from infinito-nexus/update/repository-refs-pkgmgr-20261019-3a9100b
update(repos): bump git refs to latest semver tags (pkgmgr)
2026-10-19 10:33:54 +02:00
kevinveenbirkenbach 847054928e Merge pull request #1015 from infinito-nexus/update/docker-image-versions-web-app-semaphore-20261019-393ca71
update(images): update Docker image versions (web-app-semaphore)
2026-10-19 10:33:13 +02:00
infinito-nexus-updater[bot] 3647788374 update(images): update Docker image versions (web-app-semaphore) 2026-10-19 08:15:51 +00:00
infinito-nexus-updater[bot] d26a4afa5c update(repos): bump git refs to latest semver tags (pkgmgr) 2026-10-19 08:12:04 +00:00
kevinveenbirkenbach 7075aad420 Merge pull request #1003 from evangelostsak/fix/svc-net-wireguard/split-cli-test
refactor(svc-net-wireguard): split the CLI test into files
2026-10-19 10:10:43 +02:00
kevinveenbirkenbach 19914777c4 Merge remote-tracking branch 'origin/main' into fix/compose/primary-net-ip-range 2026-10-19 09:46:19 +02:00
kevinveenbirkenbachandClaude Opus 5.5 caec064e6b fix(env): reach ip_range through the handler registry
builder.py imported utils.env.handlers.infinito.ip_range directly, while
ip_range imports EnvBuilder from builder for its annotations. CodeQL
reported that as py/unsafe-cyclic-import on PR #999. The import only
runs under TYPE_CHECKING, so nothing breaks at runtime, but builder now
takes ip_range from utils.env.handlers like ORDERED_HANDLERS, the path
every other handler module already uses.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-19 09:46:18 +02:00
kevinveenbirkenbach fae77f0a60 Merge pull request #1013 from infinito-nexus/update/version-sources-web-app-n8n-20261019-f27d3cc
update(versions): update pins with a declared source (web-app-n8n)
2026-10-19 09:44:52 +02:00
infinito-nexus-updater[bot] 01f4f51420 update(versions): update pins with a declared source (web-app-n8n) 2026-10-19 07:42:43 +00:00
kevinveenbirkenbach 106dd1d762 Merge pull request #1011 from infinito-nexus/dependabot/pip/ruff-0.17.1
chore(deps-dev): bump ruff from 0.17.0 to 0.17.1
2026-10-19 09:33:31 +02:00
kevinveenbirkenbach 928a290655 Merge pull request #1010 from infinito-nexus/dependabot/npm_and_yarn/playwright/test-1.64.1
chore(deps-dev): bump @playwright/test from 1.64.0 to 1.64.1
2026-10-19 09:31:02 +02:00
dependabot[bot] 3688890959 chore(deps-dev): bump ruff from 0.17.0 to 0.17.1
Bumps [ruff](https://github.com/astral-sh/ruff) from 0.17.0 to 0.17.1.
- [Release notes](https://github.com/astral-sh/ruff/releases)
- [Changelog](https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md)
- [Commits](https://github.com/astral-sh/ruff/compare/0.17.0...0.17.1)

---
updated-dependencies:
- dependency-name: ruff
  dependency-version: 0.17.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-10-19 01:19:49 +00:00
dependabot[bot] 8b4823b7f7 chore(deps-dev): bump @playwright/test from 1.64.0 to 1.64.1
Bumps [@playwright/test](https://github.com/microsoft/playwright) from 1.64.0 to 1.64.1.
- [Release notes](https://github.com/microsoft/playwright/releases)
- [Commits](https://github.com/microsoft/playwright/compare/v1.64.0...v1.64.1)

---
updated-dependencies:
- dependency-name: "@playwright/test"
  dependency-version: 1.64.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-10-19 01:18:14 +00:00
kevinveenbirkenbach d662de599d Merge pull request #1000 from infinito-nexus/fix/svc-bkp-volume-2-local/baudolo-pin-spot
fix(svc-bkp-volume-2-local): read the baudolo version from pyproject.toml
2026-10-19 03:10:34 +02:00
kevinveenbirkenbach 564abaae71 Merge pull request #1008 from infinito-nexus/update/version-sources-web-app-gitea-20261018-17740b1
update(versions): update pins with a declared source (web-app-gitea)
2026-10-18 23:24:23 +02:00
kevinveenbirkenbach 6b279f5b4d Merge pull request #1002 from infinito-nexus/update/version-sources-web-app-gitea-20261018-352b5fa
update(versions): update pins with a declared source (web-app-gitea)
2026-10-18 23:23:39 +02:00
infinito-nexus-updater[bot] 77e8286f07 update(versions): update pins with a declared source (web-app-gitea) 2026-10-18 21:23:35 +00:00
kevinveenbirkenbach 3b1e8669d9 Merge pull request #1004 from infinito-nexus/update/docker-image-versions-web-app-gitea-20261018-964794d
update(images): update Docker image versions (web-app-gitea)
2026-10-18 23:22:44 +02:00
kevinveenbirkenbach 92b87fb0b1 Merge pull request #1005 from infinito-nexus/update/docker-image-versions-web-app-stalwart-20261018-379310b
update(images): update Docker image versions (web-app-stalwart)
2026-10-18 23:22:17 +02:00
kevinveenbirkenbach 7363137ea2 Release version 16.0.1 v16.0.1 2026-10-18 23:04:22 +02:00
kevinveenbirkenbachandClaude Opus 5.5 07e0ef6b8b style(markdown): drop the comments from the markdownlint config
The header and the rule lists narrated the config instead of being an
exception, a parameter doc or a nocheck directive, and one of them was
wrong: it listed MD040 as kept on while the config disables it. No key
or value changes.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-18 23:04:02 +02:00
kevinveenbirkenbachandClaude Opus 5.5 dd955a71a6 style(markdown): pin list markers to dash and convert every list
The 16.0.0 entry pkgmgr wrote on top of CHANGELOG.md uses "-" bullets
while every older entry uses "*". MD004's default "consistent" style takes
the marker of the first list in a file, so lint-markdown reported 400
MD004 findings in CHANGELOG.md and the pre-push gate refused the release
push.

MD004 is now pinned to "dash", the marker pkgmgr and the changelog skill
write, and make autoformat (markdownlint-cli2 --fix) converted the lists
of the 72 files that still used "*". Only list markers changed.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-18 23:04:02 +02:00
kevinveenbirkenbach fa0b40ae00 Release version 16.0.0 2026-10-18 23:04:02 +02:00
infinito-nexus-updater[bot] c9dcc3df51 update(images): update Docker image versions (web-app-stalwart) 2026-10-18 20:17:03 +00:00
infinito-nexus-updater[bot] 0a39108643 update(images): update Docker image versions (web-app-gitea) 2026-10-18 20:16:58 +00:00
infinito-nexus-updater[bot] e7cfae20da update(versions): update pins with a declared source (web-app-gitea) 2026-10-18 20:04:50 +00:00
kevinveenbirkenbachandClaude Opus 5.5 474849a39c fix(svc-bkp-volume-2-local): read the baudolo version from pyproject.toml
Two bots bumped the one baudolo version independently. The pip pin
updater rewrites the literal package_name pin in
roles/svc-bkp-volume-2-local/tasks/01_install.yml and opens a PR scoped
to roles/<entry>/, and dependabot bumps the same package in
pyproject.toml. Each PR alone splits the pins that
tests/lint/repository/dependencies/test_baudolo_pin.py holds equal; #995
merged such a split and turned main's test-lint red until #996, and the
next upstream release (7.1.2 is tagged) would repeat it.

The version lookup now takes an optional distribution name and returns
its exact == pin from [project.dependencies]. The install task asks it
for backup-docker-to-local, so pyproject.toml is the only place the
version lives, dependabot is the only bot that moves it, and the pip
updater no longer finds a literal to bump. The lint now forbids a
literal pin in the task and requires the lookup.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-18 21:44:40 +02:00
kevinveenbirkenbachandClaude Opus 5.5 d2b33a3b2a fix(compose): keep dynamic addresses off the stack's static IPs
compose/cache.shared.override.yml attaches every worktree stack's
infinito service to the primary's network (infinito-nexus-core_default,
172.30.0.0/24) without an ipv4_address. The default network declared
no ip_range, so Docker IPAM handed out the lowest free address and the
worktree stacks took 172.30.0.2, .3, .8, .9 and, whenever the primary
container was down, .10, the primary's INFINITO_IP4. The primary's
`make compose-up` then failed with "Address already in use", and with
it `make quality-high` on main.

The default network now declares ip_range: ${INFINITO_IP_RANGE}, the
upper half of INFINITO_SUBNET. Every static address of the stack (.1,
.4 to .6, .10, .53) sits in the lower half, so a container without a
static address can no longer take one.

INFINITO_IP_RANGE is derived from the final INFINITO_SUBNET after
custom.env is applied, because a worktree pins its subnet there and
`make dotenv-force` regenerates without it in the environment. Existing
worktrees therefore get their own slot's range without a new pin.

A lint checks that every static IP in default.env and every
172.30.${slot}.N pin in scripts/system/worktree/up.sh lies below the
pool.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-18 21:44:16 +02:00
kevinveenbirkenbachandClaude Opus 5.5 6405952320 docs(wireguard): regenerate the Cosmos diagram
The README merged with #323 lists svc-swarm-node as a 1:1 dependent, but
no role on main references svc-net-wireguard. make docs regenerates the
Cosmos block from the actual dependency graph and drops the edge.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-18 21:32:05 +02:00
kevinveenbirkenbachandClaude Opus 5.5 da690a0706 style(yaml): apply ansible-lint 26.10.1 autofix
A freshly built dev container installs ansible-lint unpinned (26.10.1,
yamllint 1.38.0), and its --fix pass in make autoformat now drops the
trailing blank line of meta/packages.yml and
roles/sys-svc-container/meta/packages.yml and adds the missing document
start to roles/svc-net-wireguard/files/test/compose.yml (from #323).
Parsed YAML is unchanged.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-18 21:32:04 +02:00
evangelostsak c2eb54c39c refactor(wireguard): reduce test.sh to the flow and its expectations 2026-10-18 20:36:26 +02:00
evangelostsak fab8acbe91 test(wireguard): move the assertions into lib/checks.sh 2026-10-18 20:36:25 +02:00