fix(deploy): rewrite traefik routers and add public route for sitemap to bypass gatekeeper
Some checks failed
Build & Deploy / 🔍 Prepare (push) Successful in 4s
Build & Deploy / 🧪 QA (push) Successful in 1m53s
Build & Deploy / 🏗️ Build (push) Successful in 2m41s
Build & Deploy / 🚀 Deploy (push) Successful in 12s
Build & Deploy / 🧪 Post-Deploy Verification (push) Failing after 2m48s
Build & Deploy / 🔔 Notify (push) Successful in 1s

This commit is contained in:
2026-02-27 23:55:52 +01:00
parent 7e957d6fb4
commit 3f45293c2e
2 changed files with 23 additions and 20 deletions

View File

@@ -254,7 +254,6 @@ jobs:
- name: 📝 Generate Environment - name: 📝 Generate Environment
shell: bash shell: bash
env: env:
TRAEFIK_RULE: ${{ needs.prepare.outputs.traefik_rule }}
TRAEFIK_HOST: ${{ needs.prepare.outputs.traefik_host }} TRAEFIK_HOST: ${{ needs.prepare.outputs.traefik_host }}
ENV_FILE: ${{ needs.prepare.outputs.env_file }} ENV_FILE: ${{ needs.prepare.outputs.env_file }}
run: | run: |
@@ -266,8 +265,6 @@ jobs:
AUTH_MIDDLEWARE="$STD_MW" AUTH_MIDDLEWARE="$STD_MW"
COMPOSE_PROFILES="" COMPOSE_PROFILES=""
else else
# Exclude Gatekeeper from the main app router to prevent redirect loops
TRAEFIK_RULE="Host(\`${TRAEFIK_HOST}\`) && !PathPrefix(\`/gatekeeper\`)"
# Order: Forward (Proto) -> Auth -> Compression # Order: Forward (Proto) -> Auth -> Compression
AUTH_MIDDLEWARE="${PROJECT_NAME}-forward,${PROJECT_NAME}-auth,compress" AUTH_MIDDLEWARE="${PROJECT_NAME}-forward,${PROJECT_NAME}-auth,compress"
COMPOSE_PROFILES="gatekeeper" COMPOSE_PROFILES="gatekeeper"
@@ -316,7 +313,6 @@ jobs:
SENTRY_ENVIRONMENT=$TARGET SENTRY_ENVIRONMENT=$TARGET
PROJECT_NAME=$PROJECT_NAME PROJECT_NAME=$PROJECT_NAME
ENV_FILE=$ENV_FILE ENV_FILE=$ENV_FILE
TRAEFIK_RULE="${TRAEFIK_RULE}"
TRAEFIK_HOST="${TRAEFIK_HOST}" TRAEFIK_HOST="${TRAEFIK_HOST}"
COMPOSE_PROFILES=$COMPOSE_PROFILES COMPOSE_PROFILES=$COMPOSE_PROFILES
TRAEFIK_MIDDLEWARES=$AUTH_MIDDLEWARE TRAEFIK_MIDDLEWARES=$AUTH_MIDDLEWARE

View File

