From e9cd8d1768a9ad6cf912cca4b2d2588f5edeb937 Mon Sep 17 00:00:00 2001 From: Marc Mintel Date: Thu, 12 Feb 2026 17:33:42 +0100 Subject: [PATCH] fix(analytics): restore Smart Proxy mechanism and remove conflicting rewrites --- .gitea/workflows/deploy.yml | 3 --- Dockerfile | 2 -- docker-compose.yml | 10 ---------- lib/config.ts | 4 ++-- lib/env.ts | 2 -- lib/services/analytics/umami-analytics-service.ts | 11 ++++------- next.config.mjs | 8 -------- 7 files changed, 6 insertions(+), 34 deletions(-) diff --git a/.gitea/workflows/deploy.yml b/.gitea/workflows/deploy.yml index ea083bc3..b2fd93f7 100644 --- a/.gitea/workflows/deploy.yml +++ b/.gitea/workflows/deploy.yml @@ -199,7 +199,6 @@ jobs: NEXT_PUBLIC_TARGET=${{ needs.prepare.outputs.target }} DIRECTUS_URL=${{ needs.prepare.outputs.directus_url }} UMAMI_WEBSITE_ID=${{ secrets.UMAMI_WEBSITE_ID || vars.UMAMI_WEBSITE_ID }} - NEXT_PUBLIC_UMAMI_WEBSITE_ID=${{ secrets.UMAMI_WEBSITE_ID || vars.UMAMI_WEBSITE_ID }} UMAMI_API_ENDPOINT=${{ secrets.UMAMI_API_ENDPOINT || vars.UMAMI_API_ENDPOINT || 'https://analytics.infra.mintel.me' }} NPM_TOKEN=${{ secrets.REGISTRY_PASS }} tags: registry.infra.mintel.me/mintel/klz-cables.com:${{ needs.prepare.outputs.image_tag }} @@ -252,7 +251,6 @@ jobs: # Analytics UMAMI_WEBSITE_ID: ${{ secrets.UMAMI_WEBSITE_ID || vars.UMAMI_WEBSITE_ID }} - NEXT_PUBLIC_UMAMI_WEBSITE_ID: ${{ secrets.UMAMI_WEBSITE_ID || vars.UMAMI_WEBSITE_ID }} UMAMI_API_ENDPOINT: ${{ secrets.UMAMI_API_ENDPOINT || vars.UMAMI_API_ENDPOINT || 'https://analytics.infra.mintel.me' }} steps: - name: Checkout repository @@ -320,7 +318,6 @@ jobs: # Analytics UMAMI_WEBSITE_ID=$UMAMI_WEBSITE_ID - NEXT_PUBLIC_UMAMI_WEBSITE_ID=$NEXT_PUBLIC_UMAMI_WEBSITE_ID UMAMI_API_ENDPOINT=$UMAMI_API_ENDPOINT TARGET=$TARGET diff --git a/Dockerfile b/Dockerfile index 1d28120e..0efa3e73 100644 --- a/Dockerfile +++ b/Dockerfile @@ -7,7 +7,6 @@ ARG NEXT_PUBLIC_BASE_URL ARG NEXT_PUBLIC_TARGET ARG DIRECTUS_URL ARG UMAMI_WEBSITE_ID -ARG NEXT_PUBLIC_UMAMI_WEBSITE_ID ARG UMAMI_API_ENDPOINT ARG NPM_TOKEN @@ -16,7 +15,6 @@ ENV NEXT_PUBLIC_BASE_URL=$NEXT_PUBLIC_BASE_URL ENV NEXT_PUBLIC_TARGET=$NEXT_PUBLIC_TARGET ENV DIRECTUS_URL=$DIRECTUS_URL ENV UMAMI_WEBSITE_ID=$UMAMI_WEBSITE_ID -ENV NEXT_PUBLIC_UMAMI_WEBSITE_ID=$NEXT_PUBLIC_UMAMI_WEBSITE_ID ENV UMAMI_API_ENDPOINT=$UMAMI_API_ENDPOINT ENV SKIP_RUNTIME_ENV_VALIDATION=true ENV CI=true diff --git a/docker-compose.yml b/docker-compose.yml index 38adccde..d3e0ff6b 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -18,19 +18,9 @@ services: - "traefik.http.routers.${PROJECT_NAME:-klz-cables}.entrypoints=websecure" - "traefik.http.routers.${PROJECT_NAME:-klz-cables}.tls.certresolver=le" - "traefik.http.routers.${PROJECT_NAME:-klz-cables}.tls=true" - - "traefik.http.routers.${PROJECT_NAME:-klz-cables}.priority=1000" - "traefik.http.routers.${PROJECT_NAME:-klz-cables}.service=${PROJECT_NAME:-klz-cables}" - "traefik.http.routers.${PROJECT_NAME:-klz-cables}.middlewares=${AUTH_MIDDLEWARE:-${PROJECT_NAME:-klz-cables}-ratelimit,${PROJECT_NAME:-klz-cables}-forward,${PROJECT_NAME:-klz-cables}-compress}" - # HTTPS router (Unprotected - for Analytics & Errors) - - "traefik.http.routers.${PROJECT_NAME:-klz-cables}-unprotected.rule=${TRAEFIK_HOST_RULE:-Host(`klz-cables.com`)} && PathPrefix(`/stats`, `/errors`)" - - "traefik.http.routers.${PROJECT_NAME:-klz-cables}-unprotected.entrypoints=websecure" - - "traefik.http.routers.${PROJECT_NAME:-klz-cables}-unprotected.tls.certresolver=le" - - "traefik.http.routers.${PROJECT_NAME:-klz-cables}-unprotected.tls=true" - - "traefik.http.routers.${PROJECT_NAME:-klz-cables}-unprotected.priority=2000" - - "traefik.http.routers.${PROJECT_NAME:-klz-cables}-unprotected.service=${PROJECT_NAME:-klz-cables}" - - "traefik.http.routers.${PROJECT_NAME:-klz-cables}-unprotected.middlewares=${AUTH_MIDDLEWARE_UNPROTECTED:-${PROJECT_NAME:-klz-cables}-ratelimit,${PROJECT_NAME:-klz-cables}-forward,${PROJECT_NAME:-klz-cables}-compress}" - - "traefik.http.services.${PROJECT_NAME:-klz-cables}.loadbalancer.server.port=3000" - "traefik.http.services.${PROJECT_NAME:-klz-cables}.loadbalancer.server.scheme=http" - "traefik.docker.network=infra" diff --git a/lib/config.ts b/lib/config.ts index c3aa75fd..7d5bfd62 100644 --- a/lib/config.ts +++ b/lib/config.ts @@ -29,9 +29,9 @@ function createConfig() { analytics: { umami: { - websiteId: env.NEXT_PUBLIC_UMAMI_WEBSITE_ID || env.UMAMI_WEBSITE_ID, + websiteId: env.UMAMI_WEBSITE_ID, apiEndpoint: env.UMAMI_API_ENDPOINT, - enabled: Boolean(env.NEXT_PUBLIC_UMAMI_WEBSITE_ID || env.UMAMI_WEBSITE_ID), + enabled: Boolean(env.UMAMI_WEBSITE_ID), }, }, diff --git a/lib/env.ts b/lib/env.ts index e644b3fd..c66a9242 100644 --- a/lib/env.ts +++ b/lib/env.ts @@ -25,8 +25,6 @@ const envExtension = { // Analytics UMAMI_WEBSITE_ID: z.string().optional(), - NEXT_PUBLIC_UMAMI_WEBSITE_ID: z.string().optional(), - UMAMI_API_ENDPOINT: z.string().optional(), }; /** diff --git a/lib/services/analytics/umami-analytics-service.ts b/lib/services/analytics/umami-analytics-service.ts index 21c6eb55..cf70c6d0 100644 --- a/lib/services/analytics/umami-analytics-service.ts +++ b/lib/services/analytics/umami-analytics-service.ts @@ -68,15 +68,12 @@ export class UmamiAnalyticsService implements AnalyticsService { private async sendPayload(type: 'event', data: Record) { if (!this.options.enabled) return; + // On the client, we don't need the websiteId (it's injected by the server-side proxy handler). + // On the server, we need it because we're calling the Umami API directly. const isClient = typeof window !== 'undefined'; - const websiteId = - this.websiteId || - (isClient ? (process.env.NEXT_PUBLIC_UMAMI_WEBSITE_ID as string) : undefined); - if (!websiteId) { - this.logger.warn( - `Umami tracking called on ${isClient ? 'client' : 'server'} but no Website ID configured`, - ); + if (!isClient && !this.websiteId) { + this.logger.warn('Umami tracking called on server but no Website ID configured'); return; } diff --git a/next.config.mjs b/next.config.mjs index 1cdbab17..08a917ee 100644 --- a/next.config.mjs +++ b/next.config.mjs @@ -338,14 +338,6 @@ const nextConfig = { source: '/cms/:path*', destination: `${directusUrl}/:path*`, }, - { - source: '/stats/:path*', - destination: `${umamiUrl}/:path*`, - }, - { - source: '/errors/:path*', - destination: `${glitchtipUrl}/:path*`, - }, ]; }, };