diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..a31935e --- /dev/null +++ b/.dockerignore @@ -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/ diff --git a/.env.docker.example b/.env.docker.example new file mode 100644 index 0000000..ce3bbf4 --- /dev/null +++ b/.env.docker.example @@ -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 diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..d560fd9 --- /dev/null +++ b/Dockerfile @@ -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"] diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..d1b503c --- /dev/null +++ b/docker-compose.yml @@ -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