心域网络
DOCS

知识库

产品文档与帮助中心

星屿客服使用教程

程序部署教程

星屿客服系统程序部署教程

本文用于部署星屿客服系统,包含:

  • Node.js 后端 API:chatapi.iyqy.cn
  • 管理后台:chatadmin.iyqy.cn
  • 用户聊天端:chat.iyqy.cn
  • MySQL 数据库
  • Nginx 反向代理与 HTTPS
  • WebSocket 实时通信
  • PM2 进程守护
重要提示: 服务器 Node.js 版本必须为 22.22.3,版本不一致可能出现字节码无法加载、服务启动失败等问题。

一、域名规划

服务域名类型说明API 后端 | chatapi.iyqy.cn | NestJS | Node.js 服务,监听 3003 端口
管理后台 | chatadmin.iyqy.cn | Vue 3 静态站点 | 管理员、商户、客服坐席后台
用户端 | chat.iyqy.cn | UniApp H5 静态站点 | 用户在线咨询聊天页面

二、前置条件

部署前请确认服务器已具备以下环境:

  • 宝塔面板已安装并可以正常登录
  • Node.js 22.22.3 已安装
  • MySQL 8.0 已安装并正常运行
  • Nginx 已安装并正常运行
  • 域名已解析到当前服务器公网 IP
  • 服务器安全组已放行 80、443 端口
  • 不需要对公网开放 3003、3306、6379 端口

推荐服务器配置:

项目建议系统 | Ubuntu 22.04 / Debian 12
CPU | 2 核起,推荐 4 核
内存 | 最低 4GB,推荐 8GB
硬盘 | 50GB 起
Node.js | 22.22.3
数据库 | MySQL 8.0
进程管理 | PM2

三、数据库配置

1. 创建数据库

用宝塔安装教程时创建的数据库账户密码。

数据库仅允许本机访问即可,不建议开启公网访问。

2. 记录数据库连接地址

后端 .env 文件需要填写:

DATABASE_URL="mysql://chatbox:你的数据库密码@127.0.0.1:3306/chatbox"

如果数据库密码中包含 @、#、%、& 等特殊字符,可能需要进行 URL 编码。为了减少配置问题,建议数据库密码尽量使用字母、数字和常规符号组合。

四、部署后端 API(chatapi.iyqy.cn)

1. 上传后端代码

将发布包中的 server 目录上传到:

/www/wwwroot/chatapi.iyqy.cn/

最终目录示例:

/www/wwwroot/chatapi.iyqy.cn/
├── dist/
├── prisma/
├── node_modules/
├── uploads/
├── package.json
├── package-lock.json
├── .env
└── ...

2. 安装 Node.js 22.22.3

宝塔面板进入:

网站 → Node 项目 → Node 版本管理器

找到:

22.22.3

如果版本列表中没有,先点击:

更新版本列表

然后安装 Node.js 22.22.3,并切换为该版本。

在宝塔终端执行:

node -v
npm -v

确认 Node.js 输出为:

v22.22.3

必须是 v22.22.3,不要使用 22.22.2、22.23.0 或其他 Node.js 大版本、补丁版本。

3. 安装后端依赖

进入宝塔终端,执行:

cd /www/wwwroot/chatapi.iyqy.cn
npm install

如果发布包已经带有 package-lock.json,推荐使用:

npm ci

npm ci 会严格按照锁定版本安装依赖,更适合正式服务器部署。

4. 配置环境变量

复制环境变量模板:

cp .env.example .env

编辑 .env:

vim .env

填写示例:

PORT=3003
NODE_ENV=production

DATABASE_URL="mysql://chatbox:你的数据库密码@127.0.0.1:3306/chatbox"

JWT_SECRET=请填写一段随机字符串
JWT_REFRESH_SECRET=请填写另一段随机字符串

生成随机密钥:

node -e "console.log(require('crypto').randomBytes(32).toString('hex'))"

执行两次,分别填入:

JWT_SECRET=
JWT_REFRESH_SECRET=

不要使用以下简单值:

JWT_SECRET=123456
JWT_SECRET=admin
JWT_SECRET=chatbox

5. 初始化数据库

在后端目录执行:

