Commit Graph
8998 Commits
Author SHA1 Message Date
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 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
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
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
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
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
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 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 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
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
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
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 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
evangelostsak 8da00a7a26 test(wireguard): move the mesh probes into lib/probes.sh 2026-10-18 20:36:25 +02:00
evangelostsak f026439ef1 test(wireguard): move the test hosts' lifecycle into lib/hosts.sh 2026-10-18 20:36:25 +02:00
evangelostsak 70ffeeb09b test(wireguard): read mesh addresses and SSH options for the CLI test 2026-10-18 20:36:25 +02:00
evangelostsak 36d0806afc test(wireguard): write the CLI test's inventory from the layout 2026-10-18 20:36:25 +02:00
evangelostsak a21fa60512 test(wireguard): declare the CLI test's meshes and memberships as data 2026-10-18 20:36:25 +02:00
kevinveenbirkenbach da449f8894 Merge pull request #323 from evangelostsak/feature/svc-net-wireguard
feat(svc-net-wireguard): Dockerized WireGuard role + test-e2e-cli DinD e2e
2026-10-18 19:50:42 +02:00
kevinveenbirkenbach 0508e559d2 Merge pull request #982 from infinito-nexus/fix/web-app-zammad/search-allocation-precheck
fix(web-app-zammad): stop the deploy when Elasticsearch allocates no shard
2026-10-18 19:48:53 +02:00
evangelostsak ec9695ee88 test(wireguard): drop HOST_IMAGE from the CLI test env 2026-10-18 13:56:07 +02:00
evangelostsak fc4a2da70e test(wireguard): start and remove the test hosts through compose 2026-10-18 13:56:07 +02:00
evangelostsak 5bcbc14545 test(wireguard): declare the CLI test's three hosts in a compose file 2026-10-18 13:56:07 +02:00
evangelostsak 96fa1f43aa refactor(wireguard): leave group membership to the callers 2026-10-18 13:56:06 +02:00
evangelostsak 9eed8525e8 fix(wireguard): enable the service everywhere and drop the test image entry 2026-10-18 13:56:06 +02:00
kevinveenbirkenbach 5f2f3ef7bb Merge remote-tracking branch 'origin/main' into update/docker-image-versions-web-app-pihole-20261017-6082d2d 2026-10-18 13:47:04 +02:00
kevinveenbirkenbach a0950e8cdf Merge remote-tracking branch 'origin/main' into fix/web-app-zammad/search-allocation-precheck 2026-10-18 13:44:14 +02:00
kevinveenbirkenbachandClaude Opus 5.5 fc93ecddb2 fix(web-app-zammad): run the init job as a single swarm replica
The swarm wait added for the search precheck reads the newest task of
the init service through job_state.sh, which takes the first line of
`container service ps`. That holds for a one-shot job with one task,
the contract the akaunting setup and keycloak import jobs meet by
creating their job with `container service create`.

Zammad's init is a stack service, so it took the topology default of
compose_replicas: one task per host in the web-app-zammad group. Only
the primary placement keeps the CI swarm at one host; an inventory
that puts several hosts into the group would start one zammad-init per
host, each migrating the same database, and the wait would pass on the
first task to complete. init now pins replicas: 1, like the scheduler.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-18 13:44:13 +02:00
infinito-nexus-updater[bot] ab76a5fd82 update(pip): update pinned pip requirements (svc-bkp-volume-2-local) 2026-10-18 11:09:23 +00:00
kevinveenbirkenbach 6d84b9af04 Merge remote-tracking branch 'origin/main' into fix/web-app-zammad/search-allocation-precheck 2026-10-18 12:49:41 +02:00
kevinveenbirkenbach b2af6a10b0 Merge remote-tracking branch 'origin/main' into fix/web-app-zammad/search-allocation-precheck 2026-10-18 12:33:55 +02:00
kevinveenbirkenbachandClaude Opus 5.5 9ce68b0334 fix(web-app-zammad): wait for the current init task to complete in swarm
In swarm the role gated init only through "wait for Zammad init (seeds
+ pk-sequence reset)", which checks database state. On an existing
installation that state is already there, so a swarm deploy that
restarts init while Elasticsearch refuses shards passed: the init task
kept failing on the allocation precheck and nothing reported it.

A swarm-only task now runs sys-svc-compose's job_state.sh against the
init service after the seeds wait. It passes once the newest init task
is Complete. If the newest task stays Failed, it fails the deploy
after 60 retries 5 s apart. An init the stack deploy did not restart
is already Complete and passes at once. Compose needs no extra wait,
because railsserver depends on init with
service_completed_successfully.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-18 12:33:54 +02:00
kevinveenbirkenbachandClaude Opus 5.5 2ceba492b8 fix(web-app-zammad): render the search precheck service in compose only
In swarm, docker stack deploy ignores depends_on, so the precheck
service and every init replica ran search_allocation_precheck.sh at the
same time. They shared one probe index: one invocation's PUT could fail
the shards_acknowledged check because another had created the index
first, and either one's cleanup could delete the other's probe. The
init service carries no replica override, so compose_replicas gives it
one task per host in the application group and the collision also
happens between init replicas.

A failing precheck task also never reached has_fatal_task in
stack_ready.sh: with restart_policy none it records a single error,
while has_fatal_task needs three. stack_ready.sh then kept answering
"not converged" until the handler ran out of retries. And a Running
init task counts as converged through running_current_spec, so the
swarm deploy never depended on init failing; the role's "wait for
Zammad init" task is what stops it.

The probe index now carries the container's hostname, which docker
sets to the container id, so concurrent invocations no longer share an
index. compose.yml.j2 renders the precheck service, and init's
service_completed_successfully dependency on it, only outside swarm.
Compose keeps its fast stop on a refusal; in swarm, init runs the same
check in front of zammad-init, a refusal leaves Zammad unseeded, the
wait for Zammad init fails the deploy, and the init service logs carry
the allocation explanation.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-18 12:33:54 +02:00
kevinveenbirkenbach 1736105010 Merge remote-tracking branch 'origin/main' into fix/web-app-zammad/search-allocation-precheck 2026-10-18 12:33:54 +02:00
kevinveenbirkenbachandClaude Opus 5.5 68680e863b fix(web-app-zammad): gate init on the search precheck in swarm too
`docker stack deploy` ignores `depends_on`, so in swarm `init` started
even when the `precheck` service exited 1. The stack then looked exactly
as it did before #982: `init` hung, and `stack_ready.sh` reported "not
converged" until all 600 retries of the convergence handler ran out.
The single failed `precheck` task never turned fatal, because
`has_fatal_task` needs three errors.

`init` now runs `search_allocation_precheck.sh` in front of
`zammad-init` as well. In compose the `precheck` service still stops
`compose up` before `init` starts. In swarm, `init` keeps
`restart: on-failure`, so a refusing Elasticsearch makes its tasks fail
again and again. After three errors past `swarm_stack_fatal_grace`
(180 s), `has_fatal_task` marks the service stuck and the deploy stops
with the precheck output in the task report.

Reported by CodeRabbit on #982.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-18 12:33:53 +02:00