Commit Graph
14188 Commits
Author SHA1 Message Date
kevinveenbirkenbach ed2ed573cc Release version 16.2.2 latest v16.2.2 2026-10-21 13:00:13 +02:00
kevinveenbirkenbach 8bf16b1b66 Merge pull request #1101 from infinito-nexus/update/docker-image-versions-web-app-erpnext-20261021-d458a4d
update(images): update Docker image versions (web-app-erpnext)
2026-10-21 12:56:41 +02:00
kevinveenbirkenbach 71d15d45c9 Merge pull request #1100 from infinito-nexus/update/docker-image-versions-svc-ai-ollama-20261021-9aac2ed
update(images): update Docker image versions (svc-ai-ollama)
2026-10-21 12:56:17 +02:00
kevinveenbirkenbach 464b171282 Merge pull request #1099 from infinito-nexus/update/version-sources-web-app-xwiki-20261021-bef57aa
update(versions): update pins with a declared source (web-app-xwiki)
2026-10-21 12:55:50 +02:00
kevinveenbirkenbach c70d18580d Merge pull request #1102 from infinito-nexus/fix/web-app-moodle/mcp-provision-5-3-api
fix(web-app-moodle): mint the MCP token through the Moodle 5.3 API
2026-10-21 12:55:25 +02:00
kevinveenbirkenbachandClaude Opus 5.5 013b4606c7 fix(web-app-moodle): mint the MCP token through the Moodle 5.3 API
Moodle 5.3 marks `external_generate_token()` as a final deprecation
(`#[deprecated('\core_external\util::generate_token', since: '4.4',
final: true)]` in public/lib/externallib.php), and
`core\deprecation::emit_deprecation_notice()` throws a coding_exception
for every final deprecation, whatever the debug level. The MCP
provisioning script called it whenever no permanent token existed yet,
so every fresh install of the variant that enables MCP failed at
"Enable web services and mint the MCP bearer" (main run 39494396920,
Moodle#1: `Error code: codingerror` from deprecation.php:273 via
externallib.php:30).

The variant had not run in CI since the Moodle 5.3 bump, which is why
this surfaced only now.

Mint the token with `\core_external\util::generate_token()`, which
takes the service record instead of its id, and create the service
account with `\core\user::create_user()` in place of
`user_create_user()`, deprecated since 5.3 (MDL-82650). Neither needs
externallib.php or user/lib.php any more.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-21 12:54:18 +02:00
infinito-nexus-updater[bot] d6e7d12236 update(images): update Docker image versions (web-app-erpnext) 2026-10-21 10:39:42 +00:00
infinito-nexus-updater[bot] 944cd220c9 update(images): update Docker image versions (svc-ai-ollama) 2026-10-21 10:39:37 +00:00
infinito-nexus-updater[bot] 0efe436e61 update(versions): update pins with a declared source (web-app-xwiki) 2026-10-21 10:35:14 +00:00
kevinveenbirkenbach 0b26272c04 Merge pull request #1098 from infinito-nexus/fix/web-app-moodle/debug-level-in-db
fix(web-app-moodle): keep the component cache in debug deployments
2026-10-21 12:13:34 +02:00
kevinveenbirkenbachandClaude Opus 5.5 3e7bf106a3 fix(web-app-moodle): keep the component cache in debug deployments
config.php set `$CFG->debug = 32767` whenever MODE_DEBUG was true, as
the development and CI inventories set it. Moodle 5.3's
`core_component::is_developer()` treats any debug bit defined in
config.php as developer mode, so `init()` skipped
`$CFG->cachedir/core_component.php` and ran `fill_all_caches()` on
every PHP request: a walk over every plugin directory and every
`classes/` tree. The autoload in setup.php triggers it before the
ABORT_AFTER_CONFIG return, so even font.php and requirejs.php paid it.

On local disk the walk is cheap. In swarm the code tree is an NFS4
mount, and the walk turns into GETATTR round trips: main run
39494396920 served `/theme/font.php` in no less than 1.6 s and
`/lib/requirejs.php` in no less than 2.0 s, the five FPM workers per
replica queued, and the CSP check timed out loading the academy page
after 20 s on both Moodle swarm jobs.

