# syntax=docker/dockerfile:1.6 # ============================================================================ # Nibiru docs site — multi-stage build # # Default backend: your Ollama at https://your-ollama-host.example (no API keys). # See docker-compose.yml + .env.example for overrides. # ============================================================================ FROM node:22-alpine AS builder WORKDIR /app ENV NODE_ENV=production ENV NPM_CONFIG_PRODUCTION=false COPY package.json package-lock.json .npmrc ./ RUN npm ci COPY . . # Build-time embedding generation. Soft-fails so missing models / network # don't break the build — runtime falls back to chat-only mode. ARG OLLAMA_BASE_URL=http://localhost:11434 ARG OLLAMA_EMBED_MODEL=nomic-embed-text ARG EMBED_PROVIDER=ollama ARG OPENAI_API_KEY="" ENV OLLAMA_BASE_URL=$OLLAMA_BASE_URL ENV OLLAMA_EMBED_MODEL=$OLLAMA_EMBED_MODEL ENV EMBED_PROVIDER=$EMBED_PROVIDER ENV OPENAI_API_KEY=$OPENAI_API_KEY RUN node scripts/build-oracle-index.mjs || true # Build the static site + SSR entry. RUN npm run build:site # Build the LoRA training corpus as a side artifact (deterministic, no API). RUN node scripts/build-corpus.mjs || true RUN npm prune --omit=dev # ----------- Stage 2: runtime ----------------------------------------------- FROM node:22-alpine AS runtime WORKDIR /app ENV NODE_ENV=production ENV HOST=0.0.0.0 ENV PORT=4321 COPY --from=builder /app/dist ./dist COPY --from=builder /app/public ./public COPY --from=builder /app/scripts ./scripts COPY --from=builder /app/node_modules ./node_modules COPY --from=builder /app/package.json ./package.json EXPOSE 4321 USER node CMD ["node", "./dist/server/entry.mjs"]