From a7a5b4e85c095b240d5c1a1d8930dd89cc1e4a39 Mon Sep 17 00:00:00 2001 From: wangliang Date: Fri, 23 Oct 2026 10:52:21 +0800 Subject: [PATCH] =?UTF-8?q?docs:=20=E8=AE=B0=E5=BD=95=20wangliang=20?= =?UTF-8?q?=E5=B7=A5=E4=BD=9C=E5=8C=BA=E9=83=A8=E7=BD=B2=EF=BC=88arm64=20?= =?UTF-8?q?=E9=95=9C=E5=83=8F=E3=80=81=E5=9F=9F=E5=90=8D=E5=8F=8D=E4=BB=A3?= =?UTF-8?q?=E3=80=81=E5=88=9D=E5=A7=8B=E5=8C=96=E4=B8=8E=E9=81=97=E7=95=99?= =?UTF-8?q?=E9=A1=B9=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/deploy-wangliang.md | 171 ++++++++++++++++++ .../screenshots/wangliang-libredesk-inbox.png | Bin 0 -> 32401 bytes .../wangliang-twenty-onboarding.png | Bin 0 -> 19885 bytes 3 files changed, 171 insertions(+) create mode 100644 docs/deploy-wangliang.md create mode 100644 docs/screenshots/wangliang-libredesk-inbox.png create mode 100644 docs/screenshots/wangliang-twenty-onboarding.png diff --git a/docs/deploy-wangliang.md b/docs/deploy-wangliang.md new file mode 100644 index 0000000..ac53152 --- /dev/null +++ b/docs/deploy-wangliang.md @@ -0,0 +1,171 @@ +# crm-ai 在 wangliang 工作区的部署记录 + +> 部署时间:2026-10-23 | 部署位置:`/data/dev/wangliang/crm-ai` | 代码版本:`main @ 1ae25f1` +> +> 本文件记录这套栈**实际跑成什么样**、和仓库默认配置差在哪、怎么运维、以及还缺哪些凭据。 +> 环境相关的临时信息写在这里,通用约定见 `/data/dev/_shared/NOTES.md`。 + +## 1. 交付摘要 + +一套自包含的客服 + CRM 栈(与仓库 `docker-compose.yml` 一致,Compose 项目名 `crm-new`): + +| 组件 | 容器 | 宿主端口 | 状态 | +|---|---|---|---| +| LibreDesk v2.9.0-rc.10(客服工作台 + 内置 AI) | `crmnew-libredesk` | `9000` | ✅ healthy | +| Twenty CRM v2.30.1(server) | `crmnew-twenty-server` | `3100` | ✅ healthy | +| Twenty worker | `crmnew-twenty-worker` | — | ✅ running | +| bridge(业务工具 / RPC 集成) | `crmnew-bridge` | `4100` | ✅ healthy | +| PostgreSQL 18 + pgvector | `crmnew-postgres` | `127.0.0.1:5440` | ✅ healthy | +| Redis 8.8 | `crmnew-redis` | `127.0.0.1:6390` | ✅ healthy | +| IMAP ID 注入代理(163 专用) | `crmnew-imap-proxy` | `127.0.0.1:1993` | ✅ running | + +数据卷:`crm-new_pg-data`、`crm-new_redis-data`、`crm-new_twenty-data`(`docker compose down` 不会删)。 + +## 2. 访问地址与账号 + +| 入口 | 地址 | 账号 | +|---|---|---| +| LibreDesk(工作台 / 帮助中心 / widget) | https://wangliang-crm.dev.gaia888.com | `System` /密码见下方命令 | +| Twenty CRM | https://wangliang-twenty.dev.gaia888.com | `admin@yehwang.com` /密码见下方命令 | +| bridge(调试/集成) | https://wangliang-crmbridge.dev.gaia888.com | 请求头 `X-Tools-Key`,值见下方命令 | + +```bash +cd /data/dev/wangliang/crm-ai +grep '^LIBREDESK_SYSTEM_USER_PASSWORD=' .env # LibreDesk System 密码 +grep '^TWENTY_ADMIN_PASSWORD=' .env # Twenty 管理员密码 +grep '^TOOLS_SHARED_KEY=' .env # bridge 工具密钥 +``` + +> 密钥只存在 `.env`(600)与 `libredesk/config/config.toml`(600),两者都已被 `.gitignore` 排除,**不要提交**。 + +## 3. 与仓库默认配置的差异(重要) + +| 项 | 仓库默认 | 本环境 | 原因 | +|---|---|---|---| +| `LIBREDESK_IMAGE` | `libredesk/libredesk:v2.9.0-rc.10` | `libredesk/libredesk:v2.9.0-rc.10-**arm64**` | 宿主是 ARM64,`v2.9.0-rc.10` 只有 amd64;官方另发了 `-arm64` 同版本 tag,实测原生 `linux/arm64` 运行 | +| `LIBREDESK_BASE_URL` | `http://localhost:9000` | `https://wangliang-crm.dev.gaia888.com` | 走宿主 nginx 的 HTTPS | +| `TWENTY_SERVER_URL` | `http://192.168.31.61:3100` | `https://wangliang-twenty.dev.gaia888.com` | 前端 `REACT_APP_SERVER_BASE_URL` 用的就是它(已核对页面内联配置) | +| `RECOMMEND_URL` | 测试服地址 | `jsonrpc://host.docker.internal:24503` | 用 **本工作区** 的 product-service(宿主 socat 24503 → 容器 9503) | +| `ORDER_API_URL` | 测试服地址 | `jsonrpc://host.docker.internal:24505` | trading-service(24505 → 9505) | +| `INVENTORY_API_URL` | 测试服地址 | `jsonrpc://host.docker.internal:24509` | eta-service(24509 → 9509) | +| `MEMBER_RPC_URL` | 测试服地址 | `jsonrpc://host.docker.internal:24506` | member-service(24506 → 9506) | +| `IDENTITY_DEV_MODE` | `false` | `true` | dev 环境方便 widget 联调;**上生产前改回 `false`** | +| `public-gateway` / `cloudflared` | compose 里默认启动 | **未启动** | 已有宿主 nginx 直出 HTTPS,不需要 Cloudflare 临时隧道 | + +`host.docker.internal` 由 compose 的 `extra_hosts` 注入,指向宿主;`24503-24509` 是本工作区的 RPC 宿主转发端口 +(见 `conf/dev/rpc-forward.sh`,cron 每分钟自愈)。 + +## 4. 已完成初始化 + +### LibreDesk +- `System` 账号可登录(浏览器实测落到 `/inboxes/assigned`)。 +- `app.root_url = https://wangliang-crm.dev.gaia888.com`(`scripts/set-public-url.js`)。 +- 10 个 bridge 工具已注册(`scripts/register-tools.js`):`search_products / search_orders / search_inventory / + search_kb / search_email_history / collect_info / send_verification_code / verify_email_code / handoff_to_human / + create_opportunity`。 +- 默认助理 `Yehwang Assistant`(#1,10 个工具、引用与 handoff 开启)。 +- Live chat Inbox `Website`(#1,uuid `ad25d7a4-722d-4561-aebf-9d8f60952d09`)。 +- Automation:新会话自动分配给助理(#1,enabled)。 + +### Twenty +- Workspace `Yehwang`:`2ff5a56b-95d8-40e1-85cf-529ad3a70ed7`(`ACTIVE`)。 +- API key 已生成并写入 `.env` 的 `TWENTY_API_KEY`;GraphQL `companies` 查询验证通过。 +- 浏览器实测可登录,首次进入 `/install-apps`(Twenty 的新工作区引导页,正常现象)。 + +### bridge +- `/healthz` 正常,10 个工具就绪。 +- 实测 `search_products` 直接命中**本工作区真实商品数据**(如 `Stainless Steel Y-Chain Necklace` / `$6.73` / + `product_id=11079`),说明 `host.docker.internal:24503` 的 JSONRPC 链路是通的。 +- `search_orders` 未验证身份时按设计返回 `verification_required`。 + +## 5. 运维命令 + +```bash +cd /data/dev/wangliang/crm-ai + +docker compose ps # 状态 +docker compose logs -f --tail=100 libredesk +docker compose logs -f --tail=100 twenty-server +docker compose logs -f --tail=100 bridge + +docker compose start # 启动已有容器 +docker compose stop # 停止(保留数据) +docker compose restart libredesk # 重启单个服务 + +# 改 .env 后(bridge 必做;libredesk 也要重建才会读到新 env) +docker compose up -d --force-recreate bridge +docker compose up -d --force-recreate libredesk + +# 改 LibreDesk 配置模板后 +node scripts/render-config.js && docker compose up -d --force-recreate libredesk + +# 备份(DB + Twenty 自带数据都在 PG 里;卷里是上传文件) +mkdir -p backups +docker exec crmnew-postgres pg_dump -U crmnew -Fc libredesk > backups/libredesk-$(date +%F).dump +docker exec crmnew-postgres pg_dump -U crmnew -Fc twenty > backups/twenty-$(date +%F).dump +docker exec crmnew-postgres pg_dump -U crmnew -Fc bridge > backups/bridge-$(date +%F).dump + +# 恢复 +docker exec -i crmnew-postgres pg_restore -U crmnew -d libredesk --clean --if-exists < backups/libredesk-YYYY-MM-DD.dump +``` + +所有容器都是 `restart: unless-stopped`,Docker 守护进程重启后会自己拉起来。 + +## 6. 域名反向代理 + +宿主 nginx 新增了**独立**配置文件 `/etc/nginx/conf.d/zz-wangliang-crm.conf`: + +- `wangliang-crm.dev.gaia888.com` → `127.0.0.1:9000` +- `wangliang-twenty.dev.gaia888.com` → `127.0.0.1:3100` +- `wangliang-crmbridge.dev.gaia888.com` → `127.0.0.1:4100` +- 80 → 308 跳 HTTPS;证书复用 `*.dev.gaia888.com`(通配一级域名,三个域名都被覆盖)。 + +它**没有改** `devstack.conf` 的 map/正则,因此不影响其它工作区。 + +改完后的自检 / 重载(query 用户没有 root,用容器代跑): + +```bash +docker run --rm --privileged --pid=host redis:7-alpine \ + sh -c 'nsenter -t 1 -m -u -i -n -p /usr/sbin/nginx -t' +docker run --rm --privileged --pid=host redis:7-alpine \ + sh -c 'nsenter -t 1 -m -u -i -n -p /usr/sbin/nginx -s reload' +``` + +回滚(只需删掉这个文件并 reload,其它站点不受影响): + +```bash +docker run --rm -v /etc/nginx/conf.d:/c redis:7-alpine rm -f /c/zz-wangliang-crm.conf +# 再执行上面的 nginx -t / -s reload +``` + +## 7. 尚未配置(需要真实凭据,不是代码问题) + +| 项 | 现状 | 补法 | +|---|---|---| +| **AI Provider(DashScope)** | `LLM_*` / `EMB_*` 为空,助理不会真正调模型 | `DASHSCOPE_API_KEY=sk-xxx node scripts/configure-ai.js`(需能访问 dashscope) | +| **SMTP / 163 邮件** | `SMTP_*` 为空,OTP 与邮件渠道不可用 | 填 `.env` 后 `node scripts/configure-email.js` + `node scripts/add-email-inbox.js` | +| **知识库 RAG(search_kb)** | 无 `RAG_PG_URL`,工具返回 503 | 指向旧 KB 库后运行 `scripts/import-kb-helpcenter.js` / `rebuild-kb-index.sh` | +| **WhatsApp 渠道** | 无 Meta 凭据 | 填 `WA_*` 后 `scripts/add-whatsapp-inbox.js`;需要公网回调(本栈已有 HTTPS,可不用 cloudflared) | +| **public-gateway / cloudflared** | 未启动 | 需要 Cloudflare 临时隧道时再 `docker compose up -d public-gateway cloudflared` | + +> `IDENTITY_DEV_MODE=true` 只适合 dev;上生产前改回 `false`。 + +## 8. 验证记录(2026-10-23) + +```text +$ curl -o /dev/null -w '%{http_code}' https://wangliang-crm.dev.gaia888.com/health # 200 +$ curl -o /dev/null -w '%{http_code}' https://wangliang-twenty.dev.gaia888.com/healthz # 200 +$ curl -o /dev/null -w '%{http_code}' https://wangliang-crmbridge.dev.gaia888.com/healthz # 200 +$ curl -s https://wangliang-crmbridge.dev.gaia888.com/healthz + {"ok":true,"service":"crm-tools","tools":[10 个],"sites":["www","us","eu"]} +$ curl -s -X POST http://127.0.0.1:4100/tools/search_products -H 'X-Tools-Key: …' -d '{"query":"stainless steel necklace"}' + {"ok":true,"products":[{"name":"Stainless Steel Y-Chain Necklace","price":"$6.73","product_id":11079}]} +``` + +浏览器(Playwright 真 Chrome,1440×900): + +- LibreDesk 登录成功 → `/inboxes/assigned`(截图 `docs/screenshots/wangliang-libredesk-inbox.png`) +- Twenty 登录成功 → `/install-apps` 引导页(截图 `docs/screenshots/wangliang-twenty-onboarding.png`) +- 回归:`wangliang-www` 仍 200,`wangliang-agent` 仍 302(宿主 nginx 未被改坏) + +资源占用:约 1.9 GB 内存(Twenty worker 约 1.0 GB + server 0.6 GB + PG/Redis/bridge/LibreDesk 约 0.3 GB)。 diff --git a/docs/screenshots/wangliang-libredesk-inbox.png b/docs/screenshots/wangliang-libredesk-inbox.png new file mode 100644 index 0000000000000000000000000000000000000000..eb77c98a73b50721b0b7dcf1571637d184eb1ba7 GIT binary patch literal 32401 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 literal 0 HcmV?d00001 diff --git a/docs/screenshots/wangliang-twenty-onboarding.png b/docs/screenshots/wangliang-twenty-onboarding.png new file mode 100644 index 0000000000000000000000000000000000000000..7447a769684d64ba0a2e1e0c99b0d77bae9b3bad GIT binary patch literal 19885 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