14 KiB
14 KiB
部署与运维
**本文引用的文件** - [docker-compose.yml](file://docker-compose.yml) - [DEPLOY.md](file://DEPLOY.md) - [backend/Dockerfile](file://backend/Dockerfile) - [frontend/Dockerfile](file://frontend/Dockerfile) - [backend/src/config/env.js](file://backend/src/config/env.js) - [backend/src/config/loadEnv.js](file://backend/src/config/loadEnv.js) - [backend/src/config/database.js](file://backend/src/config/database.js) - [backend/src/config/redis.js](file://backend/src/config/redis.js) - [backend/src/config/logger.js](file://backend/src/config/logger.js) - [scripts/upload.sh](file://scripts/upload.sh) - [backend/package.json](file://backend/package.json) - [frontend/package.json](file://frontend/package.json) - [backend/start.sh](file://backend/start.sh) - [backend/restart.sh](file://backend/restart.sh) - [backend/stop.sh](file://backend/stop.sh)目录
简介
本文件面向部署与运维工程师,系统性说明项目的容器化部署、环境配置、生产部署流程、容器编排、服务依赖与网络设置、部署脚本使用、自动化流程、环境变量与数据库/缓存配置、监控与日志、性能调优、故障排除、备份恢复与灾难恢复、CI/CD 与版本发布/回滚策略,以及安全配置与访问控制。
项目结构
- 前端采用 Nginx 静态托管,后端为 Node.js API,二者通过 Docker Compose 在同一自定义桥接网络中通信。
- 前端不构建镜像,直接挂载服务器上的构建产物与 Nginx 配置;后端以独立镜像运行。
- 日志轮转策略在 Compose 层统一配置,便于生产环境管理。
- OTA 升级包本地存储通过宿主机卷挂载到后端容器,确保升级资源可用性。
graph TB
subgraph "宿主机"
V1["/data/projects/source<br/>OTA 存储卷"]
FDist["/data/project/dashboard/frontend/dist<br/>前端静态资源"]
NConf["/data/project/dashboard/frontend/nginx.conf<br/>Nginx 配置"]
end
subgraph "Docker 网络 audio-network"
FE["容器 dashboard-frontend<br/>Nginx:80"]
BE["容器 dashboard-backend<br/>Node.js:8000"]
end
V1 --> BE
FDist --> FE
NConf --> FE
FE --> |"反向代理 /api → http://backend:8000"| BE
图表来源
章节来源
核心组件
- 后端服务(Node.js)
- 基于 Node.js 22 Alpine 镜像,使用 pnpm 生产依赖安装,工作目录包含日志目录,暴露 8000 端口。
- 通过环境变量驱动数据库、Redis、搜索、S3、OTA 等配置。
- 前端服务(Nginx)
- 使用 Nginx Alpine 镜像,挂载静态资源与 Nginx 配置,不构建镜像,减少部署复杂度。
- 容器编排与网络
- Compose 定义自定义桥接网络,前后端在同一网络内通信;前端通过 Nginx 将 /api 代理到后端容器的 8000 端口。
- 部署脚本
- 提供一键上传前端、后端、Compose 的 rsync 脚本,支持虚拟执行与多目标组合。
章节来源
架构总览
- 端口映射
- 前端 Nginx 暴露 80,映射到宿主机 8082。
- 后端 Node.js 暴露 8000,映射到宿主机 8083。
- 服务依赖
- 前端依赖后端 API;Compose 通过 depends_on 实现启动顺序。
- 网络
- 两容器加入同一自定义桥接网络,实现容器间通过服务名访问。
- 日志
- 每个服务启用 JSON 文件日志轮转,单文件最大 10MB,最多 5 个文件。
sequenceDiagram
participant U as "用户浏览器"
participant FE as "dashboard-frontend(Nginx)"
participant BE as "dashboard-backend(Node.js)"
U->>FE : "访问 http : //<host> : 8082/"
FE->>FE : "解析路由与静态资源"
U->>FE : "请求 /api/*"
FE->>BE : "反向代理到 http : //backend : 8000"
BE-->>FE : "返回 API 响应"
FE-->>U : "返回 HTML/JS/CSS 与 API 数据"
图表来源
章节来源
详细组件分析
后端容器与应用配置
- 环境变量加载
- 容器内通过根目录 .env 注入;本地开发与 Docker 部署共享同一 .env 加载逻辑,但 Docker 下容器内无 .env 文件,由 Compose 注入。
- 环境类型
- 通过 APP_ENV 判断开发/生产环境,影响日志输出等行为。
- 数据库连接
- 使用 Sequelize 连接 MySQL,支持主机、端口、用户名、密码、字符集、日志开关等配置项。
- Redis 缓存
- 提供 EQ 缓存客户端工厂方法,支持主机、端口、密码、数据库编号、超时与重试配置,并记录错误日志。
- 日志
- 使用 Winston 输出到控制台与文件,日志目录位于应用内部 logs 子目录。
flowchart TD
Start(["启动后端"]) --> LoadEnv["加载根目录 .envCompose 注入"]
LoadEnv --> EnvCheck{"APP_ENV 是否为 production"}
EnvCheck --> |是| Prod["生产模式:关闭 ORM 日志"]
EnvCheck --> |否| Dev["开发模式:开启 ORM 日志"]
Prod --> DB["初始化数据库连接Sequelize"]
Dev --> DB
DB --> RedisInit["初始化 Redis 客户端"]
RedisInit --> Logger["初始化日志记录器"]
Logger --> Ready(["服务就绪"])
图表来源
- backend/src/config/loadEnv.js:1-15
- backend/src/config/env.js:1-13
- backend/src/config/database.js:1-24
- backend/src/config/redis.js:1-32
- backend/src/config/logger.js:1-29
章节来源
- backend/src/config/loadEnv.js:1-15
- backend/src/config/env.js:1-13
- backend/src/config/database.js:1-24
- backend/src/config/redis.js:1-32
- backend/src/config/logger.js:1-29
前端容器与 Nginx 配置
- 镜像与构建
- 使用 Nginx Alpine 镜像,挂载静态资源与 Nginx 配置文件,不构建前端镜像。
- 代理规则
- 前端通过 Nginx 将 /api 代理到后端容器的 8000 端口,确保 SPA 与 API 请求分离。
- 卷挂载
- 前端 dist 与 nginx.conf 通过宿主机卷挂载,便于快速更新与热替换。
章节来源
容器编排与网络
- 自定义桥接网络
- 两容器加入同一网络,实现通过服务名访问后端 API。
- 端口映射
- 前端 80:8082,后端 8000:8083,避免端口冲突。
- 日志轮转
- 每个服务启用 JSON 文件日志轮转,单文件 10MB,最多 5 份。
章节来源
部署脚本与自动化
- 功能特性
- 支持同步前端、后端、Compose 三类目标,也支持指定路径与虚拟执行。
- 默认目标包含前端 dist、后端 src 与依赖锁文件、Compose 文件。
- SSH 密钥与远程路径可配置,便于跨环境复用。
- 使用场景
- 本地构建前端后,一键上传前端与 Compose 并在服务器执行 docker compose up -d。
- 后端代码变更后,上传后端文件并在服务器重建后端镜像并启动。
sequenceDiagram
participant Dev as "开发者"
participant Script as "upload.sh"
participant Server as "服务器"
Dev->>Script : "执行 ./scripts/upload.sh frontend"
Script->>Server : "rsync 前端 dist 到 /data/project/dashboard/frontend/dist"
Dev->>Script : "执行 ./scripts/upload.sh compose"
Script->>Server : "rsync docker-compose.yml"
Dev->>Server : "在服务器执行 docker compose up -d"
Server-->>Dev : "验证服务状态与日志"
图表来源
章节来源
本地开发与非容器部署
- 本地开发
- 后端在 8083 端口启动,前端在 3000 端口启动并通过代理转发 /api 到后端。
- 非容器部署
- 通过 start.sh/stop.sh/restart.sh 管理本地进程,便于调试与快速迭代。
章节来源
依赖分析
- 后端依赖
- Web 框架、ORM、MySQL 驱动、JWT、S3 SDK、Redis 客户端、日志、校验等。
- 前端依赖
- Vue 3、Element Plus、路由、HTTP 客户端等。
- 版本锁定
- 后端与前端均使用 pnpm 并固定版本,保证构建一致性。
graph LR
BE["后端 Node.js"] --> PkgBE["package.json 依赖"]
FE["前端 Vue 应用"] --> PkgFE["package.json 依赖"]
PkgBE --> Express["express"]
PkgBE --> Sequelize["sequelize + mysql2"]
PkgBE --> JWT["jsonwebtoken"]
PkgBE --> S3["@aws-sdk/client-s3"]
PkgBE --> Redis["ioredis"]
PkgBE --> Winston["winston"]
PkgBE --> Dotenv["dotenv"]
PkgFE --> Vue["vue"]
PkgFE --> EP["element-plus"]
PkgFE --> Axios["axios"]
PkgFE --> Router["vue-router"]
图表来源
章节来源
性能考虑
- 日志轮转
- Compose 层启用日志轮转,避免磁盘膨胀;建议结合系统日志聚合与保留策略。
- 静态资源优化
- 前端构建产物通过 Nginx 提供,建议配合缓存头与压缩策略提升首屏性能。
- 数据库与缓存
- 生产环境建议使用专用数据库与 Redis 实例,合理设置连接池与超时参数。
- 容器资源
- 建议在生产环境中为容器设置 CPU/内存限制与健康检查,增强稳定性。
- CDN 与反代
- 对静态资源与 API 可引入反向代理与 CDN,降低后端压力。
故障排除指南
- 前端页面空白
- 检查 dist 是否上传成功、Nginx 代理是否指向后端 8000 端口、浏览器控制台是否存在 404。
- API 请求失败
- 确认后端容器处于 running 状态、查看后端日志定位数据库/Redis/Meilisearch 连接问题。
- 后端构建失败(pnpm/Node 版本)
- 确保上传了 package.json 与 pnpm-lock.yaml,后端镜像基于 node:22-alpine。
- .env 修改不生效
- 通过重新创建容器使新环境变量生效。
- 停止/重启服务
- 使用 docker compose down 或在服务器执行 restart.sh/stop.sh/stop.sh 管理本地进程。
章节来源
结论
本项目采用轻量化的容器化方案:前端 Nginx 静态托管、后端 Node.js API,通过 Compose 统一编排与网络隔离,辅以集中式 .env 管理与 rsync 自动化脚本,形成可重复、可审计的生产部署流程。建议在生产中进一步完善资源限制、健康检查、日志聚合与监控告警体系,以满足高可用与可观测性要求。
附录
环境变量与配置清单
- 数据库
- DATABASE_HOST、DATABASE_PORT、DATABASE_NAME、DATABASE_USER、DATABASE_PASSWORD
- 应用
- APP_NAME、APP_ENV
- 认证
- JWT_SECRET、DASHBOARD_ADMIN_USERNAME、DASHBOARD_ADMIN_PASSWORD
- 搜索
- MEILISEARCH_URL、MEILISEARCH_API_KEY、MEILISEARCH_INDEX
- S3
- AWS_REGION、AWS_S3_OTA_BUCKET、AWS_S3_MEASUREMENT_BUCKET
- OTA
- OTA_X8_PUBLIC_BASE、OTA_X9_URL_BASE、OTA_UPLOAD_DIR
- Redis EQ
- REDIS_HOST、REDIS_PORT、REDIS_PASSWORD、REDIS_EQ_DB
章节来源
目录结构(服务器)
- /data/project/dashboard/
- .env、docker-compose.yml、backend/(含 Dockerfile、package.json、pnpm-lock.yaml、src/)、frontend/(dist、nginx.conf)
- /data/projects/source/(OTA 升级包存储)
章节来源
监控指标与日志管理
- 指标
- 建议采集容器 CPU/内存/IO、API 响应时间与错误率、数据库连接数、Redis 命中率等。
- 日志
- 后端日志写入容器内 logs 文件,结合 Compose 日志轮转;建议接入集中式日志系统进行检索与告警。
章节来源
备份与灾难恢复
- 数据库
- 定期导出 MySQL 数据,保存至安全位置或对象存储。
- 配置与代码
- .env 与源码版本化管理,确保可追溯与快速回滚。
- OTA 存储
- /data/projects/source 作为本地存储,建议异地复制或对象存储归档。
- 灾难恢复
- 准备最小化恢复步骤:拉起 Compose、恢复 .env、恢复数据库快照、恢复静态资源与 Nginx 配置。
CI/CD 流程、版本发布与回滚
- 流程建议
- 代码合并触发流水线:前端构建、后端构建、上传脚本执行、Compose 启动。
- 发布与回滚
- 以标签/分支为版本依据;回滚时使用相同镜像版本或恢复 .env 快照,必要时回退数据库迁移。
安全配置、防火墙与访问控制
- 端口与防火墙
- 仅开放 8082(前端)、8083(后端)与必要的系统端口;限制来源 IP。
- 认证与密钥
- 生产环境务必更换 JWT_SECRET、管理员密码;S3 优先使用 IAM 角色而非明文凭据。
- 网络隔离
- 将数据库与缓存置于隔离网络,仅允许后端容器访问;必要时启用网络策略。