# 云客数据镜像 — 服务器部署指南 > 2026-08-21|适用于 Linux 服务器 + Docker Compose 五服务部署 ## 架构 ``` ┌─────────────────────────────────────────────────┐ │ Docker Compose │ │ ┌────────┐ ┌────────┐ ┌────────────────────┐ │ │ │ MySQL 8│ │ Redis 7│ │ backend (FastAPI) │ │ │ │ :3306 │ │ :6379 │ │ :8000 │ │ │ └────┬───┘ └────┬───┘ └─────────▲──────────┘ │ │ │ │ │ /api │ │ ┌────▼───────────▼───┐ ┌────────┴──────────┐ │ │ │ scheduler │ │ frontend (nginx) │ │ │ │ APScheduler │ │ :5173 → :80 │ │ │ │ + Playwright │ └───────────────────┘ │ │ │ + Chromium │ │ │ └────────────────────┘ │ └─────────────────────────────────────────────────┘ ``` - **scheduler**:每晚 02:00 全量 + 每 4h 消息增量 + 每周日 05:00 全量对齐(全部浏览器 fetch 零风控)→ 需要 Playwright + Chromium(镜像已内置) - **restart: unless-stopped**:容器崩溃自动重启(服务器上的守护方案,无需本地计划任务) ## 前置要求 - Linux 服务器(2C4G 起步,磁盘 ≥ 20GB:MySQL 数据 + 媒体文件 2.5GB+) - Docker 24+ 与 Docker Compose v2 - 一个有效的云客会话 cookie(从浏览器登录云客后复制) ## 部署步骤 ### 1. 上传代码 ```bash git clone <你的仓库地址> yunke cd yunke ``` ### 2. 配置 .env ```bash cp yunke-server/.env.example .env # 或手动创建 ``` 必须设置的项: ```ini # 云客会话(从浏览器 F12 → Network → 任意请求的 Cookie 头复制) YK_USERID=<32位userId> YK_COMPANY=<公司码> YK_COOKIE=user=xxx; userToken=yyy # MySQL(docker-compose 自动创建库和用户) MYSQL_ROOT_PASSWORD=<强密码> MYSQL_PASSWORD=<强密码> # 查看后台的访问令牌(留空=无鉴权,仅限内网) API_TOKEN=<随机长字符串> ``` ### 3. 启动 ```bash docker compose --env-file .env up -d --build ``` 首次构建约 5-10 分钟(含 Chromium 下载 ~150MB)。启动后: ```bash docker compose ps # 五服务全部 Up(healthy) docker compose logs -f scheduler # 看调度器日志 ``` ### 4. 验证 ```bash curl http://localhost:8000/api/health # {"status":"ok"} curl http://localhost:5173/ # 前端页面 ``` ### 5. 数据迁移(把本地 SQLite 数据搬到服务器 MySQL) **方式 A:重抓(推荐,数据最新)** 服务器上手动跑一轮全量: ```bash docker compose exec scheduler bash DB_URL="mysql+asyncmy://yunke:<密码>@mysql:3306/yunke" \ bash scripts/full_sync_all.sh ``` 耗时 6-12 小时(消息全量翻页),跑完后调度器自动接管日常增量。 **方式 B:SQLite → MySQL 数据搬迁** 把本地 smoke.db 和 media/ 目录传到服务器,用 Python 脚本逐表导: (如有需要我可以写迁移脚本,~100 行) ### 6. 媒体文件 媒体存在 Docker volume `media_data` 里。本地已有 2.5GB 媒体的话: ```bash # 本地打包 tar czf media.tar.gz -C yunke-server media/ # 传到服务器后灌入 volume docker run --rm -v yunke_media_data:/target -v $(pwd):/src alpine \ sh -c "cd /target && tar xzf /src/media.tar.gz --strip-components=1" ``` ## 日常运维 | 操作 | 命令 | |---|---| | 看调度日志 | `docker compose logs -f scheduler` | | 手动触发全量 | `docker compose exec scheduler bash scripts/full_sync_all.sh` | | 换 cookie | 改 `.env` 的 `YK_COOKIE` → `docker compose restart scheduler backend` | | 备份 MySQL | `docker compose exec mysql mysqldump -uroot -p<密码> yunke > backup.sql` | | 备份媒体 | `docker run --rm -v yunke_media_data:/data -v $(pwd):/out alpine tar czf /out/media.tgz -C /data .` | | 升级版本 | `git pull && docker compose up -d --build` | ## 已知注意事项 1. **cookie 过期**:云客会话定期失效,过期后日志出现 `⚠️ cookie 可能已过期` 提示 → 从浏览器重新复制 `YK_COOKIE` 并 restart 2. **首次消息全量很慢**(6-12h),之后增量每轮 15-30 分钟 3. **FTS 搜索**:MySQL 上自动回退 LIKE(暂无全文索引);如搜索量大可在 MySQL 建 FULLTEXT 索引 4. **时区**:容器默认 UTC;调度按容器时区触发(FULL_SYNC_HOUR=2 即 UTC 02:00)。要北京时间可在 compose 加 `TZ: Asia/Shanghai` 5. **服务器需能访问 crm2.yunkecn.com 和 *.oss.yunkecn.com**(抓取 + 媒体下载)