348 lines
14 KiB
Markdown
348 lines
14 KiB
Markdown
# 监控运维
|
|
|
|
<cite>
|
|
**本文引用的文件**
|
|
- [backend/src/config/logger.js](file://backend/src/config/logger.js)
|
|
- [backend/Dockerfile](file://backend/Dockerfile)
|
|
- [docker-compose.yml](file://docker-compose.yml)
|
|
- [backend/start.sh](file://backend/start.sh)
|
|
- [backend/restart.sh](file://backend/restart.sh)
|
|
- [backend/stop.sh](file://backend/stop.sh)
|
|
- [backend/package.json](file://backend/package.json)
|
|
- [backend/src/config/env.js](file://backend/src/config/env.js)
|
|
- [backend/src/config/database.js](file://backend/src/config/database.js)
|
|
- [backend/src/config/redis.js](file://backend/src/config/redis.js)
|
|
- [frontend/nginx.conf](file://frontend/nginx.conf)
|
|
- [DEPLOY.md](file://DEPLOY.md)
|
|
- [backend/src/routes/index.js](file://backend/src/routes/index.js)
|
|
- [backend/src/routes/dashboard.js](file://backend/src/routes/dashboard.js)
|
|
</cite>
|
|
|
|
## 目录
|
|
1. [简介](#简介)
|
|
2. [项目结构](#项目结构)
|
|
3. [核心组件](#核心组件)
|
|
4. [架构总览](#架构总览)
|
|
5. [详细组件分析](#详细组件分析)
|
|
6. [依赖关系分析](#依赖关系分析)
|
|
7. [性能考虑](#性能考虑)
|
|
8. [故障排查指南](#故障排查指南)
|
|
9. [结论](#结论)
|
|
10. [附录](#附录)
|
|
|
|
## 简介
|
|
本文件面向生产环境的监控与运维,围绕系统监控指标、日志管理、性能调优、容器与服务健康检查、日志轮转与分析、异常告警、服务重启/停止/重新部署流程、备份与灾难恢复以及自动化运维脚本进行系统化说明。文档以仓库现有实现为基础,结合 Docker Compose 部署与 Nginx 代理链路,给出可操作的运维实践。
|
|
|
|
## 项目结构
|
|
- 后端采用 Node.js + Express,使用 winston 输出日志,Dockerfile 在容器内创建日志目录并暴露 8000 端口。
|
|
- 前端通过 Nginx 提供静态资源与反向代理,将 /api 前缀转发至后端容器的 8000 端口。
|
|
- docker-compose.yml 定义了 backend 与 frontend 两个服务,启用 json-file 日志轮转(单文件 10m,最多 5 个),并挂载 OTA 升级包存储卷。
|
|
- 运维脚本提供本地启动、重启与停止能力;部署指南提供完整的构建、上传与验证流程。
|
|
|
|
```mermaid
|
|
graph TB
|
|
subgraph "宿主机"
|
|
HOST["8082:80<br/>8083:8000"]
|
|
end
|
|
subgraph "容器网络"
|
|
NET["bridge 网络"]
|
|
end
|
|
subgraph "容器: 前端"
|
|
NGINX["Nginx<br/>监听 80<br/>反代 /api -> backend:8000"]
|
|
end
|
|
subgraph "容器: 后端"
|
|
NODE["Node.js 应用<br/>监听 8000"]
|
|
LOGS["/app/logs<br/>应用日志"]
|
|
end
|
|
HOST --> NGINX
|
|
NGINX --> |"HTTP"| NODE
|
|
NET --> NGINX
|
|
NET --> NODE
|
|
NODE --> LOGS
|
|
```
|
|
|
|
图表来源
|
|
- [docker-compose.yml:7-46](file://docker-compose.yml#L7-L46)
|
|
- [frontend/nginx.conf:1-34](file://frontend/nginx.conf#L1-L34)
|
|
- [backend/Dockerfile:1-20](file://backend/Dockerfile#L1-L20)
|
|
|
|
章节来源
|
|
- [docker-compose.yml:1-46](file://docker-compose.yml#L1-L46)
|
|
- [frontend/nginx.conf:1-34](file://frontend/nginx.conf#L1-L34)
|
|
- [backend/Dockerfile:1-20](file://backend/Dockerfile#L1-L20)
|
|
|
|
## 核心组件
|
|
- 日志系统:后端使用 winston 输出到控制台与文件,日志目录在容器内创建;前端通过 Nginx 提供静态资源与 API 代理。
|
|
- 容器编排:Docker Compose 定义服务、端口映射、日志轮转、网络与卷挂载。
|
|
- 运维脚本:start.sh、restart.sh、stop.sh 提供本地启动、重启与停止能力。
|
|
- 健康检查:部署指南中提供 /health 健康检查验证方法。
|
|
- 环境与配置:APP_ENV 控制开发/生产行为;数据库与 Redis 连接通过环境变量注入。
|
|
|
|
章节来源
|
|
- [backend/src/config/logger.js:1-29](file://backend/src/config/logger.js#L1-L29)
|
|
- [backend/Dockerfile:1-20](file://backend/Dockerfile#L1-L20)
|
|
- [docker-compose.yml:1-46](file://docker-compose.yml#L1-L46)
|
|
- [backend/start.sh:1-5](file://backend/start.sh#L1-L5)
|
|
- [backend/restart.sh:1-43](file://backend/restart.sh#L1-L43)
|
|
- [backend/stop.sh:1-14](file://backend/stop.sh#L1-L14)
|
|
- [DEPLOY.md:104-118](file://DEPLOY.md#L104-L118)
|
|
- [backend/src/config/env.js:1-13](file://backend/src/config/env.js#L1-L13)
|
|
- [backend/src/config/database.js:1-24](file://backend/src/config/database.js#L1-L24)
|
|
- [backend/src/config/redis.js:1-32](file://backend/src/config/redis.js#L1-L32)
|
|
|
|
## 架构总览
|
|
下图展示从浏览器到后端 API 的完整链路,包括 Nginx 代理、后端服务与日志输出位置。
|
|
|
|
```mermaid
|
|
sequenceDiagram
|
|
participant U as "用户浏览器"
|
|
participant F as "Nginx(前端)"
|
|
participant B as "Node.js(后端)"
|
|
participant L as "日志文件"
|
|
U->>F : "请求 /api/*"
|
|
F->>B : "反向代理到 backend : 8000"
|
|
B->>L : "写入应用日志(app.log)"
|
|
B-->>F : "返回响应(JSON)"
|
|
F-->>U : "返回页面/接口数据"
|
|
```
|
|
|
|
图表来源
|
|
- [frontend/nginx.conf:11-21](file://frontend/nginx.conf#L11-L21)
|
|
- [backend/src/config/logger.js:19-26](file://backend/src/config/logger.js#L19-L26)
|
|
- [backend/Dockerfile:5-6](file://backend/Dockerfile#L5-L6)
|
|
|
|
章节来源
|
|
- [frontend/nginx.conf:1-34](file://frontend/nginx.conf#L1-L34)
|
|
- [backend/src/config/logger.js:1-29](file://backend/src/config/logger.js#L1-L29)
|
|
- [backend/Dockerfile:1-20](file://backend/Dockerfile#L1-L20)
|
|
|
|
## 详细组件分析
|
|
|
|
### 日志管理与轮转
|
|
- 日志输出:后端使用 winston,同时输出到控制台与文件;日志目录在容器内创建。
|
|
- 日志轮转:Compose 使用 json-file 驱动,单文件大小限制为 10m,最多保留 5 个文件。
|
|
- 日志分析建议:生产环境建议将容器日志接入集中式日志系统(如 ELK/Fluentd/Loki),以便聚合、检索与告警。
|
|
|
|
```mermaid
|
|
flowchart TD
|
|
Start(["应用启动"]) --> Init["初始化 winston 日志器"]
|
|
Init --> DirCheck{"日志目录存在?"}
|
|
DirCheck --> |否| Mk["创建 /app/logs"]
|
|
DirCheck --> |是| Ready["准备就绪"]
|
|
Mk --> Ready
|
|
Ready --> Write["写入控制台与文件(app.log)"]
|
|
Write --> End(["运行中"])
|
|
```
|
|
|
|
图表来源
|
|
- [backend/src/config/logger.js:5-26](file://backend/src/config/logger.js#L5-L26)
|
|
- [backend/Dockerfile:5-6](file://backend/Dockerfile#L5-L6)
|
|
- [docker-compose.yml:1-5](file://docker-compose.yml#L1-L5)
|
|
|
|
章节来源
|
|
- [backend/src/config/logger.js:1-29](file://backend/src/config/logger.js#L1-L29)
|
|
- [backend/Dockerfile:1-20](file://backend/Dockerfile#L1-L20)
|
|
- [docker-compose.yml:1-6](file://docker-compose.yml#L1-L6)
|
|
|
|
### Docker 容器监控
|
|
- 端口与网络:后端容器固定监听 8000,前端容器监听 80;通过宿主端口 8082/8083 对外提供服务。
|
|
- 卷挂载:OTA 升级包存储挂载到宿主机目录,便于持久化与备份。
|
|
- 重启策略:unless-stopped,提升稳定性。
|
|
- 日志轮转:json-file 驱动,max-size/max-file 控制磁盘占用。
|
|
|
|
章节来源
|
|
- [docker-compose.yml:7-46](file://docker-compose.yml#L7-L46)
|
|
- [backend/Dockerfile:15-16](file://backend/Dockerfile#L15-L16)
|
|
|
|
### 服务健康检查
|
|
- 健康检查端点:部署指南提供 curl 命令验证 /health。
|
|
- 建议:在生产中可将 /health 设计为返回 200/500 并携带简要状态信息,便于监控系统自动探测。
|
|
|
|
章节来源
|
|
- [DEPLOY.md:104-118](file://DEPLOY.md#L104-L118)
|
|
|
|
### 性能监控指标定义
|
|
- 后端指标(建议采集):
|
|
- QPS/吞吐:每秒请求数、成功/失败率
|
|
- 响应时间:P50/P95/P99 延迟
|
|
- 错误率:4xx/5xx 比例
|
|
- 资源使用:CPU、内存、线程数
|
|
- 数据库连接:活跃连接数、等待队列长度
|
|
- Redis 连接:可用性、命令耗时
|
|
- IO:磁盘读写、日志文件大小增长
|
|
- 前端指标(建议采集):
|
|
- 静态资源命中率、缓存命中
|
|
- Nginx 连接数、请求速率、错误码分布
|
|
|
|
章节来源
|
|
- [backend/src/config/database.js:1-24](file://backend/src/config/database.js#L1-L24)
|
|
- [backend/src/config/redis.js:1-32](file://backend/src/config/redis.js#L1-L32)
|
|
|
|
### 资源使用跟踪与异常告警
|
|
- 建议使用 Prometheus + Grafana 或云监控(如 CloudWatch/Azure Monitor)采集容器与主机指标,并设置阈值告警。
|
|
- 关键告警场景:
|
|
- CPU/内存持续高位
|
|
- 响应时间 P95 超过阈值
|
|
- 数据库/Redis 连接池耗尽
|
|
- 日志文件增长过快(接近 max-size)
|
|
|
|
章节来源
|
|
- [docker-compose.yml:1-5](file://docker-compose.yml#L1-L5)
|
|
- [backend/src/config/database.js:1-24](file://backend/src/config/database.js#L1-L24)
|
|
- [backend/src/config/redis.js:1-32](file://backend/src/config/redis.js#L1-L32)
|
|
|
|
### 服务重启、停止与重新部署流程
|
|
- 本地开发:
|
|
- 启动:backend 下执行启动脚本
|
|
- 重启:使用重启脚本,内部查找并终止占用宿主 8083 端口的进程,随后启动应用
|
|
- 停止:使用停止脚本,查找并终止占用 8083 的进程
|
|
- 生产部署:
|
|
- 仅更新前端:本地构建后上传前端产物,服务器执行 frontend 重启
|
|
- 仅更新后端:上传后端代码,服务器执行后端镜像重建与 up
|
|
- 一键流程:前端构建 + 上传 + 后端重建 + 部署
|
|
- 停止服务:docker compose down
|
|
|
|
```mermaid
|
|
flowchart TD
|
|
A["开始"] --> B{"选择操作类型"}
|
|
B --> |本地启动| S["执行 start.sh"]
|
|
B --> |本地重启| R["执行 restart.sh<br/>终止旧进程并启动新进程"]
|
|
B --> |本地停止| T["执行 stop.sh<br/>终止占用 8083 的进程"]
|
|
B --> |生产更新前端| U1["本地构建 -> 上传前端 -> 服务器 restart frontend"]
|
|
B --> |生产更新后端| U2["上传后端 -> 服务器 build --no-cache backend -> up -d backend"]
|
|
B --> |停止服务| D["docker compose down"]
|
|
S --> E["完成"]
|
|
R --> E
|
|
T --> E
|
|
U1 --> E
|
|
U2 --> E
|
|
D --> E
|
|
```
|
|
|
|
图表来源
|
|
- [backend/start.sh:1-5](file://backend/start.sh#L1-L5)
|
|
- [backend/restart.sh:1-43](file://backend/restart.sh#L1-L43)
|
|
- [backend/stop.sh:1-14](file://backend/stop.sh#L1-L14)
|
|
- [DEPLOY.md:122-153](file://DEPLOY.md#L122-L153)
|
|
|
|
章节来源
|
|
- [backend/start.sh:1-5](file://backend/start.sh#L1-L5)
|
|
- [backend/restart.sh:1-43](file://backend/restart.sh#L1-L43)
|
|
- [backend/stop.sh:1-14](file://backend/stop.sh#L1-L14)
|
|
- [DEPLOY.md:104-153](file://DEPLOY.md#L104-L153)
|
|
|
|
### 备份策略、数据恢复与灾难恢复
|
|
- 数据库备份:
|
|
- MySQL:定期执行逻辑备份(mysqldump)或物理备份(Percona XtraBackup),并校验归档与异地存放
|
|
- 缓存数据:
|
|
- Redis:导出 RDB 快照或开启 AOF,确保快照与增量日志定期归档
|
|
- 文件与升级包:
|
|
- OTA 升级包:/data/projects/source 目录作为挂载卷,纳入常规文件备份策略
|
|
- 日志:
|
|
- 容器日志:json-file 轮转,建议将日志目录也纳入备份范围
|
|
- 恢复演练:
|
|
- 定期进行备份恢复演练,验证备份完整性与恢复时间目标(RTO/RPO)
|
|
|
|
章节来源
|
|
- [docker-compose.yml:25-26](file://docker-compose.yml#L25-L26)
|
|
- [backend/src/config/database.js:1-24](file://backend/src/config/database.js#L1-L24)
|
|
- [backend/src/config/redis.js:1-32](file://backend/src/config/redis.js#L1-L32)
|
|
|
|
### 自动化运维工具与脚本
|
|
- 上传脚本:scripts/upload.sh 支持上传 frontend、backend、compose 等子任务,便于一键部署
|
|
- Compose 命令:build、up、down、logs、ps 等用于构建、启动、停止与日志查看
|
|
- 建议扩展:
|
|
- CI/CD:在流水线中集成前端构建、上传与后端镜像构建
|
|
- 健康检查钩子:在部署前后执行 /health 校验
|
|
- 告警联动:当部署失败或健康检查失败时自动回滚
|
|
|
|
章节来源
|
|
- [DEPLOY.md:63-90](file://DEPLOY.md#L63-L90)
|
|
- [DEPLOY.md:100-102](file://DEPLOY.md#L100-L102)
|
|
- [DEPLOY.md:148-153](file://DEPLOY.md#L148-L153)
|
|
|
|
## 依赖关系分析
|
|
- 后端应用依赖:
|
|
- Express 提供 Web 服务与路由
|
|
- Winston 提供日志记录
|
|
- Sequelize/MySQL 提供数据持久化
|
|
- ioredis 提供 Redis 连接
|
|
- dotenv 加载环境变量
|
|
- 前端依赖:
|
|
- Nginx 提供静态资源与反向代理
|
|
- 运维依赖:
|
|
- Docker Compose 管理多容器编排
|
|
- Shell 脚本提供本地启动/停止/重启
|
|
|
|
```mermaid
|
|
graph LR
|
|
APP["后端应用"] --> W["winston"]
|
|
APP --> S["sequelize/mysql"]
|
|
APP --> R["ioredis"]
|
|
APP --> E["express"]
|
|
APP --> D["dotenv"]
|
|
FE["前端(Nginx)"] --> APP
|
|
OPS["运维"] --> DC["docker-compose"]
|
|
OPS --> SH["shell 脚本"]
|
|
```
|
|
|
|
图表来源
|
|
- [backend/package.json:11-27](file://backend/package.json#L11-L27)
|
|
- [frontend/nginx.conf:1-34](file://frontend/nginx.conf#L1-L34)
|
|
- [docker-compose.yml:7-46](file://docker-compose.yml#L7-L46)
|
|
- [backend/start.sh:1-5](file://backend/start.sh#L1-L5)
|
|
|
|
章节来源
|
|
- [backend/package.json:1-29](file://backend/package.json#L1-L29)
|
|
- [frontend/nginx.conf:1-34](file://frontend/nginx.conf#L1-L34)
|
|
- [docker-compose.yml:1-46](file://docker-compose.yml#L1-L46)
|
|
- [backend/start.sh:1-5](file://backend/start.sh#L1-L5)
|
|
|
|
## 性能考虑
|
|
- Nginx 层优化:
|
|
- 启用 gzip 压缩静态资源
|
|
- 合理设置 client_max_body_size 与缓存头
|
|
- 后端层优化:
|
|
- 数据库连接池与查询优化
|
|
- Redis 命令超时与重试策略
|
|
- 日志级别与格式开销控制
|
|
- 容器层优化:
|
|
- 合理设置 restart 策略与资源限制
|
|
- 使用只读卷与最小权限原则
|
|
|
|
章节来源
|
|
- [frontend/nginx.conf:7-32](file://frontend/nginx.conf#L7-L32)
|
|
- [backend/src/config/database.js:1-24](file://backend/src/config/database.js#L1-L24)
|
|
- [backend/src/config/redis.js:1-32](file://backend/src/config/redis.js#L1-L32)
|
|
- [backend/src/config/logger.js:10-26](file://backend/src/config/logger.js#L10-L26)
|
|
- [docker-compose.yml:21-22](file://docker-compose.yml#L21-L22)
|
|
|
|
## 故障排查指南
|
|
- 前端页面空白:
|
|
- 检查 dist 是否上传、路径是否正确
|
|
- 查看前端容器日志
|
|
- API 请求失败:
|
|
- 确认后端容器处于 running 状态
|
|
- 查看后端容器日志,关注数据库、Redis、搜索引擎连接错误
|
|
- 核对 Nginx 代理目标为 backend:8000
|
|
- 后端构建失败:
|
|
- 确认已上传 package.json 与 pnpm-lock.yaml
|
|
- 使用指定 Node 版本与包管理器版本
|
|
- 修改 .env 不生效:
|
|
- 强制重建后端容器使其加载新环境变量
|
|
- 停止服务:
|
|
- 使用 docker compose down
|
|
|
|
章节来源
|
|
- [DEPLOY.md:226-256](file://DEPLOY.md#L226-L256)
|
|
|
|
## 结论
|
|
本运维文档基于现有代码与部署配置,给出了日志管理、容器监控、健康检查、性能指标、异常告警、服务运维流程、备份与灾难恢复以及自动化脚本的实践建议。建议在生产环境中补充集中式日志、指标采集与告警体系,并完善备份与恢复演练,以保障系统稳定与可追溯性。
|
|
|
|
## 附录
|
|
- 健康检查端点:/health(参考部署指南中的 curl 示例)
|
|
- 环境变量参考:数据库、应用、认证、搜索、S3、OTA、Redis EQ 等(参考部署指南中的表格)
|
|
|
|
章节来源
|
|
- [DEPLOY.md:104-118](file://DEPLOY.md#L104-L118)
|
|
- [DEPLOY.md:190-203](file://DEPLOY.md#L190-L203) |