Write `debug` and `debugdisplay` into the site config with
`admin/cli/cfg.php` instead, on every deploy and as integers (32767/1
in debug deployments, 0/0 otherwise). `is_developer()` reads only
values defined in config.php, so the component cache is honoured,
while `setup.php` still applies the stored debug level once the
database is up. The assignments leave config.php entirely, because
cfg.php refuses to change a name config.php defines, and
MOODLE_DEBUG leaves env.j2 with them.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-21 12:06:59 +02:00
kevinveenbirkenbach d3a6eba08f Merge pull request #1017 from infinito-nexus/update/version-sources-web-app-xwiki-20261019-45ce307
update(versions): update pins with a declared source (web-app-xwiki)
2026-10-21 00:20:33 +02:00
kevinveenbirkenbach 3f0d65aaf6 Merge pull request #1022 from infinito-nexus/update/docker-image-versions-web-app-wazuh-20261019-a052998
update(images): update Docker image versions (web-app-wazuh)
2026-10-21 00:01:10 +02:00
kevinveenbirkenbach 57a570e9fa Merge pull request #1097 from infinito-nexus/update/docker-image-versions-svc-runner-20261020-17356b8
update(images): update Docker image versions (svc-runner)
2026-10-20 23:45:34 +02:00
infinito-nexus-updater[bot] d7c4abab95 update(images): update Docker image versions (svc-runner) 2026-10-20 21:41:36 +00:00
kevinveenbirkenbach b008158f27 Merge pull request #1096 from infinito-nexus/fix/test-e2e-playwright/pull-timeout
fix(test-e2e-playwright): bound the shared Playwright image pull
2026-10-20 23:38:28 +02:00
kevinveenbirkenbach d206ac4269 Merge pull request #1095 from infinito-nexus/fix/svc-bkp-local-2-device/acl-xattr-filesystem
docs(svc-bkp-local-2-device): state the device filesystem requirement
2026-10-20 23:29:35 +02:00
kevinveenbirkenbachandClaude Opus 5.5 b1c7e98d3a fix(test-e2e-playwright): bound the shared Playwright image pull
The shared `container pull` of the Playwright image had no timeout. A
wedged registry-proxy tunnel kept a local deploy on that task for 18
minutes with no traffic until the pull was killed by hand; the task's
`retries: 3` never got a chance because the first attempt never
returned.

Run the pull under `timeout -k 60 <lookup('timeout', 1800)>`, the same
shape the compose build handlers use. A stuck pull now exits with 124
and the existing retry loop starts a fresh connection.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-20 23:27:42 +02:00
kevinveenbirkenbachandClaude Opus 5.5 701931eb92 docs(svc-bkp-local-2-device): state the device filesystem requirement
The device backup runs `rsync -aHAXP` since #1090, which needs the
mounted filesystem to store owners, POSIX ACLs and extended attributes.
The role never creates that filesystem, so name the requirement where
the operator reads how the device is used.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-20 23:27:21 +02:00
kevinveenbirkenbach 995cb7b1c7 Merge pull request #1078 from infinito-nexus/update/docker-image-versions-web-app-opentalk-20261020-e1622b2
update(images): update Docker image versions (web-app-opentalk)
2026-10-20 23:11:49 +02:00
kevinveenbirkenbach 66eb3c7082 Release version 16.2.1 v16.2.1 2026-10-20 22:35:05 +02:00
kevinveenbirkenbach dfd25d0561 Merge pull request #1081 from infinito-nexus/update/docker-image-versions-web-app-socialhome-20261020-1c28805
update(images): update Docker image versions (web-app-socialhome)
2026-10-20 22:31:33 +02:00
kevinveenbirkenbach 61ce4e7fc3 Merge pull request #1094 from infinito-nexus/fix/package-cache-frontend/restore-upstreams
fix(package-cache-frontend): restore upstreams.conf from before 16.2.0
2026-10-20 22:31:02 +02:00
kevinveenbirkenbachandClaude Opus 5.5 bc56beb7e9 fix(package-cache-frontend): restore upstreams.conf from before 16.2.0
The 16.2.0 release commit (e2501cb1de) shipped a locally generated
`compose/package-cache-frontend/upstreams.conf`, the output of the cache
generator that only exists on the feature branches (230d9a1e5e). It adds
TLS server blocks for argos-net.com, huggingface.co, index.crates.io,
registry.ollama.ai and static.crates.io, but main's `cert-gen.sh` issues
no certificates for them. nginx then dies on start with

    cannot load certificate "/etc/nginx/certs/argos-net.com.crt"

