da25f46e3e
Docker: moved all docker files to docker/ tree (was conflated with upstream Dockerfile at root + server/Dockerfile). Single container now: caddy (front, serves static + proxies /api /ws) + node backend (internal :4001). Node never exposed. entrypoint.sh runs both. Compose: one service. Blank page root cause: storage adapters had inconsistent module systems. firebase.js = ESM (export). ws.js + memory.js = CJS (module.exports). CRA prod build = ESM strict -> CJS runtime crash, blank root. Dev mode lenient, masked bug. First ws prod build (docker) = first exposure. Never dev/prod split intended; just inconsistency from M2 era. Fix: all adapters ESM. ws.js lazy-loads 'ws' pkg via dynamic import() (Node/jest only; browser uses global WebSocket). index.js static imports. server jest: added babel.config.js (preset-env, node target) to transform ESM for jest. Test: src/tests/StorageEsm.test.js — 4 tests grep all adapters for module.exports / require(). Regression guard catches CJS leak. Verified: docker page renders (root 4534 chars, UI visible). server 24 green, shared 90 green, FE ESM 4 green.
54 lines
1.5 KiB
Docker
54 lines
1.5 KiB
Docker
# docker/Dockerfile — single container: caddy (front) + node (back).
|
|
# Build context = repo root.
|
|
# ---- build stage: frontend + install backend deps ----
|
|
FROM node:18-alpine AS build
|
|
WORKDIR /app
|
|
|
|
COPY package*.json ./
|
|
COPY shared/package.json ./shared/
|
|
COPY server/package.json ./server/
|
|
RUN npm install --include-workspace-root
|
|
|
|
COPY shared/ ./shared/
|
|
COPY server/ ./server/
|
|
COPY src/ ./src/
|
|
COPY public/ ./public/
|
|
|
|
# better-sqlite3 native build (alpine musl)
|
|
RUN cd server && npm rebuild better-sqlite3
|
|
|
|
# build frontend (ws storage, same-origin via caddy)
|
|
ARG REACT_APP_TRACKER_APP_ID=ttrpg-initiative-tracker-default
|
|
ENV REACT_APP_STORAGE=ws
|
|
ENV REACT_APP_TRACKER_APP_ID=$REACT_APP_TRACKER_APP_ID
|
|
RUN NODE_OPTIONS=--openssl-legacy-provider npm run build
|
|
|
|
# prune backend dev deps for runtime
|
|
RUN npm prune --omit=dev
|
|
|
|
# ---- runtime stage: caddy + node ----
|
|
FROM node:18-alpine
|
|
RUN apk add --no-cache caddy
|
|
|
|
WORKDIR /app
|
|
COPY --from=build /app/node_modules ./node_modules
|
|
COPY --from=build /app/shared/node_modules ./shared/node_modules
|
|
COPY --from=build /app/server/node_modules ./server/node_modules
|
|
COPY --from=build /app/package*.json ./
|
|
COPY --from=build /app/shared/package.json ./shared/
|
|
COPY --from=build /app/server/package.json ./server/
|
|
COPY shared/ ./shared/
|
|
COPY server/ ./server/
|
|
# built frontend served by caddy
|
|
COPY --from=build /app/build /srv
|
|
COPY docker/Caddyfile /etc/caddy/Caddyfile
|
|
COPY docker/entrypoint.sh /entrypoint.sh
|
|
|
|
ENV NODE_ENV=production
|
|
ENV PORT=4001
|
|
ENV DB_PATH=/data/tracker.sqlite
|
|
|
|
EXPOSE 80
|
|
WORKDIR /app
|
|
CMD ["/entrypoint.sh"]
|