Commit Graph
14682 Commits
Author SHA1 Message Date
kevinveenbirkenbach 68882ebffd Merge remote-tracking branch 'origin/main' into feature/sys-ctl-hlth-runtime/vulnerable-runtimes/1127 2026-10-29 00:12:30 +01:00
kevinveenbirkenbachandClaude Opus 5.5 3c743736a8 feat(sys-ctl-hlth-runtime): alert on EOL or unpatched PHP and missing PHP hardening
Answering "which deployed containers run a vulnerable PHP?" after
CVE-2026-109618/109619 took a manual inventory of registry metadata, and
nothing noticed a hardening ini that an image never loads.

- New role sys-ctl-hlth-runtime, routed through sys-svc-compose next to
  sys-ctl-hlth-container. A daily timer runs `php` in every running
  container and fails, alerting through sys-ctl-alm-compose, when PHP is
  below the floor of its line or on a line older than every floor (7.4,
  8.1). Every service that mounts php_hardening in meta/volumes.yml fails
  while expose_php or session.upload_progress.enabled is on; other PHP
  containers of such a stack are listed as info. Compose and swarm
  containers are matched by their project/stack and service labels. The
  check is not run at deploy time, so a finding never fails a deploy.
- The floors (8.2.35, 8.3.36, 8.4.27, 8.5.12) live once, in
  HEALTH_RUNTIME_FLOORS of the role's vars/main.yml.
- `make security-runtimes` lists the PHP of every pinned role image
  without pulling: Docker Hub tags through the Hub API, which no pull rate
  limit meters, other registries through the OCI config blob (new
  registry.config_blob, which the healthcheck probe now reuses).
  PHP_VERSION, distro PHP packages and a PHP_BASE build argument count. It
  exits 1 on an image below its floor or one the registry did not answer.
  Today it flags nfrastack/fusiondirectory:1.5 (line 7.4) and
  shopware/docker-base:8.3 (8.3.25).

The role TODO.md keeps the follow-ups: further runtimes, the split web
SAPI of web-app-lam, a scheduled CI run of the report and the CVE scan.

Refs #1127

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-29 00:12:25 +01:00
kevinveenbirkenbach 276004c152 Merge remote-tracking branch 'origin/main' into fix/security/swarm-ingress-verify/1089 2026-10-29 00:01:25 +01:00
kevinveenbirkenbachandClaude Opus 5.5 c59e2838d6 fix(swarm): reach gitea, shopware and fider from inside their containers
In swarm, `docker stack deploy` drops the host IP of a short port mapping,
so a `127.0.0.1:<ports.local>` publish lands on the ingress routing mesh
on every node. The provisioning of these three roles only worked because
the mesh answered on the host:

- web-app-gitea waited for `DOCKER_REACH_HOST:<ports.local.http>` with
  wait_for and polled `/api/v1/version` there with uri_retry.
- web-app-shopware waited for `DOCKER_REACH_HOST:<ports.local.http>`.
- web-app-fider bootstrapped its first tenant in swarm by POSTing to
  `127.0.0.1:<ports.local.http>` on the hosting node.

As long as these calls depend on the mesh, container_ports cannot stop
publishing loopback ports in swarm. The probes now run inside the
service's own container through the resolved `<PREFIX>_LOCAL_CID` on
`<PREFIX>_HOST_NODE`, against the internal port:

- Gitea uses the curl it ships. The first wait accepts any HTTP answer,
  as wait_for did. The post-migration wait still requires 200.
- Shopware runs the wget probe its compose healthcheck already uses.
- Fider ships no HTTP client, so bash writes the tenant POST to
  /dev/tcp. The body comes in on stdin and the status line is checked
  for 200/201.

Fider's compose path is unchanged. The compose render of all three roles
is unchanged. The host-side ingress guard from svc-swarm-node stays in
place until the remaining host-side consumers are moved.

