ruvector/crates/mcp-brain-server/Dockerfile
rUv 930fca916f feat(sse): decouple SSE to mcp.pi.ruv.io proxy + Claude Code source research
SSE Proxy Decoupling (ADR-130):
- Fix ruvbrain-sse proxy: proper MCP handshake, session creation, drain polling
- Fix internal queue endpoints: session_create keeps receiver, drain returns buffered messages
- Add response_queues to AppState for SSE proxy communication
- Skip sparsifier for >5M edge graphs (was crashing on 16M edges)
- Add SSE_DISABLED/MAX_SSE env vars for configurable connection limits
- Route SSE to dedicated mcp.pi.ruv.io subdomain (Cloudflare CNAME)
- Serve SSE at root / path on proxy (no /sse needed)
- Update all references from pi.ruv.io/sse to mcp.pi.ruv.io
- Fix Dockerfile consciousness crate build (feature/version mismatches)

Claude Code CLI Source Research (ADR-133):
- 19 research documents analyzing Claude Code internals (3000+ lines)
- Decompiler script + RVF corpus builder for all major versions
- Binary RVF containers for v0.2, v1.0, v2.0, v2.1 (300-2068 vectors each)
- Call graphs, class hierarchies, state machines from minified source

Integration Strategy (ADR-134):
- 6-tier integration plan: WASM MCP, agents, hooks, cache, SDK, plugin
- Integration guide with architecture diagrams and performance targets

Co-Authored-By: claude-flow <ruv@ruv.net>
2026-04-02 23:39:56 +00:00

108 lines
6 KiB
Docker

