FROM node:20-alpine AS builder WORKDIR /app # Copy root package files COPY package.json package-lock.json ./ COPY server/package.json server/ COPY client/package.json client/ # Install all dependencies RUN npm ci # Copy source code COPY server/ server/ COPY client/ client/ # Build frontend RUN npm run --workspace=client build # Production stage FROM node:20-alpine WORKDIR /app # Copy root package files and lockfile COPY package.json package-lock.json ./ COPY server/package.json server/ # Install all server deps (tsx is in devDependencies but needed to run) RUN npm ci --workspace=server # Copy server source COPY server/ server/ # Copy built frontend COPY --from=builder /app/client/dist client/dist EXPOSE 3002 CMD ["npm", "run", "--workspace=server", "start"]