diff --git a/backend/Dockerfile b/backend/Dockerfile index 3573255..46e7746 100644 --- a/backend/Dockerfile +++ b/backend/Dockerfile @@ -1,35 +1,44 @@ -FROM node:22-slim AS builder +# ── Stage 1: Build ─────────────────────────────────────────────────────── +FROM bytelyst-common-base-backend:latest AS builder + WORKDIR /app/backend -ARG GITEA_NPM_HOST -ENV NODE_TLS_REJECT_UNAUTHORIZED=0 -ENV NPM_CONFIG_STRICT_SSL=false -ENV GITEA_NPM_HOST=$GITEA_NPM_HOST - -RUN npm config set strict-ssl false \ - && npm install -g pnpm@10.6.5 - -COPY .npmrc.docker ./.npmrc -COPY .docker-deps/ /app/.docker-deps/ +# Copy backend package files COPY backend/package.json ./package.json -RUN --mount=type=secret,id=gitea_npm_token \ - export GITEA_NPM_TOKEN="$(cat /run/secrets/gitea_npm_token 2>/dev/null || echo '')" && \ - pnpm install --ignore-scripts --lockfile=false - COPY backend/tsconfig.json ./tsconfig.json + +# Install backend-specific dependencies only +RUN pnpm install --prod --ignore-scripts + +# Copy source code COPY backend/src/ ./src/ COPY shared/ ../shared/ + +# Build backend RUN pnpm run build -# Production stage -FROM node:22-slim +# ── Stage 2: Production ─────────────────────────────────────────────────── +FROM bytelyst-common-base-backend:latest + WORKDIR /app/backend + +# Copy backend package files +COPY backend/package.json ./package.json + +# Install backend-specific dependencies +RUN pnpm install --prod --ignore-scripts + +# Copy built artifacts from builder +COPY --from=builder /app/backend/dist ./dist +COPY --from=builder /app/backend/node_modules ./node_modules +COPY shared/ ../shared/ + +# Environment ENV NODE_ENV=production -COPY --from=builder /app/backend/node_modules ./node_modules -COPY --from=builder /app/backend/package.json ./package.json -COPY --from=builder /app/backend/dist ./dist -COPY shared/ ../shared/ +# Health check +HEALTHCHECK --interval=30s --timeout=10s --start-period=40s --retries=3 \ + CMD node -e "require('http').get('http://localhost:4016/health', (r) => {process.exit(r.statusCode === 200 ? 0 : 1)})" EXPOSE 4016 CMD ["node", "dist/server.js"] diff --git a/web/Dockerfile b/web/Dockerfile index cde9cb2..0c1763b 100644 --- a/web/Dockerfile +++ b/web/Dockerfile @@ -1,42 +1,55 @@ -FROM node:22-slim AS builder +# ── Stage 1: Build ─────────────────────────────────────────────────────── +FROM bytelyst-common-base-web:latest AS builder + WORKDIR /app/web -ARG GITEA_NPM_HOST -ENV NODE_TLS_REJECT_UNAUTHORIZED=0 -ENV NPM_CONFIG_STRICT_SSL=false -ENV GITEA_NPM_HOST=$GITEA_NPM_HOST - -RUN npm config set strict-ssl false \ - && npm install -g pnpm@10.6.5 - -COPY .npmrc.docker ./.npmrc -COPY .docker-deps/ /app/.docker-deps/ +# Copy web package files COPY web/package.json ./package.json -RUN --mount=type=secret,id=gitea_npm_token \ - export GITEA_NPM_TOKEN="$(cat /run/secrets/gitea_npm_token 2>/dev/null || echo '')" && \ - pnpm install --ignore-scripts --lockfile=false - COPY web/next.config.ts ./next.config.ts COPY web/tsconfig.json ./tsconfig.json COPY web/next-env.d.ts ./next-env.d.ts + +# Install web-specific dependencies only +RUN pnpm install --prod --ignore-scripts + +# Copy source code COPY web/src/ ./src/ COPY shared/ ../shared/ +# Build arguments ARG NEXT_PUBLIC_NOTES_API_URL ARG NEXT_PUBLIC_PLATFORM_SERVICE_URL ENV NEXT_PUBLIC_NOTES_API_URL=$NEXT_PUBLIC_NOTES_API_URL ENV NEXT_PUBLIC_PLATFORM_SERVICE_URL=$NEXT_PUBLIC_PLATFORM_SERVICE_URL ENV NEXT_TELEMETRY_DISABLED=1 + +# Build web RUN pnpm run build -FROM node:22-slim -WORKDIR /app/web -ENV NODE_ENV=production -ENV NEXT_TELEMETRY_DISABLED=1 +# ── Stage 2: Production ─────────────────────────────────────────────────── +FROM bytelyst-common-base-web:latest +WORKDIR /app/web + +# Copy web package files +COPY web/package.json ./package.json + +# Install web-specific dependencies (production only) +RUN pnpm install --prod --ignore-scripts + +# Copy built artifacts from builder COPY --from=builder /app/web/.next/standalone ./ COPY --from=builder /app/web/.next/static ./.next/static -EXPOSE 3045 +# Environment +ENV NODE_ENV=production +ENV NEXT_TELEMETRY_DISABLED=1 ENV PORT=3045 -CMD ["node", "web/server.js"] +ENV HOSTNAME="0.0.0.0" + +# Health check +HEALTHCHECK --interval=30s --timeout=10s --start-period=40s --retries=3 \ + CMD node -e "require('http').get('http://localhost:3045', (r) => {process.exit(r.statusCode === 200 ? 0 : 1)})" + +EXPOSE 3045 +CMD ["node", "server.js"]