Files
OpenShell/deploy/docker/Dockerfile.server
T
Drew Newberry 2d85338940 feat(platform): cleanup api surface area and mtls flows (!39)
Closes #48, #52

## Summary
- Replace the envoy-gateway-based TLS setup with inline PKI generation during cluster bootstrap, generating CA, server, and client certificates directly in the `navigator-bootstrap` crate
- Remove all envoy gateway Helm templates (`gateway.yaml`, `gatewayclass.yaml`, `grpcroute.yaml`, PKI job, traffic policies) and the `Dockerfile.pki-job`
- Add native mTLS support to the navigator server with `tokio-rustls`, mounting client TLS certs as volumes into sandbox pods
- Update cluster entrypoint, healthcheck, and deploy scripts to work with the new direct-TLS architecture
- Add TLS security e2e test and fix formatting/clippy warnings

## Test Plan
- All unit tests pass (`cargo test --workspace`)
- Clippy clean (`cargo clippy --workspace --all-targets`)
- Format clean (`cargo fmt --all -- --check`)
- Python tests pass (`uv run pytest python/`)
- Full `mise run pre-commit` passes
2026-02-24 11:33:33 -08:00

89 lines
3.8 KiB
Docker

# syntax=docker/dockerfile:1.4
# Navigator Server Docker image
# Multi-stage build with cross-compilation support for multi-arch
# Stage 1: Rust builder (runs on build platform, cross-compiles for target)
FROM --platform=$BUILDPLATFORM rust:1.88-slim AS builder
ARG TARGETARCH
ARG BUILDARCH
# Install build dependencies
RUN apt-get update && apt-get install -y --no-install-recommends \
cmake g++ make protobuf-compiler && rm -rf /var/lib/apt/lists/*
# Install cross-compilation toolchain + Rust target (no-ops for native builds)
COPY deploy/docker/cross-build.sh /usr/local/bin/
RUN . cross-build.sh && install_cross_toolchain && add_rust_target
WORKDIR /build
# Copy dependency manifests first for better caching
COPY Cargo.toml Cargo.lock ./
COPY crates/navigator-cli/Cargo.toml crates/navigator-cli/Cargo.toml
COPY crates/navigator-core/Cargo.toml crates/navigator-core/Cargo.toml
COPY crates/navigator-providers/Cargo.toml crates/navigator-providers/Cargo.toml
COPY crates/navigator-router/Cargo.toml crates/navigator-router/Cargo.toml
COPY crates/navigator-sandbox/Cargo.toml crates/navigator-sandbox/Cargo.toml
COPY crates/navigator-server/Cargo.toml crates/navigator-server/Cargo.toml
COPY crates/navigator-bootstrap/Cargo.toml crates/navigator-bootstrap/Cargo.toml
# Create dummy source files to build dependencies
RUN mkdir -p crates/navigator-cli/src crates/navigator-core/src crates/navigator-providers/src crates/navigator-router/src crates/navigator-sandbox/src crates/navigator-server/src crates/navigator-bootstrap/src && \
echo "fn main() {}" > crates/navigator-cli/src/main.rs && \
echo "fn main() {}" > crates/navigator-sandbox/src/main.rs && \
echo "fn main() {}" > crates/navigator-server/src/main.rs && \
touch crates/navigator-core/src/lib.rs && \
touch crates/navigator-providers/src/lib.rs && \
touch crates/navigator-router/src/lib.rs && \
touch crates/navigator-bootstrap/src/lib.rs
# Copy proto files needed for build
COPY proto/ proto/
# Build dependencies only (cached unless Cargo.toml/lock changes)
RUN --mount=type=cache,id=cargo-registry-server-${TARGETARCH},sharing=locked,target=/usr/local/cargo/registry \
--mount=type=cache,id=cargo-target-server-${TARGETARCH},sharing=locked,target=/build/target \
. cross-build.sh && cargo_cross_build --release -p navigator-server 2>/dev/null || true
# Copy actual source code
COPY crates/ crates/
# Touch source files to ensure they're rebuilt (not the cached dummy).
# Touch build.rs and proto files to force proto code regeneration when the
# cargo target cache mount retains stale OUT_DIR artifacts from prior builds.
RUN touch crates/navigator-server/src/main.rs \
crates/navigator-core/build.rs \
proto/*.proto
# Build the actual application
RUN --mount=type=cache,id=cargo-registry-server-${TARGETARCH},sharing=locked,target=/usr/local/cargo/registry \
--mount=type=cache,id=cargo-target-server-${TARGETARCH},sharing=locked,target=/build/target \
. cross-build.sh && \
cargo_cross_build --release -p navigator-server && \
cp "$(cross_output_dir release)/navigator-server" /build/navigator-server
# Stage 2: Runtime (uses target platform)
FROM debian:bookworm-slim AS runtime
RUN apt-get update && apt-get install -y --no-install-recommends \
ca-certificates && rm -rf /var/lib/apt/lists/*
RUN useradd --create-home --user-group navigator
WORKDIR /app
COPY --from=builder /build/navigator-server /usr/local/bin/
# Copy migrations to the build-time manifest directory expected by sqlx
RUN mkdir -p /build/crates/navigator-server
COPY crates/navigator-server/migrations /build/crates/navigator-server/migrations
USER navigator
EXPOSE 8080
# Health checks are handled by Kubernetes liveness/readiness probes (tcpSocket).
# No Docker HEALTHCHECK is needed since this image runs inside a k3s cluster.
ENTRYPOINT ["navigator-server"]
CMD ["--port", "8080"]