@@ -9,7 +9,7 @@ services:
- ${ENV_FILE:-.env} - ${ENV_FILE:-.env}
labels: labels:
- "traefik.enable=true" - "traefik.enable=true"
- "traefik.http.routers.mb-grid.rule=${TRAEFIK_RULE:-Host(`${TRAEFIK_HOST:-mb-grid-solutions.localhost}`)}" - "traefik.http.routers.mb-grid.rule=Host(`${TRAEFIK_HOST:-mb-grid-solutions.localhost}`)"
- "traefik.http.routers.mb-grid.entrypoints=websecure" - "traefik.http.routers.mb-grid.entrypoints=websecure"
- "traefik.http.routers.mb-grid.tls.certresolver=le" - "traefik.http.routers.mb-grid.tls.certresolver=le"
- "traefik.http.routers.mb-grid.tls=true" - "traefik.http.routers.mb-grid.tls=true"
@@ -18,25 +18,18 @@ services:
- "traefik.http.services.mb-grid-app-svc.loadbalancer.server.port=3000" - "traefik.http.services.mb-grid-app-svc.loadbalancer.server.port=3000"
- "traefik.http.routers.mb-grid.middlewares=${TRAEFIK_MIDDLEWARES:-mb-grid-auth,mb-grid-forward,compress}" - "traefik.http.routers.mb-grid.middlewares=${TRAEFIK_MIDDLEWARES:-mb-grid-auth,mb-grid-forward,compress}"
- "traefik.docker.network=infra" - "traefik.docker.network=infra"
- "caddy=http://${TRAEFIK_HOST:-mb-grid-solutions.localhost}"
- "caddy.reverse_proxy={{upstreams 3000}}" # Public Router paths that bypass Gatekeeper auth
- "traefik.http.routers.mb-grid-public.rule=Host(`${TRAEFIK_HOST:-mb-grid-solutions.localhost}`) && PathRegexp(`^/([a-z]{2}/)?(health|login|gatekeeper|uploads|media|robots\\.txt|manifest\\.webmanifest|sitemap(-[0-9]+)?\\.xml|(.*/)?api/og(/.*)?|(.*/)?opengraph-image.*)`)"
- "traefik.http.routers.mb-grid-public.entrypoints=websecure"
- "traefik.http.routers.mb-grid-public.tls.certresolver=le"
- "traefik.http.routers.mb-grid-public.tls=true"
- "traefik.http.routers.mb-grid-public.service=mb-grid-app-svc"
- "traefik.http.routers.mb-grid-public.priority=2000"
# Forwarded Headers (Protocol Normalization) # Forwarded Headers (Protocol Normalization)
- "traefik.http.middlewares.${PROJECT_NAME:-mb-grid}-forward.headers.customrequestheaders.X-Forwarded-Proto=https" - "traefik.http.middlewares.${PROJECT_NAME:-mb-grid}-forward.headers.customrequestheaders.X-Forwarded-Proto=https"
- "traefik.http.middlewares.${PROJECT_NAME:-mb-grid}-forward.headers.customrequestheaders.X-Forwarded-Ssl=on" - "traefik.http.middlewares.${PROJECT_NAME:-mb-grid}-forward.headers.customrequestheaders.X-Forwarded-Ssl=on"
# Gatekeeper Router (Path-based)
- "traefik.http.routers.mb-grid-gatekeeper.rule=(Host(`${TRAEFIK_HOST}`) && PathPrefix(`/gatekeeper`))"
- "traefik.http.routers.mb-grid-gatekeeper.entrypoints=websecure"
- "traefik.http.routers.mb-grid-gatekeeper.tls.certresolver=le"
- "traefik.http.routers.mb-grid-gatekeeper.tls=true"
- "traefik.http.routers.mb-grid-gatekeeper.priority=2000"
- "traefik.http.routers.mb-grid-gatekeeper.service=mb-grid-gatekeeper-svc"
- "traefik.http.middlewares.${PROJECT_NAME:-mb-grid}-auth.forwardauth.address=http://mb-grid-gatekeeper:3000/gatekeeper/api/verify"
- "traefik.http.middlewares.${PROJECT_NAME:-mb-grid}-auth.forwardauth.trustForwardHeader=true"
- "traefik.http.middlewares.${PROJECT_NAME:-mb-grid}-auth.forwardauth.authRequestHeaders=X-Forwarded-Host,X-Forwarded-Proto,X-Forwarded-For,Cookie"
- "traefik.http.middlewares.${PROJECT_NAME:-mb-grid}-auth.forwardauth.authResponseHeaders=X-Auth-User"
healthcheck: healthcheck:
test: [ "CMD", "node", "-e", "fetch('http://127.0.0.1:3000/api/health').then(r => r.ok ? process.exit(0) : process.exit(1)).catch(() => process.exit(1))" ] test: [ "CMD", "node", "-e", "fetch('http://127.0.0.1:3000/api/health').then(r => r.ok ? process.exit(0) : process.exit(1)).catch(() => process.exit(1))" ]
interval: 10s interval: 10s
@@ -71,6 +64,20 @@ services:
labels: labels:
- "traefik.enable=true" - "traefik.enable=true"
- "traefik.http.services.mb-grid-gatekeeper-svc.loadbalancer.server.port=3000" - "traefik.http.services.mb-grid-gatekeeper-svc.loadbalancer.server.port=3000"
# Gatekeeper Verification Middleware
- "traefik.http.middlewares.${PROJECT_NAME:-mb-grid}-auth.forwardauth.address=http://mb-grid-gatekeeper:3000/gatekeeper/api/verify"
- "traefik.http.middlewares.${PROJECT_NAME:-mb-grid}-auth.forwardauth.trustForwardHeader=true"
- "traefik.http.middlewares.${PROJECT_NAME:-mb-grid}-auth.forwardauth.authRequestHeaders=X-Forwarded-Host,X-Forwarded-Proto,X-Forwarded-For,Cookie"
- "traefik.http.middlewares.${PROJECT_NAME:-mb-grid}-auth.forwardauth.authResponseHeaders=X-Auth-User"
# Gatekeeper Public Router (Login/Auth UI)
- "traefik.http.routers.mb-grid-gatekeeper.rule=(Host(`${TRAEFIK_HOST:-mb-grid-solutions.localhost}`) && PathPrefix(`/gatekeeper`))"
- "traefik.http.routers.mb-grid-gatekeeper.entrypoints=websecure"
- "traefik.http.routers.mb-grid-gatekeeper.tls.certresolver=le"
- "traefik.http.routers.mb-grid-gatekeeper.tls=true"
- "traefik.http.routers.mb-grid-gatekeeper.priority=2000"
- "traefik.http.routers.mb-grid-gatekeeper.service=mb-grid-gatekeeper-svc"
- "traefik.docker.network=infra" - "traefik.docker.network=infra"
mb-grid-db: mb-grid-db: