大量更新

This commit is contained in:
zeaslity
2026-05-19 14:28:44 +08:00
parent a8f6bda703
commit 9fc3372fa3
5299 changed files with 423176 additions and 426690 deletions

View File

@@ -0,0 +1,12 @@
apiVersion: v2
name: cmii-live-services
description: to k8s by cmii live
type: application
version: 1.0.0
appVersion: "5.8.0"
keywords:
- live-stream
- gb28181
- video
maintainers:
- name: hujiaxin@sinontt.com

View File

@@ -0,0 +1,228 @@
#!/bin/bash
# CMII Live Services (Merged) Helm 部署脚本
# 特性: WVP + ZLM + ZLM-OSS 合并部署,使用 HostNetwork 模式访问
# live-op | live-proxy | live-helper node port 模式访问
# ============================说明=====================================
# 如果你不需要使用此脚本文件,直接使用 helm install/upgrade ${release_name} . -n ${namespace_name} 启动
# 或者 kubectl apply -f templates/** 创建
# =====================================================================
set -e
# 配置变量 (***配置namespace & releaseName)
RELEASE_NAME="helm-live"
NAMESPACE="uavcloud-live-test"
CHART_PATH="$(cd "$(dirname "$0")" && pwd)"
VALUES_FILE="${CHART_PATH}/values.yaml"
# 颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
echo_info() {
echo -e "${GREEN}[INFO]${NC} $1"
}
echo_warn() {
echo -e "${YELLOW}[WARN]${NC} $1"
}
echo_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
echo_step() {
echo -e "${BLUE}[STEP]${NC} $1"
}
# 检查前置条件
check_prerequisites() {
echo_step "检查前置条件..."
# 检查 kubectl
if ! command -v kubectl &> /dev/null; then
echo_error "kubectl 未安装,请先安装 kubectl"
exit 1
fi
# 检查 helm
if ! command -v helm &> /dev/null; then
echo_error "helm 未安装,请先安装 helm 3.x"
exit 1
fi
# 检查 Kubernetes 连接
if ! kubectl cluster-info &> /dev/null; then
echo_error "无法连接到 Kubernetes 集群,请检查 kubeconfig 配置"
exit 1
fi
echo_info "前置条件检查通过"
}
# 创建命名空间
create_namespace() {
echo_step "创建命名空间: ${NAMESPACE}"
kubectl create namespace ${NAMESPACE} --dry-run=client -o yaml | kubectl apply -f -
}
# 验证配置文件
validate_config() {
echo_step "验证配置文件..."
if [ ! -f "${VALUES_FILE}" ]; then
echo_error "配置文件不存在: ${VALUES_FILE}"
exit 1
fi
# 检查必要配置 - 外部依赖必须填写
for field in "external.database.host" "external.redis.host" "external.minio.endpoint" "external.rabbitmq.host"; do
if grep -q "${field}: \"\"" "${VALUES_FILE}" || grep -q "${field}: ''" "${VALUES_FILE}"; then
echo_error "请在 values.yaml 中配置 ${field}"
exit 1
fi
done
echo_info "配置文件验证通过"
}
# 渲染模板(用于调试)
render_templates() {
echo_step "渲染 Helm 模板..."
helm template ${RELEASE_NAME} "${CHART_PATH}" -n ${NAMESPACE} -f "${VALUES_FILE}" > /tmp/rendered-merged.yaml
echo_info "模板已渲染到: /tmp/rendered-merged.yaml"
}
# 安装或升级
install_or_upgrade() {
echo_step "部署服务..."
# 检查是否已存在 release
if helm status ${RELEASE_NAME} -n ${NAMESPACE} &> /dev/null; then
echo_info "检测到已存在的 release,执行升级..."
helm upgrade ${RELEASE_NAME} "${CHART_PATH}" \
--namespace "${NAMESPACE}" \
--values "${VALUES_FILE}" \
--timeout 10m
else
echo_info "执行全新安装..."
helm install "${RELEASE_NAME}" "${CHART_PATH}" \
--namespace "${NAMESPACE}" \
--values "${VALUES_FILE}" \
--timeout 10m \
--create-namespace
fi
echo_info "部署完成!"
}
# 等待 Pod 就绪
wait_for_pods() {
echo_step "等待 Pod 就绪..."
echo_info "等待 Media Suite Pod (包含 WVP + ZLM + ZLM-OSS)..."
kubectl wait --for=condition=ready pod \
-l app=media-suite \
-n "${NAMESPACE}" \
--timeout=600s || {
echo_warn "Media Suite Pod 可能未就绪,请手动检查"
}
echo_info "等待其他服务 Pod..."
kubectl wait --for=condition=ready pod \
-l release="${RELEASE_NAME}" \
-n "${NAMESPACE}" \
--timeout=300s || {
echo_warn "部分 Pod 可能未就绪,请手动检查"
}
}
# 显示状态
show_status() {
echo_step "服务状态:"
echo ""
helm status "${RELEASE_NAME}" -n "${NAMESPACE}"
echo ""
echo_info "Pod 列表:"
kubectl get pods -n "${NAMESPACE}" -l release="${RELEASE_NAME}"
echo ""
echo_info "Service 列表:"
kubectl get svc -n "${NAMESPACE}" -l release="${RELEASE_NAME}"
echo ""
# 获取节点 IP
NODE_IP=$(kubectl get nodes -o jsonpath='{.items[0].status.addresses[?(@.type=="InternalIP")].address}' 2>/dev/null || echo "<NODE_IP>")
echo ""
echo_info "========================================="
echo_info "服务访问地址"
echo_info "========================================="
echo_info "Media Suite (HostNetwork 模式):"
echo " WVP HTTP: http://${NODE_IP}:$(grep 'http:' "${VALUES_FILE}" | head -1 | awk '{print $2}')"
echo " WVP SIP: ${NODE_IP}:$(grep 'sip:' "${VALUES_FILE}" | head -1 | awk '{print $2}')/UDP"
echo " ZLM HTTP: http://${NODE_IP}:$(grep 'http:' "${VALUES_FILE}" | head -1 | awk '{print $2}')"
echo " ZLM RTMP: rtmp://${NODE_IP}:$(grep 'rtmp:' "${VALUES_FILE}" | head -1 | awk '{print $2}')"
echo " ZLM RTSP: rtsp://${NODE_IP}:$(grep 'rtsp:' "${VALUES_FILE}" | head -1 | awk '{print $2}')"
echo " ZLM-OSS: http://${NODE_IP}:$(grep 'port:' "${VALUES_FILE}" | grep -A1 'zlmOss' | tail -1 | awk '{print $2}')"
echo ""
echo_info "其他服务 (NodePort 模式):"
echo " Live Operator: http://${NODE_IP}:$(grep 'liveOpNodePort' "${VALUES_FILE}" | awk '{print $2}')"
echo " Live Proxy: http://${NODE_IP}:$(grep 'liveProxyNodePort' "${VALUES_FILE}" | awk '{print $2}')"
echo " Live Helper: http://${NODE_IP}:$(grep 'liveHelperNodePort' "${VALUES_FILE}" | awk '{print $2}')"
}
# 显示日志查看命令
show_log_commands() {
echo ""
echo_info "========================================="
echo_info "日志查看命令"
echo_info "========================================="
echo_info "Media Suite 容器日志:"
echo " kubectl logs -f deployment/${RELEASE_NAME}-media-suite -n ${NAMESPACE} -c wvp"
echo " kubectl logs -f deployment/${RELEASE_NAME}-media-suite -n ${NAMESPACE} -c zlm"
echo " kubectl logs -f deployment/${RELEASE_NAME}-media-suite -n ${NAMESPACE} -c zlm-oss"
echo ""
echo_info "其他服务日志:"
echo " kubectl logs -f deployment/${RELEASE_NAME}-live-op -n ${NAMESPACE}"
echo " kubectl logs -f deployment/${RELEASE_NAME}-live-proxy -n ${NAMESPACE}"
echo " kubectl logs -f deployment/${RELEASE_NAME}-live-helper -n ${NAMESPACE}"
}
# 显示卸载命令
show_uninstall_command() {
echo ""
echo_info "========================================="
echo_info "卸载命令"
echo_info "========================================="
echo " helm uninstall ${RELEASE_NAME} -n ${NAMESPACE}"
}
# 主函数
main() {
echo_info "========================================="
echo_info "CMII Live Services (Merged) Helm 部署"
echo_info "WVP + ZLM + ZLM-OSS 合并部署模式"
echo_info "========================================="
echo ""
check_prerequisites
validate_config
create_namespace
install_or_upgrade
wait_for_pods
show_status
show_log_commands
show_uninstall_command
echo ""
echo_info "========================================="
echo_info "部署完成!"
echo_info "========================================="
}
# 执行主函数
main "$@"

View File

@@ -0,0 +1,230 @@
# live_operator_init
CREATE DATABASE IF NOT EXISTS `cmii_live_operator`;
USE `cmii_live_operator`;
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for live_gb_catalog
-- ----------------------------
DROP TABLE IF EXISTS `live_gb_catalog`;
CREATE TABLE `live_gb_catalog` (
`id` bigint(0) NOT NULL AUTO_INCREMENT COMMENT 'id',
`scope_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT 'scope id',
`create_scope_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT 'create scope id',
`device_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT 'wvp device_id',
`type` tinyint(1) NULL DEFAULT NULL COMMENT 'region or group',
`parent_id` bigint(0) NULL DEFAULT NULL COMMENT 'sys parent catalog',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 0 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Table structure for live_gb_parent_platform
-- ----------------------------
DROP TABLE IF EXISTS `live_gb_parent_platform`;
CREATE TABLE `live_gb_parent_platform` (
`id` bigint(0) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'id',
`platform_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'parentId',
`scope_id` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT 'company scope permission id',
`shared` tinyint(1) NULL DEFAULT 0 COMMENT 'is read',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `id`(`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 0 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Table structure for live_gb_sub_platform
-- ----------------------------
DROP TABLE IF EXISTS `live_gb_sub_platform`;
CREATE TABLE `live_gb_sub_platform` (
`platform_id` int(0) NOT NULL AUTO_INCREMENT,
`platform_name` varchar(96) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
`platform_gb_id` char(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
`platform_gb_domain` char(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
`platform_ip` varchar(96) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
`platform_port_sip` int(0) NOT NULL,
`platform_port_rtmp` int(0) NOT NULL,
`platform_port_rtsp` int(0) NULL DEFAULT NULL,
`platform_port_srt` int(0) NULL DEFAULT NULL,
`platform_port_http` int(0) NULL DEFAULT NULL,
`use_https` tinyint(1) NULL DEFAULT NULL,
`platform_secret` varchar(96) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
`company_id` int(0) NOT NULL,
`shared` tinyint(1) NULL DEFAULT 0,
PRIMARY KEY (`platform_id`) USING BTREE,
UNIQUE INDEX `uniq_gb_id`(`platform_gb_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Table structure for live_hub
-- ----------------------------
DROP TABLE IF EXISTS `live_hub`;
CREATE TABLE `live_hub` (
`id` int(0) NOT NULL AUTO_INCREMENT,
`hub` varchar(48) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
`dvr` int(0) NOT NULL DEFAULT 0 COMMENT 'days for reserve, 0 for disable',
`pub` tinyint(0) NOT NULL DEFAULT 1 COMMENT '0: private; 1: pub play only; 2 pub push only; 3: pub all',
`active` tinyint(0) NOT NULL DEFAULT 1 COMMENT '1 yes, 0 no',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `uniq_hub`(`hub`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 0 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Table structure for live_platform_proxy
-- ----------------------------
DROP TABLE IF EXISTS `live_platform_proxy`;
CREATE TABLE `live_platform_proxy` (
`platform_id` int(0) NOT NULL AUTO_INCREMENT,
`platform_name` varchar(96) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
`platform_gb_id` char(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
`platform_gb_domain` char(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
`platform_ip` varchar(96) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
`platform_port_sip` int(0) NOT NULL,
`platform_port_rtmp` int(0) NOT NULL,
`platform_port_rtsp` int(0) NULL DEFAULT NULL,
`platform_port_srt` int(0) NULL DEFAULT NULL,
`platform_port_http` int(0) NULL DEFAULT NULL,
`use_https` tinyint(1) NULL DEFAULT NULL,
`platform_secret` varchar(96) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
`scope_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
`shared` tinyint(1) NULL DEFAULT 0,
`type` tinyint(1) NULL DEFAULT NULL,
PRIMARY KEY (`platform_id`) USING BTREE,
UNIQUE INDEX `uniq_gb_id`(`platform_gb_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 0 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Table structure for live_record
-- ----------------------------
DROP TABLE IF EXISTS `live_record`;
CREATE TABLE `live_record` (
`id` int(0) NOT NULL AUTO_INCREMENT,
`record_uuid` CHAR(32) NOT NULL COMMENT '业务对外唯一IDUUID32字符串',
`hub` varchar(48) NOT NULL,
`stream` varchar(128) NOT NULL,
`time_begin` datetime(3) NOT NULL,
`time_end` datetime(3) NULL DEFAULT NULL,
`size` bigint(0) NOT NULL,
`status` tinyint(0) NOT NULL COMMENT '0-ok; 1-trash; 2-deleted; 3-live(完成部分上传,本段记录还未结束,仍在直播中); 4-init(上传首个切片)',
`thumbnail_uuid` CHAR(32) NULL DEFAULT NULL,
`thumbnail_bucket` varchar(48) NULL DEFAULT NULL,
`thumbnail_path` varchar(128) NULL DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE INDEX `uniq_record_uuid` (`record_uuid`),
UNIQUE INDEX `uniq_hub_stream_time` (`hub`, `stream`, `time_begin`),
INDEX `idx_hub_stream_status` (`hub`, `stream`, `status`, `time_begin`),
INDEX `idx_time_begin` (`time_begin`)
) ENGINE = InnoDB AUTO_INCREMENT = 0 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Table structure for live_segment
-- ----------------------------
DROP TABLE IF EXISTS `live_segment`;
CREATE TABLE `live_segment` (
`id` bigint(0) NOT NULL AUTO_INCREMENT,
`file_uuid` CHAR(32) NOT NULL,
`size` bigint(0) NOT NULL,
`time_begin` datetime(3) NOT NULL,
`time_end` datetime(3) NOT NULL,
`status` tinyint(0) NOT NULL COMMENT '0-ok; 1-trash; 2-deleted; 3-uploading',
`hub` varchar(48) NOT NULL,
`stream` varchar(128) NOT NULL,
`type` varchar(12) NOT NULL,
`bucket` varchar(32) NOT NULL,
`filename` varchar(128) NOT NULL,
`record_uuid` CHAR(32) NOT NULL COMMENT '推流记录id',
PRIMARY KEY (`id`),
UNIQUE INDEX `uniq_file_uuid` (`file_uuid`),
UNIQUE INDEX `uniq_hub_stream_time` (`hub`, `stream`, `time_begin`),
INDEX `idx_hub_stream_status` (`hub`, `stream`, `status`, `time_begin`),
INDEX `idx_time_begin` (`time_begin`),
INDEX `idx_record_uuid` (`record_uuid`)
) ENGINE = InnoDB AUTO_INCREMENT = 0 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Table structure for live_stream
-- ----------------------------
DROP TABLE IF EXISTS `live_stream`;
CREATE TABLE `live_stream` (
`id` char(8) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '0',
`hub` varchar(48) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
`stream` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
`dvr` int(0) NULL DEFAULT NULL COMMENT 'days for reserve, 0 for disable, null for inherit',
`pub` tinyint(0) NOT NULL DEFAULT 4 COMMENT '0: private; 1: pub play only; 2 pub push only; 3: pub all; 4: inherit',
`active` tinyint(0) NOT NULL DEFAULT 2 COMMENT '2 for inherit',
`activated_after` bigint(0) NULL DEFAULT NULL COMMENT 'sign effective time',
`metadata` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT 'business json',
`gb_name` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT 'gb_name',
`gb_enabled` tinyint(1) NULL DEFAULT NULL COMMENT '1 enabled ; 0 disabled',
`platform_proxy_id` bigint(0) NULL DEFAULT NULL COMMENT 'proxy id',
`scope_id` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT 'scope',
`gb_device_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT 'gb_id',
`stream_push_id` int(0) NULL DEFAULT NULL COMMENT 'stream push id',
`gb_id` int(0) NULL DEFAULT NULL COMMENT 'gb id',
`pushing` tinyint(1) NULL DEFAULT NULL COMMENT '1 true 0 false',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `uniq_stream`(`hub`, `stream`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Table structure for live_token
-- ----------------------------
DROP TABLE IF EXISTS `live_token`;
CREATE TABLE `live_token` (
`id` int(0) NOT NULL AUTO_INCREMENT COMMENT 'id',
`access_key` varchar(12) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT 'ak',
`secret_key` varchar(24) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT 'sk',
`active` tinyint(1) NOT NULL DEFAULT 1 COMMENT '1 yes, 0 no',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 0 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Table structure for monitor_metric
-- ----------------------------
DROP TABLE IF EXISTS `monitor_metric`;
CREATE TABLE `monitor_metric` (
`id` bigint(0) NOT NULL AUTO_INCREMENT COMMENT '指标数据id',
`metric_type` tinyint(1) NULL DEFAULT NULL COMMENT '指标类型',
`data` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '指标值(存储的是字符串、可能是json)',
`time` datetime(0) NULL DEFAULT NULL COMMENT '对应节点时间',
`create_time` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '新增时间',
PRIMARY KEY (`id`) USING BTREE,
INDEX `idx_metric_time`(`metric_type`, `time`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 0 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Table structure for live_config
-- ----------------------------
DROP TABLE IF EXISTS `live_config`;
CREATE TABLE `live_config` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id',
`k` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT 'key',
`v` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci COMMENT 'value',
`prefix` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT 'name',
`remark` varchar(30) DEFAULT NULL COMMENT 'remark',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='配置表';
-- ----------------------------
-- live_hub data init
-- ----------------------------
INSERT INTO `live_hub`
VALUES (1, '__default_', 0, 1, 1);
INSERT INTO `live_hub`
VALUES (2, 'live', 60, 1, 1);
INSERT INTO `live_hub`
VALUES (3, 'temp', 0, 1, 1);
INSERT INTO `live_hub`
VALUES (4, 'pub', 0, 3, 1);
-- ----------------------------
-- live_token data init
-- ----------------------------
INSERT INTO `live_token`
VALUES (1, '2a4052005cee', '3d13c615112649e9b2e5f1f1', 1);
SET FOREIGN_KEY_CHECKS = 1;

View File

@@ -0,0 +1,135 @@
CREATE DATABASE IF NOT EXISTS cmii_live_proxy;
use cmii_live_proxy;
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for proxy_task
-- ----------------------------
DROP TABLE IF EXISTS `proxy_task`;
CREATE TABLE `proxy_task`
(
`id` bigint(0) NOT NULL AUTO_INCREMENT COMMENT '任务id',
`template_id` bigint(0) NOT NULL COMMENT '关联模板',
`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '任务名',
`create_at` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '创建时间',
`update_at` datetime(0) NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '更新时间',
`params` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '填充参数',
`state` tinyint(1) NOT NULL DEFAULT 1 COMMENT '执行状态\r\n(1、待定 2、执行中 3、异常 4、暂停)',
`uuid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '123456' COMMENT '唯一标识(和process绑定)',
`status` tinyint(1) NOT NULL DEFAULT 1 COMMENT '状态',
`execution_time` datetime(0) NULL DEFAULT NULL COMMENT '执行时间',
`sustain_time` bigint(0) NULL DEFAULT NULL COMMENT '持续时间',
`retry_count` int(0) NULL DEFAULT 0 COMMENT '重试次数',
`process_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '进程id最新',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB
AUTO_INCREMENT = 8
CHARACTER SET = utf8mb4
COLLATE = utf8mb4_unicode_ci COMMENT = '任务表'
ROW_FORMAT = Dynamic;
-- ----------------------------
-- Table structure for proxy_task_log
-- ----------------------------
DROP TABLE IF EXISTS `proxy_task_log`;
CREATE TABLE `proxy_task_log`
(
`id` bigint(0) NOT NULL AUTO_INCREMENT COMMENT '日志id',
`content` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT '日志',
`task_id` bigint(0) NULL DEFAULT NULL COMMENT '任务id',
`process_id` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '进程id',
`create_at` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '创建时间',
`update_at` datetime(0) NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '更新时间',
`uuid` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '唯一码',
`is_new` tinyint(1) NOT NULL COMMENT '是否最新进程',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB
AUTO_INCREMENT = 4076
CHARACTER SET = utf8mb4
COLLATE = utf8mb4_unicode_ci COMMENT = '任务日志表'
ROW_FORMAT = Dynamic;
-- ----------------------------
-- Table structure for proxy_template
-- ----------------------------
DROP TABLE IF EXISTS `proxy_template`;
CREATE TABLE `proxy_template`
(
`id` bigint(0) NOT NULL AUTO_INCREMENT COMMENT '模板id',
`create_at` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '创建时间',
`update_at` datetime(0) NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '更新时间',
`ffmpeg_type` tinyint(1) NOT NULL DEFAULT 1 COMMENT '执行类型1 ffmpeg 2 ffprobe 3 ffplay',
`command` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '模板数组',
`name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '模板名称',
`status` tinyint(1) NULL DEFAULT 1 COMMENT '状态',
`placeholder_count` bigint(0) NULL DEFAULT NULL COMMENT '占位参数个数',
`operator_type` tinyint(1) NULL DEFAULT 1 COMMENT '执行类型1 任务操作 2 文件操作',
`alias` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '别名',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB
AUTO_INCREMENT = 10
CHARACTER SET = utf8mb4
COLLATE = utf8mb4_unicode_ci COMMENT = '模板表'
ROW_FORMAT = Dynamic;
-- ----------------------------
-- Table structure for proxy_video_dest_file
-- ----------------------------
DROP TABLE IF EXISTS `proxy_video_dest_file`;
CREATE TABLE `proxy_video_dest_file`
(
`id` bigint(0) NOT NULL AUTO_INCREMENT COMMENT '转换文件',
`create_at` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '创建时间',
`update_at` datetime(0) NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '更新时间',
`template_id` bigint(0) NULL DEFAULT NULL COMMENT '模板id',
`params` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '转换参数',
`path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '转换地址',
`uri` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '文件uri',
`url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '文件url',
`size` bigint(0) NULL DEFAULT NULL COMMENT '文件大小',
`src_file_type` tinyint(1) NULL DEFAULT NULL COMMENT '源文件选择类型(1 本地 2网络)',
`src_file_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '源文件地址(如果为本地文件就是id)',
`mime_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '文件转换扩展类型',
`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '文件名',
`state` tinyint(1) NOT NULL DEFAULT 0 COMMENT '执行状态\r\n(1、待定 2、执行中 3、异常 4、结束)',
`uuid` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '唯一码',
`process_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '进程id',
`log` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT '执行日志',
`parent_path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '父文件目录',
`path_uuid` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '父文件目录uuid',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB
AUTO_INCREMENT = 22
CHARACTER SET = utf8mb4
COLLATE = utf8mb4_unicode_ci COMMENT = '操作文件表'
ROW_FORMAT = Dynamic;
-- ----------------------------
-- Table structure for proxy_video_src_file
-- ----------------------------
DROP TABLE IF EXISTS `proxy_video_src_file`;
CREATE TABLE `proxy_video_src_file`
(
`id` bigint(0) NOT NULL AUTO_INCREMENT COMMENT '文件id',
`create_at` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT '创建时间',
`update_at` datetime(0) NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '更新时间',
`name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '文件名',
`uri` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '文件请求uri',
`path` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '文件路径',
`url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '文件全路径url',
`mime_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '文件类型',
`size` bigint(0) NULL DEFAULT NULL COMMENT '文件大小',
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB
AUTO_INCREMENT = 15
CHARACTER SET = utf8mb4
COLLATE = utf8mb4_unicode_ci COMMENT = '视频源文件表'
ROW_FORMAT = Dynamic;
-- ----------------------------
-- proxy_template init data
-- ----------------------------
INSERT INTO `proxy_template` VALUES (1, '2026-03-30 15:11:59', '2026-03-30 15:12:50', 1, '-re -f lavfi -i testsrc=duration=86400:size=1280x720:rate=30 -c:v libx264 -preset ultrafast -tune zerolatency -profile baseline -g 30 -keyint_min 30 -sc_threshold 0 -pix_fmt yuv420p -f flv %s', '流媒体底座测试推流', 1, 1, 1, 'proxy_live_stream');
SET FOREIGN_KEY_CHECKS = 1;

View File

@@ -0,0 +1,576 @@
CREATE DATABASE IF NOT EXISTS `wvp`;
USE `wvp`;
/*建表*/
-- 存储国标设备的基础信息及在线状态
drop table IF EXISTS wvp_device;
create table IF NOT EXISTS wvp_device
(
id serial primary key COMMENT '主键ID',
device_id character varying(50) not null COMMENT '国标设备编号',
name character varying(255) COMMENT '设备名称',
manufacturer character varying(255) COMMENT '设备厂商',
model character varying(255) COMMENT '设备型号',
firmware character varying(255) COMMENT '固件版本号',
transport character varying(50) COMMENT '信令传输协议TCP/UDP',
stream_mode character varying(50) COMMENT '拉流方式(主动/被动)',
on_line bool default false COMMENT '在线状态',
register_time character varying(50) COMMENT '注册时间',
keepalive_time character varying(50) COMMENT '最近心跳时间',
ip character varying(50) COMMENT '设备IP地址',
create_time character varying(50) COMMENT '创建时间',
update_time character varying(50) COMMENT '更新时间',
port integer COMMENT '信令端口',
expires integer COMMENT '注册有效期',
subscribe_cycle_for_catalog integer DEFAULT 0 COMMENT '目录订阅周期',
subscribe_cycle_for_mobile_position integer DEFAULT 0 COMMENT '移动位置订阅周期',
mobile_position_submission_interval integer DEFAULT 5 COMMENT '移动位置上报间隔',
subscribe_cycle_for_alarm integer DEFAULT 0 COMMENT '报警订阅周期',
host_address character varying(50) COMMENT '设备域名/主机地址',
charset character varying(50) COMMENT '信令字符集',
ssrc_check bool default false COMMENT '是否校验SSRC',
geo_coord_sys character varying(50) COMMENT '坐标系类型',
media_server_id character varying(50) default 'auto' COMMENT '绑定的流媒体服务ID',
custom_name character varying(255) COMMENT '自定义显示名称',
sdp_ip character varying(50) COMMENT 'SDP中携带的IP',
local_ip character varying(50) COMMENT '本地局域网IP',
password character varying(255) COMMENT '设备鉴权密码',
as_message_channel bool default false COMMENT '是否作为消息通道',
heart_beat_interval integer COMMENT '心跳间隔',
heart_beat_count integer COMMENT '心跳失败次数',
position_capability integer COMMENT '定位能力标识',
broadcast_push_after_ack bool default false COMMENT 'ACK后是否自动推流',
server_id character varying(50) COMMENT '所属信令服务器ID',
constraint uk_device_device unique (device_id)
);
-- 记录各设备上报的报警信息
drop table IF EXISTS wvp_device_alarm;
create table IF NOT EXISTS wvp_device_alarm
(
id serial primary key COMMENT '主键ID',
device_id character varying(50) not null COMMENT '国标设备ID',
channel_id character varying(50) not null COMMENT '报警关联的通道ID',
alarm_priority character varying(50) COMMENT '报警级别',
alarm_method character varying(50) COMMENT '报警方式(视频/语音等)',
alarm_time character varying(50) COMMENT '报警发生时间',
alarm_description character varying(255) COMMENT '报警描述',
longitude double precision COMMENT '报警经度',
latitude double precision COMMENT '报警纬度',
alarm_type character varying(50) COMMENT '报警类型',
create_time character varying(50) not null COMMENT '数据入库时间'
);
-- 存储移动位置订阅上报的数据
drop table IF EXISTS wvp_device_mobile_position;
create table IF NOT EXISTS wvp_device_mobile_position
(
id serial primary key COMMENT '主键ID',
device_id character varying(50) not null COMMENT '设备ID',
channel_id character varying(50) not null COMMENT '通道ID',
device_name character varying(255) COMMENT '设备名称',
time character varying(50) COMMENT '上报时间',
longitude double precision COMMENT '经度',
latitude double precision COMMENT '纬度',
altitude double precision COMMENT '海拔',
speed double precision COMMENT '速度',
direction double precision COMMENT '方向角',
report_source character varying(50) COMMENT '上报来源',
create_time character varying(50) COMMENT '入库时间'
);
-- 保存设备下的通道信息以及扩展属性
drop table IF EXISTS wvp_device_channel;
create table IF NOT EXISTS wvp_device_channel
(
id serial primary key COMMENT '主键ID',
device_id character varying(50) COMMENT '所属设备ID',
name character varying(255) COMMENT '通道名称',
manufacturer character varying(50) COMMENT '厂商',
model character varying(50) COMMENT '型号',
owner character varying(50) COMMENT '归属单位',
civil_code character varying(50) COMMENT '行政区划代码',
block character varying(50) COMMENT '区域/小区编号',
address character varying(50) COMMENT '安装地址',
parental integer COMMENT '是否有子节点',
parent_id character varying(50) COMMENT '父级通道ID',
safety_way integer COMMENT '安全防范等级',
register_way integer COMMENT '注册方式',
cert_num character varying(50) COMMENT '证书编号',
certifiable integer COMMENT '是否可认证',
err_code integer COMMENT '故障状态码',
end_time character varying(50) COMMENT '服务截止时间',
secrecy integer COMMENT '保密级别',
ip_address character varying(50) COMMENT '设备IP地址',
port integer COMMENT '设备端口',
password character varying(255) COMMENT '访问密码',
status character varying(50) COMMENT '在线状态',
longitude double precision COMMENT '经度',
latitude double precision COMMENT '纬度',
ptz_type integer COMMENT '云台类型',
position_type integer COMMENT '点位类型',
room_type integer COMMENT '房间类型',
use_type integer COMMENT '使用性质',
supply_light_type integer COMMENT '补光方式',
direction_type integer COMMENT '朝向',
resolution character varying(255) COMMENT '分辨率',
business_group_id character varying(255) COMMENT '业务分组ID',
download_speed character varying(255) COMMENT '下载/码流速率',
svc_space_support_mod integer COMMENT '空域SVC能力',
svc_time_support_mode integer COMMENT '时域SVC能力',
create_time character varying(50) not null COMMENT '创建时间',
update_time character varying(50) not null COMMENT '更新时间',
sub_count integer COMMENT '子节点数量',
stream_id character varying(255) COMMENT '绑定的流ID',
has_audio bool default false COMMENT '是否有音频',
gps_time character varying(50) COMMENT 'GPS定位时间',
stream_identification character varying(50) COMMENT '流标识',
channel_type int default 0 not null COMMENT '通道类型',
map_level int default 0 COMMENT '地图层级',
gb_device_id character varying(50) COMMENT 'GB内的设备ID',
gb_name character varying(255) COMMENT 'GB上报的名称',
gb_manufacturer character varying(255) COMMENT 'GB厂商',
gb_model character varying(255) COMMENT 'GB型号',
gb_owner character varying(255) COMMENT 'GB归属',
gb_civil_code character varying(255) COMMENT 'GB行政区划',
gb_block character varying(255) COMMENT 'GB区域',
gb_address character varying(255) COMMENT 'GB地址',
gb_parental integer COMMENT 'GB子节点标识',
gb_parent_id character varying(255) COMMENT 'GB父通道',
gb_safety_way integer COMMENT 'GB安全防范',
gb_register_way integer COMMENT 'GB注册方式',
gb_cert_num character varying(50) COMMENT 'GB证书编号',
gb_certifiable integer COMMENT 'GB认证标志',
gb_err_code integer COMMENT 'GB错误码',
gb_end_time character varying(50) COMMENT 'GB截止时间',
gb_secrecy integer COMMENT 'GB保密级别',
gb_ip_address character varying(50) COMMENT 'GB IP',
gb_port integer COMMENT 'GB端口',
gb_password character varying(50) COMMENT 'GB接入密码',
gb_status character varying(50) COMMENT 'GB状态',
gb_longitude double COMMENT 'GB经度',
gb_latitude double COMMENT 'GB纬度',
gb_business_group_id character varying(50) COMMENT 'GB业务分组',
gb_ptz_type integer COMMENT 'GB云台类型',
gb_position_type integer COMMENT 'GB点位类型',
gb_room_type integer COMMENT 'GB房间类型',
gb_use_type integer COMMENT 'GB用途',
gb_supply_light_type integer COMMENT 'GB补光',
gb_direction_type integer COMMENT 'GB朝向',
gb_resolution character varying(255) COMMENT 'GB分辨率',
gb_download_speed character varying(255) COMMENT 'GB码流速率',
gb_svc_space_support_mod integer COMMENT 'GB空域SVC',
gb_svc_time_support_mode integer COMMENT 'GB时域SVC',
record_plan_id integer COMMENT '绑定的录像计划ID',
data_type integer not null COMMENT '数据类型标识',
data_device_id integer not null COMMENT '数据来源设备主键',
gps_speed double precision COMMENT 'GPS速度',
gps_altitude double precision COMMENT 'GPS海拔',
gps_direction double precision COMMENT 'GPS方向',
enable_broadcast integer default 0 COMMENT '是否支持广播',
index (data_type),
index (data_device_id),
constraint uk_wvp_unique_channel unique (gb_device_id)
);
-- 媒体服务器(如 ZLM节点信息
drop table IF EXISTS wvp_media_server;
create table IF NOT EXISTS wvp_media_server
(
id character varying(255) primary key COMMENT '媒体服务器ID',
ip character varying(50) COMMENT '服务器IP',
hook_ip character varying(50) COMMENT 'hook回调IP',
sdp_ip character varying(50) COMMENT 'SDP中使用的IP',
stream_ip character varying(50) COMMENT '推流使用的IP',
http_port integer COMMENT 'HTTP端口',
http_ssl_port integer COMMENT 'HTTPS端口',
rtmp_port integer COMMENT 'RTMP端口',
rtmp_ssl_port integer COMMENT 'RTMPS端口',
rtp_proxy_port integer COMMENT 'RTP代理端口',
rtsp_port integer COMMENT 'RTSP端口',
rtsp_ssl_port integer COMMENT 'RTSPS端口',
flv_port integer COMMENT 'FLV端口',
flv_ssl_port integer COMMENT 'FLV HTTPS端口',
mp4_port integer COMMENT 'MP4点播端口',
mp4_ssl_port integer COMMENT 'MP4 HTTPS端口',
ws_flv_port integer COMMENT 'WS-FLV端口',
ws_flv_ssl_port integer COMMENT 'WS-FLV HTTPS端口',
jtt_proxy_port integer COMMENT 'JT/T代理端口',
auto_config bool default false COMMENT '是否自动配置',
secret character varying(50) COMMENT 'ZLM校验密钥',
type character varying(50) default 'zlm' COMMENT '节点类型',
rtp_enable bool default false COMMENT '是否开启RTP',
rtp_port_range character varying(50) COMMENT 'RTP端口范围',
send_rtp_port_range character varying(50) COMMENT '发送RTP端口范围',
record_assist_port integer COMMENT '录像辅助端口',
default_server bool default false COMMENT '是否默认节点',
create_time character varying(50) COMMENT '创建时间',
update_time character varying(50) COMMENT '更新时间',
hook_alive_interval integer COMMENT 'hook心跳间隔',
record_path character varying(255) COMMENT '录像目录',
record_day integer default 7 COMMENT '录像保留天数',
transcode_suffix character varying(255) COMMENT '转码指令后缀',
server_id character varying(50) COMMENT '对应信令服务器ID',
constraint uk_media_server_unique_ip_http_port unique (ip, http_port, server_id)
);
-- 上级国标平台注册信息
drop table IF EXISTS wvp_platform;
create table IF NOT EXISTS wvp_platform
(
id serial primary key COMMENT '主键ID',
enable bool default false COMMENT '是否启用该平台注册',
name character varying(255) COMMENT '平台名称',
server_gb_id character varying(50) COMMENT '上级平台国标编码',
server_gb_domain character varying(50) COMMENT '上级平台域编码',
server_ip character varying(50) COMMENT '上级平台IP',
server_port integer COMMENT '上级平台注册端口',
device_gb_id character varying(50) COMMENT '本平台向上注册的国标编码',
device_ip character varying(50) COMMENT '本平台信令IP',
device_port character varying(50) COMMENT '本平台信令端口',
username character varying(255) COMMENT '注册用户名',
password character varying(50) COMMENT '注册密码',
expires character varying(50) COMMENT '注册有效期',
keep_timeout character varying(50) COMMENT '心跳超时时间',
transport character varying(50) COMMENT '传输协议UDP/TCP',
civil_code character varying(50) COMMENT '行政区划代码',
manufacturer character varying(255) COMMENT '厂商',
model character varying(255) COMMENT '型号',
address character varying(255) COMMENT '地址',
character_set character varying(50) COMMENT '字符集',
ptz bool default false COMMENT '是否支持PTZ',
rtcp bool default false COMMENT '是否开启RTCP',
status bool default false COMMENT '注册状态',
catalog_group integer COMMENT '目录分组方式',
register_way integer COMMENT '注册方式',
secrecy integer COMMENT '保密级别',
create_time character varying(50) COMMENT '创建时间',
update_time character varying(50) COMMENT '更新时间',
as_message_channel bool default false COMMENT '是否作为消息通道',
catalog_with_platform integer default 1 COMMENT '是否推送平台目录',
catalog_with_group integer default 1 COMMENT '是否推送分组目录',
catalog_with_region integer default 1 COMMENT '是否推送区域目录',
auto_push_channel bool default true COMMENT '是否自动推送通道',
send_stream_ip character varying(50) COMMENT '推流时使用的IP',
server_id character varying(50) COMMENT '对应信令服务器ID',
constraint uk_platform_unique_server_gb_id unique (server_gb_id)
);
-- 国标平台下发的通道映射关系
drop table IF EXISTS wvp_platform_channel;
create table IF NOT EXISTS wvp_platform_channel
(
id serial primary key COMMENT '主键ID',
platform_id integer COMMENT '平台ID',
device_channel_id integer COMMENT '本地通道表主键',
custom_device_id character varying(50) COMMENT '自定义国标编码',
custom_name character varying(255) COMMENT '自定义名称',
custom_manufacturer character varying(50) COMMENT '自定义厂商',
custom_model character varying(50) COMMENT '自定义型号',
custom_owner character varying(50) COMMENT '自定义归属',
custom_civil_code character varying(50) COMMENT '自定义行政区划',
custom_block character varying(50) COMMENT '自定义区域',
custom_address character varying(50) COMMENT '自定义地址',
custom_parental integer COMMENT '自定义父/子标识',
custom_parent_id character varying(50) COMMENT '自定义父节点',
custom_safety_way integer COMMENT '自定义安全防范',
custom_register_way integer COMMENT '自定义注册方式',
custom_cert_num character varying(50) COMMENT '自定义证书编号',
custom_certifiable integer COMMENT '自定义可认证标志',
custom_err_code integer COMMENT '自定义错误码',
custom_end_time character varying(50) COMMENT '自定义截止时间',
custom_secrecy integer COMMENT '自定义保密级别',
custom_ip_address character varying(50) COMMENT '自定义IP',
custom_port integer COMMENT '自定义端口',
custom_password character varying(255) COMMENT '自定义密码',
custom_status character varying(50) COMMENT '自定义状态',
custom_longitude double precision COMMENT '自定义经度',
custom_latitude double precision COMMENT '自定义纬度',
custom_ptz_type integer COMMENT '自定义云台类型',
custom_position_type integer COMMENT '自定义点位类型',
custom_room_type integer COMMENT '自定义房间类型',
custom_use_type integer COMMENT '自定义用途',
custom_supply_light_type integer COMMENT '自定义补光',
custom_direction_type integer COMMENT '自定义朝向',
custom_resolution character varying(255) COMMENT '自定义分辨率',
custom_business_group_id character varying(255) COMMENT '自定义业务分组',
custom_download_speed character varying(255) COMMENT '自定义码流速率',
custom_svc_space_support_mod integer COMMENT '自定义空域SVC',
custom_svc_time_support_mode integer COMMENT '自定义时域SVC',
constraint uk_platform_gb_channel_platform_id_catalog_id_device_channel_id unique (platform_id, device_channel_id),
constraint uk_platform_gb_channel_device_id unique (custom_device_id)
);
-- 平台与分组(行政区划/组织)关系
drop table IF EXISTS wvp_platform_group;
create table IF NOT EXISTS wvp_platform_group
(
id serial primary key COMMENT '主键ID',
platform_id integer COMMENT '平台ID',
group_id integer COMMENT '分组ID',
constraint uk_wvp_platform_group_platform_id_group_id unique (platform_id, group_id)
);
-- 平台与区域关系
drop table IF EXISTS wvp_platform_region;
create table IF NOT EXISTS wvp_platform_region
(
id serial primary key COMMENT '主键ID',
platform_id integer COMMENT '平台ID',
region_id integer COMMENT '区域ID',
constraint uk_wvp_platform_region_platform_id_group_id unique (platform_id, region_id)
);
-- 拉流代理/转推配置
drop table IF EXISTS wvp_stream_proxy;
create table IF NOT EXISTS wvp_stream_proxy
(
id serial primary key COMMENT '主键ID',
type character varying(50) COMMENT '代理类型(拉流/推流)',
app character varying(255) COMMENT '应用名',
stream character varying(255) COMMENT '流ID',
src_url character varying(255) COMMENT '源地址',
timeout integer COMMENT '拉流超时时间',
ffmpeg_cmd_key character varying(255) COMMENT 'FFmpeg命令模板键',
rtsp_type character varying(50) COMMENT 'RTSP拉流方式',
media_server_id character varying(50) COMMENT '指定媒体服务器ID',
enable_audio bool default false COMMENT '是否启用音频',
enable_mp4 bool default false COMMENT '是否录制MP4',
pulling bool default false COMMENT '当前是否在拉流',
enable bool default false COMMENT '是否启用该代理',
create_time character varying(50) COMMENT '创建时间',
name character varying(255) COMMENT '代理名称',
update_time character varying(50) COMMENT '更新时间',
stream_key character varying(255) COMMENT '唯一流标识',
server_id character varying(50) COMMENT '信令服务器ID',
enable_disable_none_reader bool default false COMMENT '是否无人观看时自动停流',
relates_media_server_id character varying(50) COMMENT '关联的媒体服务器ID',
constraint uk_stream_proxy_app_stream unique (app, stream)
);
-- 推流会话记录
drop table IF EXISTS wvp_stream_push;
create table IF NOT EXISTS wvp_stream_push
(
id serial primary key COMMENT '主键ID',
app character varying(255) COMMENT '应用名',
stream character varying(255) COMMENT '流ID',
create_time character varying(50) COMMENT '创建时间',
media_server_id character varying(50) COMMENT '推流所在媒体服务器',
server_id character varying(50) COMMENT '信令服务器ID',
push_time character varying(50) COMMENT '推流开始时间',
status bool default false COMMENT '推流状态',
update_time character varying(50) COMMENT '更新时间',
pushing bool default false COMMENT '是否正在推流',
self bool default false COMMENT '是否本地发起',
start_offline_push bool default true COMMENT '是否离线后自动重推',
constraint uk_stream_push_app_stream unique (app, stream)
);
-- 云端录像记录
drop table IF EXISTS wvp_cloud_record;
create table IF NOT EXISTS wvp_cloud_record
(
id serial primary key COMMENT '主键ID',
app character varying(255) COMMENT '应用名',
stream character varying(255) COMMENT '流ID',
call_id character varying(255) COMMENT '会话ID',
start_time bigint COMMENT '录像开始时间',
end_time bigint COMMENT '录像结束时间',
media_server_id character varying(50) COMMENT '媒体服务器ID',
server_id character varying(50) COMMENT '信令服务器ID',
file_name character varying(255) COMMENT '文件名',
folder character varying(500) COMMENT '目录',
file_path character varying(500) COMMENT '完整路径',
collect bool default false COMMENT '是否收藏',
file_size bigint COMMENT '文件大小',
time_len double precision COMMENT '时长'
);
-- 平台用户信息
drop table IF EXISTS wvp_user;
create table IF NOT EXISTS wvp_user
(
id serial primary key COMMENT '主键ID',
username character varying(255) COMMENT '用户名',
password character varying(255) COMMENT '密码MD5',
role_id integer COMMENT '角色ID',
create_time character varying(50) COMMENT '创建时间',
update_time character varying(50) COMMENT '更新时间',
push_key character varying(50) COMMENT '推送密钥',
constraint uk_user_username unique (username)
);
-- 用户角色信息
drop table IF EXISTS wvp_user_role;
create table IF NOT EXISTS wvp_user_role
(
id serial primary key COMMENT '主键ID',
name character varying(50) COMMENT '角色名称',
authority character varying(50) COMMENT '权限标识',
create_time character varying(50) COMMENT '创建时间',
update_time character varying(50) COMMENT '更新时间'
);
drop table IF EXISTS wvp_user_api_key;
create table IF NOT EXISTS wvp_user_api_key
(
id serial primary key COMMENT '主键ID',
user_id bigint COMMENT '关联用户ID',
app character varying(255) COMMENT '应用标识',
api_key text COMMENT 'API Key',
expired_at bigint COMMENT '过期时间戳',
remark character varying(255) COMMENT '备注',
enable bool default true COMMENT '是否启用',
create_time character varying(50) COMMENT '创建时间',
update_time character varying(50) COMMENT '更新时间'
);
/*初始数据*/
-- 初始化管理员账号账号admin 密码adminMD5加密后
INSERT INTO wvp_user
VALUES (1, 'admin', '21232f297a57a5a743894a0e4a801fc3', 1, '2021-04-13 14:14:57', '2021-04-13 14:14:57',
'3e80d1762a324d5b0ff636e0bd16f1e3');
-- 初始化管理员角色
INSERT INTO wvp_user_role
VALUES (1, 'admin', '0', '2021-04-13 14:14:57', '2021-04-13 14:14:57');
-- 通用分组表,存储行业或组织结构
drop table IF EXISTS wvp_common_group;
create table IF NOT EXISTS wvp_common_group
(
id serial primary key COMMENT '主键ID',
device_id varchar(50) NOT NULL COMMENT '分组对应的平台或设备ID',
name varchar(255) NOT NULL COMMENT '分组名称',
parent_id int COMMENT '父级分组ID',
parent_device_id varchar(50) DEFAULT NULL COMMENT '父级分组对应的设备ID',
business_group varchar(50) NOT NULL COMMENT '业务分组编码',
create_time varchar(50) NOT NULL COMMENT '创建时间',
update_time varchar(50) NOT NULL COMMENT '更新时间',
civil_code varchar(50) default null COMMENT '行政区划代码',
alias varchar(255) default null COMMENT '别名',
constraint uk_common_group_device_platform unique (device_id)
);
-- 通用行政区域表
drop table IF EXISTS wvp_common_region;
create table IF NOT EXISTS wvp_common_region
(
id serial primary key COMMENT '主键ID',
device_id varchar(50) NOT NULL COMMENT '区域对应的平台或设备ID',
name varchar(255) NOT NULL COMMENT '区域名称',
parent_id int COMMENT '父级区域ID',
parent_device_id varchar(50) DEFAULT NULL COMMENT '父级区域的设备ID',
create_time varchar(50) NOT NULL COMMENT '创建时间',
update_time varchar(50) NOT NULL COMMENT '更新时间',
constraint uk_common_region_device_id unique (device_id)
);
-- 录像计划基础信息
drop table IF EXISTS wvp_record_plan;
create table IF NOT EXISTS wvp_record_plan
(
id serial primary key COMMENT '主键ID',
snap bool default false COMMENT '是否抓图计划',
name varchar(255) NOT NULL COMMENT '计划名称',
create_time character varying(50) COMMENT '创建时间',
update_time character varying(50) COMMENT '更新时间'
);
-- 录像计划条目表
drop table IF EXISTS wvp_record_plan_item;
create table IF NOT EXISTS wvp_record_plan_item
(
id serial primary key COMMENT '主键ID',
start int COMMENT '开始时间(分钟)',
stop int COMMENT '结束时间(分钟)',
week_day int COMMENT '星期0-6',
plan_id int COMMENT '所属录像计划ID',
create_time character varying(50) COMMENT '创建时间',
update_time character varying(50) COMMENT '更新时间'
);
-- 交通部 JT/T 1076 终端信息
drop table IF EXISTS wvp_jt_terminal;
create table IF NOT EXISTS wvp_jt_terminal (
id serial primary key COMMENT '主键ID',
phone_number character varying(50) COMMENT '终端SIM卡号',
terminal_id character varying(50) COMMENT '终端设备ID',
province_id character varying(50) COMMENT '所在省份ID',
province_text character varying(100) COMMENT '所在省份名称',
city_id character varying(50) COMMENT '所在城市ID',
city_text character varying(100) COMMENT '所在城市名称',
maker_id character varying(50) COMMENT '厂商ID',
model character varying(50) COMMENT '终端型号',
plate_color character varying(50) COMMENT '车牌颜色',
plate_no character varying(50) COMMENT '车牌号码',
longitude double precision COMMENT '经度',
latitude double precision COMMENT '纬度',
status bool default false COMMENT '在线状态',
register_time character varying(50) default null COMMENT '注册时间',
update_time character varying(50) not null COMMENT '更新时间',
create_time character varying(50) not null COMMENT '创建时间',
geo_coord_sys character varying(50) COMMENT '坐标系',
media_server_id character varying(50) default 'auto' COMMENT '媒体服务器ID',
sdp_ip character varying(50) COMMENT 'SDP IP',
constraint uk_jt_device_id_device_id unique (id, phone_number)
);
-- 交通部 JT/T 1076 通道信息
drop table IF EXISTS wvp_jt_channel;
create table IF NOT EXISTS wvp_jt_channel (
id serial primary key COMMENT '主键ID',
terminal_db_id integer COMMENT '所属终端记录ID',
channel_id integer COMMENT '通道号',
has_audio bool default false COMMENT '是否有音频',
name character varying(255) COMMENT '通道名称',
update_time character varying(50) not null COMMENT '更新时间',
create_time character varying(50) not null COMMENT '创建时间',
constraint uk_jt_channel_id_device_id unique (terminal_db_id, channel_id)
);
drop table IF EXISTS wvp_jt_terminal;
create table IF NOT EXISTS wvp_jt_terminal (
id serial primary key,
phone_number character varying(50),
terminal_id character varying(50),
province_id character varying(50),
province_text character varying(100),
city_id character varying(50),
city_text character varying(100),
maker_id character varying(50),
model character varying(50),
plate_color character varying(50),
plate_no character varying(50),
longitude double precision,
latitude double precision,
status bool default false,
register_time character varying(50) default null,
update_time character varying(50) not null,
create_time character varying(50) not null,
geo_coord_sys character varying(50),
media_server_id character varying(50) default 'auto',
sdp_ip character varying(50),
constraint uk_jt_device_id_device_id unique (id, phone_number)
);
drop table IF EXISTS wvp_jt_channel;
create table IF NOT EXISTS wvp_jt_channel (
id serial primary key,
terminal_db_id integer,
channel_id integer,
has_audio bool default false,
name character varying(255),
update_time character varying(50) not null,
create_time character varying(50) not null,
constraint uk_jt_channel_id_device_id unique (terminal_db_id, channel_id)
);

View File

@@ -0,0 +1,41 @@
1. 获取应用的 URL:
NOTE: It may take a few minutes for all pods to be ready.
查看 Pod 状态:
kubectl get pods -n {{ .Release.Namespace }} -l release={{ .Release.Name }}
2. Media Suite (WVP + ZLM + ZLM-OSS) 使用 HostNetwork 模式访问nodeIp+端口:
- WVP HTTP: http://{{.Values.mediaSuite.nodeIP}}:{{ .Values.wvp.ports.http }}
- WVP SIP: {{.Values.mediaSuite.nodeIP}}:{{ .Values.wvp.ports.sip }}/UDP
- ZLM HTTP: http://{{.Values.mediaSuite.nodeIP}}:{{ .Values.zlm.ports.http }}
- ZLM HTTPS: https://{{.Values.mediaSuite.nodeIP}}:{{ .Values.zlm.ports.https }}
- ZLM RTMP: rtmp://{{.Values.mediaSuite.nodeIP}}:{{ .Values.zlm.ports.rtmp }}
- ZLM RTSP: rtsp://{{.Values.mediaSuite.nodeIP}}:{{ .Values.zlm.ports.rtsp }}
- ZLM WebRTC: webrtc://{{.Values.mediaSuite.nodeIP}}:{{ .Values.zlm.ports.webrtc }}
- ZLM SRT: srt://{{.Values.mediaSuite.nodeIP}}:{{ .Values.zlm.ports.srt }}
- ZLM-OSS: http://{{.Values.mediaSuite.nodeIP}}:{{ .Values.zlmOss.port }}
3. Live Operator:
- URL: http://<NODE_IP>:{{ .Values.network.liveOpNodePort }}
4. Live Proxy:
- URL: http://<NODE_IP>:{{ .Values.network.liveProxyNodePort }}
5. Live Helper:
- URL: http://<NODE_IP>:{{ .Values.network.liveHelperNodePort }}
6. 查看日志:
# Media Suite (所有容器)
kubectl logs -f deployment/{{ .Release.Name }}-media-suite -n {{ .Release.Namespace }} -c wvp
kubectl logs -f deployment/{{ .Release.Name }}-media-suite -n {{ .Release.Namespace }} -c zlm
kubectl logs -f deployment/{{ .Release.Name }}-media-suite -n {{ .Release.Namespace }} -c zlm-oss
# Live Operator
kubectl logs -f deployment/{{ .Release.Name }}-live-op -n {{ .Release.Namespace }}
# Live Proxy
kubectl logs -f deployment/{{ .Release.Name }}-live-proxy -n {{ .Release.Namespace }}
# Live Helper
kubectl logs -f deployment/{{ .Release.Name }}-live-helper -n {{ .Release.Namespace }}
7. 卸载:
helm uninstall {{ .Release.Name }} -n {{ .Release.Namespace }}

View File

@@ -0,0 +1,13 @@
{{- if .Values.images.secretName }}
apiVersion: v1
kind: Secret
metadata:
name: {{ .Values.images.secretName }}
namespace: {{ .Release.Namespace }}
labels:
chart: {{ .Chart.Name }}-{{ .Chart.Version }}
release: {{ .Release.Name }}
type: kubernetes.io/dockerconfigjson
data:
.dockerconfigjson: {{ .Values.images.dockerConfigJson }}
{{- end }}

View File

@@ -0,0 +1,22 @@
apiVersion: v1
kind: ConfigMap
metadata:
namespace: {{ .Release.Namespace }}
name: {{ .Release.Name }}-live-helper-config
labels:
app: live-helper
chart: {{ .Chart.Name }}-{{ .Chart.Version }}
release: {{ .Release.Name }}
data:
config.yaml: |
app:
port: {{ .Values.liveHelper.port }}
workers: 4
log:
level: INFO
client:
zlm: "http://{{ .Release.Name }}-zlm:{{ .Values.zlm.ports.http }}"
downloader:
allow_domains: {{ .Values.liveHelper.allowDownload }}

View File

@@ -0,0 +1,65 @@
apiVersion: apps/v1
kind: Deployment
metadata:
namespace: {{ .Release.Namespace }}
name: {{ .Release.Name }}-live-helper
labels:
app: live-helper
chart: {{ .Chart.Name }}-{{ .Chart.Version }}
release: {{ .Release.Name }}
spec:
replicas: {{ .Values.liveHelper.replicaCount }}
selector:
matchLabels:
app: live-helper
release: {{ .Release.Name }}
template:
metadata:
labels:
app: live-helper
release: {{ .Release.Name }}
spec:
containers:
- name: live-helper
image: "{{ .Values.images.liveHelper.repository }}:{{ .Values.images.liveHelper.tag }}"
imagePullPolicy: {{ .Values.images.liveHelper.pullPolicy }}
ports:
- name: http
containerPort: {{ .Values.liveHelper.port }}
protocol: TCP
env:
- name: ALLOW_DOWNLOAD
value: "{{ .Values.liveHelper.allowDownload }}"
volumeMounts:
- name: config
mountPath: /cmii/live-helper/config.yaml
subPath: config.yaml
resources:
{{- toYaml .Values.liveHelper.resources | nindent 12 }}
volumes:
- name: config
configMap:
name: {{ .Release.Name }}-live-helper-config
imagePullSecrets:
- name: {{ .Values.images.secretName }}
---
apiVersion: v1
kind: Service
metadata:
namespace: {{ .Release.Namespace }}
name: {{ .Release.Name }}-live-helper
labels:
app: live-helper
chart: {{ .Chart.Name }}-{{ .Chart.Version }}
release: {{ .Release.Name }}
spec:
type: NodePort
ports:
- name: http
port: {{ .Values.liveHelper.port }}
targetPort: http
nodePort: {{ .Values.network.liveHelperNodePort }}
protocol: TCP
selector:
app: live-helper
release: {{ .Release.Name }}

View File

@@ -0,0 +1,86 @@
apiVersion: v1
kind: ConfigMap
metadata:
namespace: {{ .Release.Namespace }}
name: {{ .Release.Name }}-live-op-config
labels:
app: live-op
chart: {{ .Chart.Name }}-{{ .Chart.Version }}
release: {{ .Release.Name }}
data:
application.yaml: |
debug: false
server:
port: {{ .Values.liveOp.port }}
spring:
web:
resources:
static-locations: classpath:/static/
main:
allow-bean-definition-overriding: true
allow-circular-references: true
application:
name: cmii-live-operator
thymeleaf:
check-template-location: false
cache: false
platform:
info:
name: cmii-live-operator
description: cmii-live-operator
version: 5.8.0
scanPackage: com.cmii.live.op
jackson:
time-zone: GMT+8
mvc:
pathmatch:
matching-strategy: ANT_PATH_MATCHER
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
url: jdbc:mysql://{{ .Values.external.database.host }}:{{ .Values.external.database.port }}/{{ .Values.databases.liveOp }}?characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true
username: {{ .Values.external.database.username }}
password: {{ .Values.external.database.password }}
druid:
initial-size: 10
min-idle: 5
max-active: 20
max-wait: 60000
time-between-eviction-runs-millis: 60000
min-evictable-idle-time-millis: 300000
validation-query: SELECT 1
test-while-idle: true
test-on-borrow: false
test-on-return: false
use-ping-method: false
keep-alive: true
redis:
host: {{ .Values.external.redis.host }}
port: {{ .Values.external.redis.port }}
database: {{ .Values.redis.liveOpDb }}
password: {{ .Values.external.redis.password }}
live:
sync:
pool:
monitor:
enabled: false
core: 10
max: 20
queue: 1
keepalive: 20
logging:
config: classpath:logback-operator.xml
level:
root: info
com.cmii.live.op.mapper: info
mybatis-plus:
global-config:
banner: false
knife4j:
enable: true

View File

@@ -0,0 +1,97 @@
apiVersion: apps/v1
kind: Deployment
metadata:
namespace: {{ .Release.Namespace }}
name: {{ .Release.Name }}-live-op
labels:
app: live-op
chart: {{ .Chart.Name }}-{{ .Chart.Version }}
release: {{ .Release.Name }}
spec:
replicas: {{ .Values.liveOp.replicaCount }}
selector:
matchLabels:
app: live-op
release: {{ .Release.Name }}
template:
metadata:
labels:
app: live-op
release: {{ .Release.Name }}
spec:
containers:
- name: live-op
image: "{{ .Values.images.liveOp.repository }}:{{ .Values.images.liveOp.tag }}"
imagePullPolicy: {{ .Values.images.liveOp.pullPolicy }}
ports:
- name: http
containerPort: {{ .Values.liveOp.port }}
protocol: TCP
env:
- name: LIVE_IP_PUBLIC
value: "{{ .Values.mediaSuite.nodeIP }}"
- name: LIVE_IP_PRIVATE
value: "{{ .Values.mediaSuite.nodeIP }}"
- name: LIVE_OP_PORT_HTTP
value: "{{ .Values.liveOp.port }}"
- name: LIVE_WVP_PORT_HTTP
value: "{{ .Values.wvp.ports.http }}"
- name: LIVE_ZLM_PORT_HTTP
value: "{{ .Values.zlm.ports.http }}"
- name: LIVE_ZLM_PORT_HTTPS
value: "{{ .Values.zlm.ports.https }}"
- name: LIVE_ZLM_PORT_RTMP
value: "{{ .Values.zlm.ports.rtmp }}"
- name: LIVE_ZLM_PORT_RTSP
value: "{{ .Values.zlm.ports.rtsp }}"
- name: LIVE_ZLM_PORT_SRT
value: "{{ .Values.zlm.ports.srt }}"
- name: LIVE_ZLM_API_PASSWD
value: "{{ .Values.zlm.apiPasswd }}"
- name: OSS_ENDPOINT
value: "{{ .Values.external.minio.endpoint }}"
- name: OSS_AK
value: "{{ .Values.external.minio.accessKey }}"
- name: OSS_SK
value: "{{ .Values.external.minio.secretKey }}"
- name: RABBITMQ_HOST
value: "{{ .Values.external.rabbitmq.host }}"
- name: RABBITMQ_USERNAME
value: "{{ .Values.external.rabbitmq.username }}"
- name: RABBITMQ_PASSWORD
value: "{{ .Values.external.rabbitmq.password }}"
- name: RABBITMQ_PORT
value: "{{ .Values.external.rabbitmq.port }}"
volumeMounts:
- name: config
mountPath: /cmii/application.yaml
subPath: application.yaml
resources:
{{- toYaml .Values.liveOp.resources | nindent 12 }}
volumes:
- name: config
configMap:
name: {{ .Release.Name }}-live-op-config
imagePullSecrets:
- name: {{ .Values.images.secretName }}
---
apiVersion: v1
kind: Service
metadata:
namespace: {{ .Release.Namespace }}
name: {{ .Release.Name }}-live-op
labels:
app: live-op
chart: {{ .Chart.Name }}-{{ .Chart.Version }}
release: {{ .Release.Name }}
spec:
type: NodePort
ports:
- name: http
port: {{ .Values.liveOp.port }}
targetPort: http
nodePort: {{ .Values.network.liveOpNodePort }}
protocol: TCP
selector:
app: live-op
release: {{ .Release.Name }}

View File

@@ -0,0 +1,102 @@
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-live-proxy-config
labels:
app: live-proxy
chart: {{ .Chart.Name }}-{{ .Chart.Version }}
release: {{ .Release.Name }}
data:
application.yaml: |
server:
port: {{ .Values.liveProxy.port }}
live:
proxy:
ffmpeg:
ffmpeg-path: /usr/bin/ffmpeg
ffprobe-path: /usr/bin/ffprobe
ffplay-path: /usr/bin/ffplay
check-win-pid: tasklist /FI "PID eq %s " /FO LIST
check-unix-pid: ps -p %s
os-name: windows
upload:
path: /proxy/uploads
src-all-size: 4294967296
dest-all-size: 4294967296
ws:
url: "{{ .Values.mediaSuite.nodeIP }}:{{ .Values.network.liveProxyNodePort }}"
minio:
endpoint: {{ .Values.external.minio.endpoint }}
access-key: {{ .Values.external.minio.accessKey }}
secret-key: {{ .Values.external.minio.secretKey }}
bucket-name: ilm-detect
spring:
platform:
info:
name: cmii-live-proxy
description: ffmpeg服务小工具
version: 1.0.3
scanPackage: com.cmii.live.proxy.web.controller
profiles:
active: local
jackson:
time-zone: GMT+8
mvc:
pathmatch:
matching-strategy: ANT_PATH_MATCHER
thymeleaf:
check-template-location: false
cache: false
servlet:
multipart:
max-file-size: 1024MB
max-request-size: 1024MB
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
druid:
url: jdbc:mysql://{{ .Values.external.database.host }}:{{ .Values.external.database.port }}/{{ .Values.databases.proxy }}?characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true
username: {{ .Values.external.database.username }}
password: {{ .Values.external.database.password }}
initial-size: 5
min-idle: 5
max-active: 20
max-wait: 60000
time-between-eviction-runs-millis: 60000
min-evictable-idle-time-millis: 300000
max-evictable-idle-time-millis: 600000
validation-query: SELECT 1
test-while-idle: true
test-on-borrow: false
test-on-return: false
filters: stat,wall,slf4j
connection-properties: connectTimeout=10000;socketTimeout=30000
redis:
host: {{ .Values.external.redis.host }}
port: {{ .Values.external.redis.port }}
password: {{ .Values.external.redis.password }}
database: {{ .Values.redis.proxyDb }}
timeout: 10s
lettuce:
pool:
min-idle: 0
max-idle: 10
max-active: 10
max-wait: -1ms
springdoc:
api-docs:
enabled: true
swagger-ui:
enabled: true
mybatis-plus:
global-config:
banner: false
logging:
config: classpath:logback-proxy.xml
level:
com.cmii.live.proxy.web.mapper: info

View File

@@ -0,0 +1,81 @@
apiVersion: apps/v1
kind: Deployment
metadata:
namespace: {{ .Release.Namespace }}
name: {{ .Release.Name }}-live-proxy
labels:
app: live-proxy
chart: {{ .Chart.Name }}-{{ .Chart.Version }}
release: {{ .Release.Name }}
spec:
replicas: {{ .Values.liveProxy.replicaCount }}
selector:
matchLabels:
app: live-proxy
release: {{ .Release.Name }}
template:
metadata:
labels:
app: live-proxy
release: {{ .Release.Name }}
spec:
containers:
- name: live-proxy
image: "{{ .Values.images.liveProxy.repository }}:{{ .Values.images.liveProxy.tag }}"
imagePullPolicy: {{ .Values.images.liveProxy.pullPolicy }}
ports:
- name: http
containerPort: {{ .Values.liveProxy.port }}
protocol: TCP
env:
- name: LIVE_IP_PRIVATE
value: "{{ .Values.mediaSuite.nodeIP }}"
- name: LIVE_ZLM_PORT_HTTP
value: "{{ .Values.zlm.ports.http }}"
- name: LIVE_ZLM_PORT_HTTPS
value: "{{ .Values.zlm.ports.https }}"
- name: LIVE_ZLM_PORT_RTMP
value: "{{ .Values.zlm.ports.rtmp }}"
- name: LIVE_ZLM_PORT_RTSP
value: "{{ .Values.zlm.ports.rtsp }}"
- name: LIVE_OP_PORT_HTTP
value: "{{ .Values.network.liveOpNodePort }}"
volumeMounts:
- name: config
mountPath: /proxy/application.yaml
subPath: application.yaml
- name: shared-data
mountPath: /cmii/uploads
subPath: uploads
resources:
{{- toYaml .Values.liveProxy.resources | nindent 12 }}
volumes:
- name: config
configMap:
name: {{ .Release.Name }}-live-proxy-config
- name: shared-data
persistentVolumeClaim:
claimName: {{ .Release.Name }}-shared-data-pvc
imagePullSecrets:
- name: {{ .Values.images.secretName }}
---
apiVersion: v1
kind: Service
metadata:
namespace: {{ .Release.Namespace }}
name: {{ .Release.Name }}-live-proxy
labels:
app: live-proxy
chart: {{ .Chart.Name }}-{{ .Chart.Version }}
release: {{ .Release.Name }}
spec:
type: NodePort
ports:
- name: http
port: {{ .Values.liveProxy.port }}
targetPort: http
nodePort: {{ .Values.network.liveProxyNodePort }}
protocol: TCP
selector:
app: live-proxy
release: {{ .Release.Name }}

View File

@@ -0,0 +1,156 @@
apiVersion: apps/v1
kind: Deployment
metadata:
namespace: {{ .Release.Namespace }}
name: {{ .Release.Name }}-media-suite
labels:
app: media-suite
chart: {{ .Chart.Name }}-{{ .Chart.Version }}
release: {{ .Release.Name }}
spec:
replicas: {{ .Values.mediaSuite.replicaCount }}
selector:
matchLabels:
app: media-suite
release: {{ .Release.Name }}
template:
metadata:
labels:
app: media-suite
release: {{ .Release.Name }}
spec:
hostNetwork: true
dnsPolicy: ClusterFirstWithHostNet
# 配置到固定node上
nodeSelector:
{{- range $key, $value := .Values.mediaSuite.nodeSelector }}
{{ $key }}: {{ $value | quote }}
{{- end }}
containers:
# WVP Container
- name: wvp
image: "{{ .Values.images.wvp.repository }}:{{ .Values.images.wvp.tag }}"
imagePullPolicy: {{ .Values.images.wvp.pullPolicy }}
ports:
- name: wvp-http
containerPort: {{ .Values.wvp.ports.http }}
hostPort: {{ .Values.wvp.ports.http }}
protocol: TCP
- name: wvp-sip
containerPort: {{ .Values.wvp.ports.sip }}
hostPort: {{ .Values.wvp.ports.sip }}
protocol: UDP
env:
- name: TZ
value: "Asia/Shanghai"
- name: NODE_IP
valueFrom:
fieldRef:
fieldPath: status.hostIP
- name: POD_IP
valueFrom:
fieldRef:
fieldPath: status.hostIP
volumeMounts:
- name: wvp-config
mountPath: /home/koisi/wvp.yaml
subPath: application.yaml
resources:
{{- toYaml .Values.wvp.resources | nindent 12 }}
# ZLM Container
- name: zlm
image: "{{ .Values.images.zlm.repository }}:{{ .Values.images.zlm.tag }}"
imagePullPolicy: {{ .Values.images.zlm.pullPolicy }}
ports:
- name: zlm-http
containerPort: {{ .Values.zlm.ports.http }}
hostPort: {{ .Values.zlm.ports.http }}
protocol: TCP
- name: zlm-https
containerPort: {{ .Values.zlm.ports.https }}
hostPort: {{ .Values.zlm.ports.https }}
protocol: TCP
- name: zlm-rtmp
containerPort: {{ .Values.zlm.ports.rtmp }}
hostPort: {{ .Values.zlm.ports.rtmp }}
protocol: TCP
- name: zlm-rtsp
containerPort: {{ .Values.zlm.ports.rtsp }}
hostPort: {{ .Values.zlm.ports.rtsp }}
protocol: TCP
- name: zlm-webrtc-tcp
containerPort: {{ .Values.zlm.ports.webrtc }}
hostPort: {{ .Values.zlm.ports.webrtc }}
protocol: TCP
- name: zlm-webrtc-udp
containerPort: {{ .Values.zlm.ports.webrtc }}
hostPort: {{ .Values.zlm.ports.webrtc }}
protocol: UDP
- name: zlm-srt
containerPort: {{ .Values.zlm.ports.srt }}
hostPort: {{ .Values.zlm.ports.srt }}
protocol: TCP
- name: zlm-rtp-proxy
containerPort: {{ .Values.zlm.ports.rtpProxy }}
hostPort: {{ .Values.zlm.ports.rtpProxy }}
protocol: UDP
{{- range $i := untilStep (int .Values.zlm.ports.rtpMin) (int (add1 .Values.zlm.ports.rtpMax)) 1 }}
- name: zlm-rtp-{{ $i }}
containerPort: {{ $i }}
hostPort: {{ $i }}
protocol: UDP
{{- end }}
env:
- name: TZ
value: "Asia/Shanghai"
- name: NODE_IP
valueFrom:
fieldRef:
fieldPath: status.hostIP
- name: POD_IP
valueFrom:
fieldRef:
fieldPath: status.hostIP
volumeMounts:
- name: zlm-config
mountPath: /home/koisi/zlm.ini
subPath: zlm.ini
- name: shared-data
mountPath: /home/koisi/zlm/www/zlm/hls
subPath: hls
resources:
{{- toYaml .Values.zlm.resources | nindent 12 }}
# ZLM-OSS Container
- name: zlm-oss
image: "{{ .Values.images.zlmOss.repository }}:{{ .Values.images.zlmOss.tag }}"
imagePullPolicy: {{ .Values.images.zlmOss.pullPolicy }}
ports:
- name: zlm-oss-http
containerPort: {{ .Values.zlmOss.port }}
hostPort: {{ .Values.zlmOss.port }}
protocol: TCP
volumeMounts:
- name: zlm-oss-config
mountPath: /cmii/oss-adaptor/boot/config.yaml
subPath: config.yaml
- name: shared-data
mountPath: /cmii/share/hls
subPath: hls
resources:
{{- toYaml .Values.zlmOss.resources | nindent 12 }}
volumes:
- name: wvp-config
configMap:
name: {{ .Release.Name }}-wvp-config
- name: zlm-config
configMap:
name: {{ .Release.Name }}-zlm-config
- name: zlm-oss-config
configMap:
name: {{ .Release.Name }}-zlm-oss-config
- name: shared-data
persistentVolumeClaim:
claimName: {{ .Release.Name }}-shared-data-pvc
imagePullSecrets:
- name: {{ .Values.images.secretName }}

View File

@@ -0,0 +1,19 @@
# 单个共享 PVC通过 subPath 区分不同服务的数据
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
namespace: {{ .Release.Namespace }}
name: {{ .Release.Name }}-shared-data-pvc
labels:
app: media-suite
chart: {{ .Chart.Name }}-{{ .Chart.Version }}
release: {{ .Release.Name }}
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 10Gi
{{- if .Values.persistence.shared.storageClass }}
storageClassName: {{ .Values.persistence.shared.storageClass }}
{{- end }}

View File

@@ -0,0 +1,96 @@
apiVersion: v1
kind: ConfigMap
metadata:
namespace: {{ .Release.Namespace }}
name: {{ .Release.Name }}-wvp-config
labels:
app: wvp
chart: {{ .Chart.Name }}-{{ .Chart.Version }}
release: {{ .Release.Name }}
data:
application.yaml: |
spring:
cache:
type: redis
thymeleaf:
cache: false
mvc:
async:
request-timeout: 20000
servlet:
multipart:
max-file-size: 10MB
max-request-size: 100MB
data:
redis:
host: {{ .Values.external.redis.host }}
port: {{ .Values.external.redis.port }}
database: {{ .Values.redis.wvpDb }}
password: {{ .Values.external.redis.password }}
timeout: 10000
datasource:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://{{ .Values.external.database.host }}:{{ .Values.external.database.port }}/{{ .Values.databases.wvp }}?useUnicode=true&characterEncoding=UTF8&rewriteBatchedStatements=true&serverTimezone=PRC&useSSL=false&allowMultiQueries=true&allowPublicKeyRetrieval=true
username: {{ .Values.external.database.username }}
password: {{ .Values.external.database.password }}
server:
port: {{ .Values.wvp.ports.http }}
ssl:
enabled: false
sip:
ip: ${NODE_IP}
show-ip: ${NODE_IP}
port: {{ .Values.wvp.ports.sip }}
domain: {{ .Values.wvp.sip.domain }}
id: "{{ .Values.wvp.sip.id }}"
password: {{ .Values.zlm.apiPasswd }}
register-time-interval: 60
ptz-speed: 50
keepalliveToOnline: true
alarm: true
timeout: 1000
media:
id: {{ .Values.zlm.nodeId }}
ip: 127.0.0.1
http-port: {{ .Values.zlm.ports.http }}
http-ssl-port: 0
flv-port: {{ .Values.zlm.ports.http }}
flv-ssl-port: {{ .Values.zlm.ports.https }}
ws-flv-port: {{ .Values.zlm.ports.http }}
ws-flv-ssl-port: {{ .Values.zlm.ports.https }}
rtp-proxy-port: {{ .Values.zlm.ports.http }}
rtmp-port: {{ .Values.zlm.ports.https }}
rtmp-ssl-port: 0
rtsp-port: {{ .Values.zlm.ports.rtsp }}
rtsp-ssl-port: 0
auto-config: false
secret: {{ .Values.zlm.apiPasswd }}
rtp:
enable: true
port-range: {{ .Values.zlm.ports.rtpMin }},{{ .Values.zlm.ports.rtpMax }}
send-port-range: 30800,30990
record-path: /opt/media/bin/www/record/
record-day: 7
record-assist-port: 0
user-settings:
auto-apply-play: true
play-timeout: 30000
wait-track: false
record-push-live: false
record-sip: true
stream-on-demand: true
interface-authentication: true
broadcast-for-platform: TCP-PASSIVE
push-stream-after-ack: true
send-to-platforms-when-id-lost: true
interface-authentication-excludes:
- /api/**
push-authority: true
logging:
config: classpath:logback-spring.xml

View File

@@ -0,0 +1,211 @@
apiVersion: v1
kind: ConfigMap
metadata:
namespace: {{ .Release.Namespace }}
name: {{ .Release.Name }}-zlm-config
labels:
app: zlm
chart: {{ .Chart.Name }}-{{ .Chart.Version }}
release: {{ .Release.Name }}
data:
zlm.ini: |
[api]
apiDebug = 0
secret = {{ .Values.zlm.apiPasswd }}
snapRoot = ./www/snap/
defaultSnap = ./www/logo.png
downloadRoot = ./www
[ffmpeg]
bin = /usr/bin/ffmpeg
cmd = %s -re -i %s -c:a aac -strict -2 -ar 44100 -ab 48k -c:v libx264 -f flv %s
log = ./ffmpeg/ffmpeg.log
restart_sec = 0
snap = %s -rtsp_transport tcp -i %s -y -f mjpeg -frames:v 1 %s
[protocol]
modify_stamp = 2
enable_audio = 1
add_mute_audio = 0
auto_close = 0
continue_push_ms = 3000
paced_sender_ms = 0
enable_hls = 1
enable_hls_fmp4 = 0
enable_rtmp = 1
enable_ts = 1
enable_fmp4 = 1
enable_rtsp = 1
enable_mp4 = 0
mp4_as_player = 0
mp4_max_second = 3600
mp4_save_path = ./www
hls_save_path = ./www/zlm/hls
hls_demand = 0
rtsp_demand = 0
rtmp_demand = 0
ts_demand = 0
fmp4_demand = 0
[general]
enableVhost = 0
flowThreshold = 1024
enable_ffmpeg_log = 0
listen_ip = ::
maxStreamWaitMS = 0
streamNoneReaderDelayMS = 120000
resetWhenRePlay = 1
mergeWriteMS = 0
mediaServerId = {{ .Values.zlm.nodeId }}
wait_audio_track_data_ms = 1000
wait_track_ready_ms = 8000
wait_add_track_ms = 2000
unready_frame_cache = 96
check_nvidia_dev = 1
broadcast_player_count_changed = 0
[hls]
fileBufSize = 65536
segDur = 10
segNum = 3
segDelay = 0
segRetain = 5
broadcastRecordTs = 1
deleteDelaySec = 10
segKeep = 0
fastRegister = 0
[hook]
enable = 1
on_flow_report =
on_http_access =
# ZLM → Live Operator
on_play = http://{{ .Release.Name }}-live-op:{{ .Values.liveOp.port }}/hooks/on_play
on_publish = http://{{ .Release.Name }}-live-op:{{ .Values.liveOp.port }}/hooks/on_push
on_stream_changed = http://{{ .Release.Name }}-live-op:{{ .Values.liveOp.port }}/hooks/on_stream_changed
# ZLM → WVP
on_stream_none_reader = http://127.0.0.1:{{ .Values.wvp.ports.http }}/index/hook/on_stream_none_reader
on_stream_not_found = http://127.0.0.1:{{ .Values.wvp.ports.http }}/index/hook/on_stream_not_found
on_rtp_server_timeout = http://127.0.0.1:{{ .Values.wvp.ports.http }}/index/hook/on_rtp_server_timeout
on_send_rtp_stopped = http://127.0.0.1:{{ .Values.wvp.ports.http }}/index/hook/on_send_rtp_stopped
on_server_started = http://127.0.0.1:{{ .Values.wvp.ports.http }}/index/hook/on_server_started
on_server_keepalive = http://127.0.0.1:{{ .Values.wvp.ports.http }}/index/hook/on_server_keepalive
on_record_mp4 = http://127.0.0.1:{{ .Values.wvp.ports.http }}/index/hook/on_record_mp4
on_server_exited =
on_rtsp_auth =
on_rtsp_realm =
on_shell_login =
# ZLM → ZLM OSS
on_record_ts = http://127.0.0.1:{{ .Values.zlmOss.port }}/hooks/on_record_ts
stream_changed_schemas = rtsp/rtmp/fmp4/ts/hls/hls.fmp4
timeoutSec = 30
alive_interval = 10.0
retry = 1
retry_delay = 3.0
[cluster]
origin_url =
timeout_sec = 15
retry_count = 3
[http]
port = {{ .Values.zlm.ports.http }}
sslport = {{ .Values.zlm.ports.https }}
charSet = utf-8
keepAliveSecond = 30
maxReqSize = 40960
notFound = <html><head><title>404 Not Found</title></head><body><div>404 Not Found</div></body></html>
rootPath = ./www
sendBufSize = 65536
dirMenu = 1
virtualPath =
forbidCacheSuffix =
allow_cross_domains = 1
allow_ip_range = ::1,127.0.0.1,172.1.0.0-172.31.255.255,192.168.0.0-192.168.255.255,10.0.0.0-10.255.255.255
[multicast]
addrMax = 239.255.255.255
addrMin = 239.0.0.0
udpTTL = 64
[record]
appName = record
fileBufSize = 65536
sampleMS = 500
fastStart = 0
fileRepeat = 0
enableFmp4 = 0
[rtmp]
port = {{ .Values.zlm.ports.rtmp }}
sslport = 0
handshakeSecond = 15
keepAliveSecond = 15
directProxy = 1
enhanced = 0
[rtp]
audioMtuSize = 600
videoMtuSize = 1400
rtpMaxSize = 10
lowLatency = 0
h264_stap_a = 1
[rtp_proxy]
port = {{ .Values.zlm.ports.rtpProxy }}
port_range = {{ .Values.zlm.ports.rtpMin }}-{{ .Values.zlm.ports.rtpMax }}
dumpDir =
timeoutSec = 5
h264_pt = 98
h265_pt = 99
ps_pt = 96
opus_pt = 100
gop_cache = 1
rtp_g711_dur_ms = 100
udp_recv_socket_buffer = 4194304
[rtc]
bfilter=0
datachannel_echo=0
maxRtpCacheMS=5000
maxRtpCacheSize=2048
externIP = $(NODE_IP)
port = {{ .Values.zlm.ports.webrtc }}
tcpPort = {{ .Values.zlm.ports.webrtc }}
timeoutSec = 30
rembBitRate = 0
preferredCodecA = PCMA,PCMU,opus,mpeg4-generic
preferredCodecV = H264,H265,AV1,VP9,VP8
start_bitrate = 0
max_bitrate = 0
min_bitrate = 0
maxNackMS = 4000
rtpCacheCheckInterval = 96
nackMaxSize = 2048
nackMaxMS = 3000
nackMaxCount = 15
nackIntervalRatio = 1.0
nackRtpSize = 8
[srt]
port = {{ .Values.zlm.ports.srt }}
timeoutSec = 5
latencyMul = 4
pktBufSize = 8192
passPhrase=
[rtsp]
port = {{ .Values.zlm.ports.rtsp }}
sslport = 0
authBasic = 0
directProxy = 1
handshakeSecond = 15
keepAliveSecond = 15
lowLatency = 1
rtpTransportType = -1
[shell]
maxReqSize = 1024
port = 0

View File

@@ -0,0 +1,83 @@
apiVersion: v1
kind: ConfigMap
metadata:
namespace: {{ .Release.Namespace }}
name: {{ .Release.Name }}-zlm-oss-config
labels:
app: media-suite
chart: {{ .Chart.Name }}-{{ .Chart.Version }}
release: {{ .Release.Name }}
data:
config.yaml: |
app:
env: default
listen:
host: 0.0.0.0
port: {{ .Values.zlmOss.port }}
workers: 4
thread_pool: 8
log:
level: INFO
onfile_logger_interval: 10
backup_on_fails: true
skip_on_initializing_seconds: 4
skip_hubs: "Hangar, ai-5g-a"
file_dir:
shared: "/cmii/share/hls"
backup: "/cmii/backup"
debug:
save_all: false
save_to: "UASMS"
max_duration: 120
minio:
endpoint: "{{ .Values.external.minio.endpoint }}"
access_key: "{{ .Values.external.minio.accessKey }}"
secret_key: "{{ .Values.external.minio.secretKey }}"
mysql:
host: {{ .Values.external.database.host }}
port: {{ .Values.external.database.port }}
username: {{ .Values.external.database.username }}
password: {{ .Values.external.database.password }}
redis:
host: {{ .Values.external.redis.host }}
port: {{ .Values.external.redis.port }}
database: {{ .Values.redis.zlmOssDb }}
password: {{ .Values.external.redis.password }}
rabbitmq:
host: {{ .Values.external.rabbitmq.host }}
port: {{ .Values.external.rabbitmq.port }}
username: {{ .Values.external.rabbitmq.username }}
password: {{ .Values.external.rabbitmq.password }}
platforms:
live_op:
db_schema: "{{ .Values.databases.liveOp }}"
old_cmlc:
cloud_live: "{{ .Values.external.cloudLive }}"
quota: false
oss_bucket: "ilm-detect"
meta:
src_id: "1323096648758464518"
user_id: 0
company_id: 0
uasms:
scope_prefix: "UASMS"
oss_bucket: "ilm-detect"
meta:
src_id: "1323096648758464523"
platform: "REGULATOR"
user_id: 0
lite:
scope_prefix: "LITE"
oss_bucket: "ilm-detect"
routing_key: "sky.live.video"
meta:
src_id: "1111111112222222222"
platform: "LITE"
user_id: 0

View File

@@ -0,0 +1,185 @@
# 镜像配置
images:
secretName: harborsecret
# Harbor Docker Config JSON (Base64 编码)
# cat ~/.docker/config.json | base64 -w 0
dockerConfigJson: "ewoJImF1dGhzIjogewoJCSJoYXJib3IuY2RjeXkuY29tLmNuIjogewoJCQkiYXV0aCI6ICJjbUZrTURKZlpISnZibVU2UkhKdmJtVkFNVEl6TkE9PSIKCQl9Cgl9Cn0="
zlm:
repository: 镜像仓库/cmii/zlm
tag: v2.7.5
pullPolicy: IfNotPresent
wvp:
repository: 镜像仓库/cmii/wvp
tag: v2.7.4
pullPolicy: IfNotPresent
liveOp:
repository: 镜像仓库/cmii/cmii-live-operator
tag: v5.8.0
pullPolicy: Always
zlmOss:
repository: 镜像仓库/cmii/zlm-oss-adaptor
tag: v2.7.5
pullPolicy: IfNotPresent
liveHelper:
repository: 镜像仓库/cmii/cmii-hls-downloader
tag: v2.7.4
pullPolicy: IfNotPresent
liveProxy:
repository: 镜像仓库/cmii/cmii-live-proxy
tag: v1.0.3
pullPolicy: IfNotPresent
# 网络配置
network:
# HostNetwork 使用容器端口 (zlm | zlm-oss | wvp)
# NodePort (live-op|live-proxy|live-helper) default nodePort port
liveOpNodePort: 37086
liveProxyNodePort: 37081
liveHelperNodePort: 37080
# Media Suite 配置 (WVP + ZLM + ZLM-OSS 合并部署)
mediaSuite:
replicaCount: 1
# 固定部署的节点 IP用于 HostNetwork 模式)
# 其他服务通过此 IP 访问 Media Suite
nodeIP: "固定主机内网IP"
# 设置固定节点IP的标签 亲和性
nodeSelector:
kubernetes.io/hostname: "固定主机hostname"
# ZLM 配置
zlm:
apiPasswd: "035c7GB5cc"
nodeId: "koisi_gb_228"
ports:
http: 7088
https: 7089
rtmp: 7935
rtsp: 7554
webrtc: 7090
srt: 7556
rtpProxy: 7100
rtpMin: 7200
rtpMax: 7250
resources:
limits:
cpu: "2"
memory: "4Gi"
requests:
cpu: "2"
memory: "2Gi"
# WVP 配置
wvp:
ports:
http: 7082
sip: 7060
sip:
domain: "5101000049"
id: "51010000492000000228"
resources:
limits:
cpu: "2"
memory: "4Gi"
requests:
cpu: "1"
memory: "2Gi"
# Live Operator 配置
liveOp:
port: 7086
replicaCount: 1
resources:
limits:
cpu: "2"
memory: "2Gi"
requests:
cpu: "1"
memory: "1Gi"
# ZLM OSS 配置
zlmOss:
port: 7084
resources:
limits:
cpu: "2"
memory: "2Gi"
requests:
cpu: "1"
memory: "1Gi"
# Live Helper 配置
liveHelper:
port: 7080
allowDownload: "all"
replicaCount: 1
resources:
limits:
cpu: "1"
memory: "1Gi"
requests:
cpu: "500m"
memory: "512Mi"
# Live Proxy 配置
liveProxy:
port: 7081
replicaCount: 1
resources:
limits:
cpu: "1"
memory: "2Gi"
requests:
cpu: "1"
memory: "1Gi"
# mysql | redis | minio | rabbitmq | cloudLive 配置
external:
database:
host: "helm-mysql"
port: "3306"
username: "k8s_admin"
password: "fP#UaH6qQ3)8"
redis:
host: "helm-redis-master"
port: "6379"
password: "Mcache@4522"
minio:
endpoint: "http://helm-minio:9000"
accessKey: "cmii"
secretKey: "B#923fC7mk"
rabbitmq:
host: "helm-rabbitmq"
port: "5672"
username: "admin"
password: "nYcRN91r._hj"
cloudLive: "cmii-uav-cloud-live"
# 数据库名称
databases:
liveOp: cmii_live_operator
wvp: wvp
proxy: cmii_live_proxy
# Redis DB 索引
redis:
liveOpDb: 1
zlmOssDb: 1
wvpDb: 2
proxyDb: 3
# 持久化存储配置
persistence:
shared:
# 单个共享 PVC固定 10Gi
storageClass: "nfs-prod-distribute"

View File

@@ -0,0 +1,230 @@
# CMII Live Services - Merged 部署文档
## 概述
- **Media Suite**: WVP + ZLM + ZLM-OSS 三个容器合并部署在一个 Pod 中
- **网络模式**: HostNetwork (直接使用宿主机网络)
- **共享存储**: ZLM 和 ZLM-OSS 共享 HLS 数据卷
- **其他服务**: Live Operator、Live Proxy、Live Helper 独立部署 使用 NodePort 暴露
## 目录结构
```
merge/
├── Chart.yaml # Helm Chart 元数据
├── values.yaml # 配置文件
├── deploy.sh # 一键部署脚本
└── templates/
├── media-suite-deployment.yaml # Media Suite (WVP+ZLM+ZLM-OSS)
├── live-op-deployment.yaml # Live Operator
├── live-proxy-deployment.yaml # Live Proxy
├── live-helper-deployment.yaml # Live Helper
├── wvp-configmap.yaml # WVP 配置
├── zlm-configmap.yaml # ZLM 配置
├── zlm-oss-configmap.yaml # ZLM-OSS 配置
├── live-op-configmap.yaml # Live Operator 配置
├── live-proxy-configmap.yaml # Live Proxy 配置
├── live-helper-configmap.yaml # Live Helper 配置
├── pvc.yaml # 持久化存储
├── harborsecret.yaml # 镜像拉取密钥
└── NOTES.txt # 部署提示
```
## 当前服务前置
- Kubernetes 集群 (1.30.14)
- Helm (3.20.2)
- kubectl
- NFS StorageClass (用于 HLS 数据共享存储)
- 外部服务: MySQL、Redis、MinIO、RabbitMQ
## 快速开始
### 1. 修改配置
编辑 `values.yaml` 文件,根据实际情况修改:
```yaml
# 镜像配置
images:
zlm:
repository: your-registry/zlm
tag: v2.7.5
wvp:
repository: your-registry/wvp
tag: v2.7.4
# ... 其他镜像配置
# 外部依赖配置
external:
database:
host: "your-mysql-host"
port: "3306"
username: "root"
password: "your-password"
redis:
host: "your-redis-host"
port: "6379"
password: "your-password"
minio:
endpoint: "http://your-minio-host:9000"
accessKey: "your-access-key"
secretKey: "your-secret-key"
rabbitmq:
host: "your-rabbitmq-host"
port: "5672"
username: "admin"
password: "your-password"
# 持久化存储
persistence:
zlm:
hls:
storageClass: "your-nfs-storage-class"
```
### 2. 配置 Harbor 镜像密钥 (可选)
如果使用私有镜像仓库,需要配置镜像拉取密钥:
```bash
# 生成 Docker Config JSON 的 Base64 编码
cat ~/.docker/config.json | base64 -w 0
# 将输出粘贴到 values.yaml 中
images:
dockerConfigJson: "eyJhdXRocyI6..."
```
### 3. 执行部署
```bash
# 赋予执行权限
chmod +x deploy.sh
# 执行部署
./deploy.sh
```
部署脚本会自动:
- 检查前置条件
- 验证配置文件
- 创建命名空间
- 安装/升级 Helm Release
- 等待 Pod 就绪
- 显示服务状态和访问地址
### 4. 验证部署
```bash
# 查看 Pod 状态
kubectl get pods -n uavcloud-live-test
# 查看服务状态
kubectl get svc -n uavcloud-live-test
# 查看 Media Suite 日志
kubectl logs -f deployment/helm-live-media-suite -n uavcloud-live-test -c zlm
kubectl logs -f deployment/helm-live-media-suite -n uavcloud-live-test -c wvp
kubectl logs -f deployment/helm-live-media-suite -n uavcloud-live-test -c zlm-oss
```
```text
下面的内容为运维内容,按需查看即可 =================================================================================
```
## 服务访问
### Media Suite (HostNetwork 模式)
使用宿主机 IP 直接访问:
| 服务 | 协议 | 端口 | 示例 |
|------------|--------|------|-------------------------|
| WVP HTTP | HTTP | 7082 | http://<NODE_IP>:7082 |
| WVP SIP | UDP | 7060 | <NODE_IP>:7060 |
| ZLM HTTP | HTTP | 7088 | http://<NODE_IP>:7088 |
| ZLM HTTPS | HTTPS | 7089 | https://<NODE_IP>:7089 |
| ZLM RTMP | RTMP | 7935 | rtmp://<NODE_IP>:7935 |
| ZLM RTSP | RTSP | 7554 | rtsp://<NODE_IP>:7554 |
| ZLM WebRTC | WebRTC | 7090 | webrtc://<NODE_IP>:7090 |
| ZLM SRT | SRT | 7556 | srt://<NODE_IP>:7556 |
| ZLM-OSS | HTTP | 7084 | http://<NODE_IP>:7084 |
### 其他服务 (NodePort 模式)
| 服务 | 端口 | 示例 |
|---------------|-------|------------------------|
| Live Operator | 37086 | http://<NODE_IP>:37086 |
| Live Proxy | 37081 | http://<NODE_IP>:37081 |
| Live Helper | 37080 | http://<NODE_IP>:37080 |
### 容器间通信
由于使用 HostNetwork 和同 Pod 部署,容器间通过 `127.0.0.1` 通信:
- WVP → ZLM: `http://127.0.0.1:7088`
- ZLM → WVP Hooks: `http://127.0.0.1:7082`
- ZLM → ZLM-OSS Hooks: `http://127.0.0.1:7084`
### 共享存储
ZLM 和 ZLM-OSS 挂载同一个 PVC:
- ZLM: `/home/koisi/zlm/www/zlm/hls`
- ZLM-OSS: `/cmii/share/hls`
## 运维操作
### 查看日志
```bash
# Media Suite - WVP
kubectl logs -f deployment/helm-live-media-suite -n uavcloud-live-test -c wvp
# Media Suite - ZLM
kubectl logs -f deployment/helm-live-media-suite -n uavcloud-live-test -c zlm
# Media Suite - ZLM-OSS
kubectl logs -f deployment/helm-live-media-suite -n uavcloud-live-test -c zlm-oss
# Live Operator
kubectl logs -f deployment/helm-live-live-op -n uavcloud-live-test
```
### 进入容器
```bash
# 进入 ZLM 容器
kubectl exec -it deployment/helm-live-media-suite -n uavcloud-live-test -c zlm -- bash
# 进入 WVP 容器
kubectl exec -it deployment/helm-live-media-suite -n uavcloud-live-test -c wvp -- bash
```
### 升级服务
```bash
# 修改 values.yaml 后执行升级
helm upgrade helm-live ./merge -n uavcloud-live-test -f values.yaml
# 或使用部署脚本
bash deploy.sh
```
### 回滚
```bash
# 查看历史版本
helm history helm-live -n uavcloud-live-test
# 回滚到指定版本
helm rollback helm-live <REVISION> -n uavcloud-live-test
```
### 卸载
```bash
helm uninstall helm-live -n uavcloud-live-test
```