# Multi-stage build for mcp-brain-server
# Stage 1: Build the Rust binary
FROM rustlang/rust:nightly-bookworm AS builder
WORKDIR /app
# Pin to a known-good nightly (2026-03-20) to avoid nalgebra ICE on newer nightlies
RUN rustup default nightly-2026-03-20
# Install build dependencies (native-tls requires OpenSSL)
RUN apt-get update && apt-get install -y --no-install-recommends \
pkg-config \
libssl-dev \
openssl \
&& rm -rf /var/lib/apt/lists/*
# Copy minimal workspace file (only includes required crates)
COPY crates/mcp-brain-server/Cargo.workspace.toml ./Cargo.toml
COPY Cargo.lock ./
# Copy the crates needed for mcp-brain-server
COPY crates/mcp-brain-server ./crates/mcp-brain-server
COPY crates/mcp-brain ./crates/mcp-brain
COPY crates/sona ./crates/sona
COPY crates/ruvector-mincut ./crates/ruvector-mincut
COPY crates/ruvector-nervous-system ./crates/ruvector-nervous-system
COPY crates/ruvector-domain-expansion ./crates/ruvector-domain-expansion
COPY crates/ruvector-delta-core ./crates/ruvector-delta-core
COPY crates/ruvector-solver ./crates/ruvector-solver
COPY crates/ruvector-sparsifier ./crates/ruvector-sparsifier
COPY crates/ruvector-consciousness ./crates/ruvector-consciousness
COPY crates/ruvllm ./crates/ruvllm
COPY crates/ruvector-core ./crates/ruvector-core
COPY crates/rvf ./crates/rvf
# Copy patches for hnsw_rs
COPY patches ./patches
# Remove optional ruvector-* path dependencies and examples that we don't have
RUN sed -i '/ruvector-graph\s*=/d' crates/ruvector-mincut/Cargo.toml && \
sed -i '/integration\s*=\s*\[/d' crates/ruvector-mincut/Cargo.toml && \
sed -i 's/"integration",\s*//g' crates/ruvector-mincut/Cargo.toml && \
sed -i '/\[\[example\]\]/,/^$/d' crates/ruvector-mincut/Cargo.toml && \
sed -i '/\[\[bench\]\]/,/^$/d' crates/ruvector-mincut/Cargo.toml && \
sed -i '/ruvector-graph\s*=/d' crates/ruvllm/Cargo.toml && \
sed -i '/ruvector-attention\s*=/d' crates/ruvllm/Cargo.toml && \
sed -i '/ruvector-gnn\s*=/d' crates/ruvllm/Cargo.toml && \
sed -i '/ruvector-full\s*=/d' crates/ruvllm/Cargo.toml && \
sed -i '/graph\s*=\s*\[/d' crates/ruvllm/Cargo.toml && \
sed -i '/attention\s*=\s*\[/d' crates/ruvllm/Cargo.toml && \
sed -i '/gnn\s*=\s*\[/d' crates/ruvllm/Cargo.toml && \
sed -i '/\[\[example\]\]/,/^$/d' crates/ruvllm/Cargo.toml && \
sed -i '/\[\[bench\]\]/,/^$/d' crates/ruvllm/Cargo.toml && \
sed -i '/\[\[example\]\]/,/^$/d' crates/ruvector-core/Cargo.toml && \
sed -i '/\[\[bench\]\]/,/^$/d' crates/ruvector-core/Cargo.toml && \
sed -i '/\[\[example\]\]/,/^$/d' crates/ruvector-solver/Cargo.toml && \
sed -i '/\[\[bench\]\]/,/^$/d' crates/ruvector-solver/Cargo.toml && \
sed -i '/\[\[example\]\]/,/^$/d' crates/ruvector-nervous-system/Cargo.toml && \
sed -i '/\[\[bench\]\]/,/^$/d' crates/ruvector-nervous-system/Cargo.toml && \
sed -i '/\[\[example\]\]/,/^$/d' crates/ruvector-domain-expansion/Cargo.toml && \
sed -i '/\[\[bench\]\]/,/^$/d' crates/ruvector-domain-expansion/Cargo.toml && \
sed -i '/\[\[example\]\]/,/^$/d' crates/ruvector-delta-core/Cargo.toml && \
sed -i '/\[\[bench\]\]/,/^$/d' crates/ruvector-delta-core/Cargo.toml && \
sed -i '/\[\[example\]\]/,/^$/d' crates/ruvector-sparsifier/Cargo.toml && \
sed -i '/\[\[bench\]\]/,/^$/d' crates/ruvector-sparsifier/Cargo.toml && \
sed -i '/\[\[bench\]\]/,/^$/d' crates/ruvector-consciousness/Cargo.toml && \
sed -i 's/ruvector-mincut = { version = "2.1.0"/ruvector-mincut = { version = "2.0.6"/' crates/ruvector-consciousness/Cargo.toml && \
sed -i 's/ruvector-solver = { version = "2.1.0"/ruvector-solver = { version = "2.0.6"/' crates/ruvector-consciousness/Cargo.toml && \
sed -i 's/ruvector-sparsifier = { version = "2.1.0"/ruvector-sparsifier = { version = "2.0.6"/' crates/ruvector-consciousness/Cargo.toml && \
sed -i '/ruvector-coherence\s*=/d' crates/ruvector-consciousness/Cargo.toml && \
sed -i '/ruvector-cognitive-container\s*=/d' crates/ruvector-consciousness/Cargo.toml && \
sed -i '/ruvector-math\s*=/d' crates/ruvector-consciousness/Cargo.toml && \
sed -i '/^coherence-accel\s*=/d' crates/ruvector-consciousness/Cargo.toml && \
sed -i '/^witness\s*=/d' crates/ruvector-consciousness/Cargo.toml && \
sed -i '/^math-accel\s*=/d' crates/ruvector-consciousness/Cargo.toml && \
sed -i '/^full\s*=/,/]/c\full = ["parallel", "phi", "emergence", "collapse", "simd", "solver-accel", "sparsifier-accel", "mincut-accel"]' crates/ruvector-consciousness/Cargo.toml && \
find crates/rvf -name "Cargo.toml" -exec sed -i '/\[\[example\]\]/,/^$/d' {} \; && \
find crates/rvf -name "Cargo.toml" -exec sed -i '/\[\[bench\]\]/,/^$/d' {} \; && \
find crates/sona -name "Cargo.toml" -exec sed -i '/\[\[example\]\]/,/^$/d' {} \; && \
find crates/sona -name "Cargo.toml" -exec sed -i '/\[\[bench\]\]/,/^$/d' {} \; && \
find crates/rvf -name "Cargo.toml" -exec sed -i 's/rust-version = "1.87"/rust-version = "1.85"/g' {} \; && \
sed -i 's/.is_multiple_of(\([^)]*\))/ % \1 == 0/g' crates/rvf/rvf-wire/src/delta.rs && \
find crates/rvf -name "*.rs" -exec sed -i 's/.is_multiple_of(\([^)]*\))/ % \1 == 0/g' {} \; && \
sed -i 's/features = \["storage", "hnsw", "parallel", "simd"\]/features = ["storage", "hnsw", "parallel"]/g' crates/ruvllm/Cargo.toml && \
sed -i 's/pub mod simd_intrinsics;/\/\/ pub mod simd_intrinsics;/g' crates/ruvector-core/src/lib.rs && \
sed -i 's/crate::simd_intrinsics::manhattan_distance_simd(a, b)/a.iter().zip(b.iter()).map(|(x, y)| (x - y).abs()).sum()/g' crates/ruvector-core/src/distance.rs
# Build only mcp-brain-server in release mode
RUN cargo build --release -p mcp-brain-server
# Stage 2: Minimal runtime image
FROM debian:bookworm-slim
RUN apt-get update && apt-get install -y --no-install-recommends \
ca-certificates \
libssl3 \
&& rm -rf /var/lib/apt/lists/*
# Copy binary from builder
COPY --from=builder /app/target/release/mcp-brain-server /usr/local/bin/mcp-brain-server
# Copy static files
COPY crates/mcp-brain-server/static /usr/local/share/mcp-brain-server/static
ENV PORT=8080
EXPOSE 8080
CMD ["mcp-brain-server"]