实时监控
实时系统资源监控 · 编码频道状态总览
CPU 使用率
{{ formatPercent(systemInfo.cpu?.usage_percent) }}
{{ systemInfo.cpu?.model || '-' }} · {{ systemInfo.cpu?.cores || 0 }}C
内存使用
{{ systemInfo.memory?.used_mb || 0 }}MB
{{ formatPercent(systemInfo.memory?.usage_percent) }} / 共 {{ systemInfo.memory?.total_mb || 0 }} MB
{{ server.name }}
{{ server.status }}
:{{ server.port || '-' }} · 流{{ server.streams || 0 }} · 订阅{{ server.subscribers || 0 }}
网络实时流量
↓ 下行 {{ networkSummary.interfaces.length ? formatRate(networkSummary.rx) : '待选择' }}
↑ 上行 {{ networkSummary.interfaces.length ? formatRate(networkSummary.tx) : '待选择' }}
统计接口:{{ networkSummary.interfaces.map(n => n.name).join('、') || '暂无可用接口' }} · {{ networkMode === 'auto' ? '自动去重' : '手动范围' }}
选择保存在当前浏览器。已知父子接口只计一层;VPN 与物理网卡请择一,避免重复统计。
{{ net.name }} · 已计入 · 默认路由
↓ {{ formatRate(net.rx_rate_bytes) }}
↑ {{ formatRate(net.tx_rate_bytes) }}
{{ net.kind === 'bond' ? '聚合成员' : '下层接口' }}:{{ net.members.join('、') }}
隶属 {{ net.master }}
编码中的频道
{{ runningChannels.length }} 个编码中
| 频道名称 | 频道分组 | 分辨率 | 引擎 | 码率 | 运行时间 | Speed | FPS | 重启次数 | 操作 |
|---|---|---|---|---|---|---|---|---|---|
{{ channel.name }} |
{{ channel.group || '-- 不选 --' }} | {{ resolutionLabel(channel) }} | {{ outputModeLabel(channel.output_mode, channel.kcp_enabled) }} | {{ formatBitrate(channel) }} | {{ runtimeLabel(channel) }} | {{ channel.metrics?.speed || '-' }} | {{ formatFPS(channel) }} | {{ channel.restart_count || 0 }} |
暂无编码中的频道
拉流中的频道
0 个拉流中
| 频道名称 | 分组 | 引擎|状态 | 视频|音频|分辨率 | 码率 | 速度|FPS | 运行时间 | 操作 |
|---|
暂无拉流中的频道
编码频道列表
FFmpeg 中转频道管理,支持 MediaMTX、HTTP-TS、UDP 等输出
频道管理
| 频道名称 | 状态 | 在线 | 播放 | 编码 | 画面 | 倍率 / FPS | 运行 / 源 | 播放 ID | 操作 | |
|---|---|---|---|---|---|---|---|---|---|---|
|
{{ channel.name }}
{{ channel.group || '无分组' }}
|
{{ statusLabel(channel.status) }} |
|
{{ channelVideoCodec(channel) }}{{ channelAudioCodec(channel) }} |
{{ resolutionLabel(channel) }}{{ formatBitrate(channel) }} |
{{ channelSpeedLabel(channel) }}/{{ formatFPS(channel) }} |
{{ runtimeLabel(channel) }}重启 {{ channel.restart_count || 0 }}{{ restartDeadlineLabel(channel, channel.metrics.next_restart) }} |
|
显示 {{ channelPageStart }}-{{ channelPageEnd }} / {{ filteredChannels.length }}
{{ channelCurrentPage }} / {{ channelPageCount }}
{{ search || channelQuickFilter !== 'all' ? '没有匹配的频道' : '暂无编码频道,点击「新增频道」开始' }}
{{ selectedChannelLogTitle() }}
当前频道运行日志;手动启动/重启会开启新日志生命周期,自动恢复不会清除。
{{ logEntries.length }} 条结果
已暂停前端刷新
日志文件:data/logs/channel-<id>-YYYY-MM-DD.log
可选日期 {{ logDates.join(' / ') }}
{{ entry.time || '-' }}
{{ entry.level || 'INFO' }}
{{ entry.prefix || '-' }}
暂无当前频道运行日志。
节点有 Worker 更新
管理主服务器与从服务器节点,仅展示节点连接和资源状态
“安装从服务”通过 SSH 自动部署 Worker;无法 SSH 安装时可“添加从服务器”生成一次性令牌并在目标服务器手动执行安装命令。
节点总数{{ clusterPreviewNodes.length }}
可用节点{{ clusterPreviewNodes.filter(node => node.status === '在线').length }}
CPU 平均{{ clusterPreviewAverageCPU }}%
内存平均{{ clusterPreviewAverageMemory }}%
运行中的编码{{ clusterPreviewNodes.reduce((total, node) => total + Number(node.running_channels || 0), 0) }}
节点列表
主服务器和从服务器的连接状态、资源占用与网络出口。
{{ node.name }} / {{ node.id }}
{{ node.tags.join(' / ') }}
{{ node.cpu }}%
{{ node.memory }}%
{{ node.bandwidth }}
实时上行 (TX) {{ node.tx_rate }}实时下行 (RX) {{ node.rx_rate }}
{{ formatDurationSeconds(node.uptime_seconds || 0) }}
{{ node.version || "未上报" }}
有更新
{{ nodeWorkerUpdateLabel(node) }}{{ node.update_progress }}%
{{ node.update_error || node.update_message || "等待状态回传" }}
{{ nodeVersionHint(node) }}
{{ node.channel_count }} 频道{{ node.status }}
安装从服务
主服务器将通过 SSH 登录从服务器,远程下载并执行安装脚本。无需手动进入从服务器。
{{ nodeInstallStatus }}
远程执行命令
{{ nodeInstallCommandPreview }}
主服务器回连地址将自动使用当前站点地址;注册令牌由主服务器在执行安装时一次性创建,不会展示在页面或日志中。
添加从服务器
不连接 SSH。保存节点信息后生成仅一次展示、60 分钟有效的注册令牌,在目标服务器执行安装命令即可自动注册并上报。
一次性注册令牌
{{ nodeManualEnrollment.token }}仅此刻展示,{{ formatEnrollmentExpiry(nodeManualEnrollment.expires_at) }} 失效;失效后重新添加同一节点 ID 可生成新令牌。在从服务器执行
{{ nodeManualInstallCommand }}命令会安装并启动 Worker;启动后会自动向主服务器注册并上报,无需再回到本页确认。安装日志 · {{ nodeInstallLogNode.name || nodeInstallLogNode.id }}
{{ nodeInstallLogSummary() }}
正在读取安装日志…{{ formatInstallLogTime(line.time) }}{{ line.message }}
编辑节点
批量导入
通过 CSV 快速创建频道,导入后会自动刷新频道列表
CSV 导入
支持列:id, name, group, input_url, output_mode, output_url, port, stream_path, video_map, video_deinterlace, audio_map, subtitle_map, subtitle_burn, re_mode, auto_start。
编码器物理参数
管理编码器分组配置,包含解码器选择、视频/音频编码参数
快速模板
按常用硬件与目标规格创建分组
分组列表
| 名称 | 硬件 | 视频参数 | 音频参数 | 采样率 | 注意项 | 操作 |
|---|---|---|---|---|---|---|
{{ group.name }} |
{{ decoderLabel(group.decoder) }} |
{{ group.video_encoder || 'copy' }}
{{ group.resolution || '原始分辨率' }}
{{ group.video_bitrate || '不限码率' }}
|
{{ group.audio_encoder || 'copy' }}
{{ group.audio_bitrate || '不限码率' }}
|
{{ group.sample_rate || '原始' }} |
{{ item }}
正常
|
|
| 暂无编码器分组 | ||||||
出流监控
实时查看哪个 IP 正在播放输出流、播放器类型、协议、请求次数和流量。
在线会话{{ outputViewers.online || 0 }}
访问会话{{ outputViewers.total || 0 }}
客户端 IP{{ outputViewerIPGroups.length }}
累计出流{{ formatDataSize(outputViewers.bytes || 0) }}
更新时间{{ shortTime(outputViewers.updated_at) }}
客户端 IP
按 IP 汇总会话;点击 IP 或查看可展开具体拉流。HLS 按最近 60 秒访问判断在线;HTTP-TS 按连接状态和最近输出判断在线。
| 状态 | IP | 播放器 | 协议 | 频道路径 | 请求 | 累计出流 | 首次访问 | 最后活跃 | 操作 | ||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
{{ group.online_count ? '在线' : '离线' }}
{{ group.online_count }} / {{ group.session_count }} 路
|
{{ outputViewerGroupLabel(group.players) }} |
{{ protocol }} |
{{ outputViewerGroupPathLabel(group) }} |
{{ group.requests }} / 活跃 {{ group.active_requests }} | {{ formatDataSize(group.bytes) }} | {{ shortDateTime(group.started_at) }} | {{ relativeTime(group.last_active) }} | ||||||||||||||||||||
|
{{ group.ip }} 的拉流会话
共 {{ group.session_count }} 路,在线 {{ group.online_count }} 路
|
|||||||||||||||||||||||||||
| 暂无出流访问记录。打开 HLS 或 HTTP-TS 播放地址后会显示在这里。 | |||||||||||||||||||||||||||
KCP / P2P 分发
控制编码频道的 KCP 出流,以及海外 Peer 设备的受控拉流权限。
KCP 服务{{ settingsForm.kcp.enabled ? '已启用' : '已关闭' }}
P2P Peer{{ settingsForm.p2p.enabled ? '已启用' : '已关闭' }}
KCP 频道{{ kcpEligibleChannels.length }}
已登记设备{{ peers.length }}
KCP 传输服务
{{ settingsForm.kcp.enabled ? '运行开关已开' : '未对外提供' }}
KCP 启用、监听端口和缓存修改后需要重启主程序。共享密钥不会通过页面显示;启用 KCP 且未配置密钥时,系统会自动生成并写入
kcp.secret,也可使用环境变量 IPTV_KCP_SECRET 覆盖。KCP 共享密钥
保存后需重启
旧密钥不会回显。保存后当前运行中的 KCP 仍使用旧密钥,重启主程序后新密钥生效,旧 Ticket 将失效。若设置了 IPTV_KCP_SECRET,环境变量优先。
P2P Peer 分享
{{ settingsForm.p2p.enabled ? '允许 Peer 连接' : '已阻断 Peer' }}
这里是管理员硬上限。业务后台可按 quota group 下调上传 Mbps、连接数、缓存和 Chunk 大小,但不能抬高。NAT 监听地址或启用状态变化后需重启;Relay 只接受短期传输令牌,不是通用代理。
受控 Peer
按设备授权
按频道授权
并发租约
Peer 设备
设备 Token 只在注册或重新生成时显示一次;撤销设备会立即释放它持有的频道租约。
| 设备 | 状态 | 频道权限 | 并发上限 | 最后心跳 | 创建时间 | 操作 |
|---|---|---|---|---|---|---|
{{ peer.name }} {{ peer.id }} |
{{ peer.status === 'active' ? '可用' : '已撤销' }} | {{ peer.all_channels ? '全部频道' : ((peer.allowed_channel_ids?.length || 0) + ' 个频道') }} {{ peerAllowedChannelLabel(peer) }} |
{{ peer.max_streams || 0 }} 路 | {{ peer.last_seen ? relativeTime(peer.last_seen) : '未连接' }} | {{ shortDateTime(peer.created_at) }} |
暂无 Peer 设备,注册后可为海外客户端分配频道权限。
日志中心
按天切割、按时间段筛选、最新日志优先展示
频道日志
{{ logEntries.length }} 条结果
已暂停前端刷新
查询后实时流更新,不轮询日志文件
可选日期 {{ logDates.join(' / ') }}
{{ entry.time || '-' }}
{{ entry.level || 'INFO' }}
{{ entry.prefix || '-' }}
暂无符合条件的日志。
媒体转发中心
管理 Provider 列表,每个 Provider 对应一组转发频道
{{ provider.name }}
{{ provider.script }}
暂无 Provider,点击「添加 Provider」开始
{{ selectedProvider?.name || 'Provider' }} · 频道列表
共 {{ selectedProviderChannels.length }} 个频道{{ selectedProvider?.script ? ' · ' + selectedProvider.script : '' }}
转发频道
| 频道 | 播放 | 编码 | 画面 | 倍率 / FPS | 计划重启 | 播放 ID | 操作 | |||
|---|---|---|---|---|---|---|---|---|---|---|
{{ channel.name }} {{ providerChannelAccessLabel(channel) }}{{ channel.input_url || channel.manifest_script || '-' }} |
{{ providerChannelStatusLabel(channel) }} |
|
{{ providerVideoCodec(channel) }}{{ providerAudioCodec(channel) }} |
{{ providerResolutionLabel(channel) }}{{ providerBitrateLabel(channel) }} |
{{ providerSpeedLabel(channel) }}/{{ providerFPSLabel(channel) }} |
{{ providerRuntimeLabel(channel) }}重启 {{ providerRestartCount(channel) }} |
{{ providerRestartLabel(channel) }}
{{ providerRestartNextLabel(channel) }}
|
|
显示 {{ providerChannelPageStart }}-{{ providerChannelPageEnd }} / {{ filteredProviderChannels.length }}
{{ providerChannelCurrentPage }} / {{ providerChannelPageCount }}
{{ providerChannelSearch || providerChannelStatusFilter !== 'all' ? '没有匹配的频道' : '暂无转发频道,点击「添加频道」开始' }}
系统设置
管理当前启动时加载的 JSON 配置文件,保存后会写回磁盘
二进制与数据路径
重启后完全生效
服务地址
监听端口需重启
KCP 出流
启用或改端口需重启
KCP 密钥不会通过页面返回;启用 KCP 时如果为空会自动生成并写入 kcp.secret,也可以使用环境变量 IPTV_KCP_SECRET 覆盖。公网主机名不能填写 0.0.0.0。
运行策略
HLS 频道会重启
MediaMTX
配置文件
当前文件
{{ settingsForm.config_path || '-' }}
管理员入口
右上角 Admin
Web 管理
{{ settingsForm.http_addr || '-' }}
HTTP-TS
{{ settingsForm.http_ts_addr || '-' }}
HLS
{{ settingsForm.hls_addr || '-' }}
状态预览
{{ health.status === 'ok' ? '运行中' : '异常' }}
{{ settingsForm.mediamtx.enabled ? 'MediaMTX 开启' : 'MediaMTX 关闭' }}
{{ settingsForm.ffmpeg_path || 'ffmpeg' }}
保存会立即写入配置文件;监听地址、FFmpeg 路径、数据目录、MediaMTX 启停这类运行时资源,需要重启程序后完全生效。频道级自动恢复仍由每个频道自己的开关控制。
系统操作
只停止本程序管理的频道并重启程序,自动恢复开启时会自动重新拉流
当前版本
{{ currentVersion }} · 最新 {{ updateStatus.release.version }}
发布时间:{{ shortDateTime(updateStatus.release.published_at) }}
{{ updateStatus.release.notes || '暂无更新说明' }}
历史版本
{{ item.version }}
{{ shortDateTime(item.published_at) }}
{{ item.notes || '暂无更新说明' }}
{{ updateStatus.warning || updateStatus.last_error }}
正在后台下载:{{ updateProgressText }}。可继续操作或切换页面。