FROM node:20-alpine AS frontend-builder
WORKDIR /app/frontend
COPY LocalMind-Frontend/package*.json ./ COPY LocalMind-Frontend/pnpm-lock.yaml* ./
RUN npm install -g pnpm &&
pnpm install --frozen-lockfile
COPY LocalMind-Frontend/ ./
RUN pnpm run build
FROM node:20-alpine AS backend-builder
WORKDIR /app/backend
COPY LocalMind-Backend/package*.json ./ COPY LocalMind-Backend/pnpm-lock.yaml* ./
RUN npm install -g pnpm &&
pnpm install --frozen-lockfile
COPY LocalMind-Backend/ ./
RUN pnpm run build
FROM node:20-alpine
RUN apk add --no-cache dumb-init
RUN addgroup -g 1001 -S localmind &&
adduser -S localmind -u 1001
WORKDIR /app
COPY --from=backend-builder /app/backend/package*.json ./ COPY --from=backend-builder /app/backend/pnpm-lock.yaml* ./ COPY --from=backend-builder /app/backend/node_modules ./node_modules COPY --from=backend-builder /app/backend/dist ./dist COPY --from=backend-builder /app/backend/types ./types
COPY --from=frontend-builder /app/frontend/dist ./public
RUN mkdir -p /app/uploads /app/data &&
chown -R localmind:localmind /app
USER localmind
EXPOSE 3000
HEALTHCHECK --interval=30s --timeout=10s --start-period=40s --retries=3
CMD node -e "require('http').get('http://localhost:3000/health', (r) => {process.exit(r.statusCode === 200 ? 0 : 1)})"
ENTRYPOINT ["dumb-init", "--"]
CMD ["node", "dist/index.js"]