FROM node:alpine AS server # Build arguments to control edition and provide build-only auth secret fallback ARG INCLUDE_EE=true ARG NEXTAUTH_SECRET_BUILD="dev-placeholder-nextauth-secret-32" # Install required system dependencies (rarely changes) RUN apk add --no-cache \ graphicsmagick \ imagemagick \ ghostscript \ postgresql-client \ redis \ curl \ bash WORKDIR /app # Copy only package files first for npm install COPY package.json package-lock.json ./ COPY server/package.json ./server/ COPY ee/server/package.json ./ee/server/ COPY scripts/ ./scripts/ # Install dependencies (cached unless package files change) COPY server/src/invoice-templates/assemblyscript ./server/src/invoice-templates/assemblyscript RUN npm install && \ cd server/src/invoice-templates/assemblyscript && \ npm install && \ cd /app COPY tsconfig.base.json ./ WORKDIR /app COPY shared/ ./shared/ COPY services/ ./services/ # Copy EE features conditionally COPY ee/ ./ee/ # Handle edition-specific setup RUN if [ "$INCLUDE_EE" = "true" ]; then \ echo "Including EE features..."; \ NEXTAUTH_SECRET="$NEXTAUTH_SECRET_BUILD" AUTH_SECRET="$NEXTAUTH_SECRET_BUILD" ./scripts/build-enterprise.sh; \ else \ echo "Building CE edition - excluding EE features..."; \ rm -rf ./ee; \ fi WORKDIR /app/server # Copy server source code COPY server/ ./ COPY packages/ /app/packages/ COPY scripts/ ./scripts/ # Build all upstream packages (shared + pre-built) via Nx (handles dependency ordering) RUN cd /app && npx nx build-deps server ENV USE_PREBUILT="true" # Clean any existing build artifacts and build the Next.js application with conditional env var RUN rm -rf .next && \ if [ "$INCLUDE_EE" = "true" ]; then \ NEXTAUTH_SECRET="$NEXTAUTH_SECRET_BUILD" AUTH_SECRET="$NEXTAUTH_SECRET_BUILD" npm run build:enterprise; \ else \ NEXTAUTH_SECRET="$NEXTAUTH_SECRET_BUILD" AUTH_SECRET="$NEXTAUTH_SECRET_BUILD" npm run build; \ fi # Copy core package.json for version info COPY packages/core/package.json /app/packages/core/package.json # Copy and make entrypoint executable (rarely changes) COPY server/entrypoint.sh /app/entrypoint.sh RUN chmod +x /app/entrypoint.sh EXPOSE 3000 ENV NODE_ENV=production ENTRYPOINT ["/app/entrypoint.sh"]