StreamHall - 搭建你自己的直播间,从推流到观众统计一站式搞定

StreamHall - 搭建你自己的直播间,从推流到观众统计一站式搞定
Stardream起因
之前逛到一个叫 AniLive 放映室 的 nsy 直播列表站,界面设计及功能实现我很喜欢 - 干净的卡片布局、暗色主题、多直播源管理,感觉刚好是想要的形态。可惜 ta 没有开源,也没有找到类似的替代品。
既然没有现成的,那就自己造一个。StreamHall 的前端界面完全复刻了 AniLive 放映室的设计,后端则是独立重写,不共享任何原始代码,并在此基础上扩展了观看统计、Telegram 推送、推流配置辅助等符合我个人使用的功能。
这也是我第一个完全通过 Vibe Coding 完成的项目。
功能概览
StreamHall 是一个自托管的直播站点系统,核心目标是自己搭、自己管、数据全掌握。
主要功能:
- 公开直播列表 - 直播 / 存档双 Tab,支持密码保护,站点标题、简介、导航链接、页脚内容均可在后台自定义,内置中英双语界面
- 播放器 - 基于 ArtPlayer,支持 HLS、FLV、MPEG-DASH;可配置 AES-128 密钥覆盖和 DASH ClearKey 解密
- 管理后台 - 直播的增删改查、启用/禁用、拖拽排序,多播放源管理;中英双语后台
- 观看统计 - 实时在线人数、今日/历史观看量、独立访客、平均时长、设备/浏览器/OS/地理分布看板,支持导出 CSV
- Telegram 推送 - 可按直播单独配置,开播/关播自动发通知,消息模板支持自定义变量
- RTMP 推流辅助 - 配合 SRS 容器,支持隐藏公开 HLS 路由(
/h/<slug>/...),公开地址无法反推出真实推流码 - HLS 反代 - 带签名验证的代理路由,解决外链 HLS 的跨域问题
- API 密钥 - 可在后台生成 Bearer Token,程序化访问所有管理和统计接口
技术栈
整个项目的技术栈比较简单:
- 后端:单文件 Python(
server.py),无任何 Web 框架,基于标准库的ThreadingHTTPServer。每个请求独立线程,每个线程独立 PostgreSQL 连接。 - 数据库:PostgreSQL 16,唯一的外部运行时依赖是
psycopg3(连接驱动)。 - 前端:纯原生 HTML + CSS + JS,不依赖任何前端框架,三个页面(首页、播放器、管理后台)各自独立。
- 部署:Docker Compose,四个容器:应用本体、PostgreSQL、SRS(RTMP)、Nginx(HLS 代理)。
技术选型基本跟着 Vibe Coding 的节奏自然长出来的,没有提前做过多设计。
部署方式
只需 Docker Compose,大约两分钟可以跑起来。
第一步:下载配置文件
curl -LO https://git.stdm.moe/Stardream/StreamHall/raw/branch/main/docker-compose.yml |
第二步:修改必填项
打开 docker-compose.yml,把 SECRET_KEY 和 POSTGRES_PASSWORD 改成强随机值,这两个字段直接关系到会话安全和数据库访问权限,不能留默认值。
第三步:启动
docker compose up -d |
第四步:获取初始密码
docker logs streamhall |
在日志里找到这一行:
StreamHall initial admin password: <random-password> |
初始密码只打印一次,不会以明文形式落库。启动后访问 http://HOST:8085/admin 登录,进后台后在网站设置 → 安全设置里改掉密码。
各服务地址
| 地址 | 说明 |
|---|---|
http://HOST:8085/ |
公开直播列表 |
http://HOST:8085/admin |
管理后台 |
http://HOST:18088/ |
SRS HTTP 播放 |
http://HOST:8889/ |
Nginx HLS 代理 |
日后更新
docker compose pull && docker compose up -d |
几个值得说的设计细节
隐藏 HLS 路由
如果你用 RTMP 推流(比如 OBS),推流码是私密的,但如果直接把 SRS 的 HLS 地址暴露给观众,地址里会直接包含推流码(/live/<stream-key>.m3u8),任何人都能猜到推流码。
StreamHall 的做法是:在后台为每个推流码生成一个 HMAC 签名的 slug,公开播放地址变成 /h/<slug>/index.m3u8,由 Nginx 将请求反代到 StreamHall,StreamHall 验证签名后再转发给 SRS。观众拿到的地址无法反推出真实推流码。
多语言支持
前端所有用户可见的文字都走 i18n 翻译表,包括服务端返回的错误信息 - 后端只返回错误码字符串(如 stream_not_found),前端根据当前语言翻译成对应文字,不会出现中文界面里突然蹦出一条英文报错的情况。
开源地址
项目代码托管在 GayHub 和 自建的 Gitea 上,基于 AGPL-3.0 协议开源,允许自由使用、修改和自部署,但若将修改版对外分发或作为托管服务提供,须以相同协议公开源码。