Refs #1089

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-29 00:01:20 +01:00
kevinveenbirkenbach 6b6a1ad497 Merge remote-tracking branch 'origin/main' into fix/sys-svc-compose-php/remove-interim-php-mitigations/1126 2026-10-28 23:40:34 +01:00
kevinveenbirkenbach dbb3897ab2 Merge remote-tracking branch 'origin/main' into fix/mail/dmarc-rua/1125 2026-10-28 23:40:31 +01:00
kevinveenbirkenbach 4f5d9453ee Merge remote-tracking branch 'origin/main' into fix/web-app-fusiondirectory/php-hardening/1120 2026-10-28 23:40:28 +01:00
kevinveenbirkenbach acc45e69ba Merge remote-tracking branch 'origin/main' into fix/web-app-keycloak/admin-network-allowlist/1121 2026-10-28 23:40:25 +01:00
kevinveenbirkenbach b5e98804cb Merge remote-tracking branch 'origin/main' into fix/sys-svc-proxy/per-app-security-headers/1123 2026-10-28 23:40:23 +01:00
kevinveenbirkenbach d70f160108 Merge remote-tracking branch 'origin/main' into fix/svc-net-tor/onion-port-rendezvous/1214 2026-10-28 23:40:20 +01:00
kevinveenbirkenbach 5b83ce0d4d Merge remote-tracking branch 'origin/main' into documentation/branch-protection-ruleset 2026-10-28 23:40:17 +01:00
kevinveenbirkenbach bd296f6920 Merge remote-tracking branch 'origin/main' into fix/worktree/swarm-lab-subnet-overflow 2026-10-28 23:40:13 +01:00
kevinveenbirkenbach 2534022f33 Merge pull request #1262 from infinito-nexus/fix/make/final-newline
fix(make): restore the Makefile's final newline
2026-10-28 23:31:01 +01:00
kevinveenbirkenbach d63ad2a809 Merge remote-tracking branch 'origin/main' into fix/web-app-fusiondirectory/php-hardening/1120 2026-10-28 23:28:00 +01:00
kevinveenbirkenbachandClaude Opus 5.5 7f745604cb fix(web-app-fusiondirectory): mount the shared PHP hardening ini
FusionDirectory was the one PHP role #1115 left without the shared
hardening ini, so its PHP 7.4 kept session.upload_progress enabled and
a finite memory_limit, the two settings behind CVE-2026-109619 and
CVE-2026-109618.

The nfrastack image runs Alpine's php7 with /etc/php7/conf.d as scan
dir. Its init only links module inis there and chmods/chowns the tree;
php-ext reset, which empties conf.d, runs at build time only. A
read-only config at conf.d/zz-infinito-hardening.ini therefore
survives the init and loads after 99-*.ini, so it wins.

The PHP line itself stays on 7.4: FusionDirectory certifies 1.4 to
1.6 for PHP 7.4 only, nfrastack/container-fusiondirectory builds only
on PHP 7.4 and Alpine 3.15, and the PHP 8 port is upstream's
unreleased php8 branch. TODO.md records that state and the options.

The php_hardening entry sits above data in meta/volumes.yml and the
TODO note replaces only the mounted item, so the pending
feature/store-i18n changes to both files still merge cleanly.

Refs #1120

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-28 23:27:57 +01:00
kevinveenbirkenbachandClaude Opus 5.5 6f653ce633 fix(make): restore the Makefile's final newline
310663ae8c left the Makefile without a trailing newline. lint-makefile
(mbake) refuses that with "Missing final newline" / "Would reformat:
Makefile", so the Lint job fails on main and on every PR that merges it.

A local `make quality-high` hides it: its autoformat step adds the
newline to the working tree before the lint phase runs.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-28 23:27:51 +01:00
kevinveenbirkenbach 0988c4fcf1 Merge remote-tracking branch 'origin/main' into fix/web-app-keycloak/admin-network-allowlist/1121 2026-10-28 23:06:23 +01:00
kevinveenbirkenbachandClaude Opus 5.5 c8c3f96bf9 feat(web-app-keycloak): serve /admin only to declared source networks
The Keycloak vhost proxied every path to Keycloak, so the admin console
and the admin REST API under /admin/realms answered any client on the
internet (observed on auth.veen.world and auth.infinito.nexus), and
sys-svc-proxy had no way to limit a path by source address.

services.keycloak.admin.allowed_networks now takes the networks the
operator declares in the inventory. When the list is non-empty, the
vhost gets its own `location ^~ /admin`, rendered through the shared
html.conf.j2 like `/`, with one `allow` per entry and `deny all`. The
`^~` modifier keeps a regex location from taking an admin path over.
The OIDC endpoints under /realms/ and the assets under /resources/ stay
public. The role ships the list empty and adds no network of its own,
so an inventory that declares nothing renders today's vhost unchanged.
kc_admin_networks rejects anything but a list of addresses or CIDR
blocks without host bits, so a typo fails the render instead of the
nginx reload.

