This commit is contained in:
feng0207
2026-08-11 22:22:10 +08:00
commit 5e312c1266
6985 changed files with 1061169 additions and 0 deletions
+200
View File
@@ -0,0 +1,200 @@
# CRMChat 客服系统 — Docker 部署文档
## 环境要求
- Docker 24+
- Docker Compose v2+
- 端口 18091(可自定义)
## 快速开始
### 国内网络(默认,镜像加速)
```bash
# 1. 复制环境变量
cp .env.docker .env
# 2. 一键启动
docker compose -f docker-compose.yml -f docker-compose.cn.yml up -d
```
### 海外网络
```bash
cp .env.docker .env
docker compose up -d
```
## 访问地址
| 入口 | 地址 | 账号 | 密码 |
|------|------|------|------|
| 后台管理 | `http://localhost:18091/admin` | admin | admin123 |
| 客服坐席 | `http://localhost:18091/kefu` | kefu | kefu123 |
| 用户端 | `http://localhost:18091/chat/index?token=82b739d20bd2d29dc67f112b7f193683` | — | — |
| Demo 页 | `http://localhost:18091/demo` | — | — |
## 容器架构
```
┌──────────┐ ┌──────────────┐ ┌───────────┐ ┌────────┐
│ Nginx │────▶│ PHP 7.4 + │────▶│ MySQL 5.7│ │ Redis │
│ :18091 │ │ Swoole 4 │ │ :3306 │ │ :6379 │
└──────────┘ └──────────────┘ └───────────┘ └────────┘
│ │
▼ ▼
静态文件 ThinkPHP 6 路由
admin/ /api/* /kefu /install
demo/ WebSocket /ws
```
| 容器 | 镜像 | 说明 |
|------|------|------|
| crmchat-nginx | nginx:alpine | 反向代理 + 静态文件 |
| crmchat-php | 自构建 (PHP 7.4 + Swoole 4.8 + Redis) | ThinkPHP 6 应用 |
| crmchat-mysql | mysql:5.7 | 数据库,数据持久化 |
| crmchat-redis | redis:alpine | 缓存/Session/WebSocket 状态 |
## 环境变量 (.env)
```bash
# 数据库
DB_HOSTNAME=mysql
DB_DATABASE=crmeb_chat
DB_USERNAME=root
DB_PASSWORD=root # 生产环境务必修改
DB_PORT=3306
# Redis
REDIS_HOSTNAME=redis
REDIS_PORT=6379
REDIS_PASSWORD=
# Nginx 端口
NGINX_PORT=18091
# MySQL root 密码
MYSQL_ROOT_PASSWORD=root # 生产环境务必修改
```
## 目录结构
```
kefu/
├── docker/
│ └── php/
│ ├── Dockerfile # PHP 7.4 + Swoole4 镜像
│ ├── entrypoint.sh # 启动脚本(自动生成 .env、导入数据库、启动 Swoole
│ └── swoole.php # Swoole 配置
├── nginx/
│ └── nginx.conf # Nginx 配置
├── crmchat/ # ThinkPHP 6 后端源码
│ └── public/
│ ├── admin/ # 管理后台前端(构建产物)
│ ├── demo/ # 用户端 Demo 页
│ └── install/
│ ├── crmeb_clean.sql # 数据库初始化 SQL(29 张表,含初始数据)
│ └── install.lock # 自动生成,跳过安装向导
├── docker-compose.yml # 海外版 Docker Compose
├── docker-compose.cn.yml # 国内镜像加速版(覆盖镜像源)
├── .env.docker # 环境变量模板
└── .env # 实际环境变量(gitignore
```
## 常用命令
```bash
# 启动
docker compose -f docker-compose.yml -f docker-compose.cn.yml up -d
# 停止
docker compose down
# 停止并清除数据(完全重置)
docker compose down -v
# 重启
docker compose restart
# 查看日志
docker compose logs -f php
# 进入容器
docker exec -it crmchat-php bash
```
## 数据库说明
初始化 SQL 文件 `crmchat/public/install/crmeb_clean.sql` 包含:
- 29 张 `eb_` 前缀表
- 完整初始数据:管理员、客服、角色权限、系统菜单、系统配置、应用 Token
- 启动时 `entrypoint.sh` 自动导入,首次启动即用,无需安装向导
APP_KEY 已固定,Token `82b739d20bd2d29dc67f112b7f193683` 重启不变。
## 注意事项
1. **客服需要打开 WebSocket** — 仅仅登录 API 不够,需要浏览器访问 `/kefu` 进入聊天面板建立 WebSocket 连接才能接收用户消息
2. **生产环境务必修改** `.env` 中的数据库密码和 MySQL root 密码
3. **APP_KEY 已固定** — 如需更换,修改 `entrypoint.sh``APP_KEY` 的值,并重新执行 `docker compose down -v && docker compose up -d`
## 模块打包部署
三个模块的分工与部署方式:
| 模块 | 功能 | Docker 部署方式 |
|------|------|-----------------|
| `admin/` | Web 前端(管理后台 + 客服面板 + 用户端) | 构建后复制到 `crmchat/public/admin/`Nginx 静态 serve |
| `crmchat/` | PHP 后端(API + WebSocket | Volume 挂载到容器,Swoole 运行 |
| `uniapp/` | 移动端客服 App | 不在 Docker 范围内,需单独打包 |
### admin/ — 管理后台前端
**构建产物已内置在 `crmchat/public/admin/` 中,直接可用,无需额外构建步骤。**
只有在修改了 `admin/src/` 下的源码后,才需要重新构建并提交:
```bash
cd admin
npm install # 首次或依赖变更后
npm run build # 构建 → dist/
# Windows
Remove-Item -Path "..\crmchat\public\admin\*" -Recurse -Force
Copy-Item -Path "dist\*" -Destination "..\crmchat\public\admin\" -Recurse
# Linux / Mac
rm -rf ../crmchat/public/admin/*
cp -r dist/* ../crmchat/public/admin/
# 确认提交
git add ../crmchat/public/admin/ && git commit -m "更新 admin 前端构建产物"
```
构建产物提交后,新环境 clone 即可直接用 Docker 部署,无需安装 Node.js。
### crmchat/ — PHP 后端
代码通过 volume 挂载到容器(`./crmchat:/var/www/html`),修改 `.php` 文件后需重启 PHP 容器才能生效:
```bash
docker compose restart php
```
### uniapp/ — 移动端客服 App
不在 Docker 部署范围内。使用 **HBuilderX** 打开 `uniapp/` 目录,即可编译打包为:
- Android APK
- iOS IPA
- 微信小程序 / 支付宝小程序 / 百度小程序 / 头条小程序
- H5 网页
打包前需在 `uniapp/pages/config/app.js` 中配置后端 API 域名和 WebSocket 地址:
```javascript
defaultDomainName: '你的后端域名', // 如 chat.example.com
defaultRequestType: 'https', // http 或 https
defaultWsType: 'wss', // ws 或 wss
```