Files
video_socket-server/.qoder/repowiki/zh/content/部署指南/部署指南.md
2026-05-16 13:24:02 +08:00

348 lines
12 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 部署指南
<cite>
**本文引用的文件**
- [package.json](file://package.json)
- [src/index.ts](file://src/index.ts)
- [src/server.ts](file://src/server.ts)
- [src/class/options.ts](file://src/class/options.ts)
- [src/log.ts](file://src/log.ts)
- [run.bat](file://run.bat)
- [tsconfig.json](file://tsconfig.json)
</cite>
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构总览](#架构总览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能考虑](#性能考虑)
8. [故障排除指南](#故障排除指南)
9. [结论](#结论)
10. [附录](#附录)
## 简介
本指南面向生产环境部署“视频流服务器”应用,覆盖以下主题:
- 生产环境配置要求Node.js 版本、系统资源、网络与安全参数
- 容器化部署Docker 方案(含镜像构建与运行)
- 编排部署Kubernetes 部署清单模板与要点
- 反向代理Nginx 与 Apache 的典型配置思路
- SSL/TLS 证书:申请与配置流程
- 性能优化:内存管理、并发处理、资源限制
- 监控与日志:日志级别与输出策略
- 故障排除与维护:常见问题定位与修复
- 自动化与 CI/CD打包、运行与部署脚本建议
## 项目结构
该仓库为基于 TypeScript 的 Express 服务器,提供 WebSocket 信令与静态资源服务,并内置 Swagger 文档与头像上传接口。
```mermaid
graph TB
A["入口脚本<br/>src/index.ts"] --> B["HTTP(S) 服务器<br/>Express 应用"]
B --> C["静态资源<br/>client/public"]
B --> D["信令路由<br/>/signaling"]
B --> E["Swagger 文档<br/>/swagger*"]
B --> F["头像上传接口<br/>/api/upload/avatar"]
A --> G["日志模块<br/>src/log.ts"]
A --> H["选项解析<br/>src/class/options.ts"]
```
图表来源
- [src/index.ts:13-106](file://src/index.ts#L13-L106)
- [src/server.ts:14-89](file://src/server.ts#L14-L89)
- [src/log.ts:1-51](file://src/log.ts#L1-L51)
- [src/class/options.ts:1-10](file://src/class/options.ts#L1-L10)
章节来源
- [src/index.ts:13-106](file://src/index.ts#L13-L106)
- [src/server.ts:14-89](file://src/server.ts#L14-L89)
- [package.json:1-60](file://package.json#L1-L60)
## 核心组件
- 启动与配置
- 命令行参数解析与默认值端口、HTTPS 开关、密钥/证书路径、信令类型、通信模式、HTTP 访问日志级别
- 环境变量覆盖PORT、SECURE、KEYFILE、CERTFILE、TYPE、MODE、LOGGING
- HTTP(S) 服务器
- 支持 HTTP 与 HTTPSHTTPS 由外部证书文件加载
- 动态输出监听地址列表IPv4
- Express 应用
- CORS 允许跨域
- JSON/URL 编码请求体解析
- 静态资源托管与根页面路由
- Swagger 文档初始化
- 头像上传接口Multer 存储到 uploads/avatars
- 日志系统
- 日志级别枚举与动态设置
- 控制台输出格式化时间戳与级别前缀
章节来源
- [src/index.ts:20-44](file://src/index.ts#L20-L44)
- [src/index.ts:55-74](file://src/index.ts#L55-L74)
- [src/server.ts:14-89](file://src/server.ts#L14-L89)
- [src/log.ts:1-51](file://src/log.ts#L1-L51)
- [src/class/options.ts:1-10](file://src/class/options.ts#L1-L10)
## 架构总览
下图展示从客户端到服务器的典型交互路径,包括 HTTP(S) 访问、静态资源、信令与上传流程。
```mermaid
graph TB
subgraph "客户端"
U["浏览器/前端"]
end
subgraph "反向代理层"
RP["Nginx/Apache"]
end
subgraph "应用服务器"
S["Express 应用"]
WS["WebSocket 信令"]
FS["静态资源<br/>client/public"]
SW["Swagger 文档"]
UP["头像上传接口"]
end
subgraph "证书"
CERT["server.key / server.cert"]
end
U --> RP
RP --> S
S --> FS
S --> SW
S --> UP
S --> WS
S -. 使用证书 .-> CERT
```
图表来源
- [src/index.ts:55-65](file://src/index.ts#L55-L65)
- [src/server.ts:25-28](file://src/server.ts#L25-L28)
- [src/server.ts:44-83](file://src/server.ts#L44-L83)
## 详细组件分析
### 启动与配置组件
- 命令行与环境变量映射
- 端口:支持 -p/--port 与 PORT
- HTTPS-s/--secure 与 SECURE需配合 -k/--keyfile 与 -c/--certfile 或 KEYFILE/CERTFILE
- 信令类型:-t/--type 支持 websocket/http默认 websocket
- 模式:-m/--mode 支持 public/private默认 public
- 日志:-l/--logging 支持 combined/dev/short/tiny/none默认 dev
- 服务器启动
- HTTPS 时读取密钥与证书文件
- 输出监听地址与协议http/https
```mermaid
sequenceDiagram
participant CLI as "命令行/环境变量"
participant IDX as "src/index.ts"
participant APP as "Express 应用"
participant HTTPS as "HTTPS 服务器"
CLI->>IDX : 解析参数与默认值
IDX->>APP : 创建 Express 应用
IDX->>HTTPS : 加载 server.key/server.cert
HTTPS-->>IDX : 绑定端口并输出监听地址
IDX-->>CLI : 打印启动信息
```
图表来源
- [src/index.ts:20-44](file://src/index.ts#L20-L44)
- [src/index.ts:55-74](file://src/index.ts#L55-L74)
章节来源
- [src/index.ts:20-44](file://src/index.ts#L20-L44)
- [src/index.ts:55-74](file://src/index.ts#L55-L74)
- [src/class/options.ts:1-10](file://src/class/options.ts#L1-L10)
### HTTP 服务器与静态资源
- 路由与中间件
- CORS 允许所有来源
- JSON/URL 编码请求体解析
- 静态资源:根目录与 /module
- 根路径返回 index.html若存在
- Swagger 文档
- 初始化并暴露文档端点
- 头像上传
- Multer 存储到 uploads/avatars
- 接口返回重命名后的访问路径
```mermaid
flowchart TD
Start(["请求进入"]) --> CORS["CORS 中间件"]
CORS --> Body["JSON/URL 编码解析"]
Body --> Routes{"匹配路由"}
Routes --> |"/" 或 "/index.html"| StaticIndex["返回静态首页"]
Routes --> |"/module/*"| StaticModule["返回模块源码"]
Routes --> |"/signaling"| Signaling["信令路由"]
Routes --> |"/swagger*"| Swagger["Swagger 文档"]
Routes --> |"/api/upload/avatar"| Upload["头像上传处理"]
Routes --> |"/uploads/*"| StaticUploads["返回上传文件"]
Routes --> |其他| NotFound["404 未找到"]
```
图表来源
- [src/server.ts:14-89](file://src/server.ts#L14-L89)
章节来源
- [src/server.ts:14-89](file://src/server.ts#L14-L89)
### 日志系统
- 日志级别none/error/warn/log/info
- 动态设置:通过命令行 -l/--logging 或环境变量 LOGGING
- 输出格式:带 ISO 时间戳与级别前缀
章节来源
- [src/log.ts:1-51](file://src/log.ts#L1-L51)
- [src/index.ts:28](file://src/index.ts#L28)
## 依赖关系分析
- 运行时依赖
- express、ws、cors、multer、morgan、swagger-ui-express 等
- 开发与构建
- TypeScript、Jest、ESLint、ts-node、pkg 等
- 包装与分发
- pkg 将构建产物与静态资源打包为可执行文件
```mermaid
graph LR
P["package.json"] --> TSC["TypeScript 编译"]
P --> JEST["Jest 测试"]
P --> ESL["ESLint 规则"]
P --> TS["ts-node 开发"]
P --> PKG["pkg 打包"]
TSC --> BUILD["build 目录产物"]
PKG --> BIN["可执行二进制"]
```
图表来源
- [package.json:14-46](file://package.json#L14-L46)
- [package.json:50-58](file://package.json#L50-L58)
- [tsconfig.json:1-13](file://tsconfig.json#L1-L13)
章节来源
- [package.json:14-46](file://package.json#L14-L46)
- [package.json:50-58](file://package.json#L50-L58)
- [tsconfig.json:1-13](file://tsconfig.json#L1-L13)
## 性能考虑
- 内存管理
- 使用 Node.js 的垃圾回收与进程退出策略,避免内存泄漏
- 对大文件上传(如头像)采用流式处理与合理缓存大小
- 并发处理
- Express 默认并发能力受 Node.js 事件循环影响;高并发场景建议前置反向代理或使用集群模式
- WebSocket 信令应结合连接数与消息频率进行限流与心跳检测
- 资源限制
- 设置合理的 ulimit、文件句柄上限与 Node.js 堆内存上限
- 在容器中配置 CPU/内存资源配额与重启策略
- I/O 与静态资源
- 将静态资源交由反向代理缓存与压缩gzip/br减轻应用压力
- 日志与监控
- 使用 morgan 输出访问日志,结合日志切割与归档
- 结合系统监控CPU/内存/磁盘/网络与应用指标QPS/响应时间/错误率)
## 故障排除指南
- 启动失败(证书相关)
- 确认 server.key 与 server.cert 文件存在且可读
- 检查 -s/--secure 是否启用,以及 -k/-c 或 KEYFILE/CERTFILE 是否正确
- 端口占用
- 更换 -p/--port 或释放占用端口;确认防火墙放行
- CORS 与跨域
- 当前实现允许所有来源;生产环境建议限定来源
- 上传失败
- 检查 uploads/avatars 目录权限与磁盘空间
- 确认 Multer 存储配置与文件大小限制
- 日志级别过低
- 提升 -l/--logging 或设置 LOGGING=dev/info 等
- 信令类型不支持
- 仅支持 websocket 与 http非预期值会被修正为 websocket
章节来源
- [src/index.ts:55-65](file://src/index.ts#L55-L65)
- [src/server.ts:44-83](file://src/server.ts#L44-L83)
- [src/log.ts:15-24](file://src/log.ts#L15-L24)
## 结论
本指南提供了从配置、部署到运维的完整路径。生产环境建议:
- 使用反向代理统一接入与证书终止
- 以容器化与编排方式提升弹性与可观测性
- 严格控制日志级别与输出,配合监控告警
- 对上传与媒体数据进行容量与安全评估
## 附录
### A. 生产环境配置要求
- Node.js 版本
- 建议使用长期支持版本LTS确保与依赖兼容
- 系统资源
- CPU根据并发连接与媒体处理需求评估
- 内存:预留足够堆内存与静态资源缓存
- 磁盘:为 uploads/avatars 与日志保留充足空间
- 网络
- 开放端口HTTP(80)/HTTPS(443) 与 WebSocket 端口
- 防火墙与安全组放行
- 反向代理层启用 TLS 终止与压缩
### B. Docker 容器化部署
- 构建镜像
- 使用多阶段构建,先安装依赖、再编译、最后复制运行时产物
- 将 client/public 与构建产物纳入镜像
- 运行容器
- 映射端口80/443 至宿主机
- 挂载证书卷server.key 与 server.cert
- 挂载上传目录:确保持久化
- 设置环境变量覆盖默认配置(如 PORT、MODE、LOGGING
### C. Kubernetes 部署配置
- Deployment
- 设置副本数、就绪探针与存活探针
- 资源请求与限制
- Service
- ClusterIP/LoadBalancer/Ingress 选择
- ConfigMap
- 非敏感配置项(如日志级别)
- Secret
- 证书与敏感参数(如密钥文件)
- Ingress
- TLS 配置与路径转发规则
### D. 反向代理设置
- Nginx
- HTTPS 终止:配置 server 与 ssl_certificate/ssl_certificate_key
- 负载均衡upstream 与健康检查
- 静态资源缓存与压缩
- WebSocket 反向代理:升级头部透传
- Apache
- mod_ssl 终止 HTTPS
- mod_proxy_http 与 mod_proxy_wstunnel 代理 HTTP 与 WebSocket
- 启用压缩与缓存
### E. SSL/TLS 证书
- 申请
- Lets Encrypt免费、商业 CA 或企业内 CA
- 配置
- 将证书与私钥放置于安全位置
- 在启动参数中指定 -k/--keyfile 与 -c/--certfile
- 或通过环境变量 KEYFILE/CERTFILE 指定
### F. 监控与日志
- 日志
- 使用 morgan 输出访问日志,按天切割
- 结合日志聚合(如 ELK/Fluentd与告警
- 指标
- 连接数、吞吐量、错误率、响应时间
- 媒体帧率、丢包率等业务指标
### G. 自动化部署与 CI/CD
- 构建
- 使用 npm ci、tsc 与 pkg 生成可执行文件
- 测试
- Jest 单元测试与 Postman 集成测试
- 部署
- Docker 镜像推送至镜像仓库
- Kubernetes 应用部署与滚动更新
- 脚本
- run.bat 示例展示了构建与启动流程,可参考扩展为 CI/CD 步骤
章节来源
- [run.bat:1-17](file://run.bat#L1-L17)
- [package.json:5-12](file://package.json#L5-L12)