The deploy's own admin calls do not cross the vhost: every kcadm.sh
login, including web-app-opentalk's and web-app-mattermost's, runs
inside the Keycloak container against a loopback URL, and a unit test
now pins that. The README names the callers that do cross it (the
OpenTalk controller's user search, onion visitors, the Playwright
suites) and so need an entry. The TODO.md item is dropped.

Closes #1121

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-28 23:06:21 +01:00
kevinveenbirkenbachandClaude Opus 5.5 870433e74d fix(swarm): attach the nodes of a high worktree slot through the cache pool
01_bootstrap.sh pins the five swarm nodes into the shared cache network
at 200 + INFINITO_INSTANCE * 5. That band fits a /24 only for instances
0 to 10; from instance 11 on the script aborted with "pushes the node
band past ...254", so no worktree past slot 10 could start a swarm
cluster while the package cache runs. Five nodes per slot cannot fit
255 slots in one /24 with any fixed formula.

Instances whose band fits keep their pinned addresses, so the primary
checkout and CI behave as before. Above that, the nodes join the cache
network without --ip and Docker assigns them from its pool (the upper
half of the subnet), the same way every worktree stack container joins
it. Nothing in the repository reads the nodes' cache-network addresses.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-28 23:01:30 +01:00
kevinveenbirkenbachandClaude Opus 5.5 b2c2fe7703 docs(github): match branch protection docs to the live ruleset
The contributor docs described repository settings that are not in
place. security.md marked "Require status checks", "Require branch to
be up to date" and "Require signed commits" as enforced, but the active
ruleset `Main` has no required_status_checks and no required_signatures
rule, and the separate `Signed` ruleset is disabled. repository.md
listed Dependabot alerts, security and version updates, secret scanning
and push protection as disabled although all of them are on, and its
summary repeated the two rules that are not enforced. branch.md claimed
branch protection enforces the branch naming rules, while only the PR
validation run checks the prefix. Three pages still described a hadolint
SARIF job in call-lint.yml that no longer exists, which hid that nothing
uploads the Hadolint results the ruleset asks for.

The pages now state what the ruleset and the repository settings
enforce today, name the policy pages for rules that are policy only,
and record that no workflow uploads Hadolint results.

Scorecard alerts 472, 504 and 505 depend on repository settings and
process and stay open; 507 and 539 are no longer reported on main.

Refs #853

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-28 22:39:16 +01:00
kevinveenbirkenbach deae5e00d5 Merge remote-tracking branch 'origin/main' into fix/sys-svc-compose-php/remove-interim-php-mitigations/1126 2026-10-28 22:39:09 +01:00
kevinveenbirkenbachandClaude Opus 5.5 e3d2a24bcd fix(sys-svc-compose-php): scope memory_limit -1 to unpatched images
The interim CVE-2026-109618 mitigation lived in the shared hardening.ini,
so every PHP role ran without a memory limit until the last image was
patched, and no role's service_memory_mb share applied.

Registry metadata of the images pinned on main shows that 16 of the 20
consumers already ship PHP 8.2.35, 8.3.36, 8.4.27 or 8.5.12 (or the
Alpine/Debian build of it). Four predate the fix:
markoshust/magento-php:8.4-fpm (8.4.21), ghcr.io/heviat/webmail:2024.06
(the Mailu OIDC flavor, built 2025-04-04), phpldapadmin/phpldapadmin:2.3.11
(built 2026-05-15) and ghcr.io/shopware/docker-base:8.3 (8.3.25).

- Move memory_limit = -1 into its own content-addressed ini
  (FILE_PHP_MEMORY_UNLIMITED_INI) and mount it only in magento, mailu,
  phpldapadmin and shopware.
- hardening.ini keeps expose_php, session.upload_progress.enabled and
  fatal_error_backtraces as permanent hardening.
- Joomla's php-upload.ini loads as conf.d/uploads.ini again: no -1 has
  to be outranked anymore.
- The root TODO names the four images that still need the override.

