Files
windyboy c0c975584a docs(plane): 自托管 Plane 落地事实入仓库 + plane-health runbook + hardening 草稿
记录源 Linear→Plane (2026-09-03 起, Plane MCP) + plane.chans.xyz 服务行/upstream 段;
inventory + hosts/synapse.chans.xyz.md 补 Plane 部署事实 (Helm plane-ce-1.8.0 / app v1.4.1,
ns plane, IngressRoute/自有证书 issuer/PVC 5+5Gi local-path/无备份层);
新增 runbooks/plane-health.md (只读健康检查) 与 docs/plane-hardening/ 草稿
(values.hardened.yaml、secrets.yaml.example 占位、backup/ CronJob), 均为未应用设计稿;
.gitignore 增加 .tmp-* agent 临时文件。
2026-09-13 19:12:32 +08:00
..

Plane CE 加固草稿(docs/plane-hardening/

状态:草稿,未应用、未提交。 对应追踪:Plane vps 项目条目(2026-09-03记录源Linear W1N-277 已取消,Linear 自 2026-09-03 起不再作为记录源)。 线上实例:plane.chans.xyzsynapse K3sns planerelease plane-app = chart plane-ce-1.8.0 / app v1.4.1)。 依据:2026-09-03 只读核查(13 条审查意见中 11 条属实、#3 基本属实、#9 指标归属错误)+ 上游 chart 模板逐条核对。

文件

文件 内容
values.hardened.yaml 可选硬化 valuesexternal secrets 引用、requireExplicitSecrets、minio pin、上传限额对齐);含 HTTP→HTTPS extraObjects 示例
secrets.yaml.example 6 组外部 Secret 结构占位(只含 key 名,真实值仅存宿主机)
backup/plane-backup.yaml PostgreSQL 备份 CronJobpg_dump -FchostPath /var/backups/planeMinIO 已按实际用量剔除)
backup/README.md 备份方案说明(排程/容量/保留/还原/阻塞)

应用顺序(每步先 diff 后执行,全部需用户逐项确认)

现在就值得做:DB 备份(P0,见 backup/

plane-backup.yaml 部署 + 手动触发验证一次即可;88 MB 库每日快照几乎零成本。

可选(顺手做一次,不是必须)

  • Phase A 密钥外部化(零行为变化、无停机,约 15 分钟):按 secrets.yaml.example 在宿主机建 6 个 Secret(值先复制当前集群),用 values.hardened.yamlhelm diff upgradehelm upgrade;验证后删除 chart 生成的旧 Secret。 价值:默认密钥不再落在 chart 公开常量上,作为保险。
  • MCP API Key 轮换:若审查对话出过你的环境,Plane 后台重生成 + 更新 /home/windy/plane-k3s/mcp/mcp.env0600+ 重启 Cursor MCP。
  • /god-mode IP 白名单:若在意管理后台被公网爆破。chart 1.8.0 的 IngressRoute 不支持给单条路由追加 middleware → 需 post-renderer 或 upgrade 后 kubectl patch (升级会覆盖,需固化);源 IP 清单待提供。

明确暂缓/跳过(个人单节点,等出现症状再处理)

  • SECRET_KEY 等轮换(Phase B):等真要配 SMTP/OAuth 前再做(避免旧密文不可解)。
  • NetworkPolicy、有状态组件 resources limitschart 无 values 开关,需 post-render/patch)、 HTTP→HTTPS(草稿已给 extraObjects 示例)、metrics-server/Sentry。

关键限制(chart 1.8.0 模板已核对)

  • external_secrets.*_existingSecret 设置后,对应 Secret 必须包含模板所需全部 key (缺失不自动补),见 secrets.yaml.example 注释。
  • app_keys_existingSecret 的 envFrom 在所有 workload 上最后注入(后置生效), 保证 app/live 共享密钥一致——不要在其后再放同名 key 的 Secret。
  • DATABASE_URL/AMQP_URL/REDIS_URL 是 chart 生成的派生 URL,内嵌明文密码; 外部化后轮换 DB/队列密码时必须同步更新 plane-app-env
  • minio 的 MINIO_ROOT_*AWS_* 同源于一个 Secret;升级时 bucket Job 会重跑 (需 admin 权限凭据)——换 svcacct 前先确认权限覆盖该 Job。