# syntax=docker/dockerfile:1 # The web UI is built first so the Rust stage can copy the finished bundle. FROM node:26-bookworm-slim@sha256:86f07bc9c5dce4578cf37e5a418b7bfc7f817cda25cde66e2b66e95ed86c4567 AS web WORKDIR /build COPY frontend/package.json frontend/package-lock.json ./ RUN npm ci COPY frontend/ ./ RUN npm run build FROM rust:1-bookworm@sha256:114c7a4425406451c2866b6aafe69fe29b1b298832db1277d411ac73c82d04d6 AS server WORKDIR /build # Dependency manifests are copied first so a source-only change reuses the # cached dependency build. COPY Cargo.toml Cargo.lock ./ COPY crates/hive-core/Cargo.toml crates/hive-core/ COPY crates/hive-server/Cargo.toml crates/hive-server/ COPY crates/hive-cli/Cargo.toml crates/hive-cli/ RUN mkdir -p crates/hive-core/src crates/hive-server/src crates/hive-cli/src \ && echo "" > crates/hive-core/src/lib.rs \ && echo "fn main() {}" > crates/hive-server/src/main.rs \ && echo "fn main() {}" > crates/hive-cli/src/main.rs \ && cargo build --release --locked \ && rm -rf crates/*/src COPY crates/ crates/ # Cargo skips a rebuild when only mtimes look stale, so the stub artefacts are # removed explicitly before the real build. RUN touch crates/*/src/*.rs \ && cargo build --release --locked --bin hivemind-server --bin hive FROM debian:bookworm-slim@sha256:7c7b2c966bc9ee8cedfeef67e0e279108992c77681fa595db4a9d65c06ccc587 AS runtime RUN apt-get update \ && apt-get install -y --no-install-recommends ca-certificates \ && rm -rf /var/lib/apt/lists/* \ && useradd --create-home --uid 10001 hivemind WORKDIR /app COPY --from=server /build/target/release/hivemind-server /usr/local/bin/ COPY --from=server /build/target/release/hive /usr/local/bin/ COPY --from=web /build/dist /app/web RUN mkdir -p /data && chown hivemind:hivemind /data USER hivemind VOLUME ["/data"] EXPOSE 8750 ENV HIVEMIND_BIND=0.0.0.0:8750 \ HIVEMIND_DATABASE=/data/hivemind.db \ HIVEMIND_CONFIG=/data/hivemind.toml \ HIVEMIND_WEB_ROOT=/app/web HEALTHCHECK --interval=30s --timeout=4s --start-period=5s --retries=3 \ CMD ["/usr/local/bin/hive", "--database", "/data/hivemind.db", "rooms"] ENTRYPOINT ["/usr/local/bin/hivemind-server"]