# 环境配置
**本文引用的文件**
- [package.json](file://package.json)
- [src/index.ts](file://src/index.ts)
- [src/class/options.ts](file://src/class/options.ts)
- [src/server.ts](file://src/server.ts)
- [run.bat](file://run.bat)
- [tsconfig.json](file://tsconfig.json)
- [tsconfig.build.json](file://tsconfig.build.json)
- [.eslintrc.cjs](file://.eslintrc.cjs)
- [.gitignore](file://.gitignore)
- [client/package.json](file://client/package.json)
- [jest.config.js](file://jest.config.js)
- [test/env_macos.postman_environment.json](file://test/env_macos.postman_environment.json)
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构总览](#架构总览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能考虑](#性能考虑)
8. [故障排查指南](#故障排查指南)
9. [结论](#结论)
10. [附录](#附录)
## 简介
本指南面向部署与运维人员,提供该视频 socket 服务器项目的环境配置说明,涵盖 Node.js 版本要求、操作系统兼容性、系统资源建议、开发与生产差异、环境变量与运行参数、以及常见问题排查。文档中的所有技术细节均来自仓库内现有配置文件与源码。
## 项目结构
该项目采用前后端同库的组织方式:服务端为 Node.js + Express + WebSocket,前端静态资源位于 client/public 与 client/src;构建与打包通过 TypeScript 编译器与 pkg 工具完成;测试与质量工具包括 Jest、ESLint、Swagger 文档生成等。
```mermaid
graph TB
subgraph "服务端"
IDX["src/index.ts
入口与命令行参数解析"]
SRV["src/server.ts
Express 应用与路由"]
OPT["src/class/options.ts
运行参数接口"]
end
subgraph "客户端"
PUB["client/public
静态页面与资源"]
SRC["client/src
前端模块与示例"]
end
subgraph "构建与工具"
PKG["package.json
脚本与依赖"]
TSC["tsconfig.json
编译配置"]
TSB["tsconfig.build.json
构建扩展"]
ESL[".eslintrc.cjs
ESLint 规则"]
JST["jest.config.js
测试配置"]
end
IDX --> SRV
SRV --> PUB
SRV --> SRC
PKG --> IDX
PKG --> SRV
TSC --> IDX
TSC --> SRV
TSB --> PKG
ESL --> IDX
ESL --> SRV
JST --> PKG
```
**图示来源**
- [src/index.ts:1-109](file://src/index.ts#L1-L109)
- [src/server.ts:1-90](file://src/server.ts#L1-L90)
- [src/class/options.ts:1-10](file://src/class/options.ts#L1-L10)
- [package.json:1-60](file://package.json#L1-L60)
- [tsconfig.json:1-13](file://tsconfig.json#L1-L13)
- [tsconfig.build.json:1-5](file://tsconfig.build.json#L1-L5)
- [.eslintrc.cjs:1-25](file://.eslintrc.cjs#L1-L25)
- [jest.config.js:1-196](file://jest.config.js#L1-L196)
**章节来源**
- [package.json:1-60](file://package.json#L1-L60)
- [src/index.ts:1-109](file://src/index.ts#L1-L109)
- [src/server.ts:1-90](file://src/server.ts#L1-L90)
- [tsconfig.json:1-13](file://tsconfig.json#L1-L13)
- [tsconfig.build.json:1-5](file://tsconfig.build.json#L1-L5)
- [.eslintrc.cjs:1-25](file://.eslintrc.cjs#L1-L25)
- [jest.config.js:1-196](file://jest.config.js#L1-L196)
## 核心组件
- 入口与参数解析:负责从命令行读取运行参数,支持端口、HTTPS 密钥证书、信令类型、通信模式、日志级别等;同时支持通过环境变量覆盖默认值。
- Express 应用:统一处理静态资源、上传接口、Swagger 文档、CORS、JSON/URL 编码请求体等。
- 运行参数接口:定义了安全模式、端口、密钥/证书路径、信令类型、通信模式、日志级别等字段。
**章节来源**
- [src/index.ts:14-91](file://src/index.ts#L14-L91)
- [src/class/options.ts:1-10](file://src/class/options.ts#L1-L10)
- [src/server.ts:14-89](file://src/server.ts#L14-L89)
## 架构总览
下图展示了启动流程与关键组件交互:命令行参数解析后创建 Express 应用,按需启用 HTTPS,随后根据信令类型选择 WebSocket 或 HTTP 轮询,并输出启动日志与访问地址。
```mermaid
sequenceDiagram
participant CLI as "命令行/环境变量"
participant IDX as "RenderStreaming.run()"
participant SRV as "createServer()"
participant HTTPS as "HTTPS 服务器"
participant HTTP as "HTTP 服务器"
participant WS as "WebSocket 信令"
CLI->>IDX : 解析参数(-p/-s/-k/-c/-t/-m/-l)
IDX->>SRV : 创建 Express 应用
alt 启用安全模式
IDX->>HTTPS : 使用 key/cert 创建 HTTPS 服务器
HTTPS-->>IDX : 输出 https : // 地址
else 非安全模式
IDX->>HTTP : 使用 Express 监听端口
HTTP-->>IDX : 输出 http : // 地址
end
IDX->>WS : 按信令类型启动 WebSocket 信令
WS-->>IDX : 信令就绪
```
**图示来源**
- [src/index.ts:14-91](file://src/index.ts#L14-L91)
- [src/server.ts:14-42](file://src/server.ts#L14-L42)
## 详细组件分析
### 命令行参数与环境变量
- 支持的参数与默认值(优先级:命令行 > 环境变量 > 默认值):
- 端口:-p/--port,默认值来自环境变量 PORT,未设置时为 80(注意:脚本 start/dev 默认 8080)
- 安全模式:-s/--secure,默认开启(脚本 start/dev 默认开启)
- 密钥文件:-k/--keyfile,默认 server.key
- 证书文件:-c/--certfile,默认 server.cert
- 信令类型:-t/--type,默认 websocket;支持 websocket/http
- 通信模式:-m/--mode,默认 public;支持 public/private
- 日志级别:-l/--logging,默认 dev;支持 combined、dev、short、tiny、none
- 环境变量映射:
- PORT、SECURE、KEYFILE、CERTFILE、TYPE、MODE、LOGGING
```mermaid
flowchart TD
Start(["启动"]) --> Parse["解析命令行参数"]
Parse --> EnvCheck{"检查对应环境变量"}
EnvCheck --> |存在| UseEnv["使用环境变量值"]
EnvCheck --> |不存在| UseDefault["使用内置默认值"]
UseEnv --> Merge["合并为最终配置"]
UseDefault --> Merge
Merge --> Mode{"是否指定安全模式"}
Mode --> |是| HTTPS["启用 HTTPS 并加载 key/cert"]
Mode --> |否| HTTP["启用 HTTP"]
HTTPS --> Signaling["按信令类型启动"]
HTTP --> Signaling
Signaling --> Log["输出启动日志与访问地址"]
Log --> End(["完成"])
```
**图示来源**
- [src/index.ts:16-42](file://src/index.ts#L16-L42)
- [src/index.ts:55-91](file://src/index.ts#L55-L91)
**章节来源**
- [src/index.ts:16-42](file://src/index.ts#L16-L42)
- [src/index.ts:55-91](file://src/index.ts#L55-L91)
### Express 应用与静态资源
- CORS:允许任意来源访问
- 请求体解析:支持 JSON 与 URL 编码
- 静态资源:
- 根路径 / 映射到 client/public/index.html
- /module 映射到 client/src
- /uploads 映射到 client/public/uploads
- 上传接口:/api/upload/avatar,使用 multer 将头像保存至 uploads/avatars,并按用户 ID 重命名
- Swagger 文档初始化
- /config 接口返回当前信令与模式、日志级别等配置
**章节来源**
- [src/server.ts:14-89](file://src/server.ts#L14-L89)
### 构建与打包配置
- TypeScript 编译:
- tsconfig.json:目标 ES5,输出目录 build,包含 src 与 test
- tsconfig.build.json:仅包含 src,继承 tsconfig.json
- 打包:
- package.json 中的 pkg 字段声明 assets 与 targets,其中 targets 包含 "node10",表明以 Node.js 10 可执行文件为目标进行打包
**章节来源**
- [tsconfig.json:1-13](file://tsconfig.json#L1-L13)
- [tsconfig.build.json:1-5](file://tsconfig.build.json#L1-L5)
- [package.json:50-58](file://package.json#L50-L58)
### 测试与质量工具
- Jest:测试框架,收集覆盖率,测试匹配规则覆盖 src 与 test 下的 ts 文件
- ESLint:基于 TypeScript 推荐规则与 jest 插件,解析 tsconfig.lint.json
- 客户端 JS 测试:client/package.json 提供测试脚本与 eslint 配置
**章节来源**
- [jest.config.js:1-196](file://jest.config.js#L1-L196)
- [.eslintrc.cjs:1-25](file://.eslintrc.cjs#L1-L25)
- [client/package.json:1-19](file://client/package.json#L1-L19)
## 依赖关系分析
- 运行时依赖(节选):express、ws、cors、multer、morgan、swagger-jsdoc、swagger-ui-express、uuid、debug 等
- 开发依赖(节选):jest、ts-jest、ts-node、typescript、eslint、pkg 等
- 构建与打包:通过 tsc 与 pkg 实现,pkg targets 指向 node10
```mermaid
graph LR
P["package.json 依赖"] --> E["express"]
P --> W["ws"]
P --> C["cors"]
P --> M["multer"]
P --> MO["morgan"]
P --> SW["swagger-jsdoc / ui-express"]
P --> U["uuid"]
P --> D["debug"]
P -.dev.-> J["jest / ts-jest / ts-node"]
P -.dev.-> T["typescript / eslint"]
P -.dev.-> K["pkg"]
K --> OUT["可执行产物(目标 node10)"]
```
**图示来源**
- [package.json:14-46](file://package.json#L14-L46)
- [package.json:50-58](file://package.json#L50-L58)
**章节来源**
- [package.json:14-46](file://package.json#L14-L46)
- [package.json:50-58](file://package.json#L50-L58)
## 性能考虑
- 日志级别:dev/combined/short/tiny 可按需调整,none 可减少 I/O 开销
- 上传与静态资源:头像上传使用磁盘存储,建议确保磁盘空间充足并定期清理
- 信令类型:WebSocket 通常比 HTTP 轮询更高效,建议在生产环境使用 websocket
- 并发与资源:Node.js 进程的并发能力取决于 CPU 核心数与内存大小,建议为每个实例分配至少 1GB 内存并预留系统开销
[本节为通用指导,不直接分析具体文件]
## 故障排查指南
- 端口占用或权限不足
- 症状:启动失败或端口被占用
- 排查:确认 -p/--port 指定端口可用;在类 Unix 系统上避免使用小于 1024 的特权端口
- HTTPS 证书缺失
- 症状:启动时报错无法读取 server.key/server.cert
- 排查:确认 -k/--keyfile 与 -c/--certfile 指向的文件存在且可读;或关闭安全模式 -s
- 信令类型错误
- 症状:日志提示信令类型不受支持并回退为 websocket
- 排查:确保 -t/--type 设置为 websocket 或 http
- 静态资源 404
- 症状:访问 / 或 /module 返回 404
- 排查:确认 client/public 与 client/src 目录存在且包含所需文件
- 上传失败
- 症状:/api/upload/avatar 返回错误
- 排查:确认 uploads/avatars 目录存在且写权限正常;检查文件名重命名逻辑
- 环境变量未生效
- 症状:PORT/SECURE 等未按预期工作
- 排查:确认环境变量名正确且在启动前导出;命令行参数优先于环境变量
**章节来源**
- [src/index.ts:55-91](file://src/index.ts#L55-L91)
- [src/server.ts:29-39](file://src/server.ts#L29-L39)
- [src/server.ts:62-83](file://src/server.ts#L62-L83)
## 结论
本项目对 Node.js 的最低版本要求可参考打包目标 node10;实际运行建议使用较新的 LTS 版本以获得更好的稳定性与性能。生产环境推荐使用 WebSocket 信令、HTTPS 加密、合理设置日志级别与磁盘空间,并通过环境变量或命令行参数进行灵活配置。
[本节为总结,不直接分析具体文件]
## 附录
### Node.js 版本要求
- 打包目标:node10
- 建议使用:Node.js LTS(如 18.x/20.x)
**章节来源**
- [package.json:55-57](file://package.json#L55-L57)
### 操作系统兼容性
- 服务器端:Express 与 Node.js 核心模块在 Windows、Linux、macOS 上均可运行
- 客户端静态资源:无平台特定限制
- 注意:Windows 批处理脚本 run.bat 用于本地快速启动
**章节来源**
- [run.bat:1-17](file://run.bat#L1-L17)
### 系统资源建议
- 内存:建议每实例至少 1GB,视并发连接与媒体负载适当增加
- CPU:多核 CPU 更有利于并发处理
- 磁盘:确保 uploads/avatars 目录有足够空间;静态资源目录 client/public 与 client/src 需要可读权限
**章节来源**
- [src/server.ts:44-57](file://src/server.ts#L44-L57)
### 开发环境与生产环境
- 开发环境
- 启动:npm run dev(使用 ts-node 直接运行 src/index.ts)
- 参数示例:-s -p 8080 -m private -l dev
- 生产环境
- 构建:npm run build(TypeScript 编译到 build)
- 启动:npm run start(运行 build/index.js)
- 参数示例:-s -p 8080 -m private -k ./server.key -c ./server.cert -l dev
- 打包:npm run pack(使用 pkg,目标 node10)
**章节来源**
- [package.json:5-12](file://package.json#L5-L12)
- [run.bat:3-4](file://run.bat#L3-L4)
### 环境变量与运行参数对照
- PORT:覆盖端口默认值
- SECURE:启用 HTTPS(布尔)
- KEYFILE:HTTPS 秘钥文件路径
- CERTFILE:HTTPS 证书文件路径
- TYPE:信令类型 websocket/http
- MODE:通信模式 public/private
- LOGGING:日志级别 combined/dev/short/tiny/none
**章节来源**
- [src/index.ts:20-29](file://src/index.ts#L20-L29)
### 信令模式与通信模式
- 信令模式:websocket(默认)或 http(轮询)
- 通信模式:public(默认)或 private(私有模式,用于限制访问)
**章节来源**
- [src/index.ts:26-27](file://src/index.ts#L26-L27)
- [src/server.ts:25-25](file://src/server.ts#L25-L25)
### 端口与证书路径
- 端口:可通过 -p/--port 或环境变量 PORT 指定
- 证书:HTTPS 模式下需提供 -k/--keyfile 与 -c/--certfile
**章节来源**
- [src/index.ts:22-25](file://src/index.ts#L22-L25)
- [src/index.ts:56-59](file://src/index.ts#L56-L59)
### Swagger 与静态资源
- Swagger 文档:通过 initSwagger 初始化
- 静态资源:根路径与 /module、/uploads 均已配置
**章节来源**
- [src/server.ts:41-42](file://src/server.ts#L41-L42)
- [src/server.ts:27-28](file://src/server.ts#L27-L28)
- [src/server.ts:86-86](file://src/server.ts#L86-L86)
### Postman 环境
- macOS 环境示例:包含 url 变量 localhost:8080
**章节来源**
- [test/env_macos.postman_environment.json:1-14](file://test/env_macos.postman_environment.json#L1-L14)