From bad319c57acb37c90ca956f2d4305c7708492460 Mon Sep 17 00:00:00 2001 From: wangliang Date: Fri, 30 Oct 2026 14:04:37 +0800 Subject: [PATCH] =?UTF-8?q?docs(deploy):=20=E8=AE=B0=E5=BD=95=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=E6=9C=8D=E9=83=A8=E7=BD=B2=E4=B8=8E=E5=AE=9E=E4=BE=8B?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E5=8F=98=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 21 +++++- deploy/testspace/docker-compose.yml | 106 ++++++++++++++++++++++++++++ docs/testspace-config-changes.md | 40 +++++++++++ 3 files changed, 166 insertions(+), 1 deletion(-) create mode 100644 deploy/testspace/docker-compose.yml create mode 100644 docs/testspace-config-changes.md diff --git a/README.md b/README.md index 9d4c16a..3ec1c53 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,26 @@ 按官方文档 [docs.libredesk.io/getting-started/installation](https://docs.libredesk.io/getting-started/installation) 的 Docker 方式部署的独立实例, 与本机 `crm-new` 项目里那套 LibreDesk 完全隔离(独立容器、独立数据卷、独立端口)。 -## 访问 +## 两套环境 + +| 环境 | 访问地址 | 位置 | 说明 | +| --- | --- | --- | --- | +| 开发(本机) | https://192.168.31.61:9443 | 本机 `libredesk/` | 自签证书 TLS 容器,日常开发/验证 | +| 测试(测试服) | https://wangliang-crm.dev.gaia888.com | `47.76.223.252:/data/dev/wangliang/libredesk` | 共享测试,宿主 nginx 提供 TLS | + +### 测试服实例要点(2026-10-29 迁移部署) + +- 目标机 ARM64,镜像 `libredesk/libredesk:v2.9.1`(多架构,自动取 arm64)。 +- **无 tls 容器**:宿主 nginx 已有 `wangliang-crm.dev.gaia888.com → 127.0.0.1:9000` 的 server 块,TLS 由 letsencrypt 证书提供。 +- 端口:app `9000`(`0.0.0.0`)、db `127.0.0.1:5440`、redis `127.0.0.1:6390`、bridge-tools `127.0.0.1:4100`。 +- bridge-tools 额外接入 `spug-net`,RPC 全部指向 wangliang 空间:`jsonrpc://wangliang-dev:9503/9505/9509/9506`。 +- 数据从本机迁移(`pg_dump` 恢复),`encryption_key` 与本机一致;`app.root_url` 已改为测试服域名。 +- 旧 `crm-ai`(`crmnew-*`)栈已下线,数据卷 `crm-new_pg-data` / `crm-new_redis-data` / `crm-new_twenty-data` 保留。 +- 运维:`ssh yw-dev` 后 `cd /data/dev/wangliang/libredesk && docker compose ps|logs|restart`。 +- 测试服版 compose 见 `deploy/testspace/docker-compose.yml`(与本仓库 `docker-compose.yml` 的差异即上述几项); + 实例配置变更(trusted_domains / widget 文案 / AI 问候规则)见 [docs/testspace-config-changes.md](docs/testspace-config-changes.md)。 + +## 访问(本机开发实例) | 项 | 值 | | --- | --- | diff --git a/deploy/testspace/docker-compose.yml b/deploy/testspace/docker-compose.yml new file mode 100644 index 0000000..f831970 --- /dev/null +++ b/deploy/testspace/docker-compose.yml @@ -0,0 +1,106 @@ +# LibreDesk 测试服实例(/data/dev/wangliang/libredesk,47.76.223.252 ARM64) +# 入口:宿主 nginx https://wangliang-crm.dev.gaia888.com -> 127.0.0.1:9000 +# 与仓库 docker-compose.yml(本机版)差异: +# - 无 tls 容器(宿主 nginx 提供 HTTPS/WSS) +# - app 直接绑宿主 9000,db/redis 端口沿用旧 crm-new 约定(5440/6390) +# - bridge-tools 接入 spug-net,直连 wangliang-dev:9503/9505/9506/9509 +# - 镜像多架构,ARM64 自动取 arm64 variant +services: + # Libredesk app + app: + image: ${LIBREDESK_IMAGE:-libredesk/libredesk:v2.9.1} + container_name: libredesk_app + restart: unless-stopped + ports: + - "9000:9000" + environment: + # 首次启动时设置 System 用户密码(已有数据库时为幂等空操作) + LIBREDESK_SYSTEM_USER_PASSWORD: ${LIBREDESK_SYSTEM_USER_PASSWORD:-} + healthcheck: + test: ["CMD-SHELL", "wget -q -O /dev/null http://127.0.0.1:9000/health || exit 1"] + interval: 30s + timeout: 5s + retries: 3 + start_period: 30s + networks: + - libredesk + depends_on: + - db + - redis + volumes: + - ./uploads:/libredesk/uploads:rw + - ./config.toml:/libredesk/config.toml:ro + command: [sh, -c, "./libredesk --install --idempotent-install --yes --config /libredesk/config.toml && ./libredesk --upgrade --yes --config /libredesk/config.toml && ./libredesk --config /libredesk/config.toml"] + + # 业务工具服务:4 个 AI 工具(商品/订单/库存/客户资料) + bridge-tools: + build: ./bridge-tools + container_name: libredesk_bridge_tools + restart: unless-stopped + environment: + TOOLS_PORT: 4100 + TOOLS_PUBLIC_BASE_URL: http://bridge-tools:4100 + TOOLS_SHARED_KEY: ${BRIDGE_TOOLS_KEY} + TOOLS_DEV_BYPASS: "false" + RECOMMEND_URL: ${RPC_RECOMMEND_URL} + ORDER_API_URL: ${RPC_ORDER_URL} + INVENTORY_API_URL: ${RPC_INVENTORY_URL} + MEMBER_RPC_URL: ${RPC_MEMBER_URL} + RPC_TIMEOUT_MS: 8000 + PRODUCT_TIMEOUT_MS: 30000 + SITE_SEARCH_URL: https://www.yehwang.com/search.html?q= + DEFAULT_TENANT_ID: 2 + DEFAULT_LANGUAGE_ID: 1 + extra_hosts: + - "host.docker.internal:host-gateway" + ports: + # 仅本机调试用;LibreDesk 通过容器名 bridge-tools:4100 访问 + - "127.0.0.1:4100:4100" + depends_on: + - app + networks: + - libredesk + - spug-net + + # PostgreSQL database + db: + image: ${POSTGRES_IMAGE:-pgvector/pgvector:pg18} + container_name: libredesk_db + restart: unless-stopped + networks: + - libredesk + ports: + - "127.0.0.1:5440:5432" + environment: + POSTGRES_USER: ${POSTGRES_USER:-libredesk} + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-libredesk} + POSTGRES_DB: ${POSTGRES_DB:-libredesk} + healthcheck: + test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-libredesk} -d ${POSTGRES_DB:-libredesk}"] + interval: 10s + timeout: 5s + retries: 6 + volumes: + # PG18 官方镜像要求挂载 /var/lib/postgresql(数据在子目录) + - postgres-data:/var/lib/postgresql + + # Redis + redis: + image: redis:7-alpine + container_name: libredesk_redis + restart: unless-stopped + networks: + - libredesk + ports: + - "127.0.0.1:6390:6379" + volumes: + - redis-data:/data + +networks: + libredesk: + spug-net: + external: true + +volumes: + postgres-data: + redis-data: diff --git a/docs/testspace-config-changes.md b/docs/testspace-config-changes.md new file mode 100644 index 0000000..03745fa --- /dev/null +++ b/docs/testspace-config-changes.md @@ -0,0 +1,40 @@ +# 测试服实例配置变更记录(2026-10-29 / 10-30) + +> 实例:测试服 47.76.223.252 `https://wangliang-crm.dev.gaia888.com`(LibreDesk v2.9.1) +> 代码仓库:www 前端改动已推 `yehwang/storefront-web` 分支 `feature-20261030-libredesk-widget` +> 本文记录的是**数据库/实例配置**变更(不在代码仓库里,随实例数据保存)。 + +## 1. www 前端 widget 集成(代码) + +`/data/dev/wangliang/eu-store-front-web`: + +- 新增 `plugins/libredesk.client.js`:`window.LibredeskSettings = { baseURL, inboxID }` + 动态加载 `{baseURL}/widget.js`,全站加载、匿名访客。 +- `nuxt.config.js`:暴露 `LIBREDESK_BASE_URL` / `LIBREDESK_INBOX_ID`,注册插件。 +- `.env`(不入库):`LIBREDESK_BASE_URL=https://wangliang-crm.dev.gaia888.com`、`LIBREDESK_INBOX_ID=81b679b0-33fb-4796-9f83-dcc0f43231cc`。 +- 运行方式:`yarn build` 后 `PORT=3015 NODE_ENV=production yarn start`(构建时注入 env,改 .env 后必须重新 build)。 +- 已提交:`ec123c4b feat(widget): 集成 LibreDesk 客服 widget`(分支 `feature-20261030-libredesk-widget`)。 + +## 2. livechat inbox 配置(DB:inboxes.config) + +| 字段 | 值 | +| --- | --- | +| `trusted_domains` | 新增 `wangliang-www.dev.gaia888.com`(CSP `frame-ancestors` 白名单,缺了会导致 widget iframe 被浏览器拒绝、看不到按钮) | +| `brand_name` | `Yehwang` | +| `greeting_message` | `Hi! How can we help you today?` | +| `chat_introduction` | `Ask about products, orders, shipping or returns.` | + +影响:widget 首页标题/欢迎语/副标题;trusted_domains 决定哪些站点能嵌入 widget。 + +## 3. AI assistant 指令(DB:ai_assistants.instructions) + +在 `Yehwang Assistant` instructions 末尾追加一条规则: + +> When the customer greets you (e.g. hi / hello / 你好), reply exactly with: "Hi! How can we help you today? Welcome to Yehwang — ask about products, orders, shipping or returns." Do not add or change anything else in that greeting. + +效果:客户发 `hi` 时 AI 回复该固定话术(实测一致)。仍由模型生成,规则约束输出。 + +## 4. 回滚方式 + +- 前端代码:`git checkout main`(或 revert `ec123c4b`)后重新 `yarn build` + 重启。 +- inbox 配置:后台 Inbox → Widget 改回,或 `update inboxes set config = config || '{"trusted_domains": [...]}' ...`。 +- AI 规则:后台 AI Assistant → Instructions 删除该句即可。