Merge branch 'main' into update/docker-image-versions-web-app-dashboard-20261104-6877ff6

This commit is contained in:
kevinveenbirkenbach authored and GitHub committed 2026-11-05 19:07:10 +01:00
commit 6daf7f2213
19 files changed
+77 -20

No files matched your search

+2
View File
@@ -20,6 +20,8 @@ build/*
.ruff_cache
.agents
.claude/skills/
.claude/worktrees/
.worktrees/
.claude-*
collections/
.env
+2
View File
@@ -20,6 +20,8 @@ build/*
.ruff_cache
.agents
.claude/skills/
.claude/worktrees/
.worktrees/
.claude-*
collections/
.env
+1 -1
View File
@@ -260,7 +260,7 @@ compose-system-purge: compose-entity-purge
.PHONY: compose-up
# Start the development stack.
compose-up: install
compose-up: install fix-dockerignore
@"$${PYTHON}" -m cli.administration.deploy.development up
.PHONY: console
+4 -4
View File
@@ -12,7 +12,7 @@
"@playwright/test": "^1.64.1",
"eslint": "^10.14.0",
"eslint-plugin-playwright": "^2.12.1",
"globals": "^17.13.0",
"globals": "^17.14.0",
"stylelint": "^17.16.0"
}
},
@@ -1233,9 +1233,9 @@
}
},
"node_modules/globals": {
"version": "17.13.0",
"resolved": "https://registry.npmjs.org/globals/-/globals-17.13.0.tgz",
"integrity": "sha512-RwMTC61u7hrG3ZJMkZQOK4JLJrKS8QtoTii63EmWvFXHqycY9FObBJQCbsLxSO8kjKhWE5kV1GC+Vb1g3RI0Zg==",
"version": "17.14.0",
"resolved": "https://registry.npmjs.org/globals/-/globals-17.14.0.tgz",
"integrity": "sha512-UtdkTVyAJePQv0J2M9Xe4L0ruNSDV314XiIJsADI2Zf40bcdAonE/D/OhAU8AT99oij9mhLByb+NvA3QWZYgCg==",
"dev": true,
"license": "MIT",
"engines": {
+1 -1
View File
@@ -12,7 +12,7 @@
"@playwright/test": "^1.64.1",
"eslint": "^10.14.0",
"eslint-plugin-playwright": "^2.12.1",
"globals": "^17.13.0",
"globals": "^17.14.0",
"stylelint": "^17.16.0"
},
"overrides": {
+3 -2
View File
@@ -99,7 +99,8 @@ class LookupModule(LookupBase):
web_protocol = "https" if enabled else "http"
websocket_protocol = "wss" if enabled else "ws"
web_port = 443 if enabled else 80
base_url = f"{web_protocol}://{primary_domain}/"
origin = f"{web_protocol}://{primary_domain}"
base_url = f"{origin}/"
resolved: dict[str, Any] = {
"application_id": app_id,
@@ -109,7 +110,7 @@ class LookupModule(LookupBase):
"domains": {"primary": primary_domain, "all": all_domains},
"protocols": {"web": web_protocol, "websocket": websocket_protocol},
"ports": {"web": web_port},
"url": {"base": base_url},
"url": {"base": base_url, "origin": origin},
}
if want:
@@ -18,6 +18,14 @@
group: root
mode: "0755"
- name: "📁 Pre-create the {{ DIR_BACKUPS }} mount point in the shared state"
ansible.builtin.file:
path: "{{ [STORAGE_NFS_STATE_PATH, DIR_BACKUPS | relpath(DIR_VAR_LIB)] | path_join }}"
state: directory
owner: root
group: root
mode: "0755"
- name: "✅ Assert the state subdir is strictly nested under the export base"
ansible.builtin.assert:
that:
+1 -1
View File
@@ -1,6 +1,6 @@
{% include 'roles/sys-svc-container/templates/env.j2' %}
BASE_URL={{ lookup('tls', application_id, 'url.base') }}
BASE_URL={{ lookup('tls', application_id, 'url.origin') }}
DATABASE_URL=postgresql://{{ lookup('database', application_id, 'username') }}:{{ lookup('database', application_id, 'password') }}@{{ lookup('database', application_id, 'host') }}:{{ lookup('database', application_id, 'port') }}/{{ lookup('database', application_id, 'name') }}?sslmode=disable
JWT_SECRET={{ (application_id ~ lookup('users', 'administrator').password) | hash('sha256') }}
+2 -2
View File
@@ -51,7 +51,7 @@ keycloak:
shared: true
provides: sso
image: quay.io/keycloak/keycloak
version: "26.8.1"
version: "26.8.2"
name: keycloak
min_storage: 468MB
cpus: "2.0"
@@ -91,7 +91,7 @@ keycloak:
# nocheck: playwright-service-flag — sidecar shape, no probe-able surface flag
sso_proxy:
image: quay.io/oauth2-proxy/oauth2-proxy
version: "v7.15.5"
version: "v7.15.6"
min_storage: 220MB
configuration_file: oauth2-proxy-keycloak.cfg
ports:
+1 -1
View File
@@ -46,7 +46,7 @@ mattermost:
shared: true
user_access_token_enabled: "{{ 'web-app-nextcloud' in group_names }}"
image: mattermost/mattermost-team-edition
version: 12.0.2
version: 12.1.0
min_storage: 659MB
backup:
no_stop_required: true
@@ -3,7 +3,7 @@ enabled: "{{ lookup('config', 'web-app-moodle', 'services.sso.enabled') | bool }
required: false
mechanism: plugin
source: upstream
version: "v5.2.1"
version: "v5.3.0"
bridges:
- sso
update:
+1 -1
View File
@@ -141,7 +141,7 @@ context_agent:
shared: "{{ lookup('config', 'web-app-nextcloud', 'mcp.enabled') | bool }}"
name: nextcloud-context-agent
image: ghcr.io/nextcloud/context_agent
version: 2.10.0
version: 2.11.0
backup:
no_stop_required: true
# nocheck: single-replica
+1 -1
View File
@@ -55,7 +55,7 @@ prometheus:
provides:
- prometheus
image: prom/prometheus # nocheck: volumes-path-single-spot: the repository path of an image name, not a mount target
version: v3.15.1
version: v3.16.0
name: prometheus
cpus: "0.5"
mem_reservation: 512m
+1 -1
View File
@@ -42,7 +42,7 @@ stalwart:
# nocheck: default-placement-manager mail edge at a known IP: MX A-record, PTR and SPF bind to the stack host IP (a floating task's egress IP breaks deliverability); the mail store is NFS-hostile and IS the app — same rationale as web-app-mailu
placement: manager
image: stalwartlabs/stalwart
webui_version: "v2.0.4"
webui_version: "v2.0.5"
version: "v1.0.3"
update:
key: webui_version
+3 -3
View File
@@ -68,7 +68,7 @@ certs_generator:
pids_limit: 128
manager:
image: wazuh/wazuh-manager
version: "4.14.9"
version: "4.14.10"
name: wazuh.manager
# nocheck: min-storage-headroom Reason: budgets room for wazuh-manager's own operational data (var-ossec logs, alerts, agent queue/state) to grow well beyond the base image over the service's lifetime, not just the image itself.
min_storage: 10GB
@@ -98,7 +98,7 @@ indexer:
# nocheck: healthcheck-timing-override covers the indexer's real boot without waiting out the curl flavor's 10m default, which would otherwise stall manager/dashboard's startup order far longer than the indexer actually needs.
start_period: 90s
image: wazuh/wazuh-indexer
version: "4.14.9"
version: "4.14.10"
name: wazuh.indexer
# nocheck: min-storage-headroom Reason: budgets room for the OpenSearch index data (security events/alerts Wazuh continuously ingests) to grow well beyond the base image over the service's lifetime, not just the image itself.
min_storage: 20GB
@@ -116,7 +116,7 @@ indexer:
http: 8097
console:
image: wazuh/wazuh-dashboard
version: "4.14.9"
version: "4.14.10"
name: wazuh.dashboard
# nocheck: min-storage-headroom Reason: budgets room for the dashboard's own runtime state (OpenSearch Dashboards bundle/build cache rebuilt on first boot, plus exported reports and saved-object data) to grow beyond the base image, not just the image itself.
min_storage: 2GB
@@ -5,7 +5,7 @@ mechanism: extension
source: upstream
bridges:
- sso
version: "2.29.1"
version: "2.30.0"
update:
type: http_regex
url: https://maven.xwiki.org/releases/org/xwiki/contrib/oidc/oidc-authenticator/maven-metadata.xml
@@ -90,6 +90,7 @@ BUILTIN_FILTERS: set[str] = {
"items2dict",
"password_hash",
"path_join",
"relpath",
"product",
"quote",
"split",
@@ -0,0 +1,33 @@
import re
import unittest
from utils.cache.files import read_text
from . import PROJECT_ROOT
NESTED_CHECKOUTS = (".claude/worktrees/", ".worktrees/")
class TestDockerignore(unittest.TestCase):
def test_dockerignore_is_the_gitignore(self) -> None:
self.assertEqual(
read_text(str(PROJECT_ROOT / ".gitignore")),
read_text(str(PROJECT_ROOT / ".dockerignore")),
"Run 'make fix-dockerignore': .dockerignore must be a copy of .gitignore.",
)
def test_nested_checkouts_stay_out_of_the_build_context(self) -> None:
lines = read_text(str(PROJECT_ROOT / ".dockerignore")).splitlines()
for entry in NESTED_CHECKOUTS:
with self.subTest(entry=entry):
self.assertIn(entry, lines)
def test_compose_up_regenerates_the_dockerignore(self) -> None:
makefile = read_text(str(PROJECT_ROOT / "Makefile"))
match = re.search(r"^compose-up:(.*)$", makefile, re.MULTILINE)
self.assertIsNotNone(match, "Makefile has no compose-up target")
self.assertIn("fix-dockerignore", match.group(1).split())
if __name__ == "__main__":
unittest.main()
@@ -85,6 +85,16 @@ class TestTlsResolveLookup(unittest.TestCase):
)[0]
self.assertEqual(val, "https://a.example/")
def test_url_origin_is_the_base_url_without_its_trailing_slash(self):
origin, base = (
self.lookup.run(["web-app-a", want], variables=self.base_vars, mode="app")[
0
]
for want in ("url.origin", "url.base")
)
self.assertEqual(origin, "https://a.example")
self.assertEqual(f"{origin}/", base)
def test_protocols_web_path_is_http_for_an_onion_only_app(self):
onion = dict(self.base_vars)
onion["domains"] = {**self.domains, "web-app-onion": "abc123.onion"}