FROM rust:1.95-slim@sha256:985053ebf77f576c742435c12c1923ee04dbe511e17f087dd1a8f022307d3aeb AS builder
ARG CARGO_FEATURES=""
WORKDIR /build
# Cache dependencies in a separate layer
COPY Cargo.toml Cargo.lock ./
COPY crates/zeph-core/Cargo.toml crates/zeph-core/Cargo.toml
COPY crates/zeph-llm/Cargo.toml crates/zeph-llm/Cargo.toml
COPY crates/zeph-skills/Cargo.toml crates/zeph-skills/Cargo.toml
COPY crates/zeph-memory/Cargo.toml crates/zeph-memory/Cargo.toml
COPY crates/zeph-channels/Cargo.toml crates/zeph-channels/Cargo.toml
COPY crates/zeph-tools/Cargo.toml crates/zeph-tools/Cargo.toml
COPY crates/zeph-mcp/Cargo.toml crates/zeph-mcp/Cargo.toml
COPY crates/zeph-a2a/Cargo.toml crates/zeph-a2a/Cargo.toml
COPY crates/zeph-tui/Cargo.toml crates/zeph-tui/Cargo.toml
RUN mkdir -p src && echo 'fn main() {}' > src/main.rs && \
for d in crates/*/; do mkdir -p "$d/src" && echo '' > "$d/src/lib.rs"; done && \
cargo build --release ${CARGO_FEATURES:+--features $CARGO_FEATURES} 2>/dev/null || true
COPY . .
RUN touch src/main.rs && \
for d in crates/*/src/lib.rs; do touch "$d"; done && \
cargo build --release ${CARGO_FEATURES:+--features $CARGO_FEATURES}
FROM debian:bookworm-slim@sha256:67b30a61dc87758f0caf819646104f29ecbda97d920aaf5edc834128ac8493d3
RUN apt-get update && apt-get install -y --no-install-recommends \
ca-certificates \
curl wget git jq file findutils iproute2 procps \
nodejs npm python3 && \
rm -rf /var/lib/apt/lists/* && \
useradd --system --create-home --shell /sbin/nologin zeph
WORKDIR /app
COPY --from=builder /build/target/release/zeph /app/zeph
COPY config/ /app/config/
COPY .zeph/skills/ /app/.zeph/skills/
RUN mkdir -p /app/.zeph/data && \
chown -R zeph:zeph /app && \
chmod +x /app/zeph
USER zeph
ENTRYPOINT ["/app/zeph"]