Commit Graph
14682 Commits
Author SHA1 Message Date
kevinveenbirkenbachandClaude Opus 4.8 38f8bebaed fix(web-app-erpnext): self-provider playwright-service-flag nocheck
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-24 03:46:08 +02:00
infinito-nexus-updater[bot] de00200643 update(images): update Docker image versions 2026-06-24 03:46:08 +02:00
kevinveenbirkenbach 4203e9b5a6 Release version 10.0.0 2026-06-24 03:46:08 +02:00
kevinveenbirkenbachandClaude Opus 4.8 e5241ecb3c feat(web-app-erpnext): expose as consumable shared service
Mark the erpnext primary entry enabled+shared so other roles can declare it as a dependency (erpnext: {enabled, shared}); the service registry now resolves it to web-app-erpnext, matching the web-app-matomo provider pattern.

Drop svc-db-mariadb from run_after — it crossed deploy types (server -> universal), which the service-loader rejects once the entry becomes a provider. The MariaDB dependency and ordering are already handled by the mariadb: shared service flag.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-24 03:46:07 +02:00
kevinveenbirkenbachandClaude Opus 4.8 7eaebbe895 fix(matrix): make the migrated bridgev2 bridges actually deploy
Follow-ups after the bridgev2 config migration, each verified in the live DiD stack: (1) URL-encode the bridge DB password in the postgres uri (the credential contains '/', which the stricter bridgev2 Go URL parser rejected as an invalid port) so signal/whatsapp/slack connect to postgres and generate their registration; (2) drop the telegram bridge from MATRIX_BRIDGES when its Telegram api_id/api_hash credentials are absent (telegram requires them at startup and crash-loops without — unlike the other bridges — blocking synapse); (3) give the bridge healthcheck a 5m start_period so the registration generation has grace before it is marked unhealthy.

