Files
Web_BAI_Manage_ApiServer/docs/deployment.md
XuJiacheng eaf282ea24 feat: 添加微信端 API 文档和字典表初始化脚本
- 新增 openapi-wx.yaml 文件,定义微信端接口文档,包括用户统计、token 刷新、微信登录和用户资料更新等接口。
- 新增 pocketbase.dictionary.js 脚本,用于初始化和校验字典表结构,确保与预期一致。
2026-03-27 19:26:25 +08:00

469 lines
9.2 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 部署文档
## 部署环境
- Ubuntu 20.04 LTS+
- 宝塔面板 7.0+
- Docker
- Node.js 22+
## 部署架构
```
┌───────────────┐
│ 宝塔面板 │
└───────────────┘
┌───────────────────────┐
│ Nginx (反向代理) │
└───────────────────────┘
├───────────────┐
▼ ▼
┌───────────────┐ ┌───────────────┐
│ 前端容器 │ │ 后端容器 │
└───────────────┘ └───────────────┘
│ │
└───────────────┘
┌────────────────┐
│ Pocketbase DB │
└────────────────┘
```
## 准备工作
### 1. 安装宝塔面板
```bash
# 安装宝塔面板
wget -O install.sh http://download.bt.cn/install/install-ubuntu_6.0.sh && sudo bash install.sh
# 安装完成后,根据提示访问面板地址并设置账号密码
```
### 2. 安装Docker
在宝塔面板中:
1. 打开「软件商店」
2. 搜索「Docker」并安装
3. 等待安装完成
### 3. 安装Node.js
在宝塔面板中:
1. 打开「软件商店」
2. 搜索「Node.js」并安装对应版本
3. 等待安装完成
## 后端部署
后端建议采用 **dist 发布目录部署**,即:
1. 在构建机执行 `npm run build`
2. 生成 `back-end/dist/` 发布产物
3. 服务器仅部署 `dist/``package.json``package-lock.json``.env`
4. 服务器执行 `npm install --omit=dev`
5. 服务器执行 `npm start`
### 1. 创建Dockerfile
`back-end` 目录创建 `Dockerfile` 文件:
```dockerfile
FROM node:22-alpine AS build
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
FROM node:22-alpine AS production
WORKDIR /app
COPY --from=build /app/package*.json ./
RUN npm install --omit=dev
COPY --from=build /app/dist ./dist
EXPOSE 3000
CMD ["node", "dist/src/index.js"]
```
### 1.1 本地构建与上传发布包
`back-end/` 目录执行:
```bash
npm install
npm run lint
npm run test
npm run build
```
构建成功后会生成:
```text
back-end/dist/
src/
spec/
package.json
package-lock.json
.env
eslint.config.js
```
如果你采用服务器源码分离部署,建议上传以下内容到服务器:
- `dist/`
- `package.json`
- `package-lock.json`
- `.env`
然后在服务器执行:
```bash
npm install --omit=dev
npm start
```
### 2. 创建docker-compose.yml
在项目根目录创建 `docker-compose.yml` 文件:
```yaml
version: '3.8'
services:
backend:
build:
context: ./back-end
dockerfile: Dockerfile
ports:
- "3000:3000"
environment:
- NODE_ENV=production
- PORT=3000
- DB_HOST=db
- DB_PORT=8080
depends_on:
- db
restart: always
frontend:
build:
context: ./front-end
dockerfile: Dockerfile
ports:
- "80:80"
restart: always
db:
image: pocketbase/pocketbase:latest
ports:
- "8080:8080"
volumes:
- ./data:/pb_data
restart: always
```
### 3. 前端Dockerfile
`front-end` 目录创建 `Dockerfile` 文件:
```dockerfile
FROM node:22-alpine as build
WORKDIR /app
COPY package*.json ./
RUN npm install --legacy-peer-deps
COPY . .
RUN npm run build
FROM nginx:alpine
COPY --from=build /app/dist /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
```
## 一键部署脚本
### 1. 创建部署脚本
在项目根目录创建 `deploy.sh` 文件:
```bash
#!/bin/bash
# 部署脚本
echo "开始部署BAI管理系统..."
# 停止并移除旧容器
echo "停止并移除旧容器..."
docker-compose down
# 构建并启动新容器
echo "构建并启动新容器..."
docker-compose up -d --build
# 查看容器状态
echo "查看容器状态..."
docker ps
echo "部署完成!"
echo "前端访问地址: http://$(hostname -I | awk '{print $1}')"
echo "后端API地址: http://$(hostname -I | awk '{print $1}'):3000"
echo "Pocketbase管理地址: http://$(hostname -I | awk '{print $1}'):8080/_/"
```
### 2. 赋予脚本执行权限
```bash
chmod +x deploy.sh
```
### 3. 执行部署脚本
```bash
./deploy.sh
```
## 宝塔面板配置
### 1. 添加网站
1. 打开宝塔面板
2. 点击「网站」→「添加站点」
3. 填写域名信息(如果有域名)
4. 选择「纯静态」网站类型
5. 点击「提交」
### 2. 配置反向代理
1. 进入网站设置
2. 点击「反向代理」→「添加反向代理」
3. 配置前端代理:
- 代理名称frontend
- 目标URLhttp://localhost:80
- 发送域名:`bai-api.blv-oa.com`(如前后端分域,请按实际前端域名填写)
4. 配置后端代理:
- 代理名称backend
- 目标URLhttp://localhost:3000
- 发送域名:`bai-api.blv-oa.com`
- 路径:/api
5. 点击「保存」
### 3. 配置SSL证书必须
1. 进入网站设置
2. 点击「SSL」→「Let's Encrypt」
3. 申请并安装SSL证书
4. 开启「强制HTTPS」
5. 确保域名 `bai-api.blv-oa.com` 已正确解析到服务器公网 IP
## 环境变量配置
### 后端环境变量
`back-end/.env` 文件中配置:
```env
# Server Configuration
PORT=3000
NODE_ENV=production
APP_PROTOCOL=https
APP_DOMAIN=bai-api.blv-oa.com
APP_BASE_URL=https://bai-api.blv-oa.com
# Database Configuration
DB_HOST=db
DB_PORT=8080
DB_NAME=bai_management
# JWT Configuration
JWT_SECRET=your_jwt_secret_key
JWT_EXPIRES_IN=24h
# CORS Configuration
CORS_ORIGIN=https://bai-api.blv-oa.com
```
### 前端环境变量
`front-end/.env.production` 文件中配置:
```env
VUE_APP_BASE_URL=https://bai-api.blv-oa.com/api
VUE_APP_TITLE=BAI管理系统
VUE_APP_VERSION=1.0.0
```
## 域名解析与 HTTPS 部署建议
正式环境建议按以下方式部署:
1. 将域名 `bai-api.blv-oa.com` 的 DNS A 记录指向服务器公网 IP
2. 宝塔/Nginx 为该域名签发并启用 SSL 证书
3. Nginx 对外暴露 `443`,再反向代理到容器内 `backend:3000`
4. 前端生产环境接口地址统一使用:`https://bai-api.blv-oa.com/api`
5. 后端对外公开地址统一使用 `APP_BASE_URL=https://bai-api.blv-oa.com`
### 大文件上传反向代理配置
如果 PocketBase 管理页或 hooks 页面需要上传较大的图片/视频附件Nginx 需要同步放开请求体大小限制,否则浏览器会直接收到 `413 Content Too Large`,前端通常会看到 HTML 错页而不是 JSON。
建议在站点或对应 `location` 中增加:
```nginx
client_max_body_size 200m;
proxy_request_buffering off;
proxy_read_timeout 600s;
proxy_send_timeout 600s;
```
如果当前 `tbl_attachments.attachments_link` 已放宽到约 4GB反向代理层仍然需要按你的目标上传体积同步放开否则即使 PocketBase 集合字段允许更大文件,上传仍会在进入 PocketBase 之前被拦截。
## 数据库配置
### Pocketbase设置
1. 访问 Pocketbase 管理界面http://服务器IP:8080/_/
2. 创建管理员账号
3. 创建必要的集合:
- users (用户)
- data (数据)
- videos (视频)
- logs (日志)
## 监控与维护
### 后端发布命令
后端推荐命令:
```bash
# 构建发布产物
npm run build
# 生产启动
npm start
```
### 查看日志
```bash
# 查看后端日志
docker logs -f backend
# 查看前端日志
docker logs -f frontend
# 查看数据库日志
docker logs -f db
```
### 备份数据
```bash
# 备份Pocketbase数据
docker cp db:/pb_data ./backup
# 恢复Pocketbase数据
docker cp ./backup db:/pb_data
```
### 升级项目
1. 拉取最新代码
2. 执行部署脚本:`./deploy.sh`
## 常见问题
### 1. 容器启动失败
检查容器日志:
```bash
docker logs -f 容器名称
```
### 2. 访问接口报错
- 检查反向代理配置
- 检查后端服务是否正常运行
- 检查数据库连接是否正常
### 3. 前端页面空白
- 检查前端容器是否正常运行
- 检查Nginx配置
- 检查API地址配置是否正确
### 4. 数据库连接失败
- 检查数据库容器是否正常运行
- 检查数据库连接配置
- 检查网络连接
## 性能优化
### 1. 前端优化
- 启用Gzip压缩
- 静态资源缓存
- 代码分割
- 图片优化
### 2. 后端优化
- 使用PM2进程管理
- 数据库索引优化
- 缓存策略
- 负载均衡
### 3. 服务器优化
- 调整Docker内存限制
- 配置Nginx缓存
- 启用HTTPS
- 定期清理日志
## 安全措施
### 1. 服务器安全
- 配置防火墙
- 禁用root登录
- 使用SSH密钥认证
- 定期更新系统
### 2. 应用安全
- 使用HTTPS
- 密码加密存储
- 输入验证
- 防止SQL注入
- 防止XSS攻击
### 3. 数据安全
- 定期备份数据
- 数据加密
- 访问控制
- 审计日志
## 总结
本部署方案采用Docker容器化部署实现了前后端分离的架构支持一键部署和自动化管理。通过宝塔面板的反向代理功能实现了域名访问和SSL证书配置为系统提供了安全、稳定的运行环境。