fix: Schrift mitliefern statt beim Bauen herunterladen

next/font/google laedt Outfit beim Bauen von Google — das macht den Build von
einer Netzverbindung abhaengig und liess ihn im Container haengen. Die
variable Fassung liegt jetzt als Datei im Repository; weder beim Bauen noch
zur Laufzeit geht eine Anfrage nach aussen.

Ausserdem: npm blockiert seit Version 11 Install-Skripte. Fuer prisma und
@prisma/engines sind sie jetzt gezielt erlaubt, damit im Image die
plattformpassende Engine bereitliegt.
This commit is contained in:
Florian Wilde
2026-09-01 20:56:32 +02:00
parent afa3d74248
commit 18c87e6b2e
7 changed files with 49 additions and 10 deletions
+10
View File
@@ -22,6 +22,16 @@ Containerstart zeigt.
installiert und liegt im Laufzeitimage unter `/node_modules`, wo sie den installiert und liegt im Laufzeitimage unter `/node_modules`, wo sie den
getracten Abhängigkeitsbaum der Anwendung nicht stört. 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 ### Hinzugefügt
- **Erscheinungsmeldung für Watchlist-Filme.** Der Schalter dafür stand schon im - **Erscheinungsmeldung für Watchlist-Filme.** Der Schalter dafür stand schon im
+5 -2
View File
@@ -16,7 +16,10 @@ ENV NEXT_TELEMETRY_DISABLED=1
FROM base AS deps FROM base AS deps
WORKDIR /app WORKDIR /app
COPY package.json package-lock.json ./ 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 ------------------------------------------------------------------- # --- Build -------------------------------------------------------------------
FROM base AS builder FROM base AS builder
@@ -38,7 +41,7 @@ RUN npx prisma generate && npx next build
# schief: @prisma/config braucht weitere Module, die dabei fehlten. # schief: @prisma/config braucht weitere Module, die dabei fehlten.
FROM base AS prisma-cli FROM base AS prisma-cli
WORKDIR /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 ---------------------------------------------------------------- # --- Laufzeit ----------------------------------------------------------------
FROM base AS runner FROM base AS runner
+8 -3
View File
@@ -135,9 +135,14 @@ verklingt. `prefers-reduced-motion: reduce` schaltet sämtliche Übergänge ab.
## Typografie ## Typografie
**Outfit** — geometrisch, leicht gerundet, passt zur Wortmarke. Wird beim Bauen **Outfit** — geometrisch, leicht gerundet, passt zur Wortmarke. Die variable
heruntergeladen und mit ausgeliefert; die laufende Instanz fragt nie bei Google Fassung (Strichstärke 100–900) liegt als Datei im Repository
an. Rückfallkette: Inter, dann System-Sans. (`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 ## Grundhaltung
Binary file not shown.
Binary file not shown.
+10
View File
@@ -13,6 +13,16 @@ Containerstart zeigt.
installiert und liegt im Laufzeitimage unter `/node_modules`, wo sie den installiert und liegt im Laufzeitimage unter `/node_modules`, wo sie den
getracten Abhängigkeitsbaum der Anwendung nicht stört. 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 ### Hinzugefügt
- **Erscheinungsmeldung für Watchlist-Filme.** Der Schalter dafür stand schon im - **Erscheinungsmeldung für Watchlist-Filme.** Der Schalter dafür stand schon im
+16 -5
View File
@@ -1,5 +1,5 @@
import type { Metadata, Viewport } from "next"; 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 { BrandDefs } from "@/components/brand/FlimmerLogo";
import { ToastProvider } from "@/components/Toasts"; import { ToastProvider } from "@/components/Toasts";
import { ServiceWorkerRegistration } from "@/components/ServiceWorkerRegistration"; import { ServiceWorkerRegistration } from "@/components/ServiceWorkerRegistration";
@@ -7,13 +7,24 @@ import { env } from "@/lib/env";
import "./globals.css"; import "./globals.css";
/** /**
* Outfit wird beim Bauen heruntergeladen und mit ausgeliefert — die laufende * Outfit liegt als Datei im Repository.
* Instanz fragt also niemals bei Google an. *
* 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({ const outfit = localFont({
subsets: ["latin"], 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", display: "swap",
variable: "--font-outfit", variable: "--font-outfit",
fallback: ["Inter", "Segoe UI", "system-ui", "sans-serif"],
}); });
export const metadata: Metadata = { export const metadata: Metadata = {