the frontend stays unhealthy, pypi.org on the runner refuses connections,
and `make install-lint` fails in every workspace job (run 39482585010).

Restore the file byte for byte to its state before the release (blob
b5c5ef08e7), the version every workspace job passed with in run
39443109355.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-20 22:30:36 +02:00
kevinveenbirkenbach d04a5ed2c2 Merge pull request #1093 from infinito-nexus/fix/web-app-snipe-it/trusted-header-proxy-secret
fix(web-app-snipe-it): bridge the SSO header past v8.8.1's HTTP_ refusal
2026-10-20 22:16:41 +02:00
kevinveenbirkenbachandClaude Opus 5.5 b0856dcf7b fix(web-app-snipe-it): bridge the SSO header past v8.8.1's HTTP_ refusal
Snipe-IT v8.8.1 refuses any `login_remote_user_header_name` matching
`/^HTTP_/i`, so the configured `HTTP_X_FORWARDED_PREFERRED_USERNAME`
stopped minting sessions behind oauth2-proxy.

Apache in the image now copies `X-Forwarded-Preferred-Username` into
the server variable `INFINITO_SSO_USER`, and only when the request also
carries `X-Infinito-Sso-Proxy` equal to the new per-inventory
`sso_proxy_secret`; an empty secret keeps the bridge closed. openresty
sends that header on every proxied request, so a client reaching the
container directly cannot log in by forging the identity header. A
deploy-time check asserts both directions (forged 200, with secret 302).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-20 22:10:23 +02:00
kevinveenbirkenbach 16ec1d9685 Merge pull request #1092 from infinito-nexus/fix/security/codeql-cleanup
refactor(python): clear the open CodeQL code-quality alerts
2026-10-20 22:00:32 +02:00
kevinveenbirkenbachandClaude Opus 5.5 6e776a5780 refactor(python): clear the open CodeQL code-quality alerts
- Declare `__all__` in every package `__init__.py` whose `PROJECT_ROOT`
  is imported by its modules (163 packages), so the constant counts as
  exported; list every public name where the package defines more.
- Empty the 15 package `__init__.py` files whose `PROJECT_ROOT` no module
  imports.
- Declare the public API of `utils.github.variant.axes` in `__all__`,
  re-exports included, instead of silencing them with `noqa: F401`; the
  list matches the one `feature/store-i18n` already carries.
- Use `import unittest.mock as mock` in `test_applications.py`, as the
  rest of the suite does.
- Spell `_NON_PRINTABLE` in `utils/yaml_bootstrap.py` as the equivalent
  BMP-only positive class; it matches exactly the same 2111 code points
  as the old negated class across U+0000..U+10FFFF.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-20 21:40:58 +02:00
kevinveenbirkenbach aa91f14f25 Merge pull request #1091 from infinito-nexus/fix/security/clear-text-findings
fix(bcrypt_hash): derive the seeded salt from the seed alone
2026-10-20 21:38:53 +02:00
kevinveenbirkenbachandClaude Opus 5.5 d48f8e9897 fix(bcrypt_hash): derive the seeded salt from the seed alone
The seeded salt was the first 16 bytes of sha256(seed + secret). bcrypt
stores its salt in clear inside the hash, so every seeded hash published
a fast sha256 digest of the password under a seed that is public in the
repository (`web-app-wazuh:indexer-admin`). Anyone holding the hash could
test password guesses at sha256 speed instead of paying bcrypt's cost.

