| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 |
- # Stage 1: Frontend dependencies
- FROM node:22-alpine AS frontend-dependencies
- WORKDIR /opt/app
- COPY frontend/package.json frontend/package-lock.json ./
- RUN npm ci
- # Stage 2: Build frontend
- FROM node:22-alpine AS frontend-builder
- WORKDIR /opt/app
- COPY ./frontend .
- COPY --from=frontend-dependencies /opt/app/node_modules ./node_modules
- RUN npm run build
- # Stage 3: Backend dependencies
- FROM node:22-alpine AS backend-dependencies
- RUN apk add --no-cache python3
- WORKDIR /opt/app
- COPY backend/package.json backend/package-lock.json ./
- RUN npm ci
- # Stage 4: Build backend
- FROM node:22-alpine AS backend-builder
- RUN apk add openssl
- WORKDIR /opt/app
- COPY ./backend .
- COPY --from=backend-dependencies /opt/app/node_modules ./node_modules
- RUN npx prisma generate
- RUN npm run build && npm prune --production
- # Stage 5: Final image
- FROM node:22-alpine AS runner
- ENV NODE_ENV=docker
- # Delete default node user
- RUN deluser --remove-home node
- RUN apk update --no-cache \
- && apk upgrade --no-cache \
- && apk add --no-cache curl caddy su-exec openssl
- WORKDIR /opt/app/frontend
- COPY --from=frontend-builder /opt/app/public ./public
- COPY --from=frontend-builder /opt/app/.next/standalone ./
- COPY --from=frontend-builder /opt/app/.next/static ./.next/static
- COPY --from=frontend-builder /opt/app/public/img /tmp/img
- WORKDIR /opt/app/backend
- COPY --from=backend-builder /opt/app/node_modules ./node_modules
- COPY --from=backend-builder /opt/app/dist ./dist
- COPY --from=backend-builder /opt/app/prisma ./prisma
- COPY --from=backend-builder /opt/app/package.json ./
- COPY --from=backend-builder /opt/app/tsconfig.json ./
- WORKDIR /opt/app
- COPY ./reverse-proxy /opt/app/reverse-proxy
- COPY ./scripts/docker ./scripts/docker
- EXPOSE 3000
- HEALTHCHECK --interval=10s --timeout=3s CMD /bin/sh -c '(if [[ "$CADDY_DISABLED" = "true" ]]; then curl -fs http://localhost:${BACKEND_PORT:-8080}/api/health; else curl -fs http://localhost:3000/api/health; fi) || exit 1'
- ENTRYPOINT ["sh", "./scripts/docker/create-user.sh"]
- CMD ["sh", "./scripts/docker/entrypoint.sh"]
|