🎃 Add a Helm chart for self-hosted Kubernetes installs
维护者通常 1 天内回复
还没有人认领这个 Issue。
评估
- 难度
- 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
- 平均合并
- 6 小时 15 分钟
- 30 天内合并 PR
- 141
环境准备
这个项目没有提供开发容器、Dockerfile 或贡献指南,环境需要你自己搭建:先看它的 README,通用步骤见我们的新手贡献指南。
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
HelpCode-ai/anythingmcp 的其他 Issue
-
Docs: document all SMTP_* and other undocumented env vars for self-hosting可能已有人在做 关联的 PR 仍在进行中或已合并。 未关闭enhancement
难度 2/5 1-3 小时 新手友好度 82/100
HelpCode-ai/anythingmcp#1049 · 2 条评论 ·
维护者通常 1 天内回复
-
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 天内回复
查看 HelpCode-ai/anythingmcp 的全部 Issue
相似的 Issue
-
Add: VIVE TV未关闭approved check:passed streams:add
难度 1/5 1 小时以内 新手友好度 72/100
维护者通常 1 天内回复
-
bug needs-triage
难度 2/5 1-3 小时 新手友好度 62/100
Fission-AI/OpenSpec#2084 ·
维护者通常 2 天内回复
-
Contrib indemnité de départ à la retraite : faire le pont avec le simulateur sur la page générique未关闭P1
难度 2/5 1-3 小时 新手友好度 62/100
SocialGouv/code-du-travail-numerique#7561 ·
维护者通常 1 天内回复
-
beginner bug
难度 1/5 1 小时以内 新手友好度 88/100
hiero-ledger/hiero-sdk-js#4517 ·
维护者通常 1 天内回复
-
难度 2/5 1-3 小时 新手友好度 85/100
kubernetes-sigs/headlamp#7950 ·
维护者通常 3 天内回复