The salt is now sha256(seed)[:16]. The hash stays deterministic for one
password, still changes when the password rotates, and its salt carries
nothing computed from the secret. Existing Wazuh deployments get a new
hash once; `securityadmin.sh` re-applies `internal_users.yml` on every
deploy and the hash still verifies the unchanged password.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-20 21:35:32 +02:00
kevinveenbirkenbach e2501cb1de Release version 16.2.0 v16.2.0 2026-10-20 21:11:50 +02:00
kevinveenbirkenbach 7215b2e268 Merge remote-tracking branch 'origin/main' into update/version-sources-web-app-xwiki-20261019-45ce307 2026-10-20 19:46:57 +02:00
kevinveenbirkenbach a03125ff56 Merge remote-tracking branch 'origin/main' into update/docker-image-versions-web-app-wazuh-20261019-a052998 2026-10-20 19:46:49 +02:00
kevinveenbirkenbach adcd6db8a9 Merge remote-tracking branch 'origin/main' into update/docker-image-versions-web-app-opentalk-20261020-e1622b2 2026-10-20 19:46:44 +02:00
kevinveenbirkenbach 8306693e61 Merge remote-tracking branch 'origin/main' into update/docker-image-versions-web-app-socialhome-20261020-1c28805 2026-10-20 19:46:37 +02:00
kevinveenbirkenbach 6b6b5b008c Merge pull request #1090 from infinito-nexus/fix/backup/rsync-xattrs/1021
fix(backup): carry hard links, ACLs and xattrs on every backup and recover hop
2026-10-20 18:32:53 +02:00
kevinveenbirkenbachandClaude Opus 5.5 21eba1e88f fix(backup): carry hard links, ACLs and xattrs on every backup and recover hop
baudolo 7.1.x writes volume generations with `rsync -aHAX`, so the
producing host keeps `user.*` extended attributes (OpenCloud keeps its
storage metadata in `user.oc.*`). Every later copy dropped them again,
because none of the other rsync calls passed `-X` (nor `-A`/`-H`):

- NFS export snapshots (svc-bkp-nfs-2-local `script.sh`),
- the backup host's pull (svc-bkp-remote-2-local `pull_specific_host.py`),
- the device sync (svc-bkp-local-2-device `script.py`),
- every recover into a live target (`utils/recovery/base.py`, used by the
  volume, NFS and device recover scripts),
- the `recover full` and `recover remote` tree pulls.

A disaster recovery through the documented chain therefore restored
OpenCloud without `user.oc.*`, silently: the copies succeeded and the
dirval stamp does not cover attributes.

All of these now run `rsync -aHAX` (`-aHAXP` for the device sync). A
target filesystem without xattr support makes rsync exit non-zero as soon
as a source file carries attributes, so the hop fails loudly instead of
dropping them; there is no per-device opt-out. The single-image pull in
`recover remote` keeps `-a`. The provider's ssh-wrapper needs no change:
its glob accepts any server flags and its character guard allows them.

Two tests write a `user.oc.id` attribute and assert it survives the NFS
snapshot and the recover; with the old `-a` both fail with
`OSError: [Errno 61] No data available`.

Closes #1021

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-20 18:20:46 +02:00
kevinveenbirkenbach fab41791e3 Merge remote-tracking branch 'origin/main' into update/version-sources-web-app-xwiki-20261019-45ce307 2026-10-20 17:16:52 +02:00
kevinveenbirkenbach 4361b53481 Merge remote-tracking branch 'origin/main' into update/docker-image-versions-web-app-wazuh-20261019-a052998 2026-10-20 17:16:46 +02:00
kevinveenbirkenbach 58eb15e4ad Merge remote-tracking branch 'origin/main' into update/docker-image-versions-web-app-opentalk-20261020-e1622b2 2026-10-20 17:16:41 +02:00
kevinveenbirkenbach 342579e0c6 Merge remote-tracking branch 'origin/main' into update/docker-image-versions-web-app-socialhome-20261020-1c28805 2026-10-20 17:16:34 +02:00
kevinveenbirkenbach fddaecb5ea Merge pull request #1084 from infinito-nexus/fix/svc-storage-nfs-client/ganesha-dir-delegation
fix(svc-storage-nfs-client): stop requesting directory delegations from ganesha < 9.11
2026-10-20 16:51:45 +02:00
kevinveenbirkenbachandClaude Opus 5.5 9b7f25f2fe fix(svc-storage-nfs-client): stop requesting directory delegations from ganesha < 9.11
Every swarm job on ubuntu-26.04 runners (kernel 7.0) died at the NFS
probe write with `[Errno 121] Remote I/O error`. ganesha's NFSv4 debug log
in the rescue bundles shows the cause on every client, the same second as
the failure:

  Request 2: opcode 46 is OP_GET_DIR_DELEGATION
  Status of OP_GET_DIR_DELEGATION in position 2 = NFS4ERR_OP_ILLEGAL

