TeamMapper 0.4.0 配置参数详解

TeamMapper 0.4.0 全部 44 个环境变量与三层 settings JSON 的默认值、生效方式逐项详解,含协作限流参数与生产配置模板。

TeamMapperTeamMapperDocker2026/11/02

TeamMapper 0.4.0 配置参数详解

目标:把 TeamMapper 0.4.0 的全部配置面——环境变量、三层 settings JSON、功能开关、协作限流参数——逐项讲清默认值与影响,并给出生产配置模板。所有默认值取自官方 docker-compose-prod.yml、.env.default 与后端 config.service.ts/yjsLimits.ts 源码(仓库 main 分支,查询日期 2026-11-02),生效行为在 Ubuntu 26.04 实测环境逐项验证。

一、环境信息

  • 部署形态:Docker Compose(ghcr.io/b310-digital/teammapper:latest + postgres:15-alpine),端口 8144,部署步骤见本专栏《TeamMapper 0.4.0 Docker Compose 部署指南》
  • 后端:NestJS,配置读取入口 teammapper-backend/src/config.service.ts
  • 配置文件:镜像内置 config/settings.prod.json(75 行)+ 可挂载 settings.override.json
  • 实测验证方式:GET /api/settings 返回体、应用重启后行为对照

二、前置条件

  • 已完成 Compose 部署且服务健康:
curl -s -o /dev/null -w 'HTTP %{http_code}\n' http://127.0.0.1:8144/
HTTP 200
  • 已获取源码或可查官方文档(参数含义以源码为准):
git clone --depth 1 https://github.com/b310-digital/teammapper.git

三、参数查看与修改方式

TeamMapper 配置分两个通道,修改方式与生效条件不同:

通道位置修改方式生效条件
环境变量compose environment:改 compose 文件docker compose up -d 重建容器
settings JSON镜像内 settings.prod.json改源码重新构建镜像重建镜像
settings 覆盖挂载 ./config/settings.override.json → 容器 /home/node/app/teammapper/config/settings.override.json直接编辑宿主机 JSONdocker compose restart app_prod

查看当前生效的系统/用户设置(前端初始化时也调它):

curl -s http://127.0.0.1:8144/api/settings

实测返回节选(完整结构见 systemSettings + userSettings 两段):

{
  "systemSettings": {
    "info": { "name": "TeamMapper", "version": "0.1.9", "aiModel": null },
    "urls": {
      "pictogramApiUrl": "/arasaac/api/pictograms",
      "pictogramStaticUrl": "/arasaac/images/pictograms"
    },
    "featureFlags": { "pictograms": false, "ai": false, "arrows": false }
  },
  "userSettings": {
    "general": { "language": "en", "darkMode": false, "displayName": "" },
    "mapOptions": {
      "centerOnResize": false, "autoBranchColors": true, "showLinktext": false,
      "branchStyle": "tapered", "fontMaxSize": 70, "fontMinSize": 15, "fontIncrement": 5,
      "defaultNode": { "...": "节点默认颜色/字体/图片" }
    }
  }
}

💡 说明:info.version 显示 0.1.9 是镜像内 package.json 字段未随 release tag 同步的上游事实,不代表部署的是 0.1.9 版;版本以 release tag(v0.4.0-1)与镜像 digest 为准。

settings.override.json 覆盖生效实测:写入 systemSettings.urls.imprintUrl 后重启,/api/settings 即返回该值:

cat > config/settings.override.json <<'EOF'
{
  "systemSettings": {
    "urls": {
      "imprintUrl": "http://127.0.0.1:8144/imprint",
      "privacyUrl": "http://127.0.0.1:8144/privacy"
    }
  }
}
EOF
docker compose restart app_prod
curl -s http://127.0.0.1:8144/api/settings | python3 -c "import sys,json;d=json.load(sys.stdin);print('imprintUrl:',d['systemSettings']['urls'].get('imprintUrl'))"
imprintUrl: http://127.0.0.1:8144/imprint

四、参数总览

后端源码(config.service.ts 读取 process.env)实际消费的环境变量共 44 个,按域归类:

