# syntax=docker/dockerfile:1 # --- web UI (PWA) ------------------------------------------------------------- FROM node:22-alpine AS web WORKDIR /web COPY web/package.json web/package-lock.json ./ RUN npm ci --no-audit --no-fund COPY web/ ./ RUN npm run build # --- server ------------------------------------------------------------------- FROM rust:1-bookworm AS server WORKDIR /src COPY config.example.toml ./ COPY server/Cargo.toml server/Cargo.lock ./server/ # Cache dependencies separately from the sources. RUN mkdir -p server/src && echo 'fn main(){}' > server/src/main.rs \ && cd server && cargo build --release && rm -rf src COPY server/src ./server/src RUN cd server && touch src/main.rs && cargo build --release # --- runtime ------------------------------------------------------------------ # Node is included so agents can work on JS projects and run npx-based MCP servers. FROM node:22-bookworm-slim RUN apt-get update && apt-get install -y --no-install-recommends \ ca-certificates bash git curl ripgrep jq less procps \ python3 python3-venv build-essential \ chromium fonts-dejavu-core fonts-noto-color-emoji \ && rm -rf /var/lib/apt/lists/* COPY --from=server /src/server/target/release/codecraft /usr/local/bin/codecraft COPY --from=web /web/dist /app/web ENV CODECRAFT_WEB=/app/web \ CODECRAFT_CONFIG=/data/config.toml \ HOME=/data/home \ RUST_LOG=info RUN mkdir -p /data /workspace && chmod 777 /data /workspace VOLUME ["/data"] EXPOSE 8787 # Run as the host user (see docker-compose.yml) so files in /workspace keep their owner. USER 1000:1000 ENTRYPOINT ["codecraft"]