
FROM node:24-alpine AS builder

WORKDIR /app

RUN apk add --no-cache openssl
RUN npm install -g pnpm@11.0.9
RUN pnpm config set store-dir /app/.pnpm-store

# Docker build layers are non-interactive; let pnpm handle module purges without a TTY.
ENV CI=true

# Copy lockfiles/workspace manifests for better caching
COPY package.json pnpm-lock.yaml pnpm-workspace.yaml .npmrc* ./
COPY apps/web/package.json apps/web/package.json
COPY apps/worker/package.json apps/worker/package.json
COPY apps/image-proxy/package.json apps/image-proxy/package.json
COPY apps/image-proxy-aws/package.json apps/image-proxy-aws/package.json
COPY packages/api/package.json packages/api/package.json
COPY packages/cli/package.json packages/cli/package.json
COPY packages/image-proxy/package.json packages/image-proxy/package.json
COPY packages/loops/package.json packages/loops/package.json
COPY packages/resend/package.json packages/resend/package.json
COPY packages/scheduling/package.json packages/scheduling/package.json
COPY packages/tinybird/package.json packages/tinybird/package.json
COPY packages/tinybird-ai-analytics/package.json packages/tinybird-ai-analytics/package.json
COPY packages/tsconfig/package.json packages/tsconfig/package.json

# Copy Prisma schema file needed for postinstall script
COPY apps/web/prisma/schema.prisma apps/web/prisma/schema.prisma
# Copy postinstall script
COPY clone-marketing.sh clone-marketing.sh

# Install deps with a hoisted node_modules layout so Turbopack resolves packages
# from the workspace instead of following pnpm store symlinks outside package
# peer dependency boundaries.
RUN pnpm install --frozen-lockfile --prefer-offline --config.node-linker=hoisted

 # Copy the full repo
COPY . .

 # Build app (Next.js standalone)
ENV NODE_ENV=production
# Increase V8 heap for the production build.
ENV NODE_OPTIONS=--max_old_space_size=8192
ARG NEXT_PUBLIC_BASE_URL="http://NEXT_PUBLIC_BASE_URL_PLACEHOLDER"
ENV NEXT_PUBLIC_BASE_URL=${NEXT_PUBLIC_BASE_URL}
ARG NEXT_PUBLIC_BYPASS_PREMIUM_CHECKS="NEXT_PUBLIC_BYPASS_PREMIUM_CHECKS_PLACEHOLDER"
ENV NEXT_PUBLIC_BYPASS_PREMIUM_CHECKS=${NEXT_PUBLIC_BYPASS_PREMIUM_CHECKS}
ARG NEXT_PUBLIC_EMAIL_SEND_ENABLED="NEXT_PUBLIC_EMAIL_SEND_ENABLED_PLACEHOLDER"
ENV NEXT_PUBLIC_EMAIL_SEND_ENABLED=${NEXT_PUBLIC_EMAIL_SEND_ENABLED}
ARG NEXT_PUBLIC_SELF_HOSTED_LOGIN_FOOTER_TEXT="NEXT_PUBLIC_SELF_HOSTED_LOGIN_FOOTER_TEXT_PLACEHOLDER"
ENV NEXT_PUBLIC_SELF_HOSTED_LOGIN_FOOTER_TEXT=${NEXT_PUBLIC_SELF_HOSTED_LOGIN_FOOTER_TEXT}
ARG NEXT_PUBLIC_CLEANER_ENABLED="NEXT_PUBLIC_CLEANER_ENABLED_PLACEHOLDER"
ENV NEXT_PUBLIC_CLEANER_ENABLED=${NEXT_PUBLIC_CLEANER_ENABLED}
ARG NEXT_PUBLIC_AUTO_DRAFT_DISABLED="NEXT_PUBLIC_AUTO_DRAFT_DISABLED_PLACEHOLDER"
ENV NEXT_PUBLIC_AUTO_DRAFT_DISABLED=${NEXT_PUBLIC_AUTO_DRAFT_DISABLED}
ARG NEXT_PUBLIC_MEETING_BRIEFS_ENABLED="NEXT_PUBLIC_MEETING_BRIEFS_ENABLED_PLACEHOLDER"
ENV NEXT_PUBLIC_MEETING_BRIEFS_ENABLED=${NEXT_PUBLIC_MEETING_BRIEFS_ENABLED}
ARG NEXT_PUBLIC_INTEGRATIONS_ENABLED="NEXT_PUBLIC_INTEGRATIONS_ENABLED_PLACEHOLDER"
ENV NEXT_PUBLIC_INTEGRATIONS_ENABLED=${NEXT_PUBLIC_INTEGRATIONS_ENABLED}
ARG NEXT_PUBLIC_DIGEST_ENABLED="NEXT_PUBLIC_DIGEST_ENABLED_PLACEHOLDER"
ENV NEXT_PUBLIC_DIGEST_ENABLED=${NEXT_PUBLIC_DIGEST_ENABLED}
ARG NEXT_PUBLIC_WEBHOOK_ACTION_ENABLED="NEXT_PUBLIC_WEBHOOK_ACTION_ENABLED_PLACEHOLDER"
ENV NEXT_PUBLIC_WEBHOOK_ACTION_ENABLED=${NEXT_PUBLIC_WEBHOOK_ACTION_ENABLED}
ARG NEXT_PUBLIC_AI_MODEL_SETTINGS_DISABLED="NEXT_PUBLIC_AI_MODEL_SETTINGS_DISABLED_PLACEHOLDER"
ENV NEXT_PUBLIC_AI_MODEL_SETTINGS_DISABLED=${NEXT_PUBLIC_AI_MODEL_SETTINGS_DISABLED}

