# 部署文档 ## 部署环境 - 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 - 目标URL:http://localhost:80 - 发送域名:`bai-api.blv-oa.com`(如前后端分域,请按实际前端域名填写) 4. 配置后端代理: - 代理名称:backend - 目标URL:http://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设置 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证书配置,为系统提供了安全、稳定的运行环境。