cd /www/wwwroot/chatapi.iyqy.cn

npx prisma generate
npx prisma db push
npm run db:seed

说明:

npx prisma generate    生成 Prisma Client
npx prisma db push     创建或同步数据库表结构
npm run db:seed        写入默认账号、权限、菜单等初始数据

首次部署必须执行这三条命令。

6. 构建后端项目

执行:

npm run build

构建成功后应生成:

dist/

通常主入口文件为:

dist/main.js

7. 创建上传目录并设置权限

执行:

mkdir -p /www/wwwroot/chatapi.iyqy.cn/uploads
chmod -R 755 /www/wwwroot/chatapi.iyqy.cn/uploads

如系统使用 www 用户运行 Nginx 或 Node 服务,可以执行:

chown -R www:www /www/wwwroot/chatapi.iyqy.cn/uploads

如果文件上传时报“无写入权限”“Permission denied”,优先检查此目录权限。

8. 使用 PM2 启动后端

安装 PM2:

npm install -g pm2

启动 API:

cd /www/wwwroot/chatapi.iyqy.cn

pm2 start dist/main.js \
  --name chatapi \
  --max-memory-restart 512M

查看状态:

pm2 status

正常应显示:

chatapi    online

查看日志:

pm2 logs chatapi

后续重启查看可在网站-Node管理-pm2监控查看

访问自己的后端网址

返回 401 Unauthorized 或未授权提示是正常现象,说明 API 服务已正常启动。

9. 设置 PM2 开机自启

执行:

pm2 save
pm2 startup

执行 pm2 startup 后,终端会生成一条新的命令。

复制并执行终端返回的完整命令后,再执行:

pm2 save

安装日志轮转模块,避免长期运行后日志占满磁盘:

pm2 install pm2-logrotate

建议配置日志保留数量:

pm2 set pm2-logrotate:max_size 20M
pm2 set pm2-logrotate:retain 14
pm2 set pm2-logrotate:compress true

五、配置 API 域名反向代理

1. 添加 API 站点

进入宝塔面板:

网站 → 添加站点

填写:

域名:chatapi.iyqy.cn
根目录:/www/wwwroot/chatapi.iyqy.cn
PHP版本:纯静态
数据库:不创建

2. 添加反向代理

进入:

网站 → chatapi.iyqy.cn → 反向代理 → 添加反向代理

填写:

代理名称:chatapi
目标 URL:http://127.0.0.1:3003
发送域名:$host

保存后,找到刚创建的反向代理,点击右侧:

配置文件

替换为以下内容:

location ^~ / {
    proxy_pass http://127.0.0.1:3003;
    proxy_http_version 1.1;

    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;

    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";

    proxy_read_timeout 86400;
    proxy_send_timeout 86400;

    client_max_body_size 50m;

    add_header Cache-Control "no-store, no-cache, must-revalidate" always;
}

保存并重载 Nginx。

不要在“站点主配置文件”中另外再添加 location /,否则会与宝塔自动生成的反向代理规则冲突,并出现 duplicate location 错误。

3. WebSocket 配置说明

上面的配置已同时支持:

  • 普通 HTTP 接口请求
  • WebSocket 实时消息
  • Socket.IO 长连接
  • 在线状态同步
  • 正在输入状态
  • 客服端和用户端即时收发消息

proxy_read_timeout 86400 用于避免 WebSocket 长连接过早断开。

4. 申请 SSL 证书

进入:

网站 → chatapi.iyqy.cn → SSL → Let's Encrypt

申请成功后开启:

强制 HTTPS

API 最终地址:

https://chatapi.iyqy.cn

六、部署管理后台(chatadmin.iyqy.cn)

1. 本地构建项目

进入管理后台项目目录:

cd admin-console
npm install
npm run build

构建完成后会生成:

admin-console/dist/

2. 上传构建文件

将 admin-console/dist 文件夹中的全部内容上传到:

/www/wwwroot/chatadmin.iyqy.cn/

注意是上传 dist 内部文件,而不是把整个 dist 文件夹嵌套上传。

正确结构:

/www/wwwroot/chatadmin.iyqy.cn/
├── assets/
├── index.html
└── favicon.ico

3. 添加后台站点

宝塔面板:

