分布式部署(控制面同机)
一台服务器承载全部控制面服务,播放与存储能力由外部工作节点提供。对应部署仓库的
v2-all-in-one分支,许可证要求edition=DISTRIBUTED。
这一页是分布式部署(DISTRIBUTED)的两种形态之一。分布式部署内部把控制面分成 control / user / media / edge 四类角色,这些角色可以全部放在一台机器上(本页), 也可以各占一台机器(分布式部署(按角色多机))。
它和「单机版」不是一回事
两者都是「一台服务器」,但产品能力边界完全不同:
单机版(STANDALONE) | 控制面同机(DISTRIBUTED) | |
|---|---|---|
| 容器数 | 3 个(应用容器 + 数据库 + 缓存) | 8 个(6 个应用服务 + 数据库 + 缓存) |
| Storage / Play Agent | 内置,随主应用升级,不能新增 | 外部工作节点,按授权配额新增 |
| 一键安装节点命令 | 不提供 | 提供 |
| 许可证 Edition | STANDALONE | DISTRIBUTED |
选错分支会怎样,见部署模式与版本选择。
与多机形态的关系
本页与分布式部署(按角色多机)是同一个产品版本、同一套许可证、 同一个控制面,只是把这 6 个应用服务放在几台机器上的区别:
| 分支 | 控制面布置 | 需要 YIYI_DEPLOY_ROLE | 需要 join.env |
|---|---|---|---|
v2-all-in-one(本页) | 6 个应用服务全在一台机器 | 不需要(写了也会被忽略) | 不需要 |
v3-multi-host | 每类角色各一台机器 | 需要(control / user / media / edge) | 需要,由 control 生成后分发 |
从同机扩到多机时,两个分支的数据与许可证完全兼容——迁移方法见 控制面同机迁移到多机。
本机跑什么
┌──────── 一台服务器(控制面)────────┐
│ frontend :18080 Web 入口 │
│ gateway :18086 API 网关 │
│ config :18085 注册中心 │
│ user :18082 账号与线路 │
│ media :18083 媒体库 │
│ license-agent :18088 许可证租约 │
│ postgres :5432 ← 可选 │
│ redis :6379 ← 可选 │
└─────────────────────────────────────┘
其他机器(工作节点,不由本分支的 Compose 安装)
├── Storage 节点 ← 网页「节点管理」新增,用页面给出的一键命令部署
└── Play Agent 节点 ← 同上,可多台6 个应用服务使用 host 网络(直接绑定宿主机端口),因此 18080、18082、18083、 18085、18086、18088 都会在本机监听;其中只有 18080 需要对用户开放。
postgres 与 redis 走 Compose 私有网络,端口发布到 YIYI_INFRA_BIND_HOST (同机形态自动写 127.0.0.1),应用服务经 127.0.0.1 访问它们。
前置条件
| 项目 | 要求 |
|---|---|
| 机器 | 一台 Linux 服务器;播放与存储节点可以是另外的机器 |
| 授权 | 一个 edition=DISTRIBUTED 的一次性授权码 |
| 出站网络 | 能访问 YIYI_LICENSE_SERVER_URL 指向的授权中心(HTTPS) |
| 命令行工具 | docker、openssl、curl、python3,能用 sudo |
| 端口 | 18080 对用户开放;18085 需对所有工作节点开放(它们在别的机器上) |
| 磁盘 | 数据目录默认在部署目录下的 data/ |
工作节点在别的机器上,所以 18085 必须可达
config 的 18085 是注册中心。工作节点(Storage / Play Agent)要从它们所在的机器连上它, 才能注册、心跳与拉取安装脚本。如果工作节点和本机在同一个私网,放行私网即可; 不要把 18085 直接暴露到公网,正确做法是走私网或 VPN。
第 1 步:克隆并准备 .env
git clone -b v2-all-in-one https://github.com/YiYi-Product/YiYi-media-deploy.git /opt/YiYi-media-deploy
cd /opt/YiYi-media-deploy
cp .env.example .env
chmod 0600 .env第 2 步:填写 .env
必填项:
YIYI_SERVER_HOST=<本机内网地址,工作节点要能访问到>
YIYI_PUBLIC_HOST=<对外域名或公网 IP,浏览器访问用>| 变量 | 怎么填 | 说明 |
|---|---|---|
YIYI_SERVER_HOST | 必填 | 本机地址,不带协议与路径。不要填 127.0.0.1,否则工作节点连不上 |
YIYI_PUBLIC_HOST | 必填 | 用户浏览器访问的地址;留空会回退为 YIYI_SERVER_HOST |
YIYI_DATA_DIR | 留空 | 留空 = 部署目录下的 data/ |
YIYI_DB_PASSWORD、YIYI_SERVICE_TOKEN | 保持 GENERATE_ON_INSTALL | 脚本用 openssl rand -hex 32 生成并回写 |
YIYI_LICENSE_SERVER_URL | 保持模板值 | 发布方提供的授权中心地址 |
YIYI_IMAGE_TAG | 建议填 | 留空使用可变的 latest;生产建议锁定不可变版本标签 |
YIYI_USER_HOST | 不用填 | 安装脚本会自动写 127.0.0.1(同机形态下 user 就在本机) |
本分支不需要角色选择
.env 里的 YIYI_DEPLOY_ROLE 会被忽略(并打印提示);install.sh 固定按 控制面同机处理。真正决定启停的是 COMPOSE_PROFILES,由安装脚本按下面的 数据源选择自动写入,不要手工改。
第 3 步:选择数据库与缓存
两个选择互相独立,所以支持任意组合:
| 变量 | 取值 | 效果 |
|---|---|---|
YIYI_DB_MODE | bundled(默认) | 本机启动 postgres 容器 |
external | 不启动,用你的 PostgreSQL | |
YIYI_REDIS_MODE | bundled(默认) | 本机启动 redis 容器 |
external | 不启动,用你的 Redis |
| 组合 | 本机容器数 |
|---|---|
| 都自带(默认) | 8 |
| 外部数据库 + 自带 Redis | 7 |
| 自带数据库 + 外部 Redis | 7 |
| 都用外部 | 6 |
# 例:用你自己的 PostgreSQL,缓存仍用本机的
YIYI_DB_MODE=external
YIYI_DB_HOST=db.internal # 不带协议与端口
YIYI_DB_PORT=5432
YIYI_DB_USER=yiyi
YIYI_DB_PASSWORD=<外部库口令>
YIYI_REDIS_MODE=bundled用外部 PostgreSQL 要先建库
外部实例需预先建好 yiyi_config、yiyi_user、yiyi_media、yiyi_storage 四个库,并授权上述用户连接与建表。可参考部署仓库里的 postgres-init.sql。
YIYI_DB_MODE=external 时安装脚本会强制校验 YIYI_DB_HOST(必须是不带协议和端口的主机名)、 YIYI_DB_USER、YIYI_DB_PASSWORD 非空,缺一项直接退出。
从 bundled 切到 external 不会搬数据
安装脚本不迁移数据。切换前必须先 pg_dump 那四个库,切完再导入外部实例。
第 4 步:安装
sudo ./install.sh脚本会:检查 .env 与工具 → 按数据源选择写入 COMPOSE_PROFILES → 准备数据目录 → 下载并校验授权公钥 → docker compose pull → up -d 并等健康检查 → 探测各服务。
安装完成后访问:
http://<YIYI_PUBLIC_HOST>:18080第一个页面是授权激活页。输入发布方提供的一次性授权码,激活成功后自动进入创建管理员向导 (顺序是先激活、再建管理员)。
第 5 步:部署外部工作节点
控制面装好后,「节点管理」里就能新增节点了。流程:
- 到后台「节点管理」新增节点,选择服务类型(Storage 或 Play Agent);
- 页面给出一行安装命令;
- 复制到目标机器执行,节点自动注册到
config的18085。
完整参数(二进制 / Docker、ffmpeg、卸载与升级)见 分布式工作节点部署。
节点数量受授权配额限制
maxStorageNodes 与 maxPlayAgentNodes 由许可证决定,新增前会向授权中心原子占用名额, 超限返回 NODE_LIMIT_REACHED。单机版没有这套能力,见授权与版本。
端口
| 端口 | 服务 | 是否对外开放 |
|---|---|---|
18080 | frontend(Web 入口) | 是,唯一对用户的入口 |
18085 | config(注册中心) | 对工作节点开放(私网/VPN),不要直接暴露公网 |
18082 | user | 私网或本机 |
18083 | media | 私网或本机 |
18086 | gateway | 只被同机 frontend 经 127.0.0.1 访问 |
18088 | license-agent | 只绑 127.0.0.1 |
5432 / 6379 | PostgreSQL / Redis | 只在本机或私网(用外部实例时不存在) |
工作节点自己还会监听 18084(Storage)与 19090(Play Agent), 需要对控制面与播放客户端可达,详见端口与网络。
验证
cd /opt/YiYi-media-deploy
# 1. 容器数与前面选的数据源组合一致
docker compose ps
# 2. 授权状态(未激活时返回 UNACTIVATED,正常)
curl -fsS http://127.0.0.1:18085/api/license/status
# 3. 各服务健康
for p in 18085 18082 18083 18086; do
curl -fsS -o /dev/null -w "$p %{http_code}\n" http://127.0.0.1:$p/actuator/health
done
# 4. Web 入口
curl -fsSI http://127.0.0.1:18080/ | head -1激活后到「节点管理」新增并部署工作节点,两者都「在线」后即可使用文件管理与播放。
从同机扩到多机
同机形态是分布式部署的子集:控制面 6 个服务本来就分属 control / user / media / edge 四类角色,v2-all-in-one 只是把它们放在一台机器上。要拆成多机:
- 准备目标机器,克隆
v3-multi-host分支; - 按分布式部署(按角色多机)的顺序安装
control→user→media→edge; control的目标机要能接管现有数据库与data/license/(或指向你已有的外部实例);- 工作节点不用重装:它们只连
config的18085,把YIYI_SERVER_HOST/注册中心地址 指到新的control即可;节点 ID 与令牌不变。
许可证与数据无需变更
两种形态都是 edition=DISTRIBUTED,同一份许可证在两边通用,不涉及版本升级操作。 注意:从单机版(STANDALONE)换到本形态则完全不同——那需要走授权的版本升级与 拓扑迁移,见单机版迁移到分布式版。
常见问题
| 现象 | 原因 | 处理 |
|---|---|---|
| 只有 6 个容器,没有 postgres/redis | 这是预期的——你把数据库和缓存都设成了 external | 确认 YIYI_DB_MODE / YIYI_REDIS_MODE 的值是否符合预期 |
| 少了 postgres 或 redis 中的一个 | 两个开关是独立的 | 同上,分别检查两个变量 |
| 工作节点注册不上 | 节点的机器连不到本机 18085,或 YIYI_SERVER_HOST 填了 127.0.0.1 | 从节点机器 curl http://<本机地址>:18085/actuator/health;改对地址后重跑安装 |
external 模式必须填写... | YIYI_DB_MODE=external 但地址或凭据没填 | 补齐 YIYI_DB_HOST / YIYI_DB_USER / YIYI_DB_PASSWORD |
切到 external 后数据不见了 | 脚本不搬数据 | 从 pg_dump 备份导入外部实例 |
| 激活被拒绝、提示版本不匹配 | 用了 STANDALONE 的授权码 | 本形态需要 edition=DISTRIBUTED |
| 「节点管理」里没有「新增节点」 | 授权 Edition 或部署形态不匹配,能力被收窄 | 查 GET /api/config/deployment/capabilities |
docker compose ps 什么也没列出 | COMPOSE_PROFILES 被手工改坏 | 重跑 sudo ./install.sh,它会重新写入该变量 |