diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..8d1781d --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,161 @@ +networks: + mcpnet: + driver: bridge + +services: + + gateway: + build: + context: ./gateway-proxy + dockerfile: Dockerfile + container_name: mcp-gateway + restart: unless-stopped + ports: + - "${GATEWAY_PORT:-4444}:4444" + volumes: + - gateway-data:/data + environment: + - PORT=4444 + - OAUTH_ISSUER_URL=${OAUTH_ISSUER_URL} + - OAUTH_PASSWORD=${OAUTH_PASSWORD} + - OAUTH_ACCESS_TOKEN_TTL=${OAUTH_ACCESS_TOKEN_TTL:-3600} + - OAUTH_REFRESH_TOKEN_TTL=${OAUTH_REFRESH_TOKEN_TTL:-2592000} + - MCP_BACKEND_ERPNEXT=http://mcp-erpnext:32802/mcp + - MCP_BACKEND_TRUENAS=http://mcp-truenas:8100/mcp + - MCP_BACKEND_HOMEASSISTANT=http://mcp-homeassistant:8200/mcp + - MCP_BACKEND_WAVE=http://mcp-wave:8300/mcp + - MCP_BACKEND_LINKEDIN=http://mcp-linkedin:8500/mcp + - MCP_BACKEND_FORGEJO=http://mcp-forgejo:8400/mcp + - GATEWAY_STATIC_API_KEY=${GATEWAY_STATIC_API_KEY} + depends_on: + - erpnext-mcp + - truenas-mcp + - homeassistant-mcp + - wave-mcp + - linkedin-mcp + - forgejo-mcp + networks: [mcpnet] + healthcheck: + test: ["CMD", "python3", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:4444/health', timeout=5)"] + interval: 15s + timeout: 5s + start_period: 15s + retries: 3 + + erpnext-mcp: + build: + context: ./erpnext-mcp + dockerfile: Dockerfile + container_name: mcp-erpnext + restart: unless-stopped + environment: + - TRANSPORT=http + - PORT=32802 + - ERPNEXT_URL=${ERPNEXT_URL} + - ERPNEXT_API_KEY=${ERPNEXT_API_KEY} + - ERPNEXT_API_SECRET=${ERPNEXT_API_SECRET} + networks: [mcpnet] + healthcheck: + test: ["CMD", "wget", "-qO-", "http://localhost:32802/health"] + interval: 30s + timeout: 5s + start_period: 15s + retries: 3 + + truenas-mcp: + build: + context: ./truenas-mcp + dockerfile: Dockerfile + container_name: mcp-truenas + restart: unless-stopped + environment: + - TRUENAS_URL=${TRUENAS_URL} + - TRUENAS_API_KEY=${TRUENAS_API_KEY} + - PORT=8100 + networks: [mcpnet] + healthcheck: + test: ["CMD", "python3", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:8100/mcp', timeout=5)"] + interval: 30s + timeout: 5s + start_period: 15s + retries: 3 + + homeassistant-mcp: + build: + context: ./homeassistant-mcp + dockerfile: Dockerfile + container_name: mcp-homeassistant + restart: unless-stopped + environment: + - HASS_URL=${HASS_URL} + - HASS_TOKEN=${HASS_TOKEN} + - PORT=8200 + networks: [mcpnet] + healthcheck: + test: ["CMD", "python3", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:8200/mcp', timeout=5)"] + interval: 30s + timeout: 5s + start_period: 15s + retries: 3 + + wave-mcp: + build: + context: ./wave-mcp + dockerfile: Dockerfile + container_name: mcp-wave + restart: unless-stopped + environment: + - TRANSPORT=http + - PORT=8300 + - WAVE_ACCESS_TOKEN=${WAVE_ACCESS_TOKEN} + networks: [mcpnet] + healthcheck: + test: ["CMD", "wget", "-qO-", "http://localhost:8300/health"] + interval: 30s + timeout: 5s + start_period: 15s + retries: 3 + + linkedin-mcp: + build: + context: ./linkedin-mcp + dockerfile: Dockerfile + container_name: mcp-linkedin + restart: unless-stopped + environment: + - PORT=8500 + - LINKEDIN_CLIENT_ID=${LINKEDIN_CLIENT_ID} + - LINKEDIN_CLIENT_SECRET=${LINKEDIN_CLIENT_SECRET} + - LINKEDIN_REDIRECT_URI=${LINKEDIN_REDIRECT_URI} + volumes: + - linkedin-data:/data + networks: [mcpnet] + healthcheck: + test: ["CMD", "python3", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:8500/health', timeout=5)"] + interval: 30s + timeout: 5s + start_period: 10s + retries: 3 + + forgejo-mcp: + build: + context: ./forgejo-mcp + dockerfile: Dockerfile + container_name: mcp-forgejo + restart: unless-stopped + environment: + - TRANSPORT=http + - PORT=8400 + - FORGEJO_URL=${FORGEJO_URL:-https://forge.wilddragon.net} + - FORGEJO_ACCESS_TOKEN=${FORGEJO_ACCESS_TOKEN:-9b80e9ea5e1d1955585fab22fb86e740951940b4} + networks: [mcpnet] + healthcheck: + test: ["CMD", "python3", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:8400/mcp', timeout=5)"] + interval: 30s + timeout: 5s + start_period: 15s + retries: 3 + +volumes: + gateway-data: + linkedin-data: