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

9.2 KiB
Raw Permalink Blame History

部署文档

部署环境

  • Ubuntu 20.04 LTS+
  • 宝塔面板 7.0+
  • Docker
  • Node.js 22+

部署架构

┌───────────────┐
│  宝塔面板      │
└───────────────┘
        │
        ▼
┌───────────────────────┐
│  Nginx (反向代理)      │
└───────────────────────┘
        │
        ├───────────────┐
        ▼               ▼
┌───────────────┐   ┌───────────────┐
│  前端容器      │   │  后端容器      │
└───────────────┘   └───────────────┘
        │               │
        └───────────────┘
                  │
                  ▼
         ┌────────────────┐
         │  Pocketbase DB  │
         └────────────────┘

准备工作

1. 安装宝塔面板

# 安装宝塔面板
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.jsonpackage-lock.json.env
  4. 服务器执行 npm install --omit=dev
  5. 服务器执行 npm start

1. 创建Dockerfile

back-end 目录创建 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/ 目录执行:

npm install
npm run lint
npm run test
npm run build

构建成功后会生成:

back-end/dist/
  src/
  spec/
  package.json
  package-lock.json
  .env
  eslint.config.js

如果你采用服务器源码分离部署,建议上传以下内容到服务器:

  • dist/
  • package.json
  • package-lock.json
  • .env

然后在服务器执行:

npm install --omit=dev
npm start

2. 创建docker-compose.yml

在项目根目录创建 docker-compose.yml 文件:

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 文件:

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 文件:

#!/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. 赋予脚本执行权限

chmod +x deploy.sh

3. 执行部署脚本

./deploy.sh

宝塔面板配置

1. 添加网站

  1. 打开宝塔面板
  2. 点击「网站」→「添加站点」
  3. 填写域名信息(如果有域名)
  4. 选择「纯静态」网站类型
  5. 点击「提交」

2. 配置反向代理

  1. 进入网站设置
  2. 点击「反向代理」→「添加反向代理」
  3. 配置前端代理:
  • 发送域名:bai-api.blv-oa.com(如前后端分域,请按实际前端域名填写)
  1. 配置后端代理:
  • 发送域名:bai-api.blv-oa.com
  • 路径:/api
  1. 点击「保存」

3. 配置SSL证书必须

  1. 进入网站设置
  2. 点击「SSL」→「Let's Encrypt」
  3. 申请并安装SSL证书
  4. 开启「强制HTTPS」
  5. 确保域名 bai-api.blv-oa.com 已正确解析到服务器公网 IP

环境变量配置

后端环境变量

back-end/.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 文件中配置:

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 中增加:

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 (日志)

监控与维护

后端发布命令

后端推荐命令:

# 构建发布产物
npm run build

# 生产启动
npm start

查看日志

# 查看后端日志
docker logs -f backend

# 查看前端日志
docker logs -f frontend

# 查看数据库日志
docker logs -f db

备份数据

# 备份Pocketbase数据
docker cp db:/pb_data ./backup

# 恢复Pocketbase数据
docker cp ./backup db:/pb_data

升级项目

  1. 拉取最新代码
  2. 执行部署脚本:./deploy.sh

常见问题

1. 容器启动失败

检查容器日志:

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证书配置为系统提供了安全、稳定的运行环境。