Die Runtime-Stage kopierte nur /app/node_modules und legte den Build flach nach /app/build. Unter pnpm liegen die echten Pakete im Store (/app/node_modules/.pnpm); aufloesbar werden sie erst durch die Symlinks in /app/apps/web/node_modules — und die fehlten. Damit ist jede von Vite externalisierte Runtime-Dependency (alles ausser @mana/*, das via ssr.noExternal gebuendelt wird) zur Laufzeit nicht auffindbar. Hier aktuell noch folgenlos, weil die SSR-Bundles marked/gray-matter/dompurify inlinen statt zu importieren — geprueft mit `grep -rE "from .(marked|gray-matter|dompurify)." build/server` (leer). Bei postfach hat exakt dieses Muster gezuendet: dompurify wurde externalisiert -> [500] auf jeder Thread-Seite. Praeventiv angeglichen, damit die naechste externalisierte Dep nicht dieselbe Runde dreht. Kein Deploy noetig — greift beim naechsten Build der App. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
52 lines
1.8 KiB
Docker
52 lines
1.8 KiB
Docker
# Pageta-Web: SvelteKit + adapter-node.
|
|
# Build-Context = Repo-Root.
|
|
|
|
FROM oven/bun:1.1-alpine AS builder
|
|
|
|
ARG NPM_AUTH_TOKEN=""
|
|
ENV NPM_AUTH_TOKEN=$NPM_AUTH_TOKEN
|
|
|
|
WORKDIR /app
|
|
|
|
RUN apk add --no-cache nodejs npm bash \
|
|
&& npm install -g pnpm@9.15.9
|
|
|
|
COPY package.json pnpm-lock.yaml pnpm-workspace.yaml turbo.json tsconfig.base.json .npmrc ./
|
|
COPY apps/web/package.json apps/web/
|
|
COPY packages/pageta-domain/package.json packages/pageta-domain/
|
|
COPY vendor/mana-shared-schemas-0.1.23.tgz vendor/
|
|
|
|
RUN pnpm install --frozen-lockfile --prod=false
|
|
|
|
COPY packages/pageta-domain packages/pageta-domain
|
|
COPY apps/web apps/web
|
|
# Repo-Root devlog/ — die /devlog-Route liest es per Vite-Glob beim Build.
|
|
COPY devlog ./devlog
|
|
|
|
WORKDIR /app/apps/web
|
|
# Heap-Limit hochsetzen: der Vite-Build (jsdom/Readability + shared-ui) sprengt
|
|
# sonst Nodes ~2-GB-Default → "heap out of memory".
|
|
ENV NODE_OPTIONS=--max-old-space-size=4096
|
|
RUN pnpm build
|
|
|
|
FROM oven/bun:1.1-alpine
|
|
|
|
# Die pnpm-Workspace-Struktur MUSS erhalten bleiben: die echten Pakete liegen im
|
|
# Store unter /app/node_modules/.pnpm, und erst die Symlinks in
|
|
# /app/apps/web/node_modules machen sie fuer das Paket aufloesbar. Wer nur
|
|
# /app/node_modules kopiert und build/ nach /app/build legt, verliert jede
|
|
# externalisierte Runtime-Dependency (alles ausser @mana/*, das via
|
|
# ssr.noExternal gebuendelt wird) -> [500] auf genau den Routen, die sie
|
|
# importieren. Genau so ist postfach an `dompurify` gestorben.
|
|
WORKDIR /app/apps/web
|
|
|
|
COPY --from=builder /app/node_modules /app/node_modules
|
|
COPY --from=builder /app/apps/web/node_modules /app/apps/web/node_modules
|
|
COPY --from=builder /app/apps/web/build /app/apps/web/build
|
|
COPY --from=builder /app/apps/web/package.json /app/apps/web/package.json
|
|
|
|
ENV PORT=3100
|
|
ENV HOST=0.0.0.0
|
|
EXPOSE 3100
|
|
|
|
CMD ["bun", "run", "build/index.js"]
|