🎃 Add a Helm chart for self-hosted Kubernetes installs
メンテナーはふだん 1 日以内に返信
まだ誰も着手していません。
評価
- 難易度
- 4/5
- 見積もり時間
- 3〜5日
- 初心者へのやさしさ
- 40/100
- issue の種類
- 機能追加
- 明瞭さ
- 明確に書かれている
- 活発さ
- 活発
- 技術スタック
- docker, helm, kubernetes, nginx, postgresql
調査の方向性
Start with docker-compose.yml and start.sh for the environment variables and start modes, then Dockerfile:108-181 for the user, ports and healthcheck. Build the chart under deploy/helm/anythingmcp/ and check the probes against /health in health.controller.ts. Done when helm lint and helm template pass kubeconform -strict for both values files and the CI job is green. Claim the issue by comment first, since the issue suggests splitting the work.
索引モデルが issue の本文から書いたものです。
説明
Part of the October Challenge #997.
Why
Teams that run everything on Kubernetes cannot use docker compose up. Today they translate docker-compose.yml into manifests themselves and have to work out which paths go to which port, what the secrets must look like and how long the app needs to boot. A Helm chart is the usual way to install a self-hosted service on Kubernetes (n8n, Grafana and Keycloak ship one). The repository has no Helm or Kubernetes files, and the docs do not mention Kubernetes.
Self-hosted vs Cloud
- Self-hosted: a new install method for self-hosted instances, Community and Business alike. Licence and edition logic is unchanged and the chart says nothing about editions. The chart does not set
DEPLOYMENT_MODE, so instances stay self-hosted (docs/deployment.md:353). - Cloud (
DEPLOYMENT_MODE=cloud): not affected. AnythingMCP Cloud runs on Docker Compose with a blue/green release script (docker-compose.cloud.yml,deploy/cloud/release.sh), not on Kubernetes. Do not change anything underdeploy/cloud/or the compose files. - Who can use it: whoever operates the cluster. App roles are untouched: on a fresh install the first account registered becomes the admin of a new organization (
auth.controller.ts:490).
What to build
Chart at deploy/helm/anythingmcp/ with Chart.yaml (apiVersion v2, appVersion = the root package.json version, chart version starting at 0.1.0), a commented values.yaml, values.schema.json, templates/ and a README.md. No subchart dependencies.
- App Deployment:
- Image
helpcodeai/anythingmcp, tag defaulting toappVersion. Check the version tag format published on Docker Hub and never default tolatest. The image islinux/amd64only (docker-publish.yml:80); say so in the README. - Default command (
./start.sh, both processes in one pod; migrations run at start). Container ports3000(UI) and4000(API/MCP), oneServicewith both. replicaCount: 1. Document that more replicas need Redis (REDIS_URL) for shared rate limits, and sticky sessions ifMCP_STATEFUL_SESSIONSis enabled, because stateful MCP sessions live in process memory (mcp-servers/mcp-session.manager.ts).- Probes: a
startupProbeonGET /health:4000that allows at least 180 s (boot loads the whole catalog; the Dockerfile uses a 120 s start period,Dockerfile:168-178); readiness on/health; liveness on a TCP check of port 4000, because/healthalso checks the database (health.controller.ts:74-80) and a database outage should not restart the pod. securityContext:runAsNonRoot, uid/gid 1001 (Dockerfile:125,:164),allowPrivilegeEscalation: false, capabilities dropped; anemptyDirat/app/diagnostics(HEAP_SNAPSHOT_DIR,Dockerfile:154). If you can makereadOnlyRootFilesystem: truework with a fewemptyDirmounts, do it and list the paths; otherwise say what blocked it.- Resources with defaults, and
NODE_MAX_OLD_SPACE_MB(read bystart.sh) set below the memory limit.
- Image
- Configuration:
NODE_ENV=production,PORT=4000, andSERVER_URL,FRONTEND_URL,CORS_ORIGIN,NEXT_PUBLIC_API_URLall derived from onepublicUrlvalue (CORS_ORIGINis mandatory in production,main.ts:215-235).MCP_AUTH_MODE(defaultlegacy, as indocker-compose.yml),MCP_ALLOW_ANONYMOUS=false,ALLOW_OPEN_REGISTRATION=false, optionalREDIS_URL, plusextraEnv/extraEnvFromfor everything else (SMTP, KG LLM, SSO). - Secrets:
JWT_SECRET,ENCRYPTION_KEY,MCP_API_KEYand the database password, either fromexistingSecretor generated by the chart. Generated values must survivehelm upgrade(read the existing Secret withlookup, annotatehelm.sh/resource-policy: keep): a newENCRYPTION_KEYmakes every stored connector credential unreadable. At least 32 characters; the backend refuses placeholder-looking values (common/secrets.util.ts:48-66), sovalues.yamlmust not ship example secrets. - Database:
postgresql.enabled: true(default) deploys onepostgres:17-alpineStatefulSet with a PVC, for evaluation and small installs.externalDatabase.urlorexternalDatabase.existingSecretfor production, which disables the bundled one. - Ingress (disabled by default): one host; the backend paths to port 4000 and everything else to 3000. Use the same list as the Cloud Caddyfile (
deploy/cloud/Caddyfile:88-123):/api,/health,/mcp,/.well-known,/auth,/sso,/authorize,/callback,/token,/register,/userinfo. Explicit routing matters: the frontend's own rewrites to the backend are baked in at build time tohttp://localhost:4000(packages/frontend/next.config.ts:5, note indocker-compose.cloud.yml:209-214).ingressClassName, TLS and annotations come from values; document for ingress-nginxproxy-buffering: "off"and a read timeout of at least 120 s, because MCP responses can be streamed and tool calls can take a while. NOTES.txt: the URL, "open it and register the first user", and a reminder to back upENCRYPTION_KEYtogether with the database (docs/operations/backup-restore.md).- CI: a job in
.github/workflows/ci.ymlthat runshelm lint, andhelm templatepiped tokubeconform -strictfor the default values and for an external-database + ingress values file. Changes under.github/get extra review, so keep the workflow diff small. - Docs: a "Kubernetes (Helm)" section in
docs/deployment.mdafter "Production Deployment" (:159), linking the chart README.
Where to look
docker-compose.yml: the app's environment variables and defaults.start.sh:all/backend/frontendmodes, migrations at start,NODE_MAX_OLD_SPACE_MB.Dockerfile:108-181: runtime user, ports, diagnostics directory, healthcheck and why its start period is long.docs/deployment.md:202-246(path routing behind a proxy),:338-363(environment variables).deploy/cloud/Caddyfile:84-123: complete list of backend-owned paths.docker-compose.cloud.yml:203-216: why the frontend cannot proxy to a separate backend.packages/backend/src/common/secrets.util.ts: secret validation at startup.packages/backend/src/health/health.controller.ts:74-80: what/healthchecks.packages/backend/src/mcp-servers/mcp-session.manager.ts: in-memory stateful sessions.
Acceptance criteria
-
helm lintpasses;helm templateoutput for both values files passeskubeconform -strict. - On kind or minikube:
helm install→ pod Ready → UI reachable → first user registered → a connector created →tools/liston/mcp/<serverId>answers with an MCP API key (commands and output in the PR, secrets redacted). -
helm upgradewithout value changes keepsJWT_SECRETandENCRYPTION_KEY: after the upgrade, existing sessions stay valid and connector credentials still decrypt. - The pod runs as non-root; no secret value appears in a ConfigMap or in
values.yamldefaults. - The CI job is green;
docs/deployment.mdand the chart README are written.
Out of scope
- Publishing the chart (Helm repository, OCI registry, Artifact Hub): maintainers decide after merge.
- Separate Deployments for frontend and backend (
./start.sh backend|frontend), autoscaling, multi-replica support. - Bundling Redis or the MOTIS service used by the Deutsche Bahn connector.
- Operators, Kustomize, Terraform.
- Any change to
deploy/cloud/, the compose files or the Dockerfile.
Size
L (several days, may be split: app Deployment, Secret and external database first; bundled Postgres, Ingress and CI second).
How to claim
Comment "I'd like to work on this" and we'll assign you. Rules in #997.
- 主要言語
- TypeScript
- スター
- 856
- フォーク
- 82
- 平均マージ
- 8時間 27分
- マージ済み PR(30日)
- 104
環境構築
このプロジェクトには開発コンテナ、Dockerfile、コントリビューションガイドがありません。まず README を読み、一般的な手順ははじめてのコントリビューションガイドを参照してください。
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
HelpCode-ai/anythingmcp のほかの issue
-
good first issue hacktoberfest
難易度 2/5 半日 初心者へのやさしさ 70/100
HelpCode-ai/anythingmcp#996 ·
メンテナーはふだん 1 日以内に返信
-
good first issue hacktoberfest
難易度 2/5 半日 初心者へのやさしさ 72/100
HelpCode-ai/anythingmcp#995 ·
メンテナーはふだん 1 日以内に返信
-
enhancement good first issue hacktoberfest help wanted
難易度 2/5 1〜3時間 初心者へのやさしさ 78/100
HelpCode-ai/anythingmcp#982 ·
メンテナーはふだん 1 日以内に返信
-
good first issue hacktoberfest
難易度 2/5 1〜3時間 初心者へのやさしさ 88/100
HelpCode-ai/anythingmcp#745 ·
メンテナーはふだん 1 日以内に返信
-
🐣 Good first issue: contribute a new MCP adapter再び着手できるかも @7k777 が 21 日前に担当しましたが、オープン中のプルリクエストはありません。 オープンenhancement good first issue hacktoberfest help wanted
難易度 2/5 1〜3時間 初心者へのやさしさ 85/100
HelpCode-ai/anythingmcp#150 · コメント 18 件 ·
メンテナーはふだん 1 日以内に返信
HelpCode-ai/anythingmcp の issue をすべて見る
似ている issue
-
area:tui enhancement platform:macos
難易度 2/5 1〜3時間 初心者へのやさしさ 66/100
anthropics/claude-code#101490 ·
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 66/100
netlify/netlify-mcp#75 ·
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 78/100
atlassian-labs/compiled#1960 ·
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 75/100
pnp/cli-microsoft365#7639 ·
メンテナーはふだん 2 日以内に返信
-
nextjs-tracking
難易度 2/5 1〜3時間 初心者へのやさしさ 74/100
cloudflare/vinext#3887 ·
メンテナーはふだん 1 日以内に返信