From 9f7ebc6e5708c7db8c26376d66782d74b5b8f731 Mon Sep 17 00:00:00 2001 From: Maxime Van Hees Date: Thu, 30 Oct 2025 14:07:08 +0100 Subject: [PATCH] prod & dev docker containers --- Dockerfile | 62 +++++++++++++++++++++++++++++++ Dockerfile.dev | 30 +++++++++++++++ README.md | 16 ++++++++ docker-compose.yml | 91 ++++++++++++++++++++++++++++++++++++++++++++++ src/main.rs | 4 +- 5 files changed, 201 insertions(+), 2 deletions(-) create mode 100644 Dockerfile create mode 100644 Dockerfile.dev create mode 100644 docker-compose.yml diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..969bd60 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,62 @@ +# Multi-stage build for production +# Stage 1: Build the application +FROM rust:1.90-bookworm AS builder + +# Install build dependencies +RUN apt-get update && apt-get install -y \ + pkg-config \ + libssl-dev \ + protobuf-compiler \ + && rm -rf /var/lib/apt/lists/* + +WORKDIR /build + +# Copy manifests +COPY Cargo.toml Cargo.lock ./ + +# Create dummy main to cache dependencies +RUN mkdir src && \ + echo "fn main() {}" > src/main.rs && \ + cargo build --release && \ + rm -rf src + +# Copy actual source code +COPY src ./src + +# Build the actual application +RUN cargo build --release --bin herodb + +# Stage 2: Create minimal runtime image +FROM debian:bookworm-slim + +# Install runtime dependencies (minimal) +RUN apt-get update && apt-get install -y \ + ca-certificates \ + && rm -rf /var/lib/apt/lists/* + +# Create non-root user +RUN useradd -m -u 1000 herodb && \ + mkdir -p /data && \ + chown -R herodb:herodb /data + +WORKDIR /app + +# Copy binary from builder +COPY --from=builder /build/target/release/herodb /usr/local/bin/herodb + +# Switch to non-root user +USER herodb + +# Create volume mount point +VOLUME ["/data"] + +# Expose ports +EXPOSE 6379 8080 + +# Health check +HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \ + CMD timeout 2 bash -c ' + --dir /data + --port 6379 + --admin-secret ${ADMIN_SECRET} + --enable-rpc + --rpc-port 8080 + --enable-rpc-ipc + --rpc-ipc-path /tmp/herodb.ipc + healthcheck: + test: ["CMD", "timeout", "2", "bash", "-c", " + cargo run -- + --dir /data + --port 6379 + --admin-secret ${ADMIN_SECRET:-devsecret} + --enable-rpc + --rpc-port 8080 + --debug + stdin_open: true + tty: true + networks: + - herodb-network + + # Optional: Redis CLI for testing + redis-cli: + image: redis:7-alpine + container_name: herodb-cli + command: redis-cli -h herodb-prod -p 6379 + depends_on: + - herodb-prod + networks: + - herodb-network + profiles: + - tools + +volumes: + herodb-data: + driver: local + herodb-dev-data: + driver: local + herodb-ipc: + driver: local + cargo-cache: + driver: local + target-cache: + driver: local + +networks: + herodb-network: + driver: bridge \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index 2f004c2..e2b8141 100644 --- a/src/main.rs +++ b/src/main.rs @@ -65,7 +65,7 @@ async fn main() { // bind port let port = args.port.unwrap_or(6379); println!("will listen on port: {}", port); - let listener = TcpListener::bind(format!("127.0.0.1:{}", port)) + let listener = TcpListener::bind(format!("0.0.0.0:{}", port)) .await .unwrap(); @@ -110,7 +110,7 @@ async fn main() { // Start RPC server if enabled let _rpc_handle = if args.enable_rpc { - let rpc_addr = format!("127.0.0.1:{}", args.rpc_port).parse().unwrap(); + let rpc_addr = format!("0.0.0.0:{}", args.rpc_port).parse().unwrap(); let base_dir = args.dir.clone(); match rpc_server::start_rpc_server(rpc_addr, base_dir, backend.clone(), args.admin_secret.clone()).await {