# Provide safe dummy envs so Next build can complete at image build time
ENV DATABASE_URL="postgresql://dummy:dummy@dummy:5432/dummy?schema=public"
ENV DIRECT_URL="postgresql://dummy:dummy@dummy:5432/dummy?schema=public"
ENV AUTH_SECRET="dummy_secret_for_build_only_32chars!"
ENV BETTER_AUTH_SECRET="dummy_secret_for_build_only_32chars!"
ENV GOOGLE_CLIENT_ID="dummy_id_for_build_only"
ENV GOOGLE_CLIENT_SECRET="dummy_secret_for_build_only"
ENV EMAIL_ENCRYPT_SECRET="dummy_encrypt_secret_for_build_only"
ENV EMAIL_ENCRYPT_SALT="dummy_encrypt_salt_for_build_only"
ENV GOOGLE_PUBSUB_TOPIC_NAME="dummy_topic_for_build_only"
ENV GOOGLE_PUBSUB_VERIFICATION_TOKEN="dummy_pubsub_token_for_build"
ENV DEFAULT_LLMS="anthropic:claude-sonnet-4-6"
ENV INTERNAL_API_KEY="dummy_apikey_for_build_only"
ENV API_KEY_SALT="dummy_salt_for_build_only"
ENV UPSTASH_REDIS_URL="http://dummy-redis-for-build:6379"
ENV UPSTASH_REDIS_TOKEN="dummy_redis_token_for_build"
ENV REDIS_URL="redis://dummy:dummy@dummy:6379"
ENV QSTASH_TOKEN="dummy_qstash_token_for_build"
ENV QSTASH_CURRENT_SIGNING_KEY="dummy_qstash_curr_key_for_build"
ENV QSTASH_NEXT_SIGNING_KEY="dummy_qstash_next_key_for_build"
ENV DOCKER_BUILD="true"

RUN rm -f /app/apps/web/.env && touch /app/apps/web/.env

RUN npx prisma generate --schema=apps/web/prisma/schema.prisma

RUN cd /app/apps/web \
 && pnpm exec next build \
 && cd /app \
 && pnpm --filter inbox-zero-ai deploy --legacy --prod /tmp/apps/web \
 && pnpm --filter @inboxzero/worker deploy --legacy --prod /tmp/apps/worker \
 && rm -rf apps/web/.next/cache

RUN rm -f /app/apps/web/.env /app/apps/web/.next/standalone/apps/web/.env

FROM node:24-alpine AS runner

WORKDIR /app

# Install openssl for Prisma
RUN apk add --no-cache openssl

# Copy the standalone server output (contains node_modules subset + server.js)
COPY --from=builder /app/apps/web/.next/standalone ./
# Static assets used by the server
COPY --from=builder /app/apps/web/.next/static ./apps/web/.next/static
COPY --from=builder /app/apps/web/public ./apps/web/public
COPY --from=builder /app/apps/web/prisma ./apps/web/prisma
COPY --from=builder /tmp/apps/web/node_modules ./apps/web/node_modules
COPY --from=builder /tmp/apps/worker ./apps/worker

# Fail the image build if the standalone server is missing traced runtime deps.
RUN test -f apps/web/server.js \
 && node -e "require('node:module').createRequire('/app/apps/web/server.js')('next')"

# Copy runtime scripts
COPY docker/scripts /app/docker/scripts
RUN chmod +x /app/docker/scripts/*.sh

# Install Prisma CLI globally for migrations
RUN npm install -g prisma@7.3.0
# Set NODE_PATH so prisma/config imports resolve correctly
ENV NODE_PATH=/usr/local/lib/node_modules

EXPOSE 3000

# Default command runs the Next.js server from the standalone bundle
CMD ["/app/docker/scripts/start.sh"]
# Cache bust Fri Nov 21 17:08:13 IST 2025
