Dockerfile 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. # Stage 1: Frontend dependencies
  2. FROM node:22-alpine AS frontend-dependencies
  3. WORKDIR /opt/app
  4. COPY frontend/package.json frontend/package-lock.json ./
  5. RUN npm ci
  6. # Stage 2: Build frontend
  7. FROM node:22-alpine AS frontend-builder
  8. WORKDIR /opt/app
  9. COPY ./frontend .
  10. COPY --from=frontend-dependencies /opt/app/node_modules ./node_modules
  11. RUN npm run build
  12. # Stage 3: Backend dependencies
  13. FROM node:22-alpine AS backend-dependencies
  14. RUN apk add --no-cache python3
  15. WORKDIR /opt/app
  16. COPY backend/package.json backend/package-lock.json ./
  17. RUN npm ci
  18. # Stage 4: Build backend
  19. FROM node:22-alpine AS backend-builder
  20. RUN apk add openssl
  21. WORKDIR /opt/app
  22. COPY ./backend .
  23. COPY --from=backend-dependencies /opt/app/node_modules ./node_modules
  24. RUN npx prisma generate
  25. RUN npm run build && npm prune --production
  26. # Stage 5: Final image
  27. FROM node:22-alpine AS runner
  28. ENV NODE_ENV=docker
  29. # Delete default node user
  30. RUN deluser --remove-home node
  31. RUN apk update --no-cache \
  32. && apk upgrade --no-cache \
  33. && apk add --no-cache curl caddy su-exec openssl
  34. WORKDIR /opt/app/frontend
  35. COPY --from=frontend-builder /opt/app/public ./public
  36. COPY --from=frontend-builder /opt/app/.next/standalone ./
  37. COPY --from=frontend-builder /opt/app/.next/static ./.next/static
  38. COPY --from=frontend-builder /opt/app/public/img /tmp/img
  39. WORKDIR /opt/app/backend
  40. COPY --from=backend-builder /opt/app/node_modules ./node_modules
  41. COPY --from=backend-builder /opt/app/dist ./dist
  42. COPY --from=backend-builder /opt/app/prisma ./prisma
  43. COPY --from=backend-builder /opt/app/package.json ./
  44. COPY --from=backend-builder /opt/app/tsconfig.json ./
  45. WORKDIR /opt/app
  46. COPY ./reverse-proxy /opt/app/reverse-proxy
  47. COPY ./scripts/docker ./scripts/docker
  48. EXPOSE 3000
  49. 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'
  50. ENTRYPOINT ["sh", "./scripts/docker/create-user.sh"]
  51. CMD ["sh", "./scripts/docker/entrypoint.sh"]