Linux 6.19 added directory delegations: after ACCESS, CREATE, REMOVE or
RENAME the client adds GET_DIR_DELEGATION to the directory's next GETATTR
(`should_request_dir_deleg`, gated per request by the nfsv4 parameter
`directory_delegations`). nfs-ganesha before 9.11 routes op 46 to
`nfs4_op_illegal`, whose reply carries opcode 10044; the client decoder
expects 46 and fails the call with EREMOTEIO. Upstream fixed it in
nfs-ganesha#1385 (98eb77c4, first in V9.11), which answers NOTSUPP; the
client then drops the capability. The distro packages the role installs
predate it: Debian trixie 6.5-5, Ubuntu 26.04 6.5-8.

Every client and the controller now read the server's installed
nfs-ganesha release and, below 9.11, set `directory_delegations=N` right
after the mount and before the first access (the mount itself never sends
op 46), plus `options nfsv4 directory_delegations=N` in /etc/modprobe.d for
later module loads. No ganesha release grants directory delegations, so
the end state equals a fixed server. The parameter is kernel-wide and is
only ever set to N, so clients sharing one kernel cannot flip it back on
each other. Servers on 9.11 or later and the kernel nfsd flavor keep the
client default.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-20 16:28:52 +02:00
kevinveenbirkenbach 3c3a91c525 Merge pull request #1079 from infinito-nexus/update/docker-image-versions-web-app-pixelfed-20261020-cac5171
update(images): update Docker image versions (web-app-pixelfed)
2026-10-20 15:09:29 +02:00
kevinveenbirkenbach dd7af4b91a Merge pull request #1083 from infinito-nexus/feature/compose/network-recreate
feat(compose): recreate the stack network without losing volumes or worktree stacks
2026-10-20 13:48:34 +02:00
kevinveenbirkenbachandClaude Opus 5.5 310663ae8c feat(compose): recreate the stack network without losing volumes or worktree stacks
When the IPAM config of a compose project's network changes (#999 added
`ip_range`), compose recreates the network on the next `up`. With a
foreign endpoint attached, as every worktree stack is on the primary's
network, compose first stops the project's own containers, then fails
with `error while removing network: ... has active endpoints`, and a
repeated `up` or `up --force-recreate` does not recover. On 2026-10-19
this took the shared registry/package cache and coredns down for every
local session.

`make compose-network-recreate` (alias `i8conere`) runs the sequence that
recovered it: detach every running container of another project from the
network, `docker compose down --remove-orphans` without `-v` so the
caches keep their volumes, the normal `up`, then attach the detached
containers again, which draw addresses from the dynamic pool. If `up`
fails, the still-detached containers are listed instead of reattached.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-20 13:45:37 +02:00
kevinveenbirkenbach 9fd7b87b5f Merge pull request #1082 from infinito-nexus/update/docker-image-versions-web-app-taiga-20261020-db43a6d
update(images): update Docker image versions (web-app-taiga)
2026-10-20 12:32:45 +02:00
kevinveenbirkenbach 01c1677314 Merge pull request #1080 from infinito-nexus/update/docker-image-versions-web-app-snipe-it-20261020-7ccf379
update(images): update Docker image versions (web-app-snipe-it)
2026-10-20 12:31:53 +02:00
kevinveenbirkenbach f016800d50 Merge pull request #1077 from infinito-nexus/update/docker-image-versions-svc-db-rabbitmq-20261020-633fd88
update(images): update Docker image versions (svc-db-rabbitmq)
2026-10-20 12:31:13 +02:00
kevinveenbirkenbach e8a48f3bb3 Merge pull request #1076 from infinito-nexus/update/version-sources-web-app-n8n-20261020-bcab56d
update(versions): update pins with a declared source (web-app-n8n)
2026-10-20 12:30:45 +02:00