Commit Graph
14682 Commits
Author SHA1 Message Date
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
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
kevinveenbirkenbach eb27e94757 Merge pull request #987 from infinito-nexus/update/docker-image-versions-web-app-pihole-20261017-6082d2d
update(images): update Docker image versions (web-app-pihole)
2026-10-18 19:46:06 +02:00
kevinveenbirkenbach 44f3f062af Merge remote-tracking branch 'origin/main' into update/docker-image-versions-web-app-pihole-20261017-6082d2d 2026-10-18 15:04:09 +02:00
kevinveenbirkenbach 10338149a0 Merge remote-tracking branch 'origin/main' into fix/web-app-zammad/search-allocation-precheck 2026-10-18 15:04:05 +02:00
kevinveenbirkenbach c608d8f51c Merge pull request #996 from infinito-nexus/fix/svc-bkp-volume-2-local/baudolo-pin-sync
fix(svc-bkp-volume-2-local): pin baudolo 7.1.1 in pyproject.toml too
2026-10-18 15:01:42 +02:00
kevinveenbirkenbachandClaude Opus 5.5 4bd61489b3 fix(svc-bkp-volume-2-local): pin baudolo 7.1.1 in pyproject.toml too
The pip pin updater moved roles/svc-bkp-volume-2-local/tasks/01_install.yml
to backup-docker-to-local==7.1.1 in #995 (ab76a5fd82) and left
pyproject.toml on 7.0.2. tests/lint/repository/dependencies/
test_baudolo_pin.py holds both pins equal, because utils/recovery/layout.py
spells baudolo's generation layout out as literals, so main fails
test-lint since that merge: "Lists differ: ['7.1.1'] != ['7.0.2']".

pyproject.toml follows the role to 7.1.1, which PyPI serves. Between
v7.0.2 and v7.1.1 upstream changes the rsync flags of backup and restore
to -aHAX and nothing in baudolo/generation.py or baudolo/restore/paths.py,
so the layout literals stay valid.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-18 14:29:19 +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 25d1c32986 refactor(playbooks): run the mesh play on the svc-net-wireguard group only 2026-10-18 13:56:06 +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
kevinveenbirkenbach 5601592872 Merge pull request #989 from infinito-nexus/feature/fuzz/yaml-bootstrap-differential
feat(fuzz): fuzz the bootstrap YAML reader against PyYAML weekly
2026-10-18 13:29:43 +02:00
kevinveenbirkenbach c089264f71 Merge pull request #993 from infinito-nexus/fix/ci/affected-roles-skip-tests
fix(ci): stop a change under tests/ from deploying every role
2026-10-18 13:17:25 +02:00
kevinveenbirkenbach dfcab68ae1 Merge pull request #995 from infinito-nexus/update/pip-pins-svc-bkp-volume-2-local-20261018-c7406f0
update(pip): update pinned pip requirements (svc-bkp-volume-2-local)
2026-10-18 13:16:31 +02:00
kevinveenbirkenbach 356ade4dd6 Merge remote-tracking branch 'origin/main' into fix/ci/affected-roles-skip-tests 2026-10-18 13:12:12 +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
kevinveenbirkenbachandClaude Opus 5.5 9a8cc70dbf fix(ci): stop a change under tests/ from deploying every role
scripts/meta/resolve/diff/affected_roles.sh emits __ALL__ as soon as
one changed path outside roles/<role>/ is not a .md or .rst file. A
role fix that also adds its unit test under tests/unit/python/roles/
therefore deployed the whole matrix: PR #982 changed
roles/web-app-zammad/ plus
tests/unit/python/roles/web-app-zammad/files/test_search_allocation_precheck.py,
and its "Detect affected roles" job logged "Resolver output: __ALL__".

Paths under tests/ now join the .md/.rst skip-list. No role deploy
reads the top-level tests/ tree, and those suites run in their own
jobs whatever the whitelist says. A diff of only skipped paths keeps
falling back to __ALL__, as before. The same resolver feeds
effective_whitelist.sh, so the narrowing applies to every diff-driven
run.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-18 13:04:50 +02:00
kevinveenbirkenbach d5b17a5c16 Merge pull request #991 from infinito-nexus/fix/ci/workspace-image-mirror
fix(ci): pull workspace images through the GHCR mirror like the deploy jobs
2026-10-18 13:01:36 +02: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 2d34e7c535 Merge remote-tracking branch 'origin/main' into fix/web-app-zammad/search-allocation-precheck 2026-10-18 12:33:55 +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