# Docker Deployment Implementation Plan > **For Claude:** REQUIRED SUB-SKILL: Use superpowers:executing-plans to implement this plan task-by-task. **Goal:** Package AI-Trader as a Docker container with docker-compose orchestration and automated CI/CD builds on release tags. **Architecture:** Single monolithic container running all MCP services and trading agent sequentially via entrypoint script. Environment variables injected via docker-compose. Price data fetched on startup. GitHub Actions builds and pushes images to ghcr.io on release tags. **Tech Stack:** Docker, Docker Compose, Bash, GitHub Actions, Python 3.10 --- ## Task 1: Create .dockerignore **Files:** - Create: `.dockerignore` **Step 1: Create .dockerignore file** Create `.dockerignore` in project root: ``` # Version control .git/ .gitignore # Python __pycache__/ *.py[cod] *$py.class *.so .Python venv/ env/ ENV/ .venv/ # IDE .vscode/ .idea/ *.swp *.swo # Environment and secrets .env .env.* !.env.example # Data files (fetched at runtime) data/*.json data/agent_data/ data/merged.jsonl data/merged_daily.jsonl data/merged_hour.jsonl # Logs logs/ *.log # Runtime state runtime_env.json .runtime_env.json # Documentation (not needed in image) docs/ !README.md # CI/CD .github/ # Git worktrees .worktrees/ # Test files test.py delete.py refresh_data.sh # Build artifacts build/ dist/ *.egg-info/ ``` **Step 2: Verify file excludes data and secrets** Run: `cat .dockerignore | grep -E "\.env|data/.*\.json|\.git"` Expected: Should show .env, data/*.json, .git/ lines **Step 3: Commit** ```bash git add .dockerignore git commit -m "Add .dockerignore for Docker builds Excludes git history, Python cache, secrets, and runtime data" ``` --- ## Task 2: Create Dockerfile **Files:** - Create: `Dockerfile` **Step 1: Create Dockerfile with multi-stage build** Create `Dockerfile` in project root: ```dockerfile # Base stage - dependency installation FROM python:3.10-slim as base WORKDIR /app # Install dependencies COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt # Application stage FROM base WORKDIR /app # Copy application code COPY . . # Create necessary directories RUN mkdir -p data logs data/agent_data # Make entrypoint executable RUN chmod +x entrypoint.sh # Expose MCP service ports and web dashboard EXPOSE 8000 8001 8002 8003 8888 # Set Python to run unbuffered for real-time logs ENV PYTHONUNBUFFERED=1 # Use entrypoint script ENTRYPOINT ["./entrypoint.sh"] CMD ["configs/default_config.json"] ``` **Step 2: Verify Dockerfile syntax** Run: `docker build --dry-run . 2>&1 | grep -i error || echo "Syntax OK"` Expected: "Syntax OK" (or no critical errors) **Step 3: Commit** ```bash git add Dockerfile git commit -m "Add Dockerfile for containerization Multi-stage build with Python 3.10-slim base Exposes MCP service ports and web dashboard Uses entrypoint.sh for sequential startup" ``` --- ## Task 3: Create entrypoint script **Files:** - Create: `entrypoint.sh` **Step 1: Create entrypoint.sh with sequential startup logic** Create `entrypoint.sh` in project root: ```bash #!/bin/bash set -e # Exit on any error echo "🚀 Starting AI-Trader..." # Step 1: Data preparation echo "📊 Fetching and merging price data..." cd /app/data python get_daily_price.py python merge_jsonl.py cd /app # Step 2: Start MCP services in background echo "🔧 Starting MCP services..." cd /app/agent_tools python start_mcp_services.py & MCP_PID=$! cd /app # Step 3: Wait for services to initialize echo "⏳ Waiting for MCP services to start..." sleep 3 # Step 4: Run trading agent with config file echo "🤖 Starting trading agent..." CONFIG_FILE="${1:-configs/default_config.json}" python main.py "$CONFIG_FILE" # Cleanup on exit trap "echo '🛑 Stopping MCP services...'; kill $MCP_PID 2>/dev/null; exit 0" EXIT SIGTERM SIGINT ``` **Step 2: Make script executable** Run: `chmod +x entrypoint.sh` Expected: No output **Step 3: Verify script has executable permissions** Run: `ls -la entrypoint.sh | grep -E "^-rwxr"` Expected: Shows executable permissions (x flags) **Step 4: Commit** ```bash git add entrypoint.sh git commit -m "Add entrypoint script for container startup Sequential execution: data fetch → MCP services → trading agent Handles graceful shutdown of background services Supports custom config file as argument" ``` --- ## Task 4: Create docker-compose.yml **Files:** - Create: `docker-compose.yml` **Step 1: Create docker-compose.yml with service definition** Create `docker-compose.yml` in project root: ```yaml version: '3.8' services: ai-trader: build: . container_name: ai-trader-app volumes: - ./data:/app/data - ./logs:/app/logs environment: # AI Model API Configuration - OPENAI_API_BASE=${OPENAI_API_BASE} - OPENAI_API_KEY=${OPENAI_API_KEY} # Data Source Configuration - ALPHAADVANTAGE_API_KEY=${ALPHAADVANTAGE_API_KEY} - JINA_API_KEY=${JINA_API_KEY} # System Configuration - RUNTIME_ENV_PATH=/app/data/runtime_env.json # MCP Service Ports - MATH_HTTP_PORT=${MATH_HTTP_PORT:-8000} - SEARCH_HTTP_PORT=${SEARCH_HTTP_PORT:-8001} - TRADE_HTTP_PORT=${TRADE_HTTP_PORT:-8002} - GETPRICE_HTTP_PORT=${GETPRICE_HTTP_PORT:-8003} # Agent Configuration - AGENT_MAX_STEP=${AGENT_MAX_STEP:-30} ports: - "8000:8000" - "8001:8001" - "8002:8002" - "8003:8003" - "8888:8888" restart: unless-stopped ``` **Step 2: Validate YAML syntax** Run: `docker-compose config 2>&1 | grep -i error || echo "YAML valid"` Expected: "YAML valid" (or docker-compose shows parsed config) **Step 3: Commit** ```bash git add docker-compose.yml git commit -m "Add docker-compose configuration Mounts data and logs volumes for persistence Injects environment variables from .env file Exposes all MCP service ports and web dashboard Auto-restart on failure" ``` --- ## Task 5: Update .env.example for Docker **Files:** - Modify: `.env.example` **Step 1: Read current .env.example** Run: `cat .env.example` Expected: Shows existing environment variable examples **Step 2: Add Docker-specific documentation to .env.example** Add these lines at the top of `.env.example` (or update existing variables): ```bash # ============================================================================= # AI-Trader Environment Configuration # ============================================================================= # Copy this file to .env and fill in your actual values # Docker Compose automatically reads .env from project root # AI Model API Configuration OPENAI_API_BASE=https://your-openai-proxy.com/v1 OPENAI_API_KEY=your_openai_key_here # Data Source Configuration ALPHAADVANTAGE_API_KEY=your_alphavantage_key_here JINA_API_KEY=your_jina_key_here # System Configuration (Docker default paths) RUNTIME_ENV_PATH=/app/data/runtime_env.json # MCP Service Ports (defaults shown) MATH_HTTP_PORT=8000 SEARCH_HTTP_PORT=8001 TRADE_HTTP_PORT=8002 GETPRICE_HTTP_PORT=8003 # Agent Configuration AGENT_MAX_STEP=30 ``` **Step 3: Verify .env.example has all required variables** Run: `grep -E "OPENAI_API_KEY|ALPHAADVANTAGE_API_KEY|JINA_API_KEY" .env.example` Expected: Shows all three API key variables **Step 4: Commit** ```bash git add .env.example git commit -m "Update .env.example with Docker configuration Add Docker-specific paths and documentation Include all required API keys and MCP ports Show default values for optional settings" ``` --- ## Task 6: Create Docker documentation **Files:** - Create: `docs/DOCKER.md` **Step 1: Create docs/DOCKER.md with comprehensive usage guide** Create `docs/DOCKER.md`: ```markdown # Docker Deployment Guide ## Quick Start ### Prerequisites - Docker Engine 20.10+ - Docker Compose 2.0+ - API keys for OpenAI, Alpha Vantage, and Jina AI ### First-Time Setup 1. **Clone repository:** ```bash git clone https://github.com/HKUDS/AI-Trader.git cd AI-Trader ``` 2. **Configure environment:** ```bash cp .env.example .env # Edit .env and add your API keys ``` 3. **Run with Docker Compose:** ```bash docker-compose up ``` That's it! The container will: - Fetch latest price data from Alpha Vantage - Start all MCP services - Run the trading agent with default configuration ## Configuration ### Environment Variables Edit `.env` file with your credentials: ```bash # Required OPENAI_API_KEY=sk-... ALPHAADVANTAGE_API_KEY=... JINA_API_KEY=... # Optional (defaults shown) MATH_HTTP_PORT=8000 SEARCH_HTTP_PORT=8001 TRADE_HTTP_PORT=8002 GETPRICE_HTTP_PORT=8003 AGENT_MAX_STEP=30 ``` ### Custom Trading Configuration Pass a custom config file: ```bash docker-compose run ai-trader configs/my_config.json ``` ## Usage Examples ### Run in foreground with logs ```bash docker-compose up ``` ### Run in background (detached) ```bash docker-compose up -d docker-compose logs -f # Follow logs ``` ### Run with custom config ```bash docker-compose run ai-trader configs/custom_config.json ``` ### Stop containers ```bash docker-compose down ``` ### Rebuild after code changes ```bash docker-compose build docker-compose up ``` ## Data Persistence ### Volume Mounts Docker Compose mounts two volumes: - `./data:/app/data` - Price data and trading records - `./logs:/app/logs` - MCP service logs Data persists across container restarts. To reset: ```bash docker-compose down rm -rf data/agent_data/* logs/* docker-compose up ``` ### Backup Trading Data ```bash # Backup tar -czf ai-trader-backup-$(date +%Y%m%d).tar.gz data/agent_data/ # Restore tar -xzf ai-trader-backup-YYYYMMDD.tar.gz ``` ## Using Pre-built Images ### Pull from GitHub Container Registry ```bash docker pull ghcr.io/hkuds/ai-trader:latest ``` ### Run without Docker Compose ```bash docker run --env-file .env \ -v $(pwd)/data:/app/data \ -v $(pwd)/logs:/app/logs \ -p 8000-8003:8000-8003 \ ghcr.io/hkuds/ai-trader:latest ``` ### Specific version ```bash docker pull ghcr.io/hkuds/ai-trader:v1.0.0 ``` ## Troubleshooting ### MCP Services Not Starting **Symptom:** Container exits immediately or errors about ports **Solutions:** - Check ports 8000-8003 not already in use: `lsof -i :8000-8003` - View container logs: `docker-compose logs` - Check MCP service logs: `cat logs/math.log` ### Missing API Keys **Symptom:** Errors about missing environment variables **Solutions:** - Verify `.env` file exists: `ls -la .env` - Check required variables set: `grep OPENAI_API_KEY .env` - Ensure `.env` in same directory as docker-compose.yml ### Data Fetch Failures **Symptom:** Container exits during data preparation step **Solutions:** - Verify Alpha Vantage API key valid - Check API rate limits (5 requests/minute for free tier) - View logs: `docker-compose logs | grep "Fetching and merging"` ### Permission Issues **Symptom:** Cannot write to data or logs directories **Solutions:** - Ensure directories writable: `chmod -R 755 data logs` - Check volume mount permissions - May need to create directories first: `mkdir -p data logs` ### Container Keeps Restarting **Symptom:** Container restarts repeatedly **Solutions:** - View logs to identify error: `docker-compose logs --tail=50` - Disable auto-restart: Comment out `restart: unless-stopped` in docker-compose.yml - Check if main.py exits with error ## Advanced Usage ### Override Entrypoint Run bash inside container for debugging: ```bash docker-compose run --entrypoint /bin/bash ai-trader ``` ### Build Multi-platform Images For ARM64 (Apple Silicon) and AMD64: ```bash docker buildx build --platform linux/amd64,linux/arm64 -t ai-trader . ``` ### View Container Resource Usage ```bash docker stats ai-trader-app ``` ### Access MCP Services Directly Services exposed on host: - Math: http://localhost:8000 - Search: http://localhost:8001 - Trade: http://localhost:8002 - Price: http://localhost:8003 ## Development Workflow ### Local Code Changes 1. Edit code in project root 2. Rebuild image: `docker-compose build` 3. Run updated container: `docker-compose up` ### Test Different Configurations ```bash # Create test config cp configs/default_config.json configs/test_config.json # Edit test_config.json # Run with test config docker-compose run ai-trader configs/test_config.json ``` ## Production Deployment For production use, consider: 1. **Use specific version tags** instead of `latest` 2. **External secrets management** (AWS Secrets Manager, etc.) 3. **Health checks** in docker-compose.yml 4. **Resource limits** (CPU/memory) 5. **Log aggregation** (ELK stack, CloudWatch) 6. **Orchestration** (Kubernetes, Docker Swarm) See design document in `docs/plans/2025-10-30-docker-deployment-design.md` for architecture details. ``` **Step 2: Verify markdown formatting** Run: `head -20 docs/DOCKER.md` Expected: Shows properly formatted markdown header **Step 3: Commit** ```bash git add docs/DOCKER.md git commit -m "Add Docker deployment documentation Comprehensive guide including: - Quick start instructions - Configuration options - Usage examples and volume persistence - Troubleshooting common issues - Pre-built image usage" ``` --- ## Task 7: Update main README with Docker section **Files:** - Modify: `README.md` **Step 1: Read current README to find insertion point** Run: `grep -n "## 🚀 Quick Start" README.md` Expected: Shows line number of Quick Start section **Step 2: Add Docker section after Quick Start** Insert this content after the "## 🚀 Quick Start" section (around line 210): ```markdown ## 🐳 Docker Deployment ### Using Docker Compose (Recommended) The easiest way to run AI-Trader is with Docker Compose: ```bash # 1. Clone and setup git clone https://github.com/HKUDS/AI-Trader.git cd AI-Trader # 2. Configure environment cp .env.example .env # Edit .env with your API keys: # - OPENAI_API_KEY # - ALPHAADVANTAGE_API_KEY # - JINA_API_KEY # 3. Run with Docker Compose docker-compose up ``` The container automatically: - Fetches latest NASDAQ 100 price data - Starts all MCP services - Runs AI trading agents ### Using Pre-built Images Pull and run pre-built images from GitHub Container Registry: ```bash # Pull latest version docker pull ghcr.io/hkuds/ai-trader:latest # Run container docker run --env-file .env \ -v $(pwd)/data:/app/data \ -v $(pwd)/logs:/app/logs \ ghcr.io/hkuds/ai-trader:latest ``` **📖 See [docs/DOCKER.md](docs/DOCKER.md) for detailed Docker usage, troubleshooting, and advanced configuration.** --- ``` **Step 3: Verify Docker section added** Run: `grep -A 5 "## 🐳 Docker Deployment" README.md` Expected: Shows the Docker section content **Step 4: Commit** ```bash git add README.md git commit -m "Add Docker deployment section to README Include quick start with Docker Compose Add pre-built image usage instructions Link to detailed Docker documentation" ``` --- ## Task 8: Create GitHub Actions workflow **Files:** - Create: `.github/workflows/docker-release.yml` **Step 1: Create .github/workflows directory** Run: `mkdir -p .github/workflows` Expected: No output **Step 2: Create docker-release.yml workflow** Create `.github/workflows/docker-release.yml`: ```yaml name: Build and Push Docker Image on: push: tags: - 'v*' # Triggers on v1.0.0, v2.1.3, etc. workflow_dispatch: # Manual trigger option jobs: build-and-push: runs-on: ubuntu-latest permissions: contents: read packages: write steps: - name: Checkout code uses: actions/checkout@v4 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - name: Login to GitHub Container Registry uses: docker/login-action@v3 with: registry: ghcr.io username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - name: Extract version from tag id: meta run: | VERSION=${GITHUB_REF#refs/tags/v} echo "version=$VERSION" >> $GITHUB_OUTPUT echo "Building version: $VERSION" - name: Build and push Docker image uses: docker/build-push-action@v5 with: context: . push: true tags: | ghcr.io/${{ github.repository_owner }}/ai-trader:${{ steps.meta.outputs.version }} ghcr.io/${{ github.repository_owner }}/ai-trader:latest cache-from: type=gha cache-to: type=gha,mode=max - name: Image published run: | echo "✅ Docker image published successfully!" echo "📦 Pull with: docker pull ghcr.io/${{ github.repository_owner }}/ai-trader:${{ steps.meta.outputs.version }}" echo "📦 Or latest: docker pull ghcr.io/${{ github.repository_owner }}/ai-trader:latest" ``` **Step 3: Verify YAML syntax** Run: `cat .github/workflows/docker-release.yml | grep -E "name:|on:|jobs:" | head -3` Expected: Shows workflow name, triggers, and jobs **Step 4: Commit** ```bash git add .github/workflows/docker-release.yml git commit -m "Add GitHub Actions workflow for Docker builds Triggers on release tags (v*) and manual dispatch Builds and pushes to GitHub Container Registry Tags with both version and latest Uses build caching for faster builds" ``` --- ## Task 9: Update CLAUDE.md with Docker commands **Files:** - Modify: `CLAUDE.md` **Step 1: Add Docker section to CLAUDE.md development commands** Insert after the "### Starting Services" section in CLAUDE.md: ```markdown ### Docker Deployment ```bash # Build Docker image docker-compose build # Run with Docker Compose docker-compose up # Run in background docker-compose up -d # Run with custom config docker-compose run ai-trader configs/my_config.json # View logs docker-compose logs -f # Stop and remove containers docker-compose down # Pull pre-built image docker pull ghcr.io/hkuds/ai-trader:latest # Test local Docker build docker build -t ai-trader-test . docker run --env-file .env -v $(pwd)/data:/app/data ai-trader-test ``` ### Releasing Docker Images ```bash # Create and push release tag git tag v1.0.0 git push origin v1.0.0 # GitHub Actions automatically: # 1. Builds Docker image # 2. Tags with version and latest # 3. Pushes to ghcr.io/hkuds/ai-trader # Verify build in Actions tab # https://github.com/HKUDS/AI-Trader/actions ``` ``` **Step 2: Verify Docker commands added** Run: `grep -A 10 "### Docker Deployment" CLAUDE.md` Expected: Shows Docker commands section **Step 3: Commit** ```bash git add CLAUDE.md git commit -m "Update CLAUDE.md with Docker commands Add Docker build and run commands Include release process for Docker images Document GitHub Actions automation" ``` --- ## Task 10: Test Docker build locally **Files:** - None (verification task) **Step 1: Build Docker image** Run: `docker-compose build` Expected: Build completes successfully, shows "Successfully built" and image ID **Step 2: Verify image created** Run: `docker images | grep ai-trader` Expected: Shows ai-trader image with size and creation time **Step 3: Test dry-run (without API keys)** Create minimal test .env: ```bash cat > .env.test << 'EOF' OPENAI_API_KEY=test ALPHAADVANTAGE_API_KEY=test JINA_API_KEY=test RUNTIME_ENV_PATH=/app/data/runtime_env.json EOF ``` Run: `docker-compose --env-file .env.test config` Expected: Shows parsed configuration without errors **Step 4: Document test results** Create file `docs/plans/docker-test-results.txt` with output from build **Step 5: Commit test documentation** ```bash git add docs/plans/docker-test-results.txt git commit -m "Add Docker build test results Local build verification completed successfully Image builds without errors Configuration parses correctly" ``` --- ## Task 11: Create release checklist documentation **Files:** - Create: `docs/RELEASING.md` **Step 1: Create release process documentation** Create `docs/RELEASING.md`: ```markdown # Release Process ## Creating a New Release ### 1. Prepare Release 1. Ensure `main` branch is stable and tests pass 2. Update version numbers if needed 3. Update CHANGELOG.md with release notes ### 2. Create Release Tag ```bash # Ensure on main branch git checkout main git pull origin main # Create annotated tag git tag -a v1.0.0 -m "Release v1.0.0: Docker deployment support" # Push tag to trigger CI/CD git push origin v1.0.0 ``` ### 3. GitHub Actions Automation Tag push automatically triggers `.github/workflows/docker-release.yml`: 1. ✅ Checks out code 2. ✅ Sets up Docker Buildx 3. ✅ Logs into GitHub Container Registry 4. ✅ Extracts version from tag 5. ✅ Builds Docker image with caching 6. ✅ Pushes to `ghcr.io/hkuds/ai-trader:VERSION` 7. ✅ Pushes to `ghcr.io/hkuds/ai-trader:latest` ### 4. Verify Build 1. Check GitHub Actions: https://github.com/HKUDS/AI-Trader/actions 2. Verify workflow completed successfully (green checkmark) 3. Check packages: https://github.com/HKUDS/AI-Trader/pkgs/container/ai-trader ### 5. Test Release ```bash # Pull released image docker pull ghcr.io/hkuds/ai-trader:v1.0.0 # Test run docker run --env-file .env \ -v $(pwd)/data:/app/data \ ghcr.io/hkuds/ai-trader:v1.0.0 ``` ### 6. Create GitHub Release (Optional) 1. Go to https://github.com/HKUDS/AI-Trader/releases/new 2. Select tag: `v1.0.0` 3. Release title: `v1.0.0 - Docker Deployment Support` 4. Add release notes: ```markdown ## 🐳 Docker Deployment This release adds full Docker support for easy deployment. ### Pull and Run ```bash docker pull ghcr.io/hkuds/ai-trader:v1.0.0 docker run --env-file .env -v $(pwd)/data:/app/data ghcr.io/hkuds/ai-trader:v1.0.0 ``` Or use Docker Compose: ```bash docker-compose up ``` See [docs/DOCKER.md](docs/DOCKER.md) for details. ### What's New - Docker containerization with single-container architecture - docker-compose.yml for easy orchestration - Automated CI/CD builds on release tags - Pre-built images on GitHub Container Registry ``` 5. Publish release ## Version Numbering Use Semantic Versioning (SEMVER): - `v1.0.0` - Major release (breaking changes) - `v1.1.0` - Minor release (new features, backward compatible) - `v1.1.1` - Patch release (bug fixes) ## Troubleshooting Releases ### Build Fails in GitHub Actions 1. Check Actions logs for error details 2. Test local build: `docker build .` 3. Fix issues and delete/recreate tag: ```bash # Delete tag git tag -d v1.0.0 git push origin :refs/tags/v1.0.0 # Recreate after fixes git tag v1.0.0 git push origin v1.0.0 ``` ### Image Not Appearing in Registry 1. Check Actions permissions (Settings → Actions → General) 2. Verify `packages: write` permission in workflow 3. Ensure `GITHUB_TOKEN` has registry access ### Wrong Version Tagged Delete and recreate: ```bash git tag -d v1.0.0 git push origin :refs/tags/v1.0.0 git tag v1.0.1 git push origin v1.0.1 ``` ## Manual Build and Push If automated build fails, manual push: ```bash # Build locally docker build -t ghcr.io/hkuds/ai-trader:v1.0.0 . # Login to GHCR echo $GITHUB_TOKEN | docker login ghcr.io -u USERNAME --password-stdin # Push docker push ghcr.io/hkuds/ai-trader:v1.0.0 docker tag ghcr.io/hkuds/ai-trader:v1.0.0 ghcr.io/hkuds/ai-trader:latest docker push ghcr.io/hkuds/ai-trader:latest ``` ``` **Step 2: Verify release documentation complete** Run: `grep -E "^## |^### " docs/RELEASING.md` Expected: Shows all section headers **Step 3: Commit** ```bash git add docs/RELEASING.md git commit -m "Add release process documentation Complete guide for creating releases: - Tag creation and push process - GitHub Actions automation workflow - Verification and testing steps - Troubleshooting common issues" ``` --- ## Task 12: Final validation and cleanup **Files:** - None (validation task) **Step 1: Verify all Docker files created** Run: ```bash ls -la Dockerfile docker-compose.yml .dockerignore entrypoint.sh .github/workflows/docker-release.yml ``` Expected: All files exist with correct permissions **Step 2: Verify documentation complete** Run: ```bash ls -la docs/DOCKER.md docs/RELEASING.md docs/plans/2025-10-30-docker-deployment-design.md ``` Expected: All documentation files exist **Step 3: Verify git status clean** Run: `git status` Expected: Shows "working tree clean" or only untracked .env files **Step 4: Review commit history** Run: `git log --oneline -15` Expected: Shows all 11+ commits from this implementation **Step 5: Create summary commit if needed** If any files uncommitted: ```bash git add -A git commit -m "Docker deployment implementation complete All components implemented: - Dockerfile with multi-stage build - docker-compose.yml with volume mounts - entrypoint.sh for sequential startup - GitHub Actions workflow for releases - Comprehensive documentation - .dockerignore for clean builds" ``` --- ## Testing Checklist Before merging to main: - [ ] Docker image builds successfully (`docker-compose build`) - [ ] Image size reasonable (<500MB for base image) - [ ] Container starts without errors (with test .env) - [ ] MCP services start in container - [ ] Volume mounts work (data/logs persist) - [ ] Custom config file can be passed - [ ] Documentation accurate and complete - [ ] GitHub Actions workflow syntax valid - [ ] .dockerignore excludes unnecessary files ## Post-Implementation After merging: 1. Create test tag to verify GitHub Actions: `git tag v0.1.0-test` 2. Monitor Actions build 3. Test pulling from ghcr.io 4. Update project README.md if needed 5. Announce Docker support to users --- **Implementation Complete!** All Docker deployment components created with comprehensive documentation and automated CI/CD.