leankg 0.19.16

Lightweight Knowledge Graph for AI-Assisted Development
# Render / onrender production image (leankg.onrender.com).
# Multi-stage: UI (node) → Rust builder (+ demo index) → slim runtime.
# Starter Render pipeline = 2 CPU / 8 GB RAM — single-stage + parallel rustc OOMs.
FROM node:20-bookworm AS ui
WORKDIR /ui
COPY ui-v2/package.json ui-v2/package-lock.json ./
RUN npm ci
COPY ui-v2/ ./
ARG UI_EMBED_REV=2026-07-22-render-ui-tsc-fix
RUN echo "UI_EMBED_REV=${UI_EMBED_REV}" && npm run build

FROM rust:1-bookworm AS builder
WORKDIR /app

# Render Starter build pipeline: 2 CPU, 8 GB RAM (docs.render.com/build-pipeline).
# ort + rocksdb + thin LTO can exceed 8 GB with default parallel codegen.
ENV CARGO_BUILD_JOBS=1 \
    CARGO_PROFILE_RELEASE_LTO=false \
    CARGO_TERM_COLOR=always

RUN apt-get update \
    && apt-get install -y --no-install-recommends clang libclang-dev \
    && rm -rf /var/lib/apt/lists/*

COPY Cargo.toml Cargo.lock ./
COPY src ./src
# benches/ required — Cargo.toml [[bench]] targets fail manifest parse if missing.
COPY benches ./benches
COPY ontology/ ./ontology/
COPY --from=ui /ui/dist/ ./src/embed/
ARG UI_EMBED_REV=2026-07-22-render-ui-tsc-fix
RUN test -f src/embed/index.html \
    && grep -q '<title>LeanKG</title>' src/embed/index.html \
    && printf '{"ui":"ui-v2","rev":"%s","source":"Dockerfile"}\n' "${UI_EMBED_REV}" > src/embed/ui-build.json

# US-CBM-C1 / FR-HNSW-C: embeddings feature for semantic_search on hosted demo.
RUN cargo build --release --features embeddings \
    && strip target/release/leankg \
    && cp target/release/leankg /usr/local/bin/leankg

# Bake LeanKG source graph for leankg.onrender.com (regression: multi-stage shipped binary-only).
RUN leankg init --path .leankg \
    && leankg index src \
    && test -f .leankg/leankg.db

FROM debian:bookworm-slim AS runtime

COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.crt

RUN apt-get update \
    && apt-get install -y --no-install-recommends \
        ca-certificates \
        curl \
        libstdc++6 \
    && rm -rf /var/lib/apt/lists/*

WORKDIR /app

COPY --from=builder /usr/local/bin/leankg /usr/local/bin/leankg
COPY --from=builder /app/src ./src
COPY --from=builder /app/ontology ./ontology
COPY --from=builder /app/.leankg ./.leankg
COPY --from=builder /app/leankg.yaml ./leankg.yaml

ENV LEANKG_SERVE_PROJECT=/app \
    PORT=8080
EXPOSE 8080 9699

# Render health checks hit this path (index status is always available).
HEALTHCHECK --interval=30s --timeout=5s --start-period=90s --retries=3 \
    CMD curl -fsS "http://127.0.0.1:${PORT}/api/index/status" || exit 1

CMD ["leankg", "web"]