# --- build stage: bundle the PWA + the realtime server --- FROM oven/bun:1 AS build WORKDIR /app COPY package.json bun.lock* bun.lockb* ./ RUN bun install COPY . . RUN bun run build # tsc -b && vite build → /app/dist RUN bun run build:server # esbuild → /app/server/dist/index.js # --- runtime stage: small node image, non-root, serves dist + /ws --- FROM node:20-slim AS runtime ENV NODE_ENV=production STATIC_DIR=/app/dist PORT=8787 WORKDIR /app/server COPY server/package.json ./ RUN npm install --omit=dev --no-audit --no-fund COPY --from=build /app/server/dist ./dist COPY --from=build /app/dist /app/dist RUN chown -R node:node /app USER node EXPOSE 8787 CMD ["node", "dist/index.js"]