域变量
运行模式MODE PORT BINDING LOG_LEVEL WS_TRUST_PROXY
数据库POSTGRES_HOST/PORT/DATABASE/USER/PASSWORD POSTGRES_SSL POSTGRES_SSL_REJECT_UNAUTHORIZED POSTGRES_QUERY_TIMEOUT POSTGRES_STATEMENT_TIMEOUT
保留与清理DELETE_AFTER_DAYS
安全凭据JWT_SECRET
功能开关AI_ENABLED FEATURE_ARROWS FEATURE_YJS_RATE_LIMITING
法务链接IMPRINT_URL PRIVACY_URL
图标代理PICTOGRAM_API_URL PICTOGRAM_IMAGES_URL
AI/LLMAI_LLM_URL AI_LLM_TOKEN AI_LLM_PROVIDER AI_LLM_MODEL AI_LLM_RPM AI_LLM_TPM AI_LLM_TPD AI_LLM_MAX_OUTPUT_TOKENS AI_LLM_TIMEOUT_MS
图片上传UPLOAD_IMAGE_MAX_SIZE_BYTES UPLOAD_IMAGE_RATE_LIMIT UPLOAD_IMAGE_RATE_WINDOW_MS MAX_IMAGE_BYTES_PER_MAP
导图复制DUPLICATE_MAP_RATE_LIMIT DUPLICATE_MAP_RATE_WINDOW_MS DUPLICATE_MAP_MAX_IMAGE_BYTES
WS 连接限制WS_GLOBAL_MAX_CONNECTIONS WS_PER_IP_MAX_CONNECTIONS WS_PER_IP_RATE_LIMIT WS_PER_IP_RATE_WINDOW_MS
Yjs 消息限流YJS_MESSAGE_WINDOW_MS YJS_MESSAGE_MAX_COUNT YJS_MESSAGE_MAX_BYTES YJS_MAP_MAX_BYTES YJS_MAP_MAX_ENTRIES YJS_MAP_MAX_NODES

五、核心参数分类详解

5.1 运行模式与数据库连接

参数默认值说明
MODEDEV(prod compose)PROD 时加载 settings.prod.json;官方 .env.default 注释:PROD 建议数据库支持 SSL,没有则用 DEV。实测 MODE=PROD + POSTGRES_SSL=false 可正常跑(Quick Start 官方形态)
PORT3000后端监听端口,容器内保持默认,宿主映射改 compose ports
POSTGRES_SSLprod compose 默认 true内网 compose 自连可置 false
POSTGRES_SSL_REJECT_UNAUTHORIZEDfalse允许自签证书;用受信证书后置 true
POSTGRES_QUERY_TIMEOUT / POSTGRES_STATEMENT_TIMEOUT100000(毫秒)库侧超时,防慢查询拖垮协作持久化
LOG_LEVELdebug(DEV)/ log(其他)NestJS 级别 error/warn/log/debug/verbose;排障协作断连时临时调 debug
WS_TRUST_PROXY未设置于反向代理后且需要按真实客户端 IP 做 WS 限流时开启
JWT_SECRET空person_id cookie 的 HMAC 签名密钥。不设则「我的导图」列表恒为空——实测无 cookie/未签名请求:curl -s http://127.0.0.1:8144/api/maps 返回 []

5.2 保留期与清理

参数默认值说明
DELETE_AFTER_DAYS30建图时计算 deletedAt = 建图时间 + N 天(实测响应 "deleteAfterDays": 30, "deletedAt": "2026-12-02T06:46:47.788Z")。每日 cron 任务 prod:data:maps:cleanup 删除到期图;带正确 x-map-modification-secret 头的 GET 会重置计时(源码:仅 writable 才 updateLastAccessed,防爬虫续命)

5.3 功能开关(feature flags)

三个开关控制前端功能可见性,/api/settings 的 featureFlags 段实测返回 {"pictograms": false, "ai": false, "arrows": false}:

开关默认开启方式效果
pictograms关仅构建期 JSON(README 明确:must set before build time)后端代理 /arasaac/api、/arasaac/images 到 ARASAAC 图标库;关闭时不挂路由
ai关AI_ENABLED=true 环境变量首页出现 AI 生成导图入口,后端 /api/mermaid/create 生效
arrows关FEATURE_ARROWS=true显示「连接两节点为箭头」按钮与 alt+a 快捷键;关闭时图照常保存/导出箭头数据

FEATURE_YJS_RATE_LIMITING:是否启用 Yjs 消息限流(配合下节参数排障用)。

5.4 协作与限流参数(Yjs/WebSocket 网关)

网关对「每连接」「每图」「每 IP」三层限额(源码 yjsLimits.ts/config.service.ts 实测核对):

参数默认值说明
YJS_MESSAGE_WINDOW_MS10000限流滑动窗口
YJS_MESSAGE_MAX_COUNT100窗口内每连接/每图共享的 sync 消息条数上限,超限连接被 1008 关闭
YJS_MESSAGE_MAX_BYTES5242880(5 MiB)窗口内字节上限
YJS_MAP_MAX_BYTES5242880单图编码后总大小上限(超限即拒绝并重置该图同步状态)
YJS_MAP_MAX_ENTRIES100000单图 Y.Doc 条目数上限
YJS_MAP_MAX_NODES10000单图节点数上限
maxArrows10000(无环境变量)源码注释:持久化单条 insert 每行 3 个绑定参数,受 Postgres 65535 参数上限约束,故意不开放调大
WS_GLOBAL_MAX_CONNECTIONS500网关全局 WS 连接数
WS_PER_IP_MAX_CONNECTIONS50每 IP 并发连接
WS_PER_IP_RATE_LIMIT / WINDOW_MS10 / 10000每 IP 连接频率(防握手风暴)

