| # Docker Deployment | |
| > **Last Updated**: 2025-12-06 | |
| This guide covers deploying DeepBoner using Docker. | |
| ## Quick Start | |
| ```bash | |
| # Build the image | |
| docker build -t deepboner . | |
| # Run the container | |
| docker run -p 7860:7860 deepboner | |
| ``` | |
| Open http://localhost:7860 | |
| ## Dockerfile Overview | |
| The project uses a multi-stage approach: | |
| ```dockerfile | |
| FROM python:3.11-slim | |
| # Install system dependencies | |
| RUN apt-get update && apt-get install -y git curl | |
| # Install uv package manager | |
| RUN pip install uv==0.5.4 | |
| # Copy project files | |
| COPY pyproject.toml uv.lock src/ README.md . | |
| # Install runtime dependencies (no dev tools) | |
| RUN uv sync --frozen --no-dev --extra embeddings --extra magentic | |
| # Create non-root user | |
| RUN useradd --create-home appuser | |
| USER appuser | |
| # Pre-download embedding model | |
| RUN uv run python -c "from sentence_transformers import SentenceTransformer; SentenceTransformer('all-MiniLM-L6-v2')" | |
| # Expose port and run | |
| EXPOSE 7860 | |
| CMD ["uv", "run", "python", "-m", "src.app"] | |
| ``` | |
| ## Building | |
| ### Basic Build | |
| ```bash | |
| docker build -t deepboner . | |
| ``` | |
| ### With Build Arguments | |
| ```bash | |
| # Custom tag | |
| docker build -t deepboner:v0.1.0 . | |
| # No cache (clean build) | |
| docker build --no-cache -t deepboner . | |
| ``` | |
| ### Multi-Platform Build | |
| ```bash | |
| docker buildx build --platform linux/amd64,linux/arm64 -t deepboner . | |
| ``` | |
| ## Running | |
| ### Basic Run | |
| ```bash | |
| docker run -p 7860:7860 deepboner | |
| ``` | |
| ### With Environment Variables | |
| ```bash | |
| docker run -p 7860:7860 \ | |
| -e OPENAI_API_KEY=sk-your-key \ | |
| -e NCBI_API_KEY=your-ncbi-key \ | |
| -e LOG_LEVEL=INFO \ | |
| deepboner | |
| ``` | |
| ### Using .env File | |
| ```bash | |
| docker run -p 7860:7860 --env-file .env deepboner | |
| ``` | |
| ### With Persistent Storage | |
| ```bash | |
| # Persist ChromaDB data | |
| docker run -p 7860:7860 \ | |
| -v $(pwd)/data/chroma:/app/chroma_db \ | |
| deepboner | |
| ``` | |
| ### Detached Mode | |
| ```bash | |
| docker run -d -p 7860:7860 --name deepboner-app deepboner | |
| ``` | |
| ## Configuration | |
| ### Environment Variables | |
| | Variable | Description | Required | | |
| |----------|-------------|----------| | |
| | `OPENAI_API_KEY` | OpenAI API key (premium mode) | No | | |
| | `NCBI_API_KEY` | NCBI API key (higher rate limits) | No | | |
| | `HF_TOKEN` | HuggingFace token | No | | |
| | `LOG_LEVEL` | Logging level (DEBUG, INFO, WARNING, ERROR) | No | | |
| | `MAX_ITERATIONS` | Max search iterations (1-50) | No | | |
| ### Ports | |
| | Port | Service | | |
| |------|---------| | |
| | 7860 | Gradio UI + MCP Server | | |
| ### Volumes | |
| | Path | Purpose | | |
| |------|---------| | |
| | `/app/chroma_db` | ChromaDB vector store | | |
| | `/app/.cache` | HuggingFace model cache | | |
| ## Health Check | |
| The container includes a health check: | |
| ```dockerfile | |
| HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \ | |
| CMD curl -f http://localhost:7860/ || exit 1 | |
| ``` | |
| Check health status: | |
| ```bash | |
| docker inspect --format='{{.State.Health.Status}}' deepboner-app | |
| ``` | |
| ## Docker Compose | |
| Create `docker-compose.yml`: | |
| ```yaml | |
| version: '3.8' | |
| services: | |
| deepboner: | |
| build: . | |
| ports: | |
| - "7860:7860" | |
| environment: | |
| - LOG_LEVEL=INFO | |
| env_file: | |
| - .env | |
| volumes: | |
| - chroma_data:/app/chroma_db | |
| restart: unless-stopped | |
| healthcheck: | |
| test: ["CMD", "curl", "-f", "http://localhost:7860/"] | |
| interval: 30s | |
| timeout: 10s | |
| retries: 3 | |
| volumes: | |
| chroma_data: | |
| ``` | |
| Run with: | |
| ```bash | |
| docker-compose up -d | |
| ``` | |
| ## Production Considerations | |
| ### Resource Limits | |
| ```bash | |
| docker run -p 7860:7860 \ | |
| --memory=4g \ | |
| --cpus=2 \ | |
| deepboner | |
| ``` | |
| ### Logging | |
| ```bash | |
| # View logs | |
| docker logs deepboner-app | |
| # Follow logs | |
| docker logs -f deepboner-app | |
| # With timestamps | |
| docker logs -t deepboner-app | |
| ``` | |
| ### Security | |
| The container runs as non-root user (`appuser`): | |
| ```dockerfile | |
| RUN useradd --create-home appuser | |
| USER appuser | |
| ``` | |
| Do not: | |
| - Expose ports beyond 7860 | |
| - Mount sensitive host paths | |
| - Run as root in production | |
| ### Reverse Proxy | |
| For production, use a reverse proxy (nginx, traefik): | |
| ```nginx | |
| server { | |
| listen 80; | |
| server_name deepboner.example.com; | |
| location / { | |
| proxy_pass http://localhost:7860; | |
| proxy_http_version 1.1; | |
| proxy_set_header Upgrade $http_upgrade; | |
| proxy_set_header Connection "upgrade"; | |
| proxy_set_header Host $host; | |
| } | |
| } | |
| ``` | |
| ## Troubleshooting | |
| ### Container exits immediately | |
| Check logs: | |
| ```bash | |
| docker logs deepboner-app | |
| ``` | |
| Common causes: | |
| - Missing environment variables | |
| - Port conflict | |
| - Insufficient memory | |
| ### Slow startup | |
| First run downloads models. Pre-warm the cache: | |
| ```bash | |
| # Build includes model download | |
| docker build -t deepboner . | |
| ``` | |
| ### Out of memory | |
| Increase memory limit: | |
| ```bash | |
| docker run -p 7860:7860 --memory=8g deepboner | |
| ``` | |
| ### Cannot connect to port | |
| Check if port is in use: | |
| ```bash | |
| lsof -i :7860 | |
| ``` | |
| Use a different port: | |
| ```bash | |
| docker run -p 8080:7860 deepboner | |
| ``` | |
| ## Related Documentation | |
| - [HuggingFace Spaces Deployment](huggingface-spaces.md) | |
| - [MCP Integration](mcp-integration.md) | |
| - [Configuration Reference](../reference/configuration.md) | |