# 部署指南

<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 与 HTTPS；HTTPS 由外部证书文件加载
  - 动态输出监听地址列表（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 证书
- 申请
  - Let’s 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)