网站 → 添加站点

填写:

域名:chatadmin.iyqy.cn
根目录:/www/wwwroot/chatadmin.iyqy.cn
PHP版本:纯静态
数据库:不创建

4. 配置 Vue SPA 路由

进入:

网站 → chatadmin.iyqy.cn → 配置文件

在站点配置的 server 区块内添加:

location / {
    try_files $uri $uri/ /index.html;
}

保存并重载 Nginx。

此配置用于支持 Vue Router 的 history 路由模式,避免刷新页面后出现:

404 Not Found

5. 申请 SSL 证书

进入:

网站 → chatadmin.iyqy.cn → SSL → Let's Encrypt

申请证书后开启:

强制 HTTPS

后台访问地址:

https://chatadmin.iyqy.cn

七、部署用户端(chat.iyqy.cn)

1. 本地构建 UniApp H5

进入用户端项目目录:

cd ltclient-app
npm install
npm run build:h5

构建产物默认目录:

ltclient-app/unpackage/dist/build/h5/

2. 上传 H5 文件

将以下目录中的全部文件上传至:

ltclient-app/unpackage/dist/build/h5/

目标目录:

/www/wwwroot/chat.iyqy.cn/

最终目录应类似:

/www/wwwroot/chat.iyqy.cn/
├── static/
├── assets/
├── index.html
└── manifest.json

3. 添加用户端站点

进入宝塔:

网站 → 添加站点

填写:

域名:chat.iyqy.cn
根目录:/www/wwwroot/chat.iyqy.cn
PHP版本:纯静态
数据库:不创建

4. 配置 H5 路由

进入:

网站 → chat.iyqy.cn → 配置文件

添加:

location / {
    try_files $uri $uri/ /index.html;
}

保存并重载 Nginx。

5. 申请 SSL 证书

进入:

网站 → chat.iyqy.cn → SSL → Let's Encrypt

申请成功后开启:

强制 HTTPS

用户端访问地址:

https://chat.iyqy.cn

八、前端发布前检查

管理后台和用户端打包前,请确认接口地址已改为正式 API 域名:

https://chatapi.iyqy.cn

不要保留以下本地开发地址:

http://localhost:3003
http://127.0.0.1:3003
ws://localhost:3003

生产环境 WebSocket 应使用:

wss://chatapi.iyqy.cn

如果前端项目只配置 API Base URL,且 WebSocket 由程序自动识别协议,也可以只填写:

https://chatapi.iyqy.cn

九、验证部署

1. 检查 API

服务器终端执行:

curl -I https://chatapi.iyqy.cn/api/v1/admin/auth/info

返回:

HTTP/2 401

或:

HTTP/1.1 401 Unauthorized

说明 API 反向代理和后端服务正常。

2. 检查 PM2 状态

pm2 status

确认:

chatapi    online

3. 检查管理后台

浏览器访问:

https://chatadmin.iyqy.cn

应正常显示管理后台登录页。

4. 检查用户端

浏览器访问:

https://chat.iyqy.cn

应正常显示在线客服聊天界面。

5. 测试默认账号

首次部署并成功执行种子数据后,可使用以下账号测试:

身份账号密码超级管理员 | admin | admin123
商户管理员 | merchant_admin | merchant123
客服坐席 | agent01 | agent123

首次登录后,请立即修改默认管理员账号密码,避免服务器暴露后被他人登录。

十、常用运维命令

# 查看服务状态
pm2 status

# 查看实时日志
pm2 logs chatapi

# 查看最近 100 行日志
pm2 logs chatapi --lines 100

# 重启服务
pm2 restart chatapi

# 停止服务
pm2 stop chatapi

# 删除服务
pm2 delete chatapi

# 查看端口是否监听
ss -lntp | grep 3003

# 查看 Nginx 配置是否正确
nginx -t

# 重载 Nginx
nginx -s reload

十一、后端更新部署流程

更新代码后,进入后端目录执行:

cd /www/wwwroot/chatapi.iyqy.cn

git pull
npm install
npm run build
pm2 restart chatapi

如果不是 Git 部署,直接重新上传后端文件,再执行:

cd /www/wwwroot/chatapi.iyqy.cn

