Files
plane-gptproto-integration/deploy/local/patches/README.md
T
carlandCursor 0136c15274 Initial commit: Plane 自部署与 gptproto AI 集成
包含本地/远程部署脚本、AI Agent 服务、Dashboard 与 QA 验证。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-21 11:37:41 +08:00

4.0 KiB

Plane v1.3.0 反遥测 / 反回拨补丁

设计原则: env-gated 开关,上游源码逻辑完整保留,不删任何代码,只新增 2 个 if 守卫。 升级 Plane 版本时,这种最小入侵的改动几乎不会冲突。

改了什么

只动一个文件:apps/api/plane/license/management/commands/register_instance.py,加 2 处守卫:

位置 改动 触发条件
check_for_latest_version() 函数首行 多了一个 if os.environ.get("DISABLE_GITHUB_VERSION_CHECK") == "1": return fallback_version 启动时阻止 GET api.github.com/repos/makeplane/plane/releases/latest
Instance.objects.create(...) 调用 is_telemetry_enabled 字段从硬编码 True 改为 is_telemetry_enabled=(os.environ.get("DISABLE_TELEMETRY") != "1") 新建 Instance 时,根据 env 决定 telemetry 默认开关

上游所有其他代码 100% 原样保留。包括:

  • tracer.py 整个文件不动 —— 它本身有 if instance.is_telemetry_enabled: 守卫,只要 DB flag 是 False,整个 OpenTelemetry 上报流程就不会执行
  • register_instance.py 的 try/except 流程、try/except 块、Instance.update() 分支等全都保留

env 开关速查 (.env / .env.template 已设)

开关 默认值 作用
DISABLE_TELEMETRY 1 新建 Instance 时 is_telemetry_enabled 置 False,tracer.instance_traces 内部的 if 守卫会跳过整个上报逻辑
DISABLE_GITHUB_VERSION_CHECK 1 启动时跳过 GitHub release 查询
OTLP_ENDPOINT http://127.0.0.1:1 防御纵深: 即使 telemetry 误开,exporter 也连不存在的本地端口
POSTHOG_API_KEY / POSTHOG_HOST (空) PostHog 事件追踪禁用 (上游默认就是空)
VITE_SESSION_RECORDER_KEY (空) Microsoft Clarity 前端会话录制禁用 (上游默认就是空)
IS_INTERCOM_ENABLED 0 Intercom 客服 widget 禁用
UNSPLASH_ACCESS_KEY (空) Unsplash 图搜索关闭

升级 Plane 时如何重新应用

补丁过的 register_instance.py 已经替换在 deploy/local/src/apps/api/plane/license/management/commands/register_instance.py。如果你跑了 pull-plane.sh 拉新版本,补丁会被覆盖。重新应用:

cd deploy/local/src
patch -p1 < ../patches/01-env-gated-register-instance.patch

只动 1 个文件 2 处,几乎不会冲突。若失败手动加这 2 个 if 守卫即可,锚点很好认。

同时 — docker-compose.override.yml 还做了一层"覆盖挂载"

override.yml 把上面这个 patched 文件通过 volumes: bind-mount 覆盖到上游预构建镜像 makeplane/plane-backend:v1.3.0 容器内的 /code/plane/license/management/commands/register_instance.py。

这是必须的:上游镜像是预编译的,host 上改了 src/ 文件不会自动进容器。bind-mount 是绕过这点的最轻量做法 —— 比 rebuild 整个 backend 镜像快 100 倍。

验证

部署后:

# (1) DB flag 应为 false
docker compose exec plane-db psql -U plane -d plane -c \
  "SELECT instance_id, is_telemetry_enabled FROM instances;"

# (2) 容器内补丁可见
docker compose exec api grep -n "LOCKDOWN" \
  /code/plane/license/management/commands/register_instance.py

# (3) 模拟跑函数,确认 env-gated 起效
docker compose exec api python manage.py shell -c "
from plane.license.management.commands.register_instance import Command
import os
c = Command()
# 当前 env DISABLE_GITHUB_VERSION_CHECK=1,应直接返回 fallback
print(c.check_for_latest_version('v1.3.0'))  # 期望: v1.3.0
"

没动什么

为避免影响上游构建/逻辑:

  • 没改 tracer.py、Plane model 定义、Django 数据迁移、celery 任务注册、UI 组件
  • 没移除 god-mode 里的 telemetry toggle (UI 还在,但即便管理员手贱开了它,因为 env 仍是 DISABLE_TELEMETRY=1,下次重启 register_instance 又把 DB flag 改回 False —— 重启即恢复 lockdown)
  • 没破坏 任何 import / 函数签名 / 类定义,可以正常 git diff、code review、覆盖测试