FROM node:20-alpine AS build WORKDIR /app COPY package*.json ./ # Fallback to npm install if no lockfile is present RUN npm ci || npm install COPY . . # Ensure CSS variables are present RUN mkdir -p public/styles RUN cp -r styles/* public/styles/ || true RUN npm run build FROM node:20-alpine AS production WORKDIR /app RUN npm install -g serve COPY --from=build /app/dist ./dist EXPOSE 3000 # Serve static files (no SPA fallback), so /admin serves dist/admin/index.html CMD ["serve", "-l", "3000", "dist"] HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \ CMD wget -qO- http://localhost:3000/ || exit 1