(4) Two-phase synapse start: drop the synapse->bridges service_healthy depends_on (a single 'compose up -d' did not respect the start_period and aborted with 'dependency ... unhealthy' before the bridges generated registration) and instead restart synapse after the Ansible 'wait for registration files' step so it loads the freshly written appservice registrations. The bridges generate registration independently of synapse, so synapse no longer needs to block on their health.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-24 03:25:58 +02:00
dependabot[bot] 3413605929 chore(deps): bump actions/cache from 5 to 6
Bumps [actions/cache](https://github.com/actions/cache) from 5 to 6.
- [Release notes](https://github.com/actions/cache/releases)
- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)
- [Commits](https://github.com/actions/cache/compare/v5...v6)

---
updated-dependencies:
- dependency-name: actions/cache
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-06-24 01:18:21 +00:00
dependabot[bot] 516d92fdd9 chore(deps-dev): bump @playwright/test from 1.61.0 to 1.61.1
Bumps [@playwright/test](https://github.com/microsoft/playwright) from 1.61.0 to 1.61.1.
- [Release notes](https://github.com/microsoft/playwright/releases)
- [Commits](https://github.com/microsoft/playwright/compare/v1.61.0...v1.61.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2026-06-24 01:09:34 +00:00
kevinveenbirkenbachandClaude Opus 4.8 bd2d652e83 fix(wordpress): trust the injected internal CA via env in the WP HTTP API
The earlier mu-plugin pointed http_request_args['sslcertificates'] at the OS bundle (/etc/ssl/certs/ca-certificates.crt), which does NOT carry the internal root CA unless update-ca-certificates ran in the container — so the OIDC token exchange to the self-signed internal Keycloak still failed with 'cURL error 60: SSL certificate problem' in CI run 28044348006. Read the env-provided bundle first (CURL_CA_BUNDLE / CA_TRUST_CERT / SSL_CERT_FILE), which sys-svc-compose-ca injects into every container pointing at the bind-mounted /tmp/infinito/ca/root-ca.crt (compose_ca.py), falling back to the OS bundle.

Verified chain: daggerhart-openid-connect-generic issues its token/userinfo requests via wp_remote_post/wp_remote_get (the WP HTTP API), so the http_request_args filter applies and WP's curl uses CURLOPT_CAINFO = the internal root CA, which verifies the Keycloak cert.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-24 01:22:51 +02:00
kevinveenbirkenbachandClaude Opus 4.8 744f049465 fix(odoo): branch the playwright login to native admin login when SSO is off
In the SSO-disabled matrix variant, loginToOdoo waited for the auth_oauth SSO button (which never renders), so every addon spec timed out in clickOdooSsoButton — the run's actual failure (the earlier stock.spec union fix was a no-op there, since stock is addon-gated off in that variant). Branch loginToOdoo on the sso service flag: when SSO is disabled, log in natively via the Odoo /web/login form (input[name=login]/[name=password] with the provisioned administrator credentials, scoped .oe_login_form submit), so the native admin login is genuinely exercised and the addon specs run instead of skipping. When SSO is enabled the existing OIDC/Keycloak flow is unchanged.

Selectors verified against the deployed Odoo 19 login form captured in the CI trace (name=login/password, .oe_login_form button[type=submit]). Admin creds are the same lookup('users','administrator') values provisioned into res_users by tasks/05_admin.yml.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-24 01:22:51 +02:00
kevinveenbirkenbachandClaude Opus 4.8 0eee711159 fix(matrix): migrate signal/telegram/whatsapp/slack bridges to bridgev2 config
The mautrix bridge images (dock.mau.dev/mautrix/<name>:latest) moved to the bridgev2/megabridge architecture, but the role's config templates were still the legacy mautrix-go format. On boot the bridgev2 binary aborts with 'Legacy bridge config detected, but hacky network config migrator is not set', crash-loops, never writes registration.yaml, stays unhealthy, and holds synapse in Created (depends_on service_healthy) — failing the matrix deploy in CI run 28044348006.

Rewrite the 4 cutover bridges' configs to the bridgev2 layout (top-level database/network/matrix/double_puppet/encryption), preserving every templated value: homeserver address/domain, the postgres DB uri with its credential lookup, the appservice id/port/bot, the permissions map, and the raw go-template guards. The default entrypoint still generates registration.yaml, so no compose/registration changes are needed. facebook/instagram/imessage stay on the legacy format (their images are legacy-frozen and deploy healthy). Render + YAML validated; actual bridge boot is verified by CI.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-24 01:22:50 +02:00
kevinveenbirkenbachandClaude Opus 4.8 799a82a9da style(svc-db-memcached): shorten meta description to its essence
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-23 20:46:39 +02:00
kevinveenbirkenbachandClaude Opus 4.8 eb46e6fb54 docs(agents): add Cross-Mode Roundtrip to the agent cheatsheet
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-23 20:46:38 +02:00
kevinveenbirkenbachandClaude Opus 4.8 3e6bc00bcc docs(agents): add the roundtrip iteration loop
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-23 20:46:38 +02:00
kevinveenbirkenbachandClaude Opus 4.8 5dacc90f70 feat(test): default roundtrip apps to the complexity-ranked list
make roundtrip with no apps= now iterates every application, most-complex first (complexity --sort total --order desc --format string). Also marks roundtrip.sh executable and moves the roundtrip target into alphabetical order.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-23 20:46:38 +02:00
kevinveenbirkenbachandClaude Opus 4.8 8e9062834e feat(cli): add string output format to applications complexity
complexity --format string prints only the role names, one per line, so the list feeds straight into make roundtrip apps=... A unit test covers the new format.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-23 20:46:38 +02:00
kevinveenbirkenbach 5b2c75186f Release 10.1.0 2026-06-23 20:39:50 +02:00
kevinveenbirkenbach 4770450bc9 Merge pull request #230 from pragepani/feature/web-app-pihole/add-role
Feature/web app pihole/add role
2026-06-23 20:09:09 +02:00
kevinveenbirkenbach 0093942ffa Add wait_for task for Pi-hole HTTP endpoint 2026-06-23 20:05:44 +02:00
kevinveenbirkenbach 88095e3943 Delete roles/web-app-pihole/tasks/01_setup.yml 2026-06-23 20:05:17 +02:00
kevinveenbirkenbach 9a0b30c0fb Change lifecycle from alpha to beta 2026-06-23 20:02:20 +02:00
kevinveenbirkenbach e697e5a02d Update service configurations for web-app-pihole 2026-06-23 20:01:12 +02:00
kevinveenbirkenbachandClaude Opus 4.8 669ef045fb feat(test): add roundtrip target to validate roles across deploy modes
make roundtrip apps="<app> ..." iterates each role through every deploy mode in order (compose, then swarm), stopping at the first failure. Per-step logs under TMPDIR; each validated swarm cluster is released unless keep=true. The mode sequence is overridable (modes="compose swarm") so kubernetes can be appended later.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-23 19:42:32 +02:00
kevinveenbirkenbachandClaude Opus 4.8 ce6cc34351 style(svc-db-redis): wrap meta description onto two lines
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-23 19:29:39 +02:00
kevinveenbirkenbachandClaude Opus 4.8 d2daa08677 feat(test): make SWARM_NAME mandatory for act-swarm cluster names
Every swarm-test cluster is named so parallel clusters get distinct container and network names. topology.sh and extend_inventory require SWARM_NAME; act-swarm-zombie defaults it to the app id (name= overrides), the CI workflow derives it from the matrix app, and act-swarm-down/shell/playwright require name=. The bare swarm-mgr-01 names are gone (node refs now carry the cluster prefix).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-23 19:29:39 +02:00
kevinveenbirkenbachandClaude Opus 4.8 f414c8df27 fix(test): harden act-swarm cleanup
down_act_outer: match the act outer runner by name prefix instead of a hardcoded image ancestor, so it works regardless of ACT_PLATFORM_IMAGE. 13_cleanup: warn loudly when a node survives 'docker rm -f' (kernel D-state / stuck NFS, reboot needed) instead of swallowing the error.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-23 19:29:39 +02:00
kevinveenbirkenbachandClaude Opus 4.8 e09dc10720 chore(claude): allow docs.pretix.eu and owncloud.dev WebFetch
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-23 19:29:39 +02:00
kevinveenbirkenbachandClaude Opus 4.8 5626203c49 docs(architecture): document the central engine pattern
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-23 19:29:39 +02:00
kevinveenbirkenbachandClaude Opus 4.8 595b0f5b68 test(swarm): make nfs-server start idempotent
A killed prior act-swarm run leaves the nfs-server container behind, so 'docker run --name nfs-server' then conflicts on the next run. Remove any existing one first.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-23 19:29:39 +02:00
kevinveenbirkenbachandClaude Opus 4.8 9f43364c00 fix(apps): swarm-specific deploy fixes (matomo, nextcloud, prometheus, dashboard)
matomo: force-restart the swarm service after patching config.ini.php DB creds (the compose-up handler is a no-op in swarm), extracted into 10_resolve_host_cid. nextcloud: gate the redis PONG wait on the engine being local. prometheus: config 0444 (swarm config objects are root) and gate the host-monitor binds plus privileged cadvisor/node-exporter to compose only. dashboard: probe the public icon URL in swarm.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-23 19:29:39 +02:00
kevinveenbirkenbachandClaude Opus 4.8 8000dbe947 fix(swarm): NFS and overlay deploy correctness
Widen the openresty fan-in overlay /28 -> /24 (the /28 exhausted VIPs under mailu's services, deadlocking the stack). Pre-create NFS backing dirs for every volume of unpinned roles (placement decides, not the legacy per-volume nfs flag). Make email 'external' cluster-wide so swarm workers relay through the central mailu instead of a localhost root sender. Constructor: auto-place svc-prx-openresty, gate out unconsumed central engines, and load the svc-dns role group.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-23 19:29:39 +02:00
kevinveenbirkenbachandClaude Opus 4.8 fe5d395a9f feat(web-app-mailu): remap to central engines + swarm hardening
Consume central redis and unbound (drop embedded sidecars). Swarm: resolve central mariadb/redis overlay VIPs into admin extra_hosts so the DNSSEC resolver does not NXDOMAIN internal names; pre-create nginx/certs bind dirs plus a placeholder cert before stack-up; recreate the API token when a fresh cluster lacks it; wait for antispam via container exec; disable OIDC SSL verify under self-signed TLS.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-23 19:29:39 +02:00
kevinveenbirkenbachandClaude Opus 4.8 f4774ec145 refactor(apps): remap consumers to central engines
About 38 web-app/web-svc roles now consume the central svc-db-* and svc-dns engines via lookup('engine', ...) instead of embedded sidecars: meta/services flags, variant matrices, and env/conf hosts point at the shared services. Lets these apps run unpinned and NFS-shareable in swarm.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-23 19:29:39 +02:00
kevinveenbirkenbachandClaude Opus 4.8 6e13eed7af feat(svc-dns): add central unbound resolver role
DNSSEC-validating resolver as a central engine, mirroring the svc-db pattern (meta/services flags, overlay topology, per-consumer 02_init). Replaces per-app embedded unbound sidecars (e.g. mailu).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-23 19:29:39 +02:00
kevinveenbirkenbachandClaude Opus 4.8 fe94f72b7e feat(svc-db): add central DB engine roles (redis, memcached, rabbitmq, elasticsearch, typesense, qdrant)
Shared single-host engine roles consumed via lookup('engine', ...), mirroring the central postgres/mariadb pattern: meta/services flags, overlay topology in meta/server, compose templates, per-consumer provisioning in 02_init. Lets apps drop their embedded sidecars and become unpinned/NFS-shareable in swarm.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-23 19:29:39 +02:00
kevinveenbirkenbachandClaude Opus 4.8 b09598dc80 feat(engine): add central engine lookup + provisioning machinery
Foundation for the central svc-db-*/svc-dns-* engine roles: the engine lookup and engines descriptor, per-consumer engine credentials in the inventory manager, shared-net overlay rendering, container_depends_on, the sys-svc-engine provisioning dispatcher, and the compose_volumes NFS-placement split. base.yml.j2 gates the embedded redis sidecar on lookup('engine','redis',application_id,'local').

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-23 19:29:38 +02:00
kevinveenbirkenbachandClaude Opus 4.8 b579d36a3b fix(sys-front-inj-matomo): degrade when Matomo returns a non-JSON 200
site_check treated any HTTP 200 as a usable API and included inject_apply, which dereferences site_check.json. When Matomo answers 200 with an HTML body (e.g. its installer page during a provider/consumer ordering window) the result has no .json attribute and the play crashes ('dict has no attribute json'). Require site_check.json to be defined for the register/inject path and degrade (disable the snippet, reapply later) otherwise, completing the best-effort degrade contract.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-23 19:29:38 +02:00
kevinveenbirkenbachandClaude Opus 4.8 c42cb1687e fix(web-app-matomo): chown config after the swarm recreate, not before
The Matomo image entrypoint re-owns config.ini.php to root on every container start, so the post-sed chown in 07_patch_database (which runs before 04 flushes handlers and the stack redeploys Matomo) is overwritten by the recreate, leaving the config root-owned when 09 runs its API config pass (HTTP 500, config not writable). Move the chown to 04 after the post-recreate health probe and before the API pass, so it lands after the last config-rooting restart and persists through 09.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-23 19:29:38 +02:00
kevinveenbirkenbachandClaude Opus 4.8 117d246a32 fix(wordpress): trust the internal CA in the WP HTTP API for OIDC back-channel
The OIDC login redirected to Keycloak and back with a valid code, but the server-side token exchange (daggerhart-openid-connect-generic wp_remote_post to the self-signed internal Keycloak) failed with 'cURL error 60: SSL certificate problem: unable to get local issuer certificate' (60x in CI run 28018750880), so the user was never logged in and never redirected to /wp-admin. WordPress's HTTP API (WpOrg\Requests) pins CURLOPT_CAINFO to its own bundled wp-includes/certificates/ca-bundle.crt and ignores the OS trust store and the CURL_CA_BUNDLE/SSL_CERT_FILE env vars, so the earlier ca-certificates Dockerfile change had no effect.

Add a mu-plugin that filters http_request_args to set sslcertificates to the OS CA bundle (/etc/ssl/certs/ca-certificates.crt), which the compose CA-injection populates with the internal root CA, so wp_remote_* TLS verifies the internal cert. Not a green-wash: no assertion weakened, no_sslverify left false (verification stays ON), the test still requires a real OIDC round-trip to /wp-admin.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-23 19:23:57 +02:00
kevinveenbirkenbachandClaude Opus 4.8 0f18678d31 fix(odoo): collapse stock.spec inventory-identity locator to one element
stock.spec.js applied .first() to each .or() operand (breadcrumb and appTitle) before combining them, so breadcrumb.or(appTitle) was a union of two locators that resolved to 2 visible elements (the stock.menu_stock_root brand link AND the 'Inventory Overview' breadcrumb) — expect().toBeVisible() requires exactly one match and threw a Playwright strict-mode violation. The two matches actually PROVE the stock module installed; the assertion message's 'module failed to install' premise was wrong. Mirror the passing account.spec.js pattern: drop the per-branch .first() and apply a single .first() after .or(). The assertion intent (Inventory identity must render) is preserved — no green-wash.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-23 19:23:57 +02:00
kevinveenbirkenbachandClaude Opus 4.8 12d1e3e494 fix(matrix): gate synapse on bridges via container_depends_on (valid compose)
At HEAD the synapse service emitted the mautrix-* bridge dependencies as 6-space keys with no depends_on parent, so they nested under healthcheck: and 'docker compose config' rejected them (services.synapse.healthcheck additional properties 'mautrix-*' not allowed, rc=1) — which made the sys-svc-compose CA-trust handler exit rc=2 and failed the matrix deploy in CI run 28018750880.

Route the bridge gating through the container_depends_on lookup's extra= argument instead of a hand-written depends_on block, so the bridges merge with any db/redis/sso deps into a SINGLE depends_on mapping. Fixes the invalid-compose failure and removes the latent duplicate-depends_on risk a hand-written block plus a non-empty container_depends_on would produce. Render-verified for bridges-present and bridges-empty.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-23 19:23:56 +02:00
kevinveenbirkenbach d6aae20c69 Merge pull request #334 from infinito-nexus/update/docker-image-versions-20260623-96f0af4
update(images): update Docker image versions
2026-06-23 17:40:59 +02:00
kevinveenbirkenbach 7ce861339d Update services.yml 2026-06-23 17:40:32 +02:00
infinito-nexus-updater[bot] ddf925c824 update(images): update Docker image versions 2026-06-23 15:24:02 +00:00
kevinveenbirkenbach 0a8900a1b9 Merge pull request #333 from infinito-nexus/update/docker-image-versions-20260623-52b17c5
update(images): update Docker image versions
2026-06-23 17:20:01 +02:00
kevinveenbirkenbach 7033f413b4 Update services.yml 2026-06-23 17:19:37 +02:00
Prageeth Panicker 9ef1317fb1 fix(pihole): resolve port collision with web-app-seaweedfs (sso 16507→16508) 2026-06-23 13:34:55 +00:00
Prageeth Panicker d33747e057 fix(pihole): add status_codes to server.yml for health checker
Pi-hole v6 returns 308 (HTTP→HTTPS redirect) in addition to the
platform's DEFAULT_OK codes (200, 301, 302). Without 308 in the
accepted status_codes, the webserver health checker would flag
pihole.infinito.example as unhealthy.
2026-06-23 13:19:25 +00:00
Prageeth Panicker 0647229afc fix(pihole): Pi-hole v6 compatibility fixes for login and password setup
- native.spec.js: update button selector from /sign in|login/i to
  /log in|sign in/i — Pi-hole v6's submit button text is
  'Log in (uses cookie)', not 'Sign in' or 'Login'

- 01_setup.yml: remove pihole setpassword CLI task — Pi-hole v6 blocks
  this command when FTLCONF_webserver_api_password is set via env var
  ('set by environment variable; please unset it to use this function').
  Password is now set at container startup via the env var, which is
  the v6-idiomatic approach.
2026-06-23 13:19:25 +00:00
Prageeth Panicker dfcfd0ef58 fix(pihole): variant-1 test failures and Pi-hole v6 compatibility
Three fixes:

1. guest.spec.js: skip instead of fail when OIDC_ISSUER_URL is unset
   (variant-1 has SSO disabled so no Keycloak redirect is expected;
   the old expect().toBeTruthy() caused a hard failure instead of skip)

2. playwright.env.j2: only emit OIDC_ISSUER_URL when SSO is proxy-gated
   (was unconditionally set, causing native.spec.js to wrongly skip in
   variant-1 and oauth2.spec.js/guest.spec.js to fail on missing redirect)

3. compose.yml.j2: Pi-hole v6 compatibility fixes
   - Replace WEBPASSWORD with FTLCONF_webserver_api_password (v6 dropped
     legacy env vars; WEBPASSWORD is silently ignored in v6)
   - Add FTLCONF_webserver_domain={{ domain }} to whitelist the nginx
     proxy Host header; Pi-hole v6 FTL returns 403 for unrecognised Host
     headers (DNS rebinding protection) — this was causing the baseline
     playwright.spec.js to fail with HTTP 403 in variant-1
2026-06-23 13:19:24 +00:00
Prageeth Panicker 22302cb373 fix(pihole): rename persona Playwright specs to *.spec.js so they actually run
Playwright's default testMatch only discovers files matching
*.spec.js / *.test.js. test-guest.js, test-oauth2.js, and
test-native.js never matched this pattern and were silently never
executed in any CI variant -- only playwright.spec.js's 2 baseline
tests ever ran (confirmed: 0 occurrences of these files in any
playwright-junit.xml across variant-0/variant-1, sync/async).

Renamed to guest.spec.js, oauth2.spec.js, native.spec.js so the SSO
persona scenarios (Keycloak redirect, admin/biber login, native login)
actually execute and validate the sso-proxy CA trust fix.
2026-06-23 13:19:24 +00:00