AI 客服后端, 支持回复常见问题和修改用户资料.
- 运行时: Node.js
- 框架: Express.js
- 语言: TypeScript
- ORM: Prisma 7
- 数据库: PostgreSQL
- 文件存储: 阿里云 OSS
- AI Agent: LangChain
- 向量库: pgvector
- 进程管理: PM2
- 反向代理: Nginx
复制 .env.example 为 .env
- 申请 AI API Key. 如果本机性能允许, 也可以下载 Ollama 本地模型.
- 在
.env文件中填写 AI 信息
- 阿里云 → RAM 控制台 → 创建用户
- 给用户授权:AliyunOSSFullAccess
- 拿到:AccessKeyId / AccessKeySecret
- OSS 控制台创建 Bucket,记下:
- Bucket 名
- 地域(如 oss-cn-hangzhou)
- 由于当前项目公开文件和私有文件放在一个存储桶中, 所以需要更新授权策略.在阿里云 OSS 控制台 权限管理 → Bucket 授权策略 添加
{ "Version": "1", "Statement": [ { "Effect": "Allow", "Principal": "*", "Action": [ "oss:GetObject" ], "Resource": [ "acs:oss:*:*:你的bucket/public/*" ] } ] } - 在
.env文件中填写 OSS 信息
- 在 PostgreSQL 中创建数据库
psql -U luna -d postgres -h localhost
# -U 登录用户 -d 数据库名称 -h 主机地址- 在
.env文件中填写数据库连接信息
官方文档推荐编译安装, 但是我这边没有 C 编译工具链接, 试试用 apt 安装
- 查看 PG 版本
psql --version
# psql (PostgreSQL) 17.10 (Debian 17.10-0+deb13u1)- 安装
sudo apt update
sudo apt install -y postgresql-17-pgvector装好了, 再根据文档要求启用 extension.
- 进入 psql 命令行
psql -U postgres -d ai_cs -h localhost- 执行安装扩展
CREATE EXTENSION vector;- 验证安装. 能查到结果 = 安装成功
SELECT * FROM pg_extension WHERE extname = 'vector';npm install-
生成 Prisma Client:
npx prisma generate
-
运行数据库迁移:
npx prisma migrate dev
npm run dev- src/: 源代码目录
- index.ts: 程序入口
- lib/prisma.ts: Prisma Client 实例化逻辑 (包含 PostgreSQL 适配器配置)
- prisma/: Prisma 配置与 Schema
- generated/: 自动生成的 Prisma Client 代码 (已在 .gitignore 中忽略)
- prisma.config.ts: Prisma 7 配置文件
如果您修改了 prisma/schema.prisma 中的数据模型,请按照以下步骤更新数据库:
-
生成并应用迁移:
npx prisma migrate dev --name <migration_name>
此命令会创建一个新的迁移文件,将其应用到数据库,并自动重新生成 Prisma Client。
-
仅更新 Prisma Client: 如果您只需要更新 TypeScript 类型定义(例如在拉取了包含新迁移的代码后),可以运行:
npx prisma generate
本项目前后端分离, 前端存放在阿里云 OSS, 后端部署在阿里云 ECS. 在生产服务器上部署时,请遵循以下流程:
如果当前代码库尚未开源, 可以使用 SSH 密钥方式下载代码
复制 .env.example 为 .env
- 申请 AI API Key. 如果本机性能允许, 也可以下载 Ollama 本地模型.
- 在
.env文件中填写 AI 信息
同开发 > 项目初始化 > 创建阿里云 OSS 章节
同开发 > 项目初始化 > 创建数据库 章节
同开发 > 项目初始化 > 安装 pgvector 章节
- 安装 Node. 参考 https://nodejs.org/en/download
- 安装依赖.
npm install- 生成最新 Prisma Client(重要!)
npx prisma generate- 执行数据库迁移
npx prisma migrate deploy原因:生产环境应使用 deploy 而非 dev。它仅执行未应用的迁移文件,不会重置数据库,确保数据安全。
npm run build- 安装 PM2
npm install -g pm2
# 常用PM2命令
pm2 list # 查看运行进程
pm2 restart node-service # 重启
pm2 stop node-service # 停止
pm2 logs node-service # 查看日志- 运行服务
cd /www/bruce-nodejs
pm2 start ecosystem.config.cjs
# 备选方案 pm2 start dist/index.js --name "bruce-nodejs"- 生成开机启动脚本
pm2 startup- 把最新进程状态写入快照(服务器重启的时候 pm2 会读取快照来重启服务)
pm2 save- 验证
reboot
# 重启后执行
pm2 list可以在阿里云完成 ICP 备案, 一般需要至少 7 天. 在域名备案完成之前, 只能使用 IP 进行访问.
在阿里云域名解析, 创建一条 A 记录, 将域名指向服务器 IP.
在阿里云数字证书管理服务, 可以下载到免费证书. 记得把证书上传到服务器上, 路径取决于 Nginx 配置. 注意! 免费证书有效期只有 90天, 到时间了需要重新上传.
scp -i ~/.ssh/你的私钥.pem api.ai-cs.space.pem api.ai-cs.space.key root@服务器IP:/etc/nginx/ssl/修改 Nginx 配置
vim /etc/nginx/sites-available/default# HTTP 80 端口:全部重定向到 HTTPS
server {
listen 80;
server_name api.ai-cs.space;
# 永久重定向 301
return 301 https://$host$request_uri;
}
# HTTPS 443 端口 + SSL 证书配置(纯后端API,无静态资源)
server {
listen 443 ssl;
server_name api.ai-cs.space;
# ========== SSL 证书路径(修改为你实际文件路径) ==========
ssl_certificate /etc/nginx/ssl/api.ai-cs.space.pem;
ssl_certificate_key /etc/nginx/ssl/api.ai-cs.space.key;
# 基础 SSL 优化配置(阿里云通用推荐)
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
# 移除 root、index、Vue静态路由,只做API反向代理
location / {
# 全部请求转发后端,不需要拼接/api,后端自行处理路由前缀
proxy_pass http://127.0.0.1:3000;
# 透传客户端信息
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_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
}
}重启 Nginx
systemctl reload nginx && systemctl status nginx# 进入项目目录
cd /www/bruce-nodejs
# 拉取最新代码
git pull origin main
# 安装所有依赖(包含 devDependencies,TS编译需要)
npm install
# 1. TypeScript 编译
npm run build
# 2. Prisma 生产迁移 + 生成客户端
npx prisma migrate deploy
npx prisma generate
# 3. PM2 重启/启动服务
pm2 restart ecosystem.config.cjs || pm2 start ecosystem.config.cjs
# 把最新进程状态写入快照(服务器重启的时候 pm2 会读取快照来重启服务)
pm2 save使用 Github Actions 实现自动部署, 具体实现见配置文件 .github/workflows/.