# ---- build stage ---- FROM node:22-alpine AS build WORKDIR /app COPY package.json package-lock.json* ./ COPY server/package.json server/ COPY web/package.json web/ RUN npm ci --ignore-scripts COPY . . RUN npm run build # ---- runtime stage ---- FROM node:22-alpine AS runtime ENV NODE_ENV=production \ HOST=0.0.0.0 \ PORT=8080 \ STATIC_DIR=/app/web/dist \ SESSION_FILE=/data/sessions.json WORKDIR /app COPY package.json ./ COPY server/package.json server/ COPY --from=build /app/node_modules ./node_modules COPY --from=build /app/server/dist ./server/dist COPY --from=build /app/web/dist ./web/dist RUN mkdir -p /data && chown -R node:node /data /app USER node VOLUME ["/data"] EXPOSE 8080 HEALTHCHECK --interval=30s --timeout=5s CMD wget -qO- http://127.0.0.1:8080/api/health || exit 1 CMD ["node", "server/dist/index.js"]