diff --git a/CHANGELOG.md b/CHANGELOG.md index 8a81d39..91a37d8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,16 @@ Containerstart zeigt. installiert und liegt im Laufzeitimage unter `/node_modules`, wo sie den getracten Abhängigkeitsbaum der Anwendung nicht stört. +- **Der Build hing im Container am Schriftabruf.** `next/font/google` lädt + Outfit beim Bauen von Google herunter — das macht den Build von einer + Netzverbindung abhängig und blieb im Container hängen. Die variable Fassung + liegt jetzt als Datei im Repository; weder beim Bauen noch zur Laufzeit geht + eine Anfrage nach außen. Für eine selbst gehostete Anwendung ist das ohnehin + das Richtige. +- **npm blockierte Prismas Install-Skripte** (Voreinstellung seit npm 11), + wodurch im Image die plattformpassende Engine fehlen konnte. Sie sind jetzt + gezielt für `prisma` und `@prisma/engines` erlaubt statt pauschal. + ### Hinzugefügt - **Erscheinungsmeldung für Watchlist-Filme.** Der Schalter dafür stand schon im diff --git a/Dockerfile b/Dockerfile index 8ba26f9..4e46135 100644 --- a/Dockerfile +++ b/Dockerfile @@ -16,7 +16,10 @@ ENV NEXT_TELEMETRY_DISABLED=1 FROM base AS deps WORKDIR /app COPY package.json package-lock.json ./ -RUN npm ci --no-audit --no-fund +# npm blockt Install-Skripte seit Version 11 standardmäßig. Prisma braucht seine +# eigenen, um die passende Engine für die Plattform bereitzulegen — deshalb hier +# gezielt erlaubt statt pauschal. +RUN npm ci --no-audit --no-fund --allow-scripts "prisma,@prisma/engines" # --- Build ------------------------------------------------------------------- FROM base AS builder @@ -38,7 +41,7 @@ RUN npx prisma generate && npx next build # schief: @prisma/config braucht weitere Module, die dabei fehlten. FROM base AS prisma-cli WORKDIR /cli -RUN npm init -y > /dev/null && npm install --omit=dev --no-audit --no-fund prisma@7.10.0 +RUN npm init -y > /dev/null && npm install --omit=dev --no-audit --no-fund --allow-scripts "prisma,@prisma/engines" prisma@7.10.0 # --- Laufzeit ---------------------------------------------------------------- FROM base AS runner diff --git a/docs/DESIGN.md b/docs/DESIGN.md index 82eec92..660c1fb 100644 --- a/docs/DESIGN.md +++ b/docs/DESIGN.md @@ -135,9 +135,14 @@ verklingt. `prefers-reduced-motion: reduce` schaltet sämtliche Übergänge ab. ## Typografie -**Outfit** — geometrisch, leicht gerundet, passt zur Wortmarke. Wird beim Bauen -heruntergeladen und mit ausgeliefert; die laufende Instanz fragt nie bei Google -an. Rückfallkette: Inter, dann System-Sans. +**Outfit** — geometrisch, leicht gerundet, passt zur Wortmarke. Die variable +Fassung (Strichstärke 100–900) liegt als Datei im Repository +(`public/fonts/`), aufgeteilt in Latin und Latin-Extended. + +Bewusst nicht `next/font/google`: das lädt die Schrift beim Bauen herunter und +macht den Build von einer Netzverbindung abhängig — im Container blieb er +daran hängen. Mit der mitgelieferten Datei gibt es weder beim Bauen noch zur +Laufzeit einen Abruf nach außen. Rückfallkette: Inter, dann System-Sans. ## Grundhaltung diff --git a/public/fonts/outfit-latin-ext.woff2 b/public/fonts/outfit-latin-ext.woff2 new file mode 100644 index 0000000..c54ceec Binary files /dev/null and b/public/fonts/outfit-latin-ext.woff2 differ diff --git a/public/fonts/outfit-latin.woff2 b/public/fonts/outfit-latin.woff2 new file mode 100644 index 0000000..85e3332 Binary files /dev/null and b/public/fonts/outfit-latin.woff2 differ diff --git a/releases/v0.6.1.md b/releases/v0.6.1.md index ae107f4..43fa3ff 100644 --- a/releases/v0.6.1.md +++ b/releases/v0.6.1.md @@ -13,6 +13,16 @@ Containerstart zeigt. installiert und liegt im Laufzeitimage unter `/node_modules`, wo sie den getracten Abhängigkeitsbaum der Anwendung nicht stört. +- **Der Build hing im Container am Schriftabruf.** `next/font/google` lädt + Outfit beim Bauen von Google herunter — das macht den Build von einer + Netzverbindung abhängig und blieb im Container hängen. Die variable Fassung + liegt jetzt als Datei im Repository; weder beim Bauen noch zur Laufzeit geht + eine Anfrage nach außen. Für eine selbst gehostete Anwendung ist das ohnehin + das Richtige. +- **npm blockierte Prismas Install-Skripte** (Voreinstellung seit npm 11), + wodurch im Image die plattformpassende Engine fehlen konnte. Sie sind jetzt + gezielt für `prisma` und `@prisma/engines` erlaubt statt pauschal. + ### Hinzugefügt - **Erscheinungsmeldung für Watchlist-Filme.** Der Schalter dafür stand schon im diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 4f2cc51..9605c22 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -1,5 +1,5 @@ import type { Metadata, Viewport } from "next"; -import { Outfit } from "next/font/google"; +import localFont from "next/font/local"; import { BrandDefs } from "@/components/brand/FlimmerLogo"; import { ToastProvider } from "@/components/Toasts"; import { ServiceWorkerRegistration } from "@/components/ServiceWorkerRegistration"; @@ -7,13 +7,24 @@ import { env } from "@/lib/env"; import "./globals.css"; /** - * Outfit wird beim Bauen heruntergeladen und mit ausgeliefert — die laufende - * Instanz fragt also niemals bei Google an. + * Outfit liegt als Datei im Repository. + * + * next/font/google würde die Schrift beim Bauen herunterladen — das macht den + * Build von einer Netzverbindung abhängig und ließ ihn im Container hängen. + * Für eine selbst gehostete Anwendung ist die mitgelieferte Datei ohnehin das + * Richtige: kein Abruf beim Bauen, keiner zur Laufzeit. + * + * Es ist die variable Fassung (Strichstärke 100–900), aufgeteilt in Latin und + * Latin-Extended — der Browser lädt nur, was die Seite wirklich braucht. */ -const outfit = Outfit({ - subsets: ["latin"], +const outfit = localFont({ + src: [ + { path: "../../public/fonts/outfit-latin.woff2", weight: "100 900", style: "normal" }, + { path: "../../public/fonts/outfit-latin-ext.woff2", weight: "100 900", style: "normal" }, + ], display: "swap", variable: "--font-outfit", + fallback: ["Inter", "Segoe UI", "system-ui", "sans-serif"], }); export const metadata: Metadata = {