npm install
npm run build
pm2 restart chatapi

如数据库结构有调整,再执行:

npx prisma generate
npx prisma db push
pm2 restart chatapi

更新完成后查看日志:

pm2 logs chatapi --lines 100

确认没有数据库连接、Redis、环境变量、端口占用等报错。

十二、常见问题

1. 页面显示 502 Bad Gateway

执行:

pm2 status
pm2 logs chatapi
ss -lntp | grep 3003

常见原因:

  • Node.js 服务未启动。
  • Node.js 版本不是 22.22.3,Bytenode 字节码无法加载。
  • API 实际监听端口不是 3003。
  • .env 文件配置错误。
  • MySQL 无法连接。
  • 构建文件 dist/main.js 不存在。
  • Nginx 反向代理地址填写错误。

2. 聊天消息无法实时刷新

优先检查:

1. chatapi.iyqy.cn 是否已申请 SSL。
2. Nginx 反向代理是否包含 Upgrade 和 Connection 配置。
3. 前端 WebSocket 地址是否为 wss://chatapi.iyqy.cn。
4. Cloudflare 或 CDN 是否缓存了 API、Socket、WebSocket 请求。

API 和 WebSocket 路径不建议缓存,例如:

/api/
/socket.io/
/ws/

如果使用 Cloudflare,建议先将 chatapi.iyqy.cn 设置为“仅 DNS”,确认系统正常后再单独配置 WebSocket 和缓存规则。

3. 文件上传失败

检查上传目录:

ls -ld /www/wwwroot/chatapi.iyqy.cn/uploads

重新设置权限:

mkdir -p /www/wwwroot/chatapi.iyqy.cn/uploads
chown -R www:www /www/wwwroot/chatapi.iyqy.cn/uploads
chmod -R 755 /www/wwwroot/chatapi.iyqy.cn/uploads

同时确认 API 反向代理配置中存在:

client_max_body_size 50m;

需要上传更大文件时,可改为:

client_max_body_size 200m;

4. 数据库连接失败

检查 .env:

DATABASE_URL="mysql://chatbox:你的数据库密码@127.0.0.1:3306/chatbox"

检查 MySQL 状态:

systemctl status mysqld

部分系统服务名可能是:

systemctl status mysql

修改数据库密码后,需要同步修改 .env,再重启 API:

pm2 restart chatapi

5. 宝塔配置保存后提示 duplicate location

不要同时在以下两个位置都添加:

location / { ... }

正确做法:

  • API 域名:在“反向代理 → 配置文件”中维护代理规则。
  • 管理后台、用户端静态站点:在“站点配置文件”中配置 SPA 的 try_files 规则。

十三、安全建议

  1. 3003、3306、6379 不对外开放。
  2. 只放行 80、443、SSH 端口和宝塔面板端口。
  3. 宝塔面板不要长期使用默认 8888 端口。
  4. 修改宝塔后台默认用户名和密码。
  5. 给宝塔设置安全入口和授权 IP。
  6. 修改默认管理员账号 admin / admin123。
  7. 定期备份 MySQL 数据库和 uploads 文件目录。
  8. .env 文件不得上传到 Git 仓库。
  9. chatapi.iyqy.cn 不建议走缓存型 CDN。
  10. 定期检查 PM2 日志和服务器磁盘空间。

十四、最终部署结构

/www/wwwroot/
├── chatapi.iyqy.cn/          Node.js / NestJS 后端
│   ├── dist/
│   ├── prisma/
│   ├── uploads/
│   ├── .env
│   └── package.json
│
├── chatadmin.iyqy.cn/        Vue 3 管理后台静态文件
│   ├── assets/
│   └── index.html
│
└── chat.iyqy.cn/             UniApp H5 用户端静态文件
    ├── assets/
    ├── static/
    └── index.html

最终访问关系:

用户访问:
https://chat.iyqy.cn

管理后台访问:
https://chatadmin.iyqy.cn

前端 API / WebSocket 请求:
https://chatapi.iyqy.cn
wss://chatapi.iyqy.cn

Nginx:
chatapi.iyqy.cn → 127.0.0.1:3003

后端:
Node.js 22.22.3 + NestJS + PM2

数据层:
MySQL 8.0