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

351 lines
13 KiB
Markdown
Raw 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)
- [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)