-
Notifications
You must be signed in to change notification settings - Fork 77
Add dev & production deployment setup #93
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Open
mguptahub
wants to merge
13
commits into
main
Choose a base branch
from
infra/add-docker-compose-dev
base: main
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Open
Changes from all commits
Commits
Show all changes
13 commits
Select commit
Hold shift + click to select a range
40cb303
Add docker-compose.yml for local development
mguptahub 67f3e94
Add deploy folder, production docker-compose, and README local dev docs
mguptahub cb0f380
Rename deploy/ to deployments/
mguptahub b68deb1
Add deployments/README.md with Docker Compose and Helm Chart (stub) docs
mguptahub af806f7
Replace Redis with Valkey; remove exposed Valkey port
mguptahub 99fa5dd
Fix Dockerfile: install uv via pip instead of ghcr.io multi-stage copy
mguptahub 7e3035f
Make OAuth provider optional in HTTP mode
mguptahub d9d503b
Revert "Make OAuth provider optional in HTTP mode"
mguptahub e141ef6
Fix dev docker-compose: use entrypoint override instead of command
mguptahub e2f661b
Document dummy OAuth values for local dev in .env.docker
mguptahub f99a536
Add Helm chart deployment docs to deployments/README.md
mguptahub d72e27f
updated as per CodeRabbit suggestions
mguptahub b8cbe12
implemented suggestion
mguptahub File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,28 @@ | ||
| # Plane MCP Server — Docker development environment template | ||
| # Copy this file to .env and fill in your values: | ||
| # cp .env.docker .env | ||
|
|
||
| # ------------------------------------------------------------------- | ||
| # Plane API | ||
| # ------------------------------------------------------------------- | ||
| PLANE_BASE_URL=https://api.plane.so | ||
|
|
||
| # Internal URL for server-to-server calls (optional; leave blank for cloud) | ||
| PLANE_INTERNAL_BASE_URL= | ||
|
|
||
| # ------------------------------------------------------------------- | ||
| # OAuth Provider (required for OAuth flow via /mcp) | ||
| # For local dev without OAuth, use dummy values below — the server will | ||
| # start and the header API-key endpoint (/http/api-key/mcp) will work. | ||
| # Real OAuth flow requires valid credentials from your Plane OAuth app. | ||
| # ------------------------------------------------------------------- | ||
| PLANE_OAUTH_PROVIDER_CLIENT_ID=dev | ||
| PLANE_OAUTH_PROVIDER_CLIENT_SECRET=dev | ||
| # Should match the public URL your MCP clients reach the server on | ||
| PLANE_OAUTH_PROVIDER_BASE_URL=http://localhost:8211 | ||
|
|
||
| # ------------------------------------------------------------------- | ||
| # Redis — set automatically by docker-compose; override only if needed | ||
| # ------------------------------------------------------------------- | ||
| # REDIS_HOST=redis | ||
| # REDIS_PORT=6379 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,167 @@ | ||
| # Plane MCP Server — Production Deployment | ||
|
|
||
| This folder contains production deployment configurations for the Plane MCP Server. | ||
|
|
||
| > **Note**: These setups use the published Docker image. For local development, see the [Local Development](../README.md#local-development) section in the root README. | ||
|
|
||
| --- | ||
|
|
||
| ## Option 1: Docker Compose | ||
|
|
||
| ### Prerequisites | ||
|
|
||
| - [Docker](https://docs.docker.com/get-docker/) and Docker Compose v2+ | ||
|
|
||
| ### Setup | ||
|
|
||
| ```bash | ||
| cd deployments | ||
|
|
||
| # 1. Edit variables.env with your values | ||
| # (fill in OAuth credentials and Plane API URL) | ||
| vi variables.env | ||
|
|
||
| # 2. Start the server | ||
| docker compose up -d | ||
|
|
||
| # 3. Check logs | ||
| docker compose logs -f mcp | ||
| ``` | ||
|
|
||
| ### Services | ||
|
|
||
| | Service | Port | Description | | ||
| |---------|------|-------------| | ||
| | `mcp` | `8211` | Plane MCP Server (HTTP mode) | | ||
| | `valkey` | — | Token storage for OAuth (internal only) | | ||
|
|
||
| ### Endpoints | ||
|
|
||
| | Endpoint | Auth | Description | | ||
| |----------|------|-------------| | ||
| | `http://<host>:8211/mcp` | OAuth | OAuth-based MCP endpoint | | ||
| | `http://<host>:8211/http/api-key/mcp` | PAT header | Personal Access Token endpoint | | ||
| | `http://<host>:8211/sse` | OAuth | Legacy SSE endpoint (deprecated) | | ||
|
|
||
| ### Configuration | ||
|
|
||
| All configuration is done via `variables.env`. Key variables: | ||
|
|
||
| | Variable | Required | Description | | ||
| |----------|----------|-------------| | ||
| | `APP_RELEASE_VERSION` | No | Image tag to deploy (default: `latest`) | | ||
| | `PLANE_BASE_URL` | No | Plane API URL (default: `https://api.plane.so`) | | ||
| | `PLANE_INTERNAL_BASE_URL` | No | Internal API URL for server-to-server calls | | ||
| | `PLANE_OAUTH_PROVIDER_CLIENT_ID` | Yes | OAuth client ID | | ||
| | `PLANE_OAUTH_PROVIDER_CLIENT_SECRET` | Yes | OAuth client secret | | ||
| | `PLANE_OAUTH_PROVIDER_BASE_URL` | Yes | Public URL the server is reachable on | | ||
|
|
||
| ### Upgrading | ||
|
|
||
| ```bash | ||
| # Pull the latest image and restart | ||
| docker compose pull | ||
| docker compose up -d | ||
| ``` | ||
|
|
||
| --- | ||
|
|
||
| ## Option 2: Helm Chart | ||
|
|
||
| ### Prerequisites | ||
|
|
||
| - Kubernetes cluster (v1.21+) | ||
| - [Helm](https://helm.sh/docs/intro/install/) v3+ | ||
| - An ingress controller (e.g. nginx) | ||
|
|
||
| ### Add the Helm Repository | ||
|
|
||
| ```bash | ||
| helm repo add plane https://helm.plane.so | ||
| helm repo update | ||
| ``` | ||
|
|
||
| ### Install | ||
|
|
||
| ```bash | ||
| helm install plane-mcp plane/plane-mcp-server \ | ||
| --namespace plane-mcp \ | ||
| --create-namespace \ | ||
| -f values.yaml | ||
| ``` | ||
|
|
||
| ### Minimal `values.yaml` | ||
|
|
||
| ```yaml | ||
| ingress: | ||
| enabled: true | ||
| host: mcp.yourdomain.com | ||
| ingressClass: nginx | ||
| ssl: | ||
| enabled: true | ||
| issuer: cloudflare # cloudflare | digitalocean | http | ||
| email: you@yourdomain.com | ||
|
|
||
| services: | ||
| api: | ||
| plane_base_url: 'https://api.plane.so' | ||
| plane_oauth: | ||
| enabled: true | ||
| client_id: '<your-oauth-client-id>' | ||
| client_secret: '<your-oauth-client-secret>' | ||
| provider_base_url: 'https://mcp.yourdomain.com' | ||
| ``` | ||
|
|
||
| ### Key Values | ||
|
|
||
| | Value | Default | Description | | ||
| |-------|---------|-------------| | ||
| | `dockerRegistry.default_tag` | `latest` | Image tag to deploy | | ||
| | `ingress.enabled` | `true` | Enable ingress | | ||
| | `ingress.host` | `mcp.example.com` | Public hostname | | ||
| | `ingress.ingressClass` | `nginx` | Ingress class name | | ||
| | `ingress.ssl.enabled` | `false` | Enable TLS via cert-manager | | ||
| | `ingress.ssl.issuer` | `cloudflare` | ACME issuer (`cloudflare`, `digitalocean`, `http`) | | ||
| | `services.api.replicas` | `1` | Number of MCP server replicas | | ||
| | `services.api.plane_base_url` | `''` | Plane API URL | | ||
| | `services.api.plane_oauth.enabled` | `false` | Enable OAuth endpoints | | ||
| | `services.api.plane_oauth.client_id` | `''` | OAuth client ID | | ||
| | `services.api.plane_oauth.client_secret` | `''` | OAuth client secret | | ||
| | `services.api.plane_oauth.provider_base_url` | `''` | Public URL the server is reachable on | | ||
| | `services.redis.local_setup` | `true` | Deploy Valkey in-cluster | | ||
| | `services.redis.external_redis_url` | `''` | External Valkey/Redis URL (if not using in-cluster) | | ||
| | `services.proxy.enabled` | `false` | Enable nginx proxy sidecar | | ||
|
|
||
| ### Upgrade | ||
|
|
||
| ```bash | ||
| helm upgrade plane-mcp plane/plane-mcp-server \ | ||
| --namespace plane-mcp \ | ||
| -f values.yaml | ||
| ``` | ||
|
|
||
| ### Uninstall | ||
|
|
||
| ```bash | ||
| helm uninstall plane-mcp --namespace plane-mcp | ||
| ``` | ||
|
|
||
| --- | ||
|
|
||
| ## Troubleshooting | ||
|
|
||
| **Server not starting?** | ||
| ```bash | ||
| docker compose logs mcp | ||
| ``` | ||
|
|
||
| **Valkey connection issues?** | ||
| ```bash | ||
| docker compose exec valkey valkey-cli ping | ||
| ``` | ||
|
|
||
| **Reset and start fresh:** | ||
| ```bash | ||
| docker compose down -v # removes Redis volume too | ||
| docker compose up -d | ||
| ``` |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,36 @@ | ||
| # Plane MCP Server — Production Deployment | ||
| # | ||
| # Setup: | ||
| # # edit variables.env with your values | ||
mguptahub marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| # docker compose up -d | ||
|
|
||
| name: plane-mcp | ||
|
|
||
| services: | ||
| mcp: | ||
| image: makeplane/plane-mcp-server:${APP_RELEASE_VERSION:-latest} | ||
| restart: always | ||
| ports: | ||
| - "8211:8211" | ||
| env_file: | ||
| - variables.env | ||
| environment: | ||
| REDIS_HOST: valkey | ||
| REDIS_PORT: "6379" | ||
| depends_on: | ||
| valkey: | ||
| condition: service_healthy | ||
|
|
||
| valkey: | ||
| image: valkey/valkey:8-alpine | ||
| restart: always | ||
| volumes: | ||
| - valkey-data:/data | ||
| healthcheck: | ||
| test: ["CMD", "valkey-cli", "ping"] | ||
| interval: 5s | ||
| timeout: 3s | ||
| retries: 5 | ||
|
|
||
| volumes: | ||
| valkey-data: | ||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,30 @@ | ||
| # Plane MCP Server — Production Environment Variables | ||
| # Edit this file with your values before running docker compose up | ||
|
|
||
| # ------------------------------------------------------------------- | ||
| # Release | ||
| # ------------------------------------------------------------------- | ||
| APP_RELEASE_VERSION=latest | ||
|
|
||
| # ------------------------------------------------------------------- | ||
| # Plane API | ||
| # ------------------------------------------------------------------- | ||
| PLANE_BASE_URL=https://api.plane.so | ||
|
|
||
| # Internal URL for server-to-server calls (optional) | ||
| # Use this if the MCP server and Plane API are on the same network | ||
| PLANE_INTERNAL_BASE_URL= | ||
|
|
||
| # ------------------------------------------------------------------- | ||
| # OAuth Provider (required for OAuth flow via /mcp) | ||
| # ------------------------------------------------------------------- | ||
| PLANE_OAUTH_PROVIDER_CLIENT_ID= | ||
| PLANE_OAUTH_PROVIDER_CLIENT_SECRET= | ||
| # Public URL your MCP clients reach the server on | ||
| PLANE_OAUTH_PROVIDER_BASE_URL=http://localhost:8211 | ||
|
|
||
| # ------------------------------------------------------------------- | ||
| # Redis — managed by docker-compose, override only if using external Redis | ||
| # ------------------------------------------------------------------- | ||
| # REDIS_HOST=redis | ||
| # REDIS_PORT=6379 |
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.