💡 说明:单条 WS 消息硬上限 1 MiB(WS_MAX_PAYLOAD,源码常量,不可配);导图典型 sync 消息 1–50 KB,正常协作不会触碰限流线,仅防滥用。

5.5 图片与导图复制限额

参数默认值说明
UPLOAD_IMAGE_MAX_SIZE_BYTES150000单张上传图片大小(POST /api/maps/:id/images)
UPLOAD_IMAGE_RATE_LIMIT / WINDOW_MS30 / 60000每窗口上传次数
MAX_IMAGE_BYTES_PER_MAP2000000单图图片总预算
DUPLICATE_MAP_RATE_LIMIT / WINDOW_MS5 / 60000匿名「复制导图」接口频控(POST /api/maps/:id/duplicate)
DUPLICATE_MAP_MAX_IMAGE_BYTES1000000000复制时允许携带的图片总量

5.6 AI/LLM 参数

AI_ENABLED=true 后生效,对接 OpenAI 兼容接口:AI_LLM_URL(接口地址)、AI_LLM_TOKEN(API Key,用 ${VAR} 注入勿明文)、AI_LLM_PROVIDER/AI_LLM_MODEL、AI_LLM_RPM/TPM/TPD(每分钟/每日请求与 token 配额)、AI_LLM_MAX_OUTPUT_TOKENS、AI_LLM_TIMEOUT_MS。未配置时 /api/settings 的 info.aiModel 为 null(实测)。

5.7 userSettings(前端用户默认值)

settings.*.json 的 userSettings 段是前端初始默认(语言、暗色模式、分支样式 tapered、字号区间 15–70、步长 5、新节点/根节点默认颜色字体)。定位:系统设置(systemSettings)由后端下发、前端不缓存;用户设置(userSettings)用户在前端改后存浏览器本地,覆盖系统默认。改 override 文件只影响新访客的初始值。

六、生产配置模板

适用场景:16GB 内存 / 50GB SSD 单机、部门级协作(≤50 并发编辑者)、数据不出内网:

    environment:
      MODE: PROD
      BINDING: "0.0.0.0"
      POSTGRES_HOST: postgres_prod
      POSTGRES_PORT: 5432
      POSTGRES_DATABASE: teammapper-db
      POSTGRES_USER: teammapper-user
      POSTGRES_PASSWORD: q1w2e3r4
      POSTGRES_SSL: "false"
      POSTGRES_QUERY_TIMEOUT: 100000
      POSTGRES_STATEMENT_TIMEOUT: 100000
      DELETE_AFTER_DAYS: 365          # 内网知识资产不按 30 天清理
      LOG_LEVEL: warn
      JWT_SECRET: tm-jwt-9f3a7c2e5b8d1460   # 生产请换 32 字节随机串并用 ${VAR} 注入
      WS_GLOBAL_MAX_CONNECTIONS: 200
      YJS_MAP_MAX_BYTES: 8388608      # 大图团队放宽到 8 MiB

要点:DELETE_AFTER_DAYS 按数据主权策略定;JWT_SECRET 必须设否则「我的导图」不可用;对外发布务必配反向代理 TLS(官方 docs/deployment.md 有 Nginx 示例)。

七、常见问题

Q1:改了 settings.override.json 没生效? 该文件只在启动时读取,需 docker compose restart app_prod;并确认挂载路径是 /home/node/app/teammapper/config/settings.override.json(本文《TeamMapper 0.4.0 Docker Compose 部署指南》已挂载)。挂载前宿主机文件不存在会被挂成目录(见《TeamMapper 0.4.0 Docker Compose 部署指南》第十章 Q3)。

Q2:pictograms 图标开关为什么没有环境变量? 官方 README 明确该 flag 必须 build-time 写进 JSON(关闭时后端根本不挂代理路由),运行期改不了。

Q3:协作时连接被 1008 关闭? 触发 YJS_MESSAGE_* 限流(窗口 10s 内 >100 条 sync 消息或 >5 MiB)。多人拖拽大图的极端场景可放宽 YJS_MESSAGE_MAX_COUNT/YJS_MESSAGE_MAX_BYTES,或临时 LOG_LEVEL=debug 观察被拒消息。

Q4:想禁用匿名复制导图的滥用? 调低 DUPLICATE_MAP_RATE_LIMIT(默认每分钟 5 次);该端点自带 Throttle 守卫,无需改代码。

Q5:数据库连接池/超时如何影响协作? 持久化走防抖写库,POSTGRES_*_TIMEOUT 过小会导致大图保存失败进而触发图重置;保持默认 100000ms 即可。

八、参考链接