FROM rust:1.95-slim@sha256:81099830a1e1d244607b9a7a30f3ff6ecadc52134a933b4635faba24f52840c9 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:f9c6a2fd2ddbc23e336b6257a5245e31f996953ef06cd13a59fa0a1df2d5c252
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"]