Create Docker deployment infrastructure

This commit provides production-ready Docker deployment for the HTTP MCP wrapper.

Components:
- Dockerfile: Multi-stage build for optimized image size
  - Builder stage: Compiles dependencies and installs packages
  - Production stage: Minimal runtime image with only necessary files
  - Python 3.11 slim base image
  - Health check endpoint integration
  - Proper Python environment variables (unbuffered, no bytecode)

- docker-compose.yml: Complete orchestration setup
  - Service configuration with restart policy
  - Port mapping (8000:8000)
  - Environment variable passthrough
  - Health check configuration
  - Isolated network
  - Ready for production deployment

- .dockerignore: Optimized build context
  - Excludes Python cache, virtual environments, IDE files
  - Excludes tests and documentation
  - Reduces image size and build time

- .env.docker.example: Docker-specific environment template
  - All required Gitea configuration
  - Optional authentication settings
  - Optional tool filtering settings

Deployment:
1. Copy .env.docker.example to .env
2. Fill in Gitea credentials
3. Run: docker-compose up -d
4. Access at http://localhost:8000

This infrastructure enables easy deployment to any Docker-compatible environment (local, cloud, Kubernetes).

Closes #15

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-02-03 16:10:06 -05:00
parent eb7e97c967
commit 1733600876
4 changed files with 183 additions and 0 deletions

67
.dockerignore Normal file
View File

@@ -0,0 +1,67 @@
# Python
__pycache__/
*.py[cod]
*$py.class
*.so
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
*.egg-info/
.installed.cfg
*.egg
MANIFEST
*.coverage
.pytest_cache/
.mypy_cache/
.ruff_cache/
# Virtual environments
venv/
env/
ENV/
.venv/
# IDE
.vscode/
.idea/
*.swp
*.swo
*~
# Git
.git/
.gitignore
.gitattributes
# Documentation
*.md
docs/
# CI/CD
.github/
.gitlab-ci.yml
# Environment files
.env
.env.*
!.env.example
# Claude Code
.claude/
# Docker
.dockerignore
docker-compose.override.yml
# Test files
tests/

19
.env.docker.example Normal file
View File

@@ -0,0 +1,19 @@
# Docker Compose Environment Variables
# Copy this file to .env and fill in your values
# Gitea Configuration (REQUIRED)
GITEA_URL=https://gitea.example.com
GITEA_TOKEN=your_gitea_api_token_here
GITEA_OWNER=your_username_or_org
GITEA_REPO=your_repo_name
# Authentication Configuration (OPTIONAL)
# Uncomment to enable Bearer token authentication
# AUTH_TOKEN=your_bearer_token_here
# Tool Filtering Configuration (OPTIONAL)
# Uncomment to enable specific tools only (whitelist mode)
# ENABLED_TOOLS=list_issues,create_issue,update_issue,list_labels
# Uncomment to disable specific tools (blacklist mode)
# DISABLED_TOOLS=delete_issue,close_milestone

54
Dockerfile Normal file
View File

@@ -0,0 +1,54 @@
# Gitea HTTP MCP Wrapper Dockerfile
# Multi-stage build for optimized image size
FROM python:3.11-slim as builder
# Set working directory
WORKDIR /build
# Install build dependencies
RUN apt-get update && \
apt-get install -y --no-install-recommends \
gcc \
&& rm -rf /var/lib/apt/lists/*
# Copy requirements first for better caching
COPY requirements.txt .
RUN pip install --user --no-cache-dir -r requirements.txt
# Copy source code
COPY pyproject.toml .
COPY src/ src/
# Install package
RUN pip install --user --no-cache-dir -e .
# Production stage
FROM python:3.11-slim
# Set working directory
WORKDIR /app
# Copy installed packages from builder
COPY --from=builder /root/.local /root/.local
# Copy source code
COPY src/ src/
COPY pyproject.toml .
# Make sure scripts in .local are usable
ENV PATH=/root/.local/bin:$PATH
# Set Python environment variables
ENV PYTHONUNBUFFERED=1
ENV PYTHONDONTWRITEBYTECODE=1
# Expose default port
EXPOSE 8000
# Health check
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
CMD python -c "import urllib.request; urllib.request.urlopen('http://localhost:8000/health').read()"
# Run the HTTP MCP server
CMD ["gitea-http-wrapper"]

43
docker-compose.yml Normal file
View File

@@ -0,0 +1,43 @@
version: '3.8'
services:
gitea-mcp-wrapper:
build:
context: .
dockerfile: Dockerfile
image: gitea-mcp-wrapper:latest
container_name: gitea-mcp-wrapper
restart: unless-stopped
ports:
- "8000:8000"
environment:
# Gitea Configuration
- GITEA_URL=${GITEA_URL}
- GITEA_TOKEN=${GITEA_TOKEN}
- GITEA_OWNER=${GITEA_OWNER}
- GITEA_REPO=${GITEA_REPO}
# HTTP Server Configuration
- HTTP_HOST=0.0.0.0
- HTTP_PORT=8000
# Authentication (Optional)
- AUTH_TOKEN=${AUTH_TOKEN:-}
# Tool Filtering (Optional)
- ENABLED_TOOLS=${ENABLED_TOOLS:-}
- DISABLED_TOOLS=${DISABLED_TOOLS:-}
healthcheck:
test: ["CMD", "python", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:8000/health').read()"]
interval: 30s
timeout: 3s
retries: 3
start_period: 5s
networks:
- gitea-mcp-network
networks:
gitea-mcp-network:
driver: bridge