Refs #1126

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-28 22:39:07 +01:00
kevinveenbirkenbach b17e83fadc Merge remote-tracking branch 'origin/main' into fix/svc-net-tor/onion-port-rendezvous/1214 2026-10-28 22:39:02 +01:00
kevinveenbirkenbachandClaude Opus 5.5 2d0016d27b fix(svc-net-tor): let a port probe attempt outlast Tor's SocksTimeout
The onion port probe gave every SOCKS connect 60s, half of Tor's
SocksTimeout (120s by default; torrc does not set it), although its own
docstring argued that abandoning an attempt before SocksTimeout is
destructive. Every attempt authenticates with fresh credentials, so Tor
builds a whole new rendezvous for it and keeps working on it until
SocksTimeout. The probe walked away first and called the port dead. The
other raw onion connects in the repository, the svc-db-* CLI tests and
test-e2e-playwright's wait_onion_reachable.sh, wait 120s per attempt.

Run 40128751852 shows how often an attempt needs more than that. Of 178
svc-net-tor CLI runs in its 89 compose onion jobs, three lost their
first attempt to the 60s timeout and connected on the second within
seconds (Shopware#1, Hugo#1, n8n#1; the CLI test took 77-79s against
the usual 1-16s), and Hugo#1's other run took 40s on a single attempt. When
the stall outlasts the 70s until the second attempt, the probe fails
while the HTTP probe reaches the same onion port seconds earlier:
OpenBao#1 (run 39166850273, job 118050491920, the original failure of
#1048) and Socialhome#1 (run 40088473634, job 121019758461). In the
Socialhome job tor.log holds no line for either attempt, because Tor
never reached its own verdict.

ONION_PORT_TIMEOUT is now 130: SocksTimeout plus room for Tor's
once-per-second expiry sweep, so an attempt ends with Tor's own answer
(reply 0x06, and a "Giving up" notice in tor.log, which the rescue
artifact captures) instead of the probe's. The second attempt now starts
at 140s and ends at 270s, so the probe rides out every stall the old
budget did, and any stall shorter than about 260s instead of about 120s.
A green run still costs one connect per port, and a refused or unmapped
port still fails at once. A unit test pins the window above Tor's
SocksTimeout and fails as soon as torrc sets its own.

That doubles what a dead port costs, and meta/tests.yml caps the whole
CLI test. The largest compose onion deploy in run 40128751852 probes 19
domains and 5 ports; with everything dead that is 19 x 350 + 5 x 260 +
10 = 7960s, beyond the 7200s that 069df39027 set for the same reason.
9000 keeps the full failure output for up to 22 domains.

Closes #1214

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-28 22:39:00 +01:00
kevinveenbirkenbachandClaude Opus 5.5 a7685e3b21 fix(worktree): derive the swarm lab subnet without an octet overflow
scripts/system/worktree/up.sh pinned INFINITO_SWARM_LAB_SUBNET to
192.168.$((244 + slot)).0/24. From slot 12 on that third octet exceeds
255, so every worktree past slot 11 carries an invalid subnet
(192.168.358.0/24 for slot 114), and make swarm-zombie dies at the lab
network creation with `invalid subnet: netip.ParsePrefix(...)`.

The lab prefix is now 10.244.<slot>, valid and distinct for every slot
up to max_slot 255, and outside both the primary lab subnet
192.168.244.0/24 and the 172.30.0.0/16 worktree subnets. The host
daemon allocates nothing from 10.0.0.0/8.

A new lint renders the prefix for every slot and fails on an invalid,
repeated or overlapping subnet; against the old derivation it fails 247
of 255 slots.

Worktrees that were pinned before this fix keep their custom.env; the
ones at slot 12 or above need their INFINITO_SWARM_*_IP and
INFINITO_SWARM_LAB_SUBNET pins rewritten to 10.244.<slot>.x and a
make dotenv before they can run swarm.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-28 22:38:54 +01:00
kevinveenbirkenbach 43438101f6 Merge remote-tracking branch 'origin/main' into fix/sys-svc-proxy/per-app-security-headers/1123 2026-10-28 21:38:45 +01:00
kevinveenbirkenbachandClaude Opus 5.5 1f8fc336e6 feat(proxy): per-app nosniff, Referrer-Policy, Permissions-Policy and HSTS directives
#1115 raised HSTS to one year but set no X-Content-Type-Options,
Referrer-Policy, Permissions-Policy or HSTS includeSubDomains/preload,
because none of them is safe globally: nosniff lets ORB block no-cors
responses typed text/html, includeSubDomains on the apex covers hosts
the platform does not serve, and a server-level add_header is dropped
in every location that sets its own.

