## Stage 1: Build frontend (Vue/Vite) FROM node:22-alpine AS web-builder WORKDIR /app/web COPY web/package.json web/package-lock.json ./ RUN npm ci COPY web/ ./ RUN npm run build ## Stage 2: Build backend (TypeScript) FROM node:22-alpine AS builder WORKDIR /app # sodium-native needs build tools on Alpine RUN apk add --no-cache python3 make g++ COPY package.json package-lock.json ./ RUN npm ci --ignore-scripts=false COPY tsconfig.json ./ COPY src/ ./src/ RUN npm run build ## Stage 3: Production image FROM node:22-alpine WORKDIR /app RUN apk add --no-cache python3 make g++ COPY package.json package-lock.json ./ RUN npm ci --omit=dev --ignore-scripts=false && \ apk del python3 make g++ && \ rm -rf /root/.npm /tmp/* COPY --from=builder /app/dist ./dist COPY --from=web-builder /app/web/dist ./public ENV PORT=8080 ENV HOST=0.0.0.0 EXPOSE 8080 USER node CMD ["node", "dist/cli.js"]