Compare commits
1 Commits
perf_mem_t
...
docker
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9f7ebc6e57 |
62
Dockerfile
Normal file
62
Dockerfile
Normal file
@@ -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 '</dev/tcp/localhost/6379' || exit 1
|
||||||
|
|
||||||
|
# Default command
|
||||||
|
ENTRYPOINT ["herodb"]
|
||||||
|
CMD ["--dir", "/data", "--port", "6379", "--enable-rpc", "--rpc-port", "8080"]
|
||||||
30
Dockerfile.dev
Normal file
30
Dockerfile.dev
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
# Development Dockerfile with full toolchain
|
||||||
|
FROM rust:1.90
|
||||||
|
|
||||||
|
# Install development tools
|
||||||
|
RUN apt-get update && apt-get install -y \
|
||||||
|
pkg-config \
|
||||||
|
libssl-dev \
|
||||||
|
protobuf-compiler \
|
||||||
|
redis-tools \
|
||||||
|
netcat-openbsd \
|
||||||
|
curl \
|
||||||
|
vim \
|
||||||
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
|
# Install cargo tools for development
|
||||||
|
RUN cargo install cargo-watch cargo-edit
|
||||||
|
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
# Copy project files
|
||||||
|
COPY . .
|
||||||
|
|
||||||
|
# Pre-build dependencies (optional, for faster startup)
|
||||||
|
RUN cargo build
|
||||||
|
|
||||||
|
# Expose ports
|
||||||
|
EXPOSE 6379 8080
|
||||||
|
|
||||||
|
# Development command with hot reload
|
||||||
|
CMD ["cargo", "run", "--", "--dir", "/data", "--port", "6379", "--enable-rpc", "--rpc-port", "8080"]
|
||||||
16
README.md
16
README.md
@@ -22,6 +22,22 @@ The main purpose of HeroDB is to offer a lightweight, embeddable, and Redis-comp
|
|||||||
|
|
||||||
## Quick Start
|
## Quick Start
|
||||||
|
|
||||||
|
### Docker
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Production
|
||||||
|
docker-compose build herodb-prod
|
||||||
|
ADMIN_SECRET=your-secret docker-compoae up -d herodb-prod
|
||||||
|
|
||||||
|
# Development
|
||||||
|
docker-compose build herodb-dev
|
||||||
|
docker-compose up herodb-dev
|
||||||
|
```
|
||||||
|
|
||||||
|
Ports:
|
||||||
|
- Redis on 6379 (prod) / 6380 (dev)
|
||||||
|
- RPC on 8080 (prod) / 8081 (dev)
|
||||||
|
|
||||||
### Building HeroDB
|
### Building HeroDB
|
||||||
|
|
||||||
To build HeroDB, navigate to the project root and run:
|
To build HeroDB, navigate to the project root and run:
|
||||||
|
|||||||
91
docker-compose.yml
Normal file
91
docker-compose.yml
Normal file
@@ -0,0 +1,91 @@
|
|||||||
|
services:
|
||||||
|
# Production service
|
||||||
|
herodb-prod:
|
||||||
|
build:
|
||||||
|
context: .
|
||||||
|
dockerfile: Dockerfile
|
||||||
|
container_name: herodb-production
|
||||||
|
restart: unless-stopped
|
||||||
|
ports:
|
||||||
|
- "6379:6379"
|
||||||
|
- "8080:8080"
|
||||||
|
volumes:
|
||||||
|
- herodb-data:/data
|
||||||
|
# Optional: Unix socket for IPC
|
||||||
|
- herodb-ipc:/tmp
|
||||||
|
environment:
|
||||||
|
- RUST_LOG=${RUST_LOG:-info}
|
||||||
|
command: >
|
||||||
|
--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", "</dev/tcp/localhost/6379"]
|
||||||
|
interval: 30s
|
||||||
|
timeout: 3s
|
||||||
|
retries: 3
|
||||||
|
start_period: 5s
|
||||||
|
networks:
|
||||||
|
- herodb-network
|
||||||
|
|
||||||
|
# Development service
|
||||||
|
herodb-dev:
|
||||||
|
build:
|
||||||
|
context: .
|
||||||
|
dockerfile: Dockerfile.dev
|
||||||
|
container_name: herodb-development
|
||||||
|
ports:
|
||||||
|
- "6380:6379" # Different port to avoid conflicts
|
||||||
|
- "8081:8080"
|
||||||
|
volumes:
|
||||||
|
- ./:/app
|
||||||
|
- cargo-cache:/usr/local/cargo/registry
|
||||||
|
- target-cache:/app/target
|
||||||
|
- herodb-dev-data:/data
|
||||||
|
environment:
|
||||||
|
- RUST_LOG=debug
|
||||||
|
- RUST_BACKTRACE=1
|
||||||
|
command: >
|
||||||
|
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
|
||||||
@@ -65,7 +65,7 @@ async fn main() {
|
|||||||
// bind port
|
// bind port
|
||||||
let port = args.port.unwrap_or(6379);
|
let port = args.port.unwrap_or(6379);
|
||||||
println!("will listen on port: {}", port);
|
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
|
.await
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
@@ -110,7 +110,7 @@ async fn main() {
|
|||||||
|
|
||||||
// Start RPC server if enabled
|
// Start RPC server if enabled
|
||||||
let _rpc_handle = if args.enable_rpc {
|
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();
|
let base_dir = args.dir.clone();
|
||||||
|
|
||||||
match rpc_server::start_rpc_server(rpc_addr, base_dir, backend.clone(), args.admin_secret.clone()).await {
|
match rpc_server::start_rpc_server(rpc_addr, base_dir, backend.clone(), args.admin_secret.clone()).await {
|
||||||
|
|||||||
Reference in New Issue
Block a user