WEBSERVER_SECURITY_HEADERS (group_vars/all/04_webserver.yml) now holds
the platform values, all opt-in: nosniff false, no Referrer-Policy, no
Permissions-Policy, HSTS max-age one year without includeSubDomains or
preload. A role overrides any key under security_headers in its
meta/server.yml, an inventory under
applications.<role>.server.security_headers.

The new security_headers filter merges both, rejects unknown keys,
wrong types, unknown Referrer-Policy tokens, non-printable header values
and preload without includeSubDomains or below a one-year max-age, and
composes the HSTS value.

- nosniff, Referrer-Policy and Permissions-Policy are set in the Lua
  header filter of content_security_policy.conf.j2, next to CSP, so a
  location's own add_header cannot drop them. Referrer-Policy is only
  set when the upstream sends none; Permissions-Policy only on HTML
  documents.
- HSTS stays the single server-level add_header in nginx_ssl_header.j2,
  now with the per-app value. A second emitter in Lua would duplicate
  the header. It stays inside the TLS branch, which onion vhosts never
  enter, so an onion vhost gets no HSTS even when its app opts in.

No role opts in yet, so rendered vhosts are unchanged.

Closes #1123

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-28 21:38:38 +01:00
kevinveenbirkenbach be0ecf213d Merge remote-tracking branch 'origin/main' into fix/mail/dmarc-rua/1125 2026-10-28 20:56:43 +01:00
kevinveenbirkenbachandClaude Opus 5.5 c4d0283300 feat(mail): publish a DMARC aggregate report address (rua)
Both mail providers published "v=DMARC1; p=reject; ruf=...; adkim=s;
aspf=s" without a rua tag, so the domain owner received no aggregate
reports and could not see who sends in the domain's name or whether
legitimate mail fails alignment.

services.<entity>.dmarc.rua_user in web-app-stalwart and web-app-mailu
now names the users-catalogue key whose mailbox receives the aggregate
reports. It is set to administrator, the one user every deployment
provisions with a mailbox (user-administrator), and an inventory may
name another key. The address is built as <username>@<mail domain>,
which is the exact account or alias the provider creates, so the record
never points at an address the server does not serve. An assert in the
DNS task fails the deploy before any record is written when the user
carries no mailbox account (Stalwart), or neither a mailbox account nor
a forward alias (Mailu), so reports cannot bounce. Mailu's DMARC_RUA
env, which only feeds the record its admin UI suggests, now carries the
same local part instead of the unprovisioned "admin".

production_facts.py takes a required --dmarc-rua. check_dmarc parses
the record's tags and fails unless rua names that mailbox (size
suffixes and several URIs are accepted). The policy check now reads the
p tag instead of matching the substring "p=", which "sp=" also matched.

Closes #1125

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-28 20:56:40 +01:00
kevinveenbirkenbach 4f641f0322 Merge pull request #1253 from infinito-nexus/update/docker-image-versions-web-app-matrix-20261028-b1bcdfd
update(images): update Docker image versions (web-app-matrix)
2026-10-28 20:21:40 +01:00
kevinveenbirkenbach 90b9953032 Merge pull request #1254 from infinito-nexus/update/docker-image-versions-web-app-stalwart-20261028-711b383
update(images): update Docker image versions (web-app-stalwart)
2026-10-28 20:21:15 +01:00
infinito-nexus-updater[bot] 9ed531a77e update(images): update Docker image versions (web-app-stalwart) 2026-10-28 19:14:53 +00:00
infinito-nexus-updater[bot] 40c6d63d4b update(images): update Docker image versions (web-app-matrix) 2026-10-28 19:14:47 +00:00
kevinveenbirkenbach e8cb250c51 Merge pull request #1252 from infinito-nexus/fix/web-app-matrix/element-force-verification
fix(web-app-matrix): declare Element's forced device verification per variant
2026-10-28 19:40:04 +01:00
kevinveenbirkenbachandClaude Opus 5.5 4a56b4c19c fix(web-app-matrix): declare Element's forced device verification per variant
Element v1.12.33 (automated bump a8fba45d60, on main) ships element-web
#35364, which turns force_verification on by default. From the second
OIDC login of an account on, Element stops on "Confirm your digital
identity" with no skip button, so the Matrix SSO specs that log the same
account in twice (test-dm-admin-biber.js, test-design.js) never reach the
signed-in UI: "administrator: authenticated Element UI (user menu / room
list / welcome) must render" fails after 120 s (fork run 40625679270,
Matrix#2 and the co-deployed Moodle#2).

