diff --git a/apps/web/.env.example b/apps/web/.env.example index 26e6ed8..4648fe8 100644 --- a/apps/web/.env.example +++ b/apps/web/.env.example @@ -1 +1,5 @@ VITE_SERVER_URL=http://localhost:3001 + +# Umami analytics (optionnel, prod). Vide en dev = pas de suivi. +VITE_UMAMI_SRC= +VITE_UMAMI_WEBSITE_ID= diff --git a/apps/web/Dockerfile b/apps/web/Dockerfile index ba9a281..344ce1e 100644 --- a/apps/web/Dockerfile +++ b/apps/web/Dockerfile @@ -15,6 +15,11 @@ COPY apps/web apps/web ARG VITE_SERVER_URL ENV VITE_SERVER_URL=$VITE_SERVER_URL +# Umami analytics (optionnel) — figé au build. +ARG VITE_UMAMI_SRC +ENV VITE_UMAMI_SRC=$VITE_UMAMI_SRC +ARG VITE_UMAMI_WEBSITE_ID +ENV VITE_UMAMI_WEBSITE_ID=$VITE_UMAMI_WEBSITE_ID RUN bun run --filter web build FROM nginx:1.27-alpine AS runner diff --git a/apps/web/src/lib/analytics.ts b/apps/web/src/lib/analytics.ts new file mode 100644 index 0000000..f904e00 --- /dev/null +++ b/apps/web/src/lib/analytics.ts @@ -0,0 +1,20 @@ +// Umami analytics : on injecte le script seulement si les variables de build +// sont présentes (donc pas en dev → pas de trafic local dans les stats). +// L'ID de site est public (visible dans le HTML), ce n'est pas un secret. + +const SRC = import.meta.env.VITE_UMAMI_SRC +const WEBSITE_ID = import.meta.env.VITE_UMAMI_WEBSITE_ID + +export function initAnalytics(): void { + if (!SRC || !WEBSITE_ID) { + return + } + if (document.querySelector("script[data-website-id]")) { + return + } + const script = document.createElement("script") + script.defer = true + script.src = SRC + script.setAttribute("data-website-id", WEBSITE_ID) + document.head.appendChild(script) +} diff --git a/apps/web/src/main.tsx b/apps/web/src/main.tsx index e611d29..5d70ca3 100644 --- a/apps/web/src/main.tsx +++ b/apps/web/src/main.tsx @@ -6,6 +6,9 @@ import "@workspace/ui/globals.css" import { App } from "./App.tsx" import { ThemeProvider } from "@/components/theme-provider.tsx" import { I18nProvider } from "@/i18n/provider" +import { initAnalytics } from "@/lib/analytics" + +initAnalytics() const queryClient = new QueryClient() diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml index 32ed268..cc8fb33 100644 --- a/docker-compose.prod.yml +++ b/docker-compose.prod.yml @@ -54,6 +54,8 @@ services: dockerfile: apps/web/Dockerfile args: VITE_SERVER_URL: ${VITE_SERVER_URL} + VITE_UMAMI_SRC: ${VITE_UMAMI_SRC:-} + VITE_UMAMI_WEBSITE_ID: ${VITE_UMAMI_WEBSITE_ID:-} restart: unless-stopped depends_on: - server