Files

351 lines
13 KiB
Markdown
Raw Permalink Normal View History

2026-05-16 13:24:02 +08:00
# 容器化部署
<cite>
**本文引用的文件**
- [package.json](file://package.json)
- [tsconfig.json](file://tsconfig.json)
- [tsconfig.build.json](file://tsconfig.build.json)
- [src/index.ts](file://src/index.ts)
- [src/server.ts](file://src/server.ts)
- [src/signaling.ts](file://src/signaling.ts)
- [src/websocket.ts](file://src/websocket.ts)
- [src/class/options.ts](file://src/class/options.ts)
- [src/服务端接口与WebSocket消息类型.md](file://src/服务端接口与WebSocket消息类型.md)
- [.gitignore](file://.gitignore)
- [run.bat](file://run.bat)
- [server.cert](file://server.cert)
</cite>
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构总览](#架构总览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能考虑](#性能考虑)
8. [故障排查指南](#故障排查指南)
9. [结论](#结论)
10. [附录](#附录)
## 简介
本文件面向视频流服务器项目,提供从本地开发到容器化部署的完整指南,覆盖以下主题:
- Docker 镜像构建Dockerfile 配置与多阶段构建优化
- Docker Compose服务定义、端口映射、卷挂载、环境变量
- 容器网络:端口暴露、内部通信、外部访问
- Kubernetes 部署Deployment、Service、Ingress 资源定义
- 安全配置:证书、密钥、只读根文件系统、非 root 用户
- 资源限制与健康检查
- 监控与日志最佳实践
## 项目结构
该仓库为基于 Node.js + Express + WebSocket 的视频信令与静态资源服务,核心运行方式如下:
- 使用命令行参数控制端口、HTTPS、信令协议类型、通信模式、日志级别等
- 默认监听端口可在脚本中查看,支持 HTTP 或 HTTPS
- 提供静态页面与上传接口,集成 Swagger 文档
- 通过 HTTP 轮询或 WebSocket 提供 WebRTC 信令
```mermaid
graph TB
subgraph "应用进程"
A["Express 应用<br/>src/server.ts"]
B["HTTP/HTTPS 服务器<br/>src/index.ts"]
C["WebSocket 信令<br/>src/websocket.ts"]
D["信令路由<br/>src/signaling.ts"]
end
subgraph "静态资源"
E["客户端页面<br/>client/public"]
F["前端模块<br/>client/src"]
end
subgraph "配置与脚本"
G["启动脚本<br/>package.json scripts"]
H["编译配置<br/>tsconfig.json/tsconfig.build.json"]
I["运行批处理<br/>run.bat"]
end
B --> A
A --> D
A --> E
A --> F
B --> C
G --> B
H --> G
I --> G
```
**图表来源**
- [src/server.ts:14-89](file://src/server.ts#L14-L89)
- [src/index.ts:52-91](file://src/index.ts#L52-L91)
- [src/websocket.ts:15-39](file://src/websocket.ts#L15-L39)
- [src/signaling.ts:4-24](file://src/signaling.ts#L4-L24)
- [package.json:5-12](file://package.json#L5-L12)
- [tsconfig.json:1-13](file://tsconfig.json#L1-L13)
- [tsconfig.build.json:1-5](file://tsconfig.build.json#L1-L5)
- [run.bat:1-6](file://run.bat#L1-L6)
**章节来源**
- [package.json:5-12](file://package.json#L5-L12)
- [src/index.ts:20-40](file://src/index.ts#L20-L40)
- [src/server.ts:14-89](file://src/server.ts#L14-L89)
- [tsconfig.json:1-13](file://tsconfig.json#L1-L13)
- [run.bat:1-6](file://run.bat#L1-L6)
## 核心组件
- 应用入口与参数解析:负责读取命令行参数与环境变量,初始化 Express 应用与 HTTPS/HTTP 服务器
- Express 服务器:配置 CORS、日志、静态资源、上传接口、Swagger 文档
- WebSocket 信令:基于 ws 的信令通道支持连接管理、offer/answer/candidate 广播等
- 信令路由HTTP REST 接口,按会话隔离,支持轮询与 WebSocket 两种模式
- 配置项接口统一承载端口、HTTPS、信令类型、通信模式、日志级别等
**章节来源**
- [src/index.ts:13-106](file://src/index.ts#L13-L106)
- [src/server.ts:14-89](file://src/server.ts#L14-L89)
- [src/websocket.ts:6-117](file://src/websocket.ts#L6-L117)
- [src/signaling.ts:4-24](file://src/signaling.ts#L4-L24)
- [src/class/options.ts:1-9](file://src/class/options.ts#L1-L9)
## 架构总览
容器化部署建议采用“单容器一进程”原则,将应用打包为镜像并在容器内运行。网络层面需明确:
- 端口暴露HTTP/HTTPS 端口对外暴露
- 内部通信WebSocket 与 HTTP 信令在同一进程内处理
- 外部访问:通过反向代理或 Ingress 统一入口
```mermaid
graph TB
subgraph "宿主机"
L["负载均衡/反向代理<br/>Nginx/Ingress"]
end
subgraph "容器"
S["应用进程<br/>Node.js + Express + WebSocket"]
P["端口映射<br/>80/443 -> 容器端口"]
V["卷挂载<br/>静态资源/上传目录"]
end
L --> P
P --> S
V -.-> S
```
[此图为概念性架构示意,不直接对应具体源码文件,故不提供图表来源]
## 详细组件分析
### Docker 镜像构建
- 基础镜像选择:建议使用官方 Node.js LTS 镜像作为基础层
- 多阶段构建:
- 第一阶段:安装依赖并编译 TypeScript 源码
- 第二阶段:仅复制构建产物与必要运行时依赖,减小镜像体积
- 工作目录与用户:
- 设置非 root 用户与只读根文件系统,提升安全性
- 启动命令:
- 使用 package.json 中的 start 脚本结合环境变量控制端口、HTTPS、信令类型、通信模式、日志级别
```mermaid
flowchart TD
Start(["开始"]) --> Stage1["阶段1安装依赖与编译<br/>Node LTS + npm ci + tsc"]
Stage1 --> Stage2["阶段2复制构建产物<br/>最小化运行时镜像"]
Stage2 --> Config["配置运行用户与权限<br/>非root + 只读根"]
Config --> Expose["暴露端口<br/>80/443"]
Expose --> Entrypoint["设置入口命令<br/>npm start"]
Entrypoint --> End(["完成"])
```
[此图为流程图示意,不直接对应具体源码文件,故不提供图表来源]
**章节来源**
- [package.json:5-12](file://package.json#L5-L12)
- [tsconfig.json:1-13](file://tsconfig.json#L1-L13)
- [tsconfig.build.json:1-5](file://tsconfig.build.json#L1-L5)
- [src/index.ts:20-40](file://src/index.ts#L20-L40)
### Docker Compose 配置要点
- 服务定义:单服务运行应用进程
- 端口映射:将宿主 80/443 映射到容器端口
- 卷挂载:
- 静态资源目录client/public
- 上传目录client/public/uploads确保写权限
- 环境变量通过环境变量传递端口、HTTPS 开关、证书路径、信令类型、通信模式、日志级别
- 依赖与健康检查:可选添加健康检查探针,探测 /config 或 /signaling
```mermaid
sequenceDiagram
participant U as "用户"
participant C as "Compose 服务"
participant N as "Node 应用"
participant WS as "WebSocket 信令"
U->>C : 访问 / 或 /signaling
C->>N : 请求转发
N-->>C : 返回静态页面/接口响应
U->>WS : 建立 WebSocket 连接
WS-->>U : 信令数据offer/answer/candidate
```
[此图为概念性交互示意,不直接对应具体源码文件,故不提供图表来源]
**章节来源**
- [src/server.ts:25-86](file://src/server.ts#L25-L86)
- [src/websocket.ts:15-39](file://src/websocket.ts#L15-L39)
- [src/index.ts:20-40](file://src/index.ts#L20-L40)
### 容器网络配置
- 端口暴露:根据 HTTPS 开关暴露 80HTTP或 443HTTPS默认监听端口可在启动参数中调整
- 内部通信WebSocket 与 HTTP 信令在同一进程内,无需额外网络组件
- 外部访问:建议通过反向代理或 Ingress 提供 TLS 终止与域名路由
```mermaid
flowchart TD
A["外部请求"] --> B{"是否启用 HTTPS?"}
B --> |是| C["443/TCP 映射"]
B --> |否| D["80/TCP 映射"]
C --> E["应用进程监听端口"]
D --> E
E --> F["HTTP 轮询 /signaling"]
E --> G["WebSocket /ws 信令"]
```
[此图为流程图示意,不直接对应具体源码文件,故不提供图表来源]
**章节来源**
- [src/index.ts:52-91](file://src/index.ts#L52-L91)
- [src/server.ts:25-86](file://src/server.ts#L25-L86)
### Kubernetes 部署配置
- Deployment单副本或按需副本数设置资源请求与限制
- ServiceClusterIP/LoadBalancer暴露 80/443
- IngressTLS 终止、路径路由至 Service
- Secret存放 server.key 与 server.cert
- ConfigMap存放运行参数如端口、信令类型、通信模式、日志级别
```mermaid
graph TB
subgraph "Kubernetes"
I["Ingress"]
S["Service"]
D["Deployment"]
P["Pod"]
end
I --> S
S --> D
D --> P
```
[此图为概念性部署示意,不直接对应具体源码文件,故不提供图表来源]
**章节来源**
- [src/index.ts:20-40](file://src/index.ts#L20-L40)
- [src/server.ts:25-86](file://src/server.ts#L25-L86)
### 容器安全配置
- 证书与密钥:
- 将 server.key 与 server.cert 以 Secret 方式挂载,避免硬编码
- 应用通过环境变量或挂载路径读取证书
- 最小权限:
- 使用非 root 用户运行
- 根文件系统只读,仅对上传目录进行写入
- 网络策略:限制入站流量,仅开放必要端口
- 配置注入:通过 ConfigMap/环境变量注入运行参数
**章节来源**
- [src/index.ts:55-65](file://src/index.ts#L55-L65)
- [server.cert:1-22](file://server.cert#L1-L22)
- [src/server.ts:44-57](file://src/server.ts#L44-L57)
### 资源限制与健康检查
- 资源限制:为 CPU 与内存设置 requests/limits避免资源争抢
- 健康检查:
- HTTP 探针:探测 /config 或 /signaling确认服务可用
- TCP 探针:若仅需端口存活,可使用 TCPSocket
- 重启策略:根据业务需求设置 restartPolicy
**章节来源**
- [src/server.ts:25-26](file://src/server.ts#L25-L26)
- [src/index.ts:52-91](file://src/index.ts#L52-L91)
### 监控与日志收集
- 日志:
- 使用 morgan 输出访问日志,支持多种格式
- 将日志输出到 stdout/stderr便于容器平台采集
- 指标:
- 可扩展 Prometheus 指标导出(如连接数、消息速率)
- 链路追踪:
- 结合 OpenTelemetry 或平台内置追踪能力
**章节来源**
- [src/server.ts:18-20](file://src/server.ts#L18-L20)
- [src/index.ts:62-72](file://src/index.ts#L62-L72)
## 依赖关系分析
- 应用入口依赖服务器创建与 WebSocket 信令
- Express 服务器依赖信令路由与静态资源
- 信令路由依赖 HTTP 处理器
- 配置项接口贯穿各组件,作为统一输入
```mermaid
graph LR
IDX["src/index.ts"] --> SRV["src/server.ts"]
SRV --> SIG["src/signaling.ts"]
IDX --> WS["src/websocket.ts"]
SRV --> OPT["src/class/options.ts"]
```
**图表来源**
- [src/index.ts:52-91](file://src/index.ts#L52-L91)
- [src/server.ts:14-89](file://src/server.ts#L14-L89)
- [src/signaling.ts:4-24](file://src/signaling.ts#L4-L24)
- [src/websocket.ts:15-39](file://src/websocket.ts#L15-L39)
- [src/class/options.ts:1-9](file://src/class/options.ts#L1-L9)
**章节来源**
- [src/index.ts:52-91](file://src/index.ts#L52-L91)
- [src/server.ts:14-89](file://src/server.ts#L14-L89)
- [src/signaling.ts:4-24](file://src/signaling.ts#L4-L24)
- [src/websocket.ts:15-39](file://src/websocket.ts#L15-L39)
- [src/class/options.ts:1-9](file://src/class/options.ts#L1-L9)
## 性能考虑
- 多阶段构建减少镜像体积,缩短拉取时间
- 仅复制构建产物与运行时依赖,避免 node_modules 进入最终镜像
- 合理设置资源限制,避免 OOM
- WebSocket 与 HTTP 共用同一进程,降低进程间通信开销
- 静态资源与上传目录分离,便于缓存与持久化
[本节为通用指导,不直接分析具体文件,故不提供章节来源]
## 故障排查指南
- 端口占用:确认容器端口未被占用,或调整映射端口
- HTTPS 证书:检查 server.key 与 server.cert 是否正确挂载与读取
- CORS 问题:确认前端域名与跨域配置
- 上传失败:检查上传目录权限与磁盘空间
- 信令异常:验证会话 ID 与 WebSocket 连接状态
**章节来源**
- [src/index.ts:55-65](file://src/index.ts#L55-L65)
- [src/server.ts:44-86](file://src/server.ts#L44-L86)
- [src/websocket.ts:27-38](file://src/websocket.ts#L27-L38)
## 结论
通过多阶段构建与最小化运行时镜像,结合 Compose/Kubernetes 的标准化编排,可实现稳定、安全、可观测的容器化部署。配合证书管理、资源限制与健康检查,可满足生产环境的高可用与高安全要求。
[本节为总结性内容,不直接分析具体文件,故不提供章节来源]
## 附录
### 关键运行参数与环境变量
- 端口:-p/--port默认值来自环境变量 PORT
- HTTPS-s/--secure证书与密钥路径由 -k/--keyfile 与 -c/--certfile 指定
- 信令类型:-t/--type支持 websocket/http
- 通信模式:-m/--modepublic/private
- 日志级别:-l/--logging支持 combined/dev/short/tiny/none
**章节来源**
- [src/index.ts:20-40](file://src/index.ts#L20-L40)
- [package.json:9](file://package.json#L9)
### API 与信令概览
- 配置接口:返回当前信令类型、通信模式与日志级别
- 上传接口:支持头像上传并重命名为用户 ID
- 信令接口:按会话隔离,支持连接管理与 WebRTC 信令交换
**章节来源**
- [src/server.ts:25-86](file://src/server.ts#L25-L86)
- [src/服务端接口与WebSocket消息类型.md:7-33](file://src/服务端接口与WebSocket消息类型.md#L7-L33)
- [src/服务端接口与WebSocket消息类型.md:37-83](file://src/服务端接口与WebSocket消息类型.md#L37-L83)
- [src/服务端接口与WebSocket消息类型.md:139-234](file://src/服务端接口与WebSocket消息类型.md#L139-L234)