services.element.force_verification now carries the platform default,
true as upstream, and both flavors render it (the compose element config
and the MDAD element configuration extension). Only variants 0 and 2,
the SSO rounds, set it to false. Production keeps forced verification.

Cherry-picked from e042c9dbf9 on feature/store-i18n. main has no Element
branding block yet, so the MDAD flavor carries only the force_verification
key in its configuration extension.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-28 19:33:36 +01:00
kevinveenbirkenbach 65431ad7ca Merge pull request #1251 from infinito-nexus/update/version-sources-web-app-stalwart-20261028-f3b426f
update(versions): update pins with a declared source (web-app-stalwart)
2026-10-28 17:55:56 +01:00
infinito-nexus-updater[bot] b05f4c0124 update(versions): update pins with a declared source (web-app-stalwart) 2026-10-28 16:44:56 +00:00
kevinveenbirkenbach 83ba787554 Merge pull request #1239 from infinito-nexus/update/repository-refs-web-app-discourse-20261027-e6a0fdd
update(repos): bump git refs to latest semver tags (web-app-discourse)
2026-10-28 17:43:06 +01:00
kevinveenbirkenbach 5589f4665d Merge pull request #1250 from infinito-nexus/update/docker-image-versions-web-app-jenkins-20261028-7e63bf9
update(images): update Docker image versions (web-app-jenkins)
2026-10-28 16:22:27 +01:00
infinito-nexus-updater[bot] e1d6f59b97 update(images): update Docker image versions (web-app-jenkins) 2026-10-28 15:19:49 +00:00
kevinveenbirkenbach 939513219d Merge pull request #1227 from infinito-nexus/update/docker-image-versions-web-app-stalwart-20261026-f99d2b6
update(images): update Docker image versions (web-app-stalwart)
2026-10-28 16:15:36 +01:00
kevinveenbirkenbach 67b1f48fdb Merge pull request #1233 from infinito-nexus/fix/web-app-seaweedfs/anonymous-deny
fix(web-app-seaweedfs): deny unsigned reads on non-public consumer buckets
2026-10-28 16:14:22 +01:00
kevinveenbirkenbach 9c89f1c3a1 Merge pull request #1246 from infinito-nexus/update/docker-image-versions-web-app-pretix-20261028-aff6b54
update(images): update Docker image versions (web-app-pretix)
2026-10-28 14:42:58 +01:00
kevinveenbirkenbach b8e453f118 Merge pull request #1245 from infinito-nexus/update/docker-image-versions-svc-prx-openresty-20261028-74e5bd7
update(images): update Docker image versions (svc-prx-openresty)
2026-10-28 12:31:26 +01:00
kevinveenbirkenbach ea38f34cac Merge pull request #1247 from infinito-nexus/update/version-sources-web-app-n8n-20261028-9bfee5a
update(versions): update pins with a declared source (web-app-n8n)
2026-10-28 12:30:57 +01:00
infinito-nexus-updater[bot] 5652816bcf update(versions): update pins with a declared source (web-app-n8n) 2026-10-28 11:29:40 +00:00
infinito-nexus-updater[bot] b6a9e84b9d update(images): update Docker image versions (web-app-pretix) 2026-10-28 11:29:22 +00:00
infinito-nexus-updater[bot] 8c1a3b9ea3 update(images): update Docker image versions (svc-prx-openresty) 2026-10-28 11:29:15 +00:00
kevinveenbirkenbach 41ae3bee38 Merge branch 'main' into update/repository-refs-web-app-discourse-20261027-e6a0fdd 2026-10-28 12:26:12 +01:00
kevinveenbirkenbach b14eac384d Merge branch 'main' into update/docker-image-versions-web-app-stalwart-20261026-f99d2b6 2026-10-28 12:26:08 +01:00