# 容器化部署 **本文引用的文件** - [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) ## 目录 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 应用
src/server.ts"] B["HTTP/HTTPS 服务器
src/index.ts"] C["WebSocket 信令
src/websocket.ts"] D["信令路由
src/signaling.ts"] end subgraph "静态资源" E["客户端页面
client/public"] F["前端模块
client/src"] end subgraph "配置与脚本" G["启动脚本
package.json scripts"] H["编译配置
tsconfig.json/tsconfig.build.json"] I["运行批处理
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["负载均衡/反向代理
Nginx/Ingress"] end subgraph "容器" S["应用进程
Node.js + Express + WebSocket"] P["端口映射
80/443 -> 容器端口"] V["卷挂载
静态资源/上传目录"] end L --> P P --> S V -.-> S ``` [此图为概念性架构示意,不直接对应具体源码文件,故不提供图表来源] ## 详细组件分析 ### Docker 镜像构建 - 基础镜像选择:建议使用官方 Node.js LTS 镜像作为基础层 - 多阶段构建: - 第一阶段:安装依赖并编译 TypeScript 源码 - 第二阶段:仅复制构建产物与必要运行时依赖,减小镜像体积 - 工作目录与用户: - 设置非 root 用户与只读根文件系统,提升安全性 - 启动命令: - 使用 package.json 中的 start 脚本,结合环境变量控制端口、HTTPS、信令类型、通信模式、日志级别 ```mermaid flowchart TD Start(["开始"]) --> Stage1["阶段1:安装依赖与编译
Node LTS + npm ci + tsc"] Stage1 --> Stage2["阶段2:复制构建产物
最小化运行时镜像"] Stage2 --> Config["配置运行用户与权限
非root + 只读根"] Config --> Expose["暴露端口
80/443"] Expose --> Entrypoint["设置入口命令
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 开关暴露 80(HTTP)或 443(HTTPS),默认监听端口可在启动参数中调整 - 内部通信: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:单副本或按需副本数,设置资源请求与限制 - Service:ClusterIP/LoadBalancer,暴露 80/443 - Ingress:TLS 终止、路径路由至 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/--mode,public/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)