# mesh-llm Fly.io console image
#
# Deploy:
#   fly deploy --config fly/console/fly.toml --dockerfile fly/Dockerfile
#   Set MESH_HEADLESS=1 in fly.toml [env] to run API-only (no web UI)

# syntax=docker/dockerfile:1.7

FROM node:24-alpine AS ui-builder
ARG VITE_API_URL=https://meshllm.cloud
ENV VITE_API_URL=$VITE_API_URL
RUN npm install -g pnpm
WORKDIR /app
COPY crates/mesh-llm-ui/package.json crates/mesh-llm-ui/pnpm-lock.yaml crates/mesh-llm-ui/pnpm-workspace.yaml ./
RUN --mount=type=cache,id=pnpm-store,target=/root/.local/share/pnpm/store \
    pnpm install --frozen-lockfile
COPY crates/mesh-llm-ui/ ./
RUN pnpm run build

FROM debian:bookworm-slim AS builder
RUN apt-get update && apt-get install -y --no-install-recommends \
    ca-certificates curl git cmake ninja-build pkg-config libssl-dev libdbus-1-dev python3 build-essential \
    && rm -rf /var/lib/apt/lists/*
RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --default-toolchain stable --profile minimal
ENV PATH="/root/.cargo/bin:$PATH"
WORKDIR /src
COPY Cargo.toml Cargo.lock ./
COPY crates/mesh-llm-ui/ crates/mesh-llm-ui/
COPY crates/mesh-llm-gpu-bench/ crates/mesh-llm-gpu-bench/
COPY crates/mesh-llm-identity/ crates/mesh-llm-identity/
COPY crates/mesh-llm-protocol/ crates/mesh-llm-protocol/
COPY crates/mesh-llm-routing/ crates/mesh-llm-routing/
COPY crates/mesh-llm-system/ crates/mesh-llm-system/
COPY crates/mesh-llm-types/ crates/mesh-llm-types/
COPY crates/mesh-llm-host-runtime/Cargo.toml crates/mesh-llm-host-runtime/Cargo.toml
COPY crates/mesh-llm/Cargo.toml crates/mesh-llm/Cargo.toml
COPY crates/mesh-llm/build.rs crates/mesh-llm/build.rs
COPY crates/mesh-llm-plugin/Cargo.toml crates/mesh-llm-plugin/Cargo.toml
COPY crates/mesh-llm-plugin/build.rs crates/mesh-llm-plugin/build.rs
COPY crates/mesh-llm-host-runtime/ crates/mesh-llm-host-runtime/
COPY crates/mesh-llm/ crates/mesh-llm/
COPY crates/mesh-llm-plugin/ crates/mesh-llm-plugin/
COPY crates/mesh-client/ crates/mesh-client/
COPY crates/mesh-api/ crates/mesh-api/
COPY crates/mesh-host-core/ crates/mesh-host-core/
COPY crates/mesh-api-ffi/ crates/mesh-api-ffi/
COPY crates/mesh-llm-test-harness/ crates/mesh-llm-test-harness/
COPY crates/model-ref/ crates/model-ref/
COPY crates/model-artifact/ crates/model-artifact/
COPY crates/model-hf/ crates/model-hf/
COPY crates/model-package/ crates/model-package/
COPY crates/model-resolver/ crates/model-resolver/
COPY crates/skippy-protocol/ crates/skippy-protocol/
COPY crates/skippy-topology/ crates/skippy-topology/
COPY crates/skippy-cache/ crates/skippy-cache/
COPY crates/skippy-metrics/ crates/skippy-metrics/
COPY crates/openai-frontend/ crates/openai-frontend/
COPY crates/skippy-ffi/ crates/skippy-ffi/
COPY crates/skippy-runtime/ crates/skippy-runtime/
COPY crates/skippy-server/ crates/skippy-server/
COPY crates/metrics-server/ crates/metrics-server/
COPY crates/skippy-model-package/ crates/skippy-model-package/
COPY crates/skippy-coordinator/ crates/skippy-coordinator/
COPY crates/skippy-correctness/ crates/skippy-correctness/
COPY crates/llama-spec-bench/ crates/llama-spec-bench/
COPY crates/skippy-bench/ crates/skippy-bench/
COPY crates/skippy-prompt/ crates/skippy-prompt/
COPY crates/mesh-mixture-of-agents/ crates/mesh-mixture-of-agents/
COPY tools/xtask/ tools/xtask/
COPY scripts/prepare-llama.sh scripts/build-llama.sh scripts/
COPY third_party/llama.cpp/upstream.txt third_party/llama.cpp/upstream.txt
COPY third_party/llama.cpp/patches/ third_party/llama.cpp/patches/
RUN LLAMA_STAGE_USE_SCCACHE=0 scripts/prepare-llama.sh pinned && \
    LLAMA_STAGE_USE_SCCACHE=0 scripts/build-llama.sh
COPY --from=ui-builder /app/dist crates/mesh-llm-ui/dist
RUN --mount=type=cache,target=/root/.cargo/registry \
    --mount=type=cache,target=/root/.cargo/git \
    --mount=type=cache,target=/src/target \
    cargo build --release --locked -p mesh-llm && \
    cp target/release/mesh-llm /usr/local/bin/mesh-llm

FROM debian:bookworm-slim
RUN apt-get update && apt-get install -y --no-install-recommends \
    ca-certificates libgomp1 libdbus-1-3 \
    && rm -rf /var/lib/apt/lists/*
COPY --from=builder /usr/local/bin/mesh-llm /usr/local/bin/mesh-llm
COPY docker/entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
ENV APP_MODE=console
EXPOSE 3131 9337
ENTRYPOINT ["/entrypoint.sh"]
