# baoyu-workbench-ops — deploy cdn

### ✅ 国内远程访问正解：反向隧道 frp（Mac 主动出站）

出站流量国内不受限，所以让 Mac 跑 frpc **主动连出**到一台国内服务器（腾讯云轻量/CVM）跑 frps，把 8765 映射到国内公网 IP。销售员访问服务器公网 IP，不依赖 ts.net。

- 架构：Mac `frpc` → 出站 → 服务器 `frps`(7000 控制端口) → 暴露 8765 到公网
- 服务器：轻量应用服务器（广州/2核2G/Ubuntu），约 ¥30-40/月
- Mac 不关机则隧道常年在线；frpc 用 launchd 开机自启
- **frp 二进制 GitHub 被墙**，下载走镜像：`https://ghfast.top/https://github.com/fatedier/frp/releases/download/v0.71.0/frp_0.71.0_darwin_arm64.tar.gz`（Linux 服务器侧用 `linux_amd64`，也可从 Mac scp 上传）
- 版本 v0.71.0 用 TOML 配置（frpc.toml / frps.toml），token 鉴权；本机 arm64
- HTTPS/混合内容：CloudBase(HTTPS) 调 CVM(HTTP) 会被浏览器拦，需域名+SSL 或让 CVM 同时托管前端（同源）

完整落地配方（frps/frpc/Caddy 配置、systemd/launchd、Lighthouse 防火墙、SSH ubuntu 用户、GitHub 镜像下载等）→ `references/frp-tunnel-deployment.md`

## 角色体系（2026-07-29）

| 角色 | role值 | 数据范围 | 编辑/管理 | 改密 |
|------|--------|---------|----------|------|
| 管理员 | `admin` | 全公司 | ✅ | ✅ |
| 总经理 | `gm` | 全公司（只读） | ❌ | ❌ |
| 销售员 | `sales` | 仅自己名下 | ❌ | ✅ |
| 经理 | `manager` | 部门范围 | ❌ | ❌ |

**gm 实现**：`isFullView()` = `role==='admin'||role==='gm'` 应用到所有数据可见性判断。改密按钮 `display:none`，`finishLogin()` 中仅 `role==='admin'` 显示。

**添加 gm 用户**：CloudBase `user_roles` 添加 `{role:'gm', ...}` → 若飞书搜索不到该用户（权限范围限制），用本地页面 `工具/add_xxx.html` 初始化。部署后 `tcb hosting deploy`。

## 柱状图标注规范

客户透视横向柱状图：名称+数值分两行紧跟柱子右侧（`x=w+6`，`y=10`/`y=22`），避免窄柱截断数字。禁止数值放柱内（`x=w-6 text-anchor=end`）。

## 安全加固（2026-07-29）

| 措施 | 说明 |
|------|------|
| App Secret 不暴露前端 | 飞书免登 OAuth 走服务端 `/api/feishu/auth`（Funnel 代理）|
| 登录防暴力破解 | 每邮箱每小时最多 5 次失败，成功清零 |
| CloudBase user_roles 写权限 | `auth.openid == doc._openid` 仅文档创建者可写 |

详见 `references/security-audit-20260729.md`。

<!-- 已合并到上方 KPI + 顺丰管线 Pitfalls (2026-07-30 更新) -->
## KPI + 顺丰管线 Pitfalls（2026-07-30/08-01）

| P | 症状 | 根因 | 修复 |
|---|------|------|------|
| P15 | MQL查不到销售员 | 销售员是角色(`role_7dd6e0`)非字段 | `get_workitem_brief(fields=['role_7dd6e0'])` |
| P16 | 顺丰批量仅首条通过 | **SF API只校验第一个单号**，批量查询中后续单号全拒 | 逐条查询 `sf_query_routes([tn],...)` |
| P17 | kpi_progress部署后KPI不变 | 工作台读workbench_data内嵌kpiProgress | `merge_workbench_data.py`后部署 |
| P18 | 本地数据≠CloudBase | 手动部署遗漏 | `cb_sync_data.sh` + `check_sync.py` |
| P19 | total_h2_actual只取单月 | `mcp_kpi_pipeline.py:115` 用month_idx索引 | 改用`person.h2_actual`累计 |
| P20 | H2图表月份错位 | 前端`h2Actuals: [current,0,…]` | 从`threeYearMonthly`按月份索引 |
| P21 | 累计达成缺历史H2月 | `fullYearTax=H1+prog.total` | 无筛选时用`dash.total_h1_h2` |
| P22 | cb_sync漏kpi_dashboard | 只同步kpi_progress | 加入`cb_sync_data.sh` |

**完整级联故障分析（2026-08-07）** → `references/dashboard-data-consistency-cascade.md`

详见：
- `references/sf-pipeline-debug.md` — 顺丰调试全记录
- `references/kpi-pipeline.md` — KPI管线+业务线分拆

## 决策链批量导入（Feishu Excel → JSON · 2026-07-29）

飞书「客户导出」Excel含决策链URL列。导入：`read_file` 读xlsx → 解析TAB分隔行 → 批量更新 `_key_customers.json` + `customer_360.json` → `tcb hosting deploy`。

已完成62家（102条飞书记录→匹配444家ERP客户）。URL格式：`https://i16l6v9noru.feishu.cn/wiki/...` 或 `/docx/...`。

## 顺丰物流管道

见 `references/sf-logistics-pipeline.md`。
