From aac0529bb68ac9c6a1ca7d7575433e0f461cb993 Mon Sep 17 00:00:00 2001 From: Marc Mintel Date: Mon, 17 Aug 2026 18:31:29 +0200 Subject: [PATCH] fix(infra): replace legacy klz fallback references with etib across docker compose and test scripts --- docker-compose.dev.yml | 3 +- docker-compose.yml | 85 ++++++++++++++++---------------- package.json | 3 +- scripts/assets-sync.sh | 13 ++--- scripts/audit-local.sh | 3 +- scripts/check-broken-assets.ts | 8 +-- scripts/check-forms.ts | 7 +-- scripts/check-html.ts | 9 ++-- scripts/check-http.ts | 9 ++-- scripts/check-locale.ts | 6 ++- scripts/check-security.ts | 6 ++- scripts/lhci-puppeteer-setup.cjs | 3 +- scripts/pagespeed-sitemap.ts | 3 +- scripts/smoke.ts | 3 +- scripts/wcag-sitemap.ts | 9 ++-- tests/docker-config.test.ts | 15 ++++++ 16 files changed, 112 insertions(+), 73 deletions(-) create mode 100644 tests/docker-config.test.ts diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml index b23be9d04..74b7aeb94 100644 --- a/docker-compose.dev.yml +++ b/docker-compose.dev.yml @@ -57,9 +57,10 @@ services: sh -c "pnpm install --no-frozen-lockfile && pnpm next dev --webpack --hostname 0.0.0.0 --port 3001" labels: - "traefik.enable=true" - - "traefik.http.services.${PROJECT_NAME:-klz}-app-svc.loadbalancer.server.port=3001" + - "traefik.http.services.${PROJECT_NAME:-etib}-app-svc.loadbalancer.server.port=3001" - "traefik.docker.network=infra" + networks: default: name: ${COMPOSE_PROJECT_NAME:-etib}-dev-internal diff --git a/docker-compose.yml b/docker-compose.yml index 89b78d31b..785d00ec2 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -15,47 +15,47 @@ services: labels: - "traefik.enable=true" # HTTP ⇒ HTTPS redirect - - "traefik.http.routers.${PROJECT_NAME:-klz}-web.rule=${TRAEFIK_HOST_RULE:-Host(`${TRAEFIK_HOST:-e-tib.com}`) || Host(`staging.${TRAEFIK_HOST:-e-tib.com}`) || Host(`testing.${TRAEFIK_HOST:-e-tib.com}`)}" - - "traefik.http.routers.${PROJECT_NAME:-klz}-web.entrypoints=web" - - "traefik.http.routers.${PROJECT_NAME:-klz}-web.middlewares=redirect-https" + - "traefik.http.routers.${PROJECT_NAME:-etib}-web.rule=${TRAEFIK_HOST_RULE:-Host(`${TRAEFIK_HOST:-e-tib.com}`) || Host(`staging.${TRAEFIK_HOST:-e-tib.com}`) || Host(`testing.${TRAEFIK_HOST:-e-tib.com}`)}" + - "traefik.http.routers.${PROJECT_NAME:-etib}-web.entrypoints=web" + - "traefik.http.routers.${PROJECT_NAME:-etib}-web.middlewares=redirect-https" # HTTPS router (Standard) - - "traefik.http.routers.${PROJECT_NAME:-klz}.rule=${TRAEFIK_HOST_RULE:-Host(`${TRAEFIK_HOST:-e-tib.com}`) || Host(`staging.${TRAEFIK_HOST:-e-tib.com}`) || Host(`testing.${TRAEFIK_HOST:-e-tib.com}`)}" - - "traefik.http.routers.${PROJECT_NAME:-klz}.entrypoints=${TRAEFIK_ENTRYPOINT:-web}" - - "traefik.http.routers.${PROJECT_NAME:-klz}.tls.certresolver=${TRAEFIK_CERT_RESOLVER:-}" - - "traefik.http.routers.${PROJECT_NAME:-klz}.tls=${TRAEFIK_TLS:-false}" - - "traefik.http.routers.${PROJECT_NAME:-klz}.service=${PROJECT_NAME:-klz}-app-svc" - - "traefik.http.routers.${PROJECT_NAME:-klz}.middlewares=${AUTH_MIDDLEWARE:-etib-ratelimit,etib-forward,etib-compress}" + - "traefik.http.routers.${PROJECT_NAME:-etib}.rule=${TRAEFIK_HOST_RULE:-Host(`${TRAEFIK_HOST:-e-tib.com}`) || Host(`staging.${TRAEFIK_HOST:-e-tib.com}`) || Host(`testing.${TRAEFIK_HOST:-e-tib.com}`)}" + - "traefik.http.routers.${PROJECT_NAME:-etib}.entrypoints=${TRAEFIK_ENTRYPOINT:-web}" + - "traefik.http.routers.${PROJECT_NAME:-etib}.tls.certresolver=${TRAEFIK_CERT_RESOLVER:-}" + - "traefik.http.routers.${PROJECT_NAME:-etib}.tls=${TRAEFIK_TLS:-false}" + - "traefik.http.routers.${PROJECT_NAME:-etib}.service=${PROJECT_NAME:-etib}-app-svc" + - "traefik.http.routers.${PROJECT_NAME:-etib}.middlewares=${AUTH_MIDDLEWARE:-etib-ratelimit,etib-forward,etib-compress}" # Public Router – paths that bypass Gatekeeper auth (health, SEO, static assets, OG images) - - "traefik.http.routers.${PROJECT_NAME:-klz}-public.rule=(${TRAEFIK_HOST_RULE:-Host(`${TRAEFIK_HOST:-e-tib.com}`) || Host(`staging.${TRAEFIK_HOST:-e-tib.com}`) || Host(`testing.${TRAEFIK_HOST:-e-tib.com}`)}) && PathRegexp(`^/([a-z]{2}/)?(health|login|gatekeeper|uploads|media|assets|_next|robots\\.txt|manifest\\.webmanifest|sitemap(-[0-9]+)?\\.xml|(.*/)?api/og(/.*)?|(.*/)?opengraph-image.*)`)" + - "traefik.http.routers.${PROJECT_NAME:-etib}-public.rule=(${TRAEFIK_HOST_RULE:-Host(`${TRAEFIK_HOST:-e-tib.com}`) || Host(`staging.${TRAEFIK_HOST:-e-tib.com}`) || Host(`testing.${TRAEFIK_HOST:-e-tib.com}`)}) && PathRegexp(`^/([a-z]{2}/)?(health|login|gatekeeper|uploads|media|assets|_next|robots\\.txt|manifest\\.webmanifest|sitemap(-[0-9]+)?\\.xml|(.*/)?api/og(/.*)?|(.*/)?opengraph-image.*)`)" - - "traefik.http.routers.${PROJECT_NAME:-klz}-public.entrypoints=${TRAEFIK_ENTRYPOINT:-web}" - - "traefik.http.routers.${PROJECT_NAME:-klz}-public.tls.certresolver=${TRAEFIK_CERT_RESOLVER:-}" - - "traefik.http.routers.${PROJECT_NAME:-klz}-public.tls=${TRAEFIK_TLS:-false}" - - "traefik.http.routers.${PROJECT_NAME:-klz}-public.service=${PROJECT_NAME:-klz}-app-svc" - - "traefik.http.routers.${PROJECT_NAME:-klz}-public.priority=2000" + - "traefik.http.routers.${PROJECT_NAME:-etib}-public.entrypoints=${TRAEFIK_ENTRYPOINT:-web}" + - "traefik.http.routers.${PROJECT_NAME:-etib}-public.tls.certresolver=${TRAEFIK_CERT_RESOLVER:-}" + - "traefik.http.routers.${PROJECT_NAME:-etib}-public.tls=${TRAEFIK_TLS:-false}" + - "traefik.http.routers.${PROJECT_NAME:-etib}-public.service=${PROJECT_NAME:-etib}-app-svc" + - "traefik.http.routers.${PROJECT_NAME:-etib}-public.priority=2000" - - "traefik.http.services.${PROJECT_NAME:-klz}-app-svc.loadbalancer.server.port=3000" + - "traefik.http.services.${PROJECT_NAME:-etib}-app-svc.loadbalancer.server.port=3000" - "traefik.docker.network=infra" # Middlewares - - "traefik.http.middlewares.${PROJECT_NAME:-klz}-compress.compress=true" - - "traefik.http.middlewares.${PROJECT_NAME:-klz}-ratelimit.ratelimit.average=100" - - "traefik.http.middlewares.${PROJECT_NAME:-klz}-ratelimit.ratelimit.burst=50" - - "traefik.http.middlewares.${PROJECT_NAME:-klz}-forward.headers.customrequestheaders.X-Forwarded-Proto=https" - - "traefik.http.middlewares.${PROJECT_NAME:-klz}-forward.headers.customrequestheaders.X-Forwarded-Ssl=on" + - "traefik.http.middlewares.${PROJECT_NAME:-etib}-compress.compress=true" + - "traefik.http.middlewares.${PROJECT_NAME:-etib}-ratelimit.ratelimit.average=100" + - "traefik.http.middlewares.${PROJECT_NAME:-etib}-ratelimit.ratelimit.burst=50" + - "traefik.http.middlewares.${PROJECT_NAME:-etib}-forward.headers.customrequestheaders.X-Forwarded-Proto=https" + - "traefik.http.middlewares.${PROJECT_NAME:-etib}-forward.headers.customrequestheaders.X-Forwarded-Ssl=on" # Login redirect – the app's middleware sends users to /login but login lives at /gatekeeper/login - - "traefik.http.middlewares.${PROJECT_NAME:-klz}-loginredirect.redirectregex.regex=^https?://([^/]+)/([a-z]{2}/)?login(.*)" - - "traefik.http.middlewares.${PROJECT_NAME:-klz}-loginredirect.redirectregex.replacement=https://$${1}/gatekeeper/login$${3}" - - "traefik.http.middlewares.${PROJECT_NAME:-klz}-loginredirect.redirectregex.permanent=false" - - "traefik.http.routers.${PROJECT_NAME:-klz}-loginredir.rule=(${TRAEFIK_HOST_RULE:-Host(`${TRAEFIK_HOST:-e-tib.com}`) || Host(`staging.${TRAEFIK_HOST:-e-tib.com}`) || Host(`testing.${TRAEFIK_HOST:-e-tib.com}`)}) && PathRegexp(`^/([a-z]{2}/)?login`)" - - "traefik.http.routers.${PROJECT_NAME:-klz}-loginredir.entrypoints=${TRAEFIK_ENTRYPOINT:-web}" - - "traefik.http.routers.${PROJECT_NAME:-klz}-loginredir.tls.certresolver=${TRAEFIK_CERT_RESOLVER:-}" - - "traefik.http.routers.${PROJECT_NAME:-klz}-loginredir.tls=${TRAEFIK_TLS:-false}" - - "traefik.http.routers.${PROJECT_NAME:-klz}-loginredir.middlewares=${PROJECT_NAME:-klz}-loginredirect" - - "traefik.http.routers.${PROJECT_NAME:-klz}-loginredir.service=${PROJECT_NAME:-klz}-app-svc" - - "traefik.http.routers.${PROJECT_NAME:-klz}-loginredir.priority=2002" + - "traefik.http.middlewares.${PROJECT_NAME:-etib}-loginredirect.redirectregex.regex=^https?://([^/]+)/([a-z]{2}/)?login(.*)" + - "traefik.http.middlewares.${PROJECT_NAME:-etib}-loginredirect.redirectregex.replacement=https://$${1}/gatekeeper/login$${3}" + - "traefik.http.middlewares.${PROJECT_NAME:-etib}-loginredirect.redirectregex.permanent=false" + - "traefik.http.routers.${PROJECT_NAME:-etib}-loginredir.rule=(${TRAEFIK_HOST_RULE:-Host(`${TRAEFIK_HOST:-e-tib.com}`) || Host(`staging.${TRAEFIK_HOST:-e-tib.com}`) || Host(`testing.${TRAEFIK_HOST:-e-tib.com}`)}) && PathRegexp(`^/([a-z]{2}/)?login`)" + - "traefik.http.routers.${PROJECT_NAME:-etib}-loginredir.entrypoints=${TRAEFIK_ENTRYPOINT:-web}" + - "traefik.http.routers.${PROJECT_NAME:-etib}-loginredir.tls.certresolver=${TRAEFIK_CERT_RESOLVER:-}" + - "traefik.http.routers.${PROJECT_NAME:-etib}-loginredir.tls=${TRAEFIK_TLS:-false}" + - "traefik.http.routers.${PROJECT_NAME:-etib}-loginredir.middlewares=${PROJECT_NAME:-etib}-loginredirect" + - "traefik.http.routers.${PROJECT_NAME:-etib}-loginredir.service=${PROJECT_NAME:-etib}-app-svc" + - "traefik.http.routers.${PROJECT_NAME:-etib}-loginredir.priority=2002" etib-gatekeeper: profiles: [ "gatekeeper" ] @@ -65,7 +65,7 @@ services: default: infra: aliases: - - ${PROJECT_NAME:-klz}-gatekeeper + - ${PROJECT_NAME:-etib}-gatekeeper env_file: - ${ENV_FILE:-.env} environment: @@ -74,19 +74,20 @@ services: NODE_ENV: production labels: - "traefik.enable=true" - - "traefik.http.services.${PROJECT_NAME:-klz}-gatekeeper-svc.loadbalancer.server.port=3000" - - "traefik.http.middlewares.${PROJECT_NAME:-klz}-auth.forwardauth.address=http://${PROJECT_NAME:-klz}-gatekeeper:3000/gatekeeper/api/verify" - - "traefik.http.middlewares.${PROJECT_NAME:-klz}-auth.forwardauth.trustForwardHeader=true" - - "traefik.http.middlewares.${PROJECT_NAME:-klz}-auth.forwardauth.authResponseHeaders=X-Auth-User" + - "traefik.http.services.${PROJECT_NAME:-etib}-gatekeeper-svc.loadbalancer.server.port=3000" + - "traefik.http.middlewares.${PROJECT_NAME:-etib}-auth.forwardauth.address=http://${PROJECT_NAME:-etib}-gatekeeper:3000/gatekeeper/api/verify" + - "traefik.http.middlewares.${PROJECT_NAME:-etib}-auth.forwardauth.trustForwardHeader=true" + - "traefik.http.middlewares.${PROJECT_NAME:-etib}-auth.forwardauth.authResponseHeaders=X-Auth-User" - "traefik.docker.network=infra" # Gatekeeper Public Router (Login/Auth UI) — basePath mode on main domain - - "traefik.http.routers.${PROJECT_NAME:-klz}-gatekeeper.rule=(${TRAEFIK_HOST_RULE:-Host(`${TRAEFIK_HOST:-e-tib.com}`) || Host(`staging.${TRAEFIK_HOST:-e-tib.com}`) || Host(`testing.${TRAEFIK_HOST:-e-tib.com}`)}) && PathPrefix(`/gatekeeper`)" - - "traefik.http.routers.${PROJECT_NAME:-klz}-gatekeeper.entrypoints=${TRAEFIK_ENTRYPOINT:-web}" - - "traefik.http.routers.${PROJECT_NAME:-klz}-gatekeeper.tls.certresolver=${TRAEFIK_CERT_RESOLVER:-}" - - "traefik.http.routers.${PROJECT_NAME:-klz}-gatekeeper.tls=${TRAEFIK_TLS:-false}" - - "traefik.http.routers.${PROJECT_NAME:-klz}-gatekeeper.service=${PROJECT_NAME:-klz}-gatekeeper-svc" - - "traefik.http.routers.${PROJECT_NAME:-klz}-gatekeeper.priority=2001" + - "traefik.http.routers.${PROJECT_NAME:-etib}-gatekeeper.rule=(${TRAEFIK_HOST_RULE:-Host(`${TRAEFIK_HOST:-e-tib.com}`) || Host(`staging.${TRAEFIK_HOST:-e-tib.com}`) || Host(`testing.${TRAEFIK_HOST:-e-tib.com}`)}) && PathPrefix(`/gatekeeper`)" + - "traefik.http.routers.${PROJECT_NAME:-etib}-gatekeeper.entrypoints=${TRAEFIK_ENTRYPOINT:-web}" + - "traefik.http.routers.${PROJECT_NAME:-etib}-gatekeeper.tls.certresolver=${TRAEFIK_CERT_RESOLVER:-}" + - "traefik.http.routers.${PROJECT_NAME:-etib}-gatekeeper.tls=${TRAEFIK_TLS:-false}" + - "traefik.http.routers.${PROJECT_NAME:-etib}-gatekeeper.service=${PROJECT_NAME:-etib}-gatekeeper-svc" + - "traefik.http.routers.${PROJECT_NAME:-etib}-gatekeeper.priority=2001" + etib-db: image: postgres:15-alpine diff --git a/package.json b/package.json index 564a1c7d0..5928f71b9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,7 @@ { "name": "e-tib-nextjs", - "version": "2.4.57", + "version": "2.4.58", + "type": "module", "private": true, "packageManager": "pnpm@10.18.3", diff --git a/scripts/assets-sync.sh b/scripts/assets-sync.sh index fdb30cc8b..4297a564f 100755 --- a/scripts/assets-sync.sh +++ b/scripts/assets-sync.sh @@ -31,22 +31,23 @@ fi get_media_path() { case "$1" in local) echo "$LOCAL_MEDIA_DIR" ;; - testing) echo "/var/lib/docker/volumes/klz-testing_klz_media_data/_data" ;; - staging) echo "/var/lib/docker/volumes/klz-staging_klz_media_data/_data" ;; - prod|production) echo "/var/lib/docker/volumes/klz-cablescom_klz_media_data/_data" ;; + testing) echo "/var/lib/docker/volumes/etib-testing_etib_media_data/_data" ;; + staging) echo "/var/lib/docker/volumes/etib-staging_etib_media_data/_data" ;; + prod|production) echo "/var/lib/docker/volumes/e-tibcom_etib_media_data/_data" ;; *) echo "❌ Unknown environment: $1"; exit 1 ;; esac } get_app_container() { case "$1" in - testing) echo "klz-testing-klz-app-1" ;; - staging) echo "klz-staging-klz-app-1" ;; - prod|production) echo "klz-cablescom-klz-app-1" ;; + testing) echo "etib-testing-etib-app-1" ;; + staging) echo "etib-staging-etib-app-1" ;; + prod|production) echo "e-tibcom-etib-app-1" ;; *) echo "" ;; esac } + SRC_PATH=$(get_media_path "$SOURCE_ENV") TGT_PATH=$(get_media_path "$TARGET_ENV") TGT_CONTAINER=$(get_app_container "$TARGET_ENV") diff --git a/scripts/audit-local.sh b/scripts/audit-local.sh index 8f1053451..e826349a8 100755 --- a/scripts/audit-local.sh +++ b/scripts/audit-local.sh @@ -15,7 +15,8 @@ export NEXT_PUBLIC_CI=true export CI=true docker network create infra 2>/dev/null || true -docker volume create klz_db_data 2>/dev/null || true +docker volume create etib_db_data 2>/dev/null || true + # 2. Start infra services (DB, CMS, Gatekeeper) echo "📦 Starting infrastructure services..." diff --git a/scripts/check-broken-assets.ts b/scripts/check-broken-assets.ts index c3ce1297b..35d17eb7e 100644 --- a/scripts/check-broken-assets.ts +++ b/scripts/check-broken-assets.ts @@ -7,7 +7,8 @@ const targetUrl = process.env.NEXT_PUBLIC_BASE_URL || 'http://localhost:3000'; const limit = process.env.ASSET_CHECK_LIMIT ? parseInt(process.env.ASSET_CHECK_LIMIT) : 20; -const gatekeeperPassword = process.env.GATEKEEPER_PASSWORD || 'klz2026'; +const gatekeeperPassword = process.env.GATEKEEPER_PASSWORD || 'etib2026'; +const authCookieName = process.env.AUTH_COOKIE_NAME || 'etib_gatekeeper_session'; async function main() { console.log(`\n🚀 Starting Strict Asset Integrity Check for: ${targetUrl}`); @@ -20,9 +21,10 @@ async function main() { try { console.log(`📥 Fetching sitemap from ${sitemapUrl}...`); const response = await axios.get(sitemapUrl, { - headers: { Cookie: `klz_gatekeeper_session=${gatekeeperPassword}` }, + headers: { Cookie: `${authCookieName}=${gatekeeperPassword}` }, }); + const $ = cheerio.load(response.data, { xmlMode: true }); urls = $('url loc') .map((i, el) => $(el).text()) @@ -64,7 +66,7 @@ async function main() { // Inject Gatekeeper session bypassing auth screens await page.setCookie({ - name: 'klz_gatekeeper_session', + name: authCookieName, value: gatekeeperPassword, domain: new URL(targetUrl).hostname, path: '/', diff --git a/scripts/check-forms.ts b/scripts/check-forms.ts index 66a331289..a9911f336 100644 --- a/scripts/check-forms.ts +++ b/scripts/check-forms.ts @@ -3,7 +3,8 @@ import axios from 'axios'; import * as cheerio from 'cheerio'; const targetUrl = process.argv[2] || process.env.NEXT_PUBLIC_BASE_URL || 'http://localhost:3000'; -const gatekeeperPassword = process.env.GATEKEEPER_PASSWORD || 'klz2026'; +const gatekeeperPassword = process.env.GATEKEEPER_PASSWORD || 'etib2026'; +const authCookieName = process.env.AUTH_COOKIE_NAME || 'etib_gatekeeper_session'; // Utility for hardcoded delays const delay = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms)); @@ -20,7 +21,7 @@ async function main() { while (Date.now() - startTime < maxWaitMs) { try { const resp = await axios.get(targetUrl, { - headers: { Cookie: `klz_gatekeeper_session=${gatekeeperPassword}` }, + headers: { Cookie: `${authCookieName}=${gatekeeperPassword}` }, timeout: 5000, validateStatus: (s) => s === 200, }); @@ -50,7 +51,7 @@ async function main() { try { console.log(`📥 Fetching sitemap from ${sitemapUrl}...`); const response = await axios.get(sitemapUrl, { - headers: { Cookie: `klz_gatekeeper_session=${gatekeeperPassword}` }, + headers: { Cookie: `${authCookieName}=${gatekeeperPassword}` }, }); const $ = cheerio.load(response.data, { xmlMode: true }); diff --git a/scripts/check-html.ts b/scripts/check-html.ts index b822aca38..8702e3f67 100644 --- a/scripts/check-html.ts +++ b/scripts/check-html.ts @@ -5,7 +5,8 @@ import * as path from 'path'; import { execSync } from 'child_process'; const targetUrl = process.argv[2] || process.env.NEXT_PUBLIC_BASE_URL || 'http://localhost:3000'; -const gatekeeperPassword = process.env.GATEKEEPER_PASSWORD || 'klz2026'; +const gatekeeperPassword = process.env.GATEKEEPER_PASSWORD || 'etib2026'; +const authCookieName = process.env.AUTH_COOKIE_NAME || 'etib_gatekeeper_session'; async function main() { console.log(`\n🚀 Starting HTML Validation for: ${targetUrl}`); @@ -16,10 +17,11 @@ async function main() { console.log(`📥 Fetching sitemap from ${sitemapUrl}...`); const response = await axios.get(sitemapUrl, { - headers: { Cookie: `klz_gatekeeper_session=${gatekeeperPassword}` }, + headers: { Cookie: `${authCookieName}=${gatekeeperPassword}` }, validateStatus: (status) => status < 400, }); + const $ = cheerio.load(response.data, { xmlMode: true }); let urls = $('url loc') .map((i, el) => $(el).text()) @@ -47,10 +49,11 @@ async function main() { const u = urls[i]; try { const res = await axios.get(u, { - headers: { Cookie: `klz_gatekeeper_session=${gatekeeperPassword}` }, + headers: { Cookie: `${authCookieName}=${gatekeeperPassword}` }, validateStatus: (status) => status < 400, }); + // Generate a safe filename that retains URL information const urlStr = new URL(u); const safePath = (urlStr.pathname + urlStr.search).replace(/[^a-zA-Z0-9]/g, '_'); diff --git a/scripts/check-http.ts b/scripts/check-http.ts index c279ee9c8..ee1fea16c 100644 --- a/scripts/check-http.ts +++ b/scripts/check-http.ts @@ -2,7 +2,8 @@ import axios from 'axios'; import * as cheerio from 'cheerio'; const targetUrl = process.argv[2] || process.env.NEXT_PUBLIC_BASE_URL || 'http://localhost:3000'; -const gatekeeperPassword = process.env.GATEKEEPER_PASSWORD || 'klz2026'; +const gatekeeperPassword = process.env.GATEKEEPER_PASSWORD || 'etib2026'; +const authCookieName = process.env.AUTH_COOKIE_NAME || 'etib_gatekeeper_session'; async function main() { console.log(`\n🚀 Starting HTTP Sitemap Validation for: ${targetUrl}\n`); @@ -12,10 +13,11 @@ async function main() { console.log(`📥 Fetching sitemap from ${sitemapUrl}...`); const response = await axios.get(sitemapUrl, { - headers: { Cookie: `klz_gatekeeper_session=${gatekeeperPassword}` }, + headers: { Cookie: `${authCookieName}=${gatekeeperPassword}` }, validateStatus: (status) => status < 400, }); + const $ = cheerio.load(response.data, { xmlMode: true }); let urls = $('url loc') .map((i, el) => $(el).text()) @@ -42,10 +44,11 @@ async function main() { const u = urls[i]; try { const res = await axios.get(u, { - headers: { Cookie: `klz_gatekeeper_session=${gatekeeperPassword}` }, + headers: { Cookie: `${authCookieName}=${gatekeeperPassword}` }, validateStatus: null, // Don't throw on error status }); + if (res.status >= 400) { console.error(`❌ ERROR ${res.status}: ${res.statusText} -> ${u}`); hasErrors = true; diff --git a/scripts/check-locale.ts b/scripts/check-locale.ts index dfe392c82..307730de5 100644 --- a/scripts/check-locale.ts +++ b/scripts/check-locale.ts @@ -12,7 +12,8 @@ import * as cheerio from 'cheerio'; */ const targetUrl = process.argv[2] || process.env.NEXT_PUBLIC_BASE_URL || 'http://localhost:3000'; -const gatekeeperPassword = process.env.GATEKEEPER_PASSWORD || 'klz2026'; +const gatekeeperPassword = process.env.GATEKEEPER_PASSWORD || 'etib2026'; +const authCookieName = process.env.AUTH_COOKIE_NAME || 'etib_gatekeeper_session'; // Expected slug translations: German key → English value const SLUG_MAP: Record = { @@ -32,7 +33,8 @@ const REVERSE_SLUG_MAP: Record = Object.fromEntries( Object.entries(SLUG_MAP).map(([de, en]) => [en, de]), ); -const headers = { Cookie: `klz_gatekeeper_session=${gatekeeperPassword}` }; +const headers = { Cookie: `${authCookieName}=${gatekeeperPassword}` }; + function getExpectedTranslation( sourcePath: string, diff --git a/scripts/check-security.ts b/scripts/check-security.ts index c84569e61..73f109d0d 100644 --- a/scripts/check-security.ts +++ b/scripts/check-security.ts @@ -1,7 +1,8 @@ import axios from 'axios'; const targetUrl = process.argv[2] || process.env.NEXT_PUBLIC_BASE_URL || 'http://localhost:3000'; -const gatekeeperPassword = process.env.GATEKEEPER_PASSWORD || 'klz2026'; +const gatekeeperPassword = process.env.GATEKEEPER_PASSWORD || 'etib2026'; +const authCookieName = process.env.AUTH_COOKIE_NAME || 'etib_gatekeeper_session'; const requiredHeaders = [ 'strict-transport-security', @@ -15,10 +16,11 @@ async function main() { console.log(`\n🛡️ Starting Security Headers Scan for: ${targetUrl}\n`); try { const response = await axios.head(targetUrl, { - headers: { Cookie: `klz_gatekeeper_session=${gatekeeperPassword}` }, + headers: { Cookie: `${authCookieName}=${gatekeeperPassword}` }, validateStatus: () => true, }); + const headers = response.headers; let allPassed = true; diff --git a/scripts/lhci-puppeteer-setup.cjs b/scripts/lhci-puppeteer-setup.cjs index dc9917c28..18ba6d8c1 100644 --- a/scripts/lhci-puppeteer-setup.cjs +++ b/scripts/lhci-puppeteer-setup.cjs @@ -7,9 +7,10 @@ module.exports = async (browser, context) => { // Using LHCI_URL or TARGET_URL if available const targetUrl = process.env.LHCI_URL || process.env.TARGET_URL || 'https://testing.e-tib.com'; - const gatekeeperPassword = process.env.GATEKEEPER_PASSWORD || 'klz2026'; + const gatekeeperPassword = process.env.GATEKEEPER_PASSWORD || 'etib2026'; const authCookieName = process.env.AUTH_COOKIE_NAME || 'etib_gatekeeper_session'; + console.log(`🔑 LHCI Auth: Setting gatekeeper cookie (${authCookieName}) for ${new URL(targetUrl).hostname}...`); await page.setCookie({ diff --git a/scripts/pagespeed-sitemap.ts b/scripts/pagespeed-sitemap.ts index 75c0e6faa..2be6b1df3 100644 --- a/scripts/pagespeed-sitemap.ts +++ b/scripts/pagespeed-sitemap.ts @@ -18,9 +18,10 @@ const targetUrl = process.env.LHCI_URL || 'http://localhost:3000'; const limit = process.env.PAGESPEED_LIMIT ? parseInt(process.env.PAGESPEED_LIMIT) : 20; // Default limit to avoid infinite runs -const gatekeeperPassword = process.env.GATEKEEPER_PASSWORD || 'klz2026'; +const gatekeeperPassword = process.env.GATEKEEPER_PASSWORD || 'etib2026'; const authCookieName = process.env.AUTH_COOKIE_NAME || 'etib_gatekeeper_session'; + async function main() { console.log(`\n🚀 Starting PageSpeed test for: ${targetUrl}`); console.log(`📊 Limit: ${limit} pages\n`); diff --git a/scripts/smoke.ts b/scripts/smoke.ts index d7451bcfd..df0332d4c 100644 --- a/scripts/smoke.ts +++ b/scripts/smoke.ts @@ -1,7 +1,8 @@ import puppeteer from 'puppeteer'; const targetUrl = process.argv[2] || process.env.NEXT_PUBLIC_BASE_URL || 'http://localhost:3000'; -const gatekeeperPassword = process.env.GATEKEEPER_PASSWORD || 'klz2026'; +const gatekeeperPassword = process.env.GATEKEEPER_PASSWORD || 'etib2026'; + async function run() { console.log(`🚀 Smoke Test: ${targetUrl}`); diff --git a/scripts/wcag-sitemap.ts b/scripts/wcag-sitemap.ts index 56d931292..938e3536c 100644 --- a/scripts/wcag-sitemap.ts +++ b/scripts/wcag-sitemap.ts @@ -14,7 +14,8 @@ import * as path from 'path'; const targetUrl = process.argv[2] || process.env.NEXT_PUBLIC_BASE_URL || 'http://localhost:3000'; const limit = process.env.PAGESPEED_LIMIT ? parseInt(process.env.PAGESPEED_LIMIT) : 20; -const gatekeeperPassword = process.env.GATEKEEPER_PASSWORD || 'klz2026'; +const gatekeeperPassword = process.env.GATEKEEPER_PASSWORD || 'etib2026'; +const authCookieName = process.env.AUTH_COOKIE_NAME || 'etib_gatekeeper_session'; async function main() { console.log(`\n🚀 Starting WCAG Audit for: ${targetUrl}`); @@ -27,11 +28,12 @@ async function main() { const response = await axios.get(sitemapUrl, { headers: { - Cookie: `klz_gatekeeper_session=${gatekeeperPassword}`, + Cookie: `${authCookieName}=${gatekeeperPassword}`, }, validateStatus: (status) => status < 400, }); + const $ = cheerio.load(response.data, { xmlMode: true }); let urls = $('url loc') .map((i, el) => $(el).text()) @@ -92,8 +94,9 @@ async function main() { ], }, headers: { - Cookie: `klz_gatekeeper_session=${gatekeeperPassword}`, + Cookie: `${authCookieName}=${gatekeeperPassword}`, }, + timeout: 60000, // Increase timeout for slower pages }, urls: urls, diff --git a/tests/docker-config.test.ts b/tests/docker-config.test.ts new file mode 100644 index 000000000..df0962ae1 --- /dev/null +++ b/tests/docker-config.test.ts @@ -0,0 +1,15 @@ +import { describe, it, expect } from 'vitest'; +import fs from 'node:fs'; +import path from 'node:path'; + +describe('Docker Configuration Project Name Integrity', () => { + it('ensures docker-compose.yml has no legacy klz project fallbacks', () => { + const composeContent = fs.readFileSync(path.resolve(process.cwd(), 'docker-compose.yml'), 'utf-8'); + expect(composeContent).not.toContain('klz'); + }); + + it('ensures docker-compose.dev.yml has no legacy klz project fallbacks', () => { + const devComposeContent = fs.readFileSync(path.resolve(process.cwd(), 'docker-compose.dev.yml'), 'utf-8'); + expect(devComposeContent).not.toContain('klz'); + }); +});