2026-03-18 14:29:41 +08:00
|
|
|
|
# 部署文档
|
|
|
|
|
|
|
|
|
|
|
|
## 部署环境
|
|
|
|
|
|
|
|
|
|
|
|
- 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. 等待安装完成
|
|
|
|
|
|
|
|
|
|
|
|
## 后端部署
|
|
|
|
|
|
|
2026-03-20 18:32:58 +08:00
|
|
|
|
后端建议采用 **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`
|
|
|
|
|
|
|
2026-03-18 14:29:41 +08:00
|
|
|
|
### 1. 创建Dockerfile
|
|
|
|
|
|
|
|
|
|
|
|
在 `back-end` 目录创建 `Dockerfile` 文件:
|
|
|
|
|
|
|
|
|
|
|
|
```dockerfile
|
2026-03-20 18:32:58 +08:00
|
|
|
|
FROM node:22-alpine AS build
|
2026-03-18 14:29:41 +08:00
|
|
|
|
|
|
|
|
|
|
WORKDIR /app
|
|
|
|
|
|
|
|
|
|
|
|
COPY package*.json ./
|
|
|
|
|
|
RUN npm install
|
|
|
|
|
|
|
|
|
|
|
|
COPY . .
|
2026-03-20 18:32:58 +08:00
|
|
|
|
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
|
2026-03-18 14:29:41 +08:00
|
|
|
|
|
|
|
|
|
|
EXPOSE 3000
|
|
|
|
|
|
|
2026-03-20 18:32:58 +08:00
|
|
|
|
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
|
2026-03-18 14:29:41 +08:00
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### 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
|
|
|
|
|
|
- 目标URL:http://localhost:80
|
2026-03-20 18:32:58 +08:00
|
|
|
|
- 发送域名:`bai-api.blv-oa.com`(如前后端分域,请按实际前端域名填写)
|
2026-03-18 14:29:41 +08:00
|
|
|
|
4. 配置后端代理:
|
|
|
|
|
|
- 代理名称:backend
|
|
|
|
|
|
- 目标URL:http://localhost:3000
|
2026-03-20 18:32:58 +08:00
|
|
|
|
- 发送域名:`bai-api.blv-oa.com`
|
2026-03-18 14:29:41 +08:00
|
|
|
|
- 路径:/api
|
|
|
|
|
|
5. 点击「保存」
|
|
|
|
|
|
|
2026-03-20 18:32:58 +08:00
|
|
|
|
### 3. 配置SSL证书(必须)
|
2026-03-18 14:29:41 +08:00
|
|
|
|
|
|
|
|
|
|
1. 进入网站设置
|
|
|
|
|
|
2. 点击「SSL」→「Let's Encrypt」
|
|
|
|
|
|
3. 申请并安装SSL证书
|
|
|
|
|
|
4. 开启「强制HTTPS」
|
2026-03-20 18:32:58 +08:00
|
|
|
|
5. 确保域名 `bai-api.blv-oa.com` 已正确解析到服务器公网 IP
|
2026-03-18 14:29:41 +08:00
|
|
|
|
|
|
|
|
|
|
## 环境变量配置
|
|
|
|
|
|
|
|
|
|
|
|
### 后端环境变量
|
|
|
|
|
|
|
|
|
|
|
|
在 `back-end/.env` 文件中配置:
|
|
|
|
|
|
|
|
|
|
|
|
```env
|
|
|
|
|
|
# Server Configuration
|
|
|
|
|
|
PORT=3000
|
|
|
|
|
|
NODE_ENV=production
|
2026-03-20 18:32:58 +08:00
|
|
|
|
APP_PROTOCOL=https
|
|
|
|
|
|
APP_DOMAIN=bai-api.blv-oa.com
|
|
|
|
|
|
APP_BASE_URL=https://bai-api.blv-oa.com
|
2026-03-18 14:29:41 +08:00
|
|
|
|
|
|
|
|
|
|
# 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
|
2026-03-20 18:32:58 +08:00
|
|
|
|
CORS_ORIGIN=https://bai-api.blv-oa.com
|
2026-03-18 14:29:41 +08:00
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### 前端环境变量
|
|
|
|
|
|
|
|
|
|
|
|
在 `front-end/.env.production` 文件中配置:
|
|
|
|
|
|
|
|
|
|
|
|
```env
|
2026-03-20 18:32:58 +08:00
|
|
|
|
VUE_APP_BASE_URL=https://bai-api.blv-oa.com/api
|
2026-03-18 14:29:41 +08:00
|
|
|
|
VUE_APP_TITLE=BAI管理系统
|
|
|
|
|
|
VUE_APP_VERSION=1.0.0
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2026-03-20 18:32:58 +08:00
|
|
|
|
## 域名解析与 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`
|
|
|
|
|
|
|
2026-03-18 14:29:41 +08:00
|
|
|
|
## 数据库配置
|
|
|
|
|
|
|
|
|
|
|
|
### Pocketbase设置
|
|
|
|
|
|
|
|
|
|
|
|
1. 访问 Pocketbase 管理界面:http://服务器IP:8080/_/
|
|
|
|
|
|
2. 创建管理员账号
|
|
|
|
|
|
3. 创建必要的集合:
|
|
|
|
|
|
- users (用户)
|
|
|
|
|
|
- data (数据)
|
|
|
|
|
|
- videos (视频)
|
|
|
|
|
|
- logs (日志)
|
|
|
|
|
|
|
|
|
|
|
|
## 监控与维护
|
|
|
|
|
|
|
2026-03-20 18:32:58 +08:00
|
|
|
|
### 后端发布命令
|
|
|
|
|
|
|
|
|
|
|
|
后端推荐命令:
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
# 构建发布产物
|
|
|
|
|
|
npm run build
|
|
|
|
|
|
|
|
|
|
|
|
# 生产启动
|
|
|
|
|
|
npm start
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2026-03-18 14:29:41 +08:00
|
|
|
|
### 查看日志
|
|
|
|
|
|
|
|
|
|
|
|
```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证书配置,为系统提供了安全、稳定的运行环境。
|