diff --git a/.gitea/workflows/deploy.yml b/.gitea/workflows/deploy.yml index b2fd93f7..ea083bc3 100644 --- a/.gitea/workflows/deploy.yml +++ b/.gitea/workflows/deploy.yml @@ -199,6 +199,7 @@ 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 }} @@ -251,6 +252,7 @@ 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 @@ -318,6 +320,7 @@ 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 0efa3e73..1d28120e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -7,6 +7,7 @@ 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 @@ -15,6 +16,7 @@ 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/lib/config.ts b/lib/config.ts index 7d5bfd62..c3aa75fd 100644 --- a/lib/config.ts +++ b/lib/config.ts @@ -29,9 +29,9 @@ function createConfig() { analytics: { umami: { - websiteId: env.UMAMI_WEBSITE_ID, + websiteId: env.NEXT_PUBLIC_UMAMI_WEBSITE_ID || env.UMAMI_WEBSITE_ID, apiEndpoint: env.UMAMI_API_ENDPOINT, - enabled: Boolean(env.UMAMI_WEBSITE_ID), + enabled: Boolean(env.NEXT_PUBLIC_UMAMI_WEBSITE_ID || env.UMAMI_WEBSITE_ID), }, }, diff --git a/lib/env.ts b/lib/env.ts index 5a65d037..e644b3fd 100644 --- a/lib/env.ts +++ b/lib/env.ts @@ -22,6 +22,11 @@ const envExtension = { INFRA_DIRECTUS_URL: z.string().url().optional(), INFRA_DIRECTUS_TOKEN: z.string().optional(), + + // 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 cf70c6d0..21c6eb55 100644 --- a/lib/services/analytics/umami-analytics-service.ts +++ b/lib/services/analytics/umami-analytics-service.ts @@ -68,12 +68,15 @@ 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 (!isClient && !this.websiteId) { - this.logger.warn('Umami tracking called on server but no Website ID configured'); + if (!websiteId) { + this.logger.warn( + `Umami tracking called on ${isClient ? 'client' : 'server'} but no Website ID configured`, + ); return; }