# 监控运维 **本文引用的文件** - [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) ## 目录 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
8083:8000"] end subgraph "容器网络" NET["bridge 网络"] end subgraph "容器: 前端" NGINX["Nginx
监听 80
反代 /api -> backend:8000"] end subgraph "容器: 后端" NODE["Node.js 应用
监听 8000"] LOGS["/app/logs
应用日志"] 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
终止旧进程并启动新进程"] B --> |本地停止| T["执行 stop.sh
终止占用 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)