pageta/apps/web/Dockerfile
Till JS 704a98603e fix(docker): pnpm-Workspace-Struktur im Runtime-Image erhalten
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>
2026-07-26 23:30:27 +02:00

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"]