human: 如何处理七牛云的低代码服务端接入指南（develop分支 支持docker部署）

gpt: [低代码](https://developer.qiniu.com/lowcode) > 使用文档 >
[互动直播](https://developer.qiniu.com/lowcode/manual/12004/qlive) >
[互动直播服务端接入指南](https://developer.qiniu.com/lowcode/manual/12005/qlive-server-
guide) > 服务端接入指南（develop分支 支持docker部署）

#  服务端接入指南（develop分支 支持docker部署）

最近更新时间: 2023-03-28 17:23:08

# 1\. 项目编译运行

## 1.1 项目编译

  * 本项目使用go 1.16 编译

    
    
    1. clone 项目
    git clone https://github.com/pili-engineering/QNLiveKit_Server 
    2. 编译
    cd QNLiveKit_Server/app/live
    go build
    

  * 在当前目录下，生成可执行文件 live

## 1.2 项目运行

  * 项目的运行，需要提供一个配置文件 config.yaml。配置文件的说明，见后面。

    
    
    ./live -f config.yaml 2>&1 > live.log &
    

## 1.3 使用docker-compose部署

  * 安装 docker、docker-compose
  * 新建 .env 文件 ，内容示例如下

    
    
    PORT_LIVE=8099
    PORT_PROMETHEUS=29090
    PORT_GRAFANA=23000
    QINIU_ACCESS_KEY = {{ ak }}
    QINIU_SECRET_KEY = {{ sk }}
    IM_ADMIN_TOKEN = {{ im_admin_token }}
    PILI_PUB_KEY = {{ publish_key }}
    

字段名 | 说明 |   
---|---|---  
PORT_LIVE | qnlivekit_server-qnliv中， “${PORT_LIVE}:8099” 将容器的8099端口映射到宿主机PORT_LIVE端口 |   
PORT_PROMETHEUS | prometheus “${PORT_PROMETHEUS}:9090” 将容器的9090端口映射到宿主机PORT_PROMETHEUS端口 |   
PORT_GRAFANA | grafana “${PORT_GRAFANA}:3000” 将容器的3000端口映射到宿主机PORT_GRAFANA端口 |   
QINIU_ACCESS_KEY | ak/sk鉴权 {{ .qiniu_key_pair_access_key }} |   
QINIU_SECRET_KEY | ak/sk鉴权 {{ .qiniu_key_pair_secret_key }} |   
IM_ADMIN_TOKEN | IM服务 获取管理员token ，详情参考[IM服务接入指南 __](https://developer.qiniu.com/IM/8332/startim)与[IM服务端接入指南 __](https://developer.qiniu.com/IM/8102/im-service-integration-guide)|   
PILI_PUB_KEY | Pili服务直播推流鉴权，当采用限时鉴权，security_type为expiry时， 从【直播空间设置】获取publish_key ；当security_type为无鉴权（none）和 限时鉴权SK（expiry_sk），该位置留空 |   
  
  * 执行 `docker-compose --env-file live.env up`  
自动完成包括构建镜像，（重新）创建服务，启动服务，并关联服务相关容器的一系列操作。

  * 修改后可执行 ` docker-compose --env-file live.env up --build`。  
如果不希望容器被停止并重新创建，可以使用 `docker-compose up --no-
recreate`。这样将只会启动处于停止状态的容器，而忽略已经运行的服务。

  * `docker-compose down`停止和删除容器、网络、卷、镜像。

#2. 配置文件

  * 互动直播使用 yaml 格式的配置文件，文件内容如下所示：

    
    
    node:
      node_id: {{.node_id}}
    account:
      access_key: {{ .qiniu_key_pair_access_key }}
      secret_key: {{ .qiniu_key_pair_secret_key }}
    httpq:
      addr: ":8099"
    auth:
      jwt_key: jwtkey
      server:
        enable: true
        access_key: ak
        secret_key: sk
    cache:
      type: {{type}}
      addr: {{host:ip}}
    mysql:
      databases:
        - host: 127.0.0.1
          port: 3306
          username: {{ user }}
          password: {{ password }}
          max_idle_conns: 10
          max_open_conns: 100
          database: live
          conn_max_life_time: 5
          default: live
        - host: 127.0.0.1
          port: 3306
          username: {{ user }}
          password: {{ password }}
          max_idle_conns: 10
          max_open_conns: 100
          database: live
          conn_max_life_time: 5
          default: live
          read_only: true
    im:
      app_id: {{ im_app_id }}
      endpoint: {{ im_endpoint }}
      token: {{ im_admin_token }}
    rtc:
      app_id: {{ app_id }}
    pili:
      hub: {{ 直播hub }}
      room_token_expire_s: 3600
      playback_url: https://{{xxx}}-playback.com
      security_type: { { security_type } }
      publish_key: {{ publish_key }}
      publish_expire_s: 3600
      stream_pattern: qn_live_kit-%s
      publish_url:  rtmp://{{xxx}}-publish.com
      publish_domain: {{xxx}}-publish.com
      rtmp_play_url: rtmp://{{xxx}}-rtmp.com
      flv_play_url: https://{{xxx}}-hdl.com
      hls_play_url: https://{{xxx}}-hls.com
      media_url: https://{{xxx}}
    cron:
      single_task_node: 1
    prome:
      client_mode: pusher
      exporter_config:
        listen_addr: ":9200"
      pusher_config:
        url: "https://{{xxx}}"
        job: live
        instance: live_{{.node}}
        interval_s: 10
    callback:
      addr: https://niucube-api.qiniu.com/v1/live/callback
    censor:
      callback: https://{{xxx}}
      bucket: {{ censor_bucket }}
      addr: https://{{xxx}}
    gift:
      gift_addr: http://127.0.0.1:8099/manager/gift/test
    

## 配置文件详细介绍

  

### node配置

    
    
    node_id: {{ nodeId }}
    

字段名 | 类型 | 示例 | 说明  
---|---|---|---  
node_id | int | 1 | 互动直播支持分布式部署，每个节点指定一个nodeId。所有节点的nodeId 不能重复。  
nodeId 会用于内部的ID 生成。  
  
  

### 面向服务的鉴权配置 account：

    
    
    account:
      access_key: {{ .qiniu_key_pair_access_key }}
      secret_key: {{ .qiniu_key_pair_secret_key }}
    

字段名 | 示例 | 说明  
---|---|---  
access_key | {{ .qiniu_key_pair_access_key }} | 七牛对API请求鉴权，用户需要使用密钥（AccessKey/SecretKey）进行身份验证。此处填入AccessKey  
secret_key | {{ .qiniu_key_pair_secret_key }} | 此处填入SecretKey，第一次使用七牛API之前，您需要在七牛开发者平台的 [密钥管理 __](https://portal.qiniu.com/user/key)中取得密钥  
  
  

### 监听地址

    
    
    httpq:
      addr: ":8099"
    

字段名 | 类型 | 示例 | 说明  
---|---|---|---  
addr | string | 1 | 互动直播服务提供HTTP RESTful API 接口。service 配置服务的监听地址`{host:ip}`  
host：监听的IP  
port: 监听的端口  
  
  

### 互动直播服务端鉴权

    
    
    auth:
      jwt_key: jwtkey
      server:
        enable: true
        access_key: ak
        secret_key: sk
    

字段名 | 类型 | 示例 | 说明  
---|---|---|---  
jwt_key | string | jwt-key | 用于客户端鉴权token 的加解密  
server:  
enable | bool | true | enable：true，开启鉴权；false，关闭鉴权。如果互动直播服务，与需要调用互动直播服务接口的其他服务，在同一个安全局域网内，可以关闭服务端接口的鉴权。  
server:  
access_key | string | ak | 互动直播服务，提供面向服务端的接口，与面向客户端的接口。面向服务端的接口，使用 ak/sk 的鉴权方式。这里为ak  
server:  
secret_key | string | sk | secret key  
  
  

### Redis配置

    
    
    cache_config:
        type: node
        addr: {{ip:port}}
    

或者

    
    
    cache_config:
        type: cluster
        addrs:
        	- {{ip:port}}
        	- {{ip:port}}
    

字段名 | 类型 | 示例 | 说明  
---|---|---|---  
type | string | node/cluster | 低代码服务，使用redis 作为缓存。支持redis 单节点模式，与集群模式。  
node：单节点模式  
cluster：集群模式  
addr | string | addr: 127.0.0.1:6379 | 配置type为node时，必须配置单节点redis 的地址。  
addrs |  | 如上所示 | 配置type为cluster时，必须配置的redis集群地址列表。  
  
  

### Mysql配置

    
    
    mysql:
      databases:
        - host: 127.0.0.1
          port: 3306
          username: {{ user }}
          password: {{ password }}
          max_idle_conns: 10
          max_open_conns: 100
          database: live
          conn_max_life_time: 5
          default: live
        - host: 127.0.0.1
          port: 3306
          username: {{ user }}
          password: {{ password }}
          max_idle_conns: 10
          max_open_conns: 100
          database: live
          conn_max_life_time: 5       
          default: live
          read_only: true
    

  * 互动直播服务使用mysql 进行业务数据存储。
  * 支持配置多个数据库，使用读写分离模式。

字段名 | 说明  
---|---  
host/port | MySQL 实例的 IP 地址/主机名和可选端口。  
username | 数据库用户的登录名/用户名  
password | 数据库用户密码  
max_idle_conns | 空闲连接池中的最大连接数，默认2（Grafana v5.4+）  
max_open_conns | 数据库的最大打开连接数，默认unlimited（Grafana v5.4+）  
database | MySQL 数据库的名称。  
conn_max_life_time | 可以重用连接的最长时间（以秒为单位），默认为14400/4 小时。这应该始终低于 MySQL (Grafana v5.4+) 中配置的wait_timeout。  
default | 默认数据源意味着它将被预先选用  
  
  

### IM配置

    
    
    im:
      app_id: {{ im_app_id }}
      endpoint: {{ im_endpoint }}
      token: {{ im_admin_token }}
    

字段名 | 类型 | 示例 | 说明 |   
---|---|---|---|---  
app_id | string |  | 互动直播服务，使用七牛IM 作为即时通信消息服务。  
app_id：创建IM App时，为App生成的唯一标识 |   
endpoint | string |  | endpoint：App所在API服务的地址 ，参考 [IM服务接入指南 __](https://developer.qiniu.com/IM/8332/startim)与[IM服务端接入指南 __](https://developer.qiniu.com/IM/8102/im-service-integration-guide)|   
token | string |  | token：IM中获取的管理员token，参考 [IM服务接入指南 __](https://developer.qiniu.com/IM/8332/startim)与[IM服务端接入指南 __](https://developer.qiniu.com/IM/8102/im-service-integration-guide)|   
  
  

### RTC PILI配置

RTC

    
    
    rtc:
      app_id: {{ app_id }}
    

字段名 | 类型 | 示例 | 说明  
---|---|---|---  
app_id | string | c9n9509o5e70 | 互动直播服务，使用七牛的RTC 服务，作为连麦服务。  
RTC 应用的配置，参考：[管理实时音视频 __](https://developer.qiniu.com/rtc/9858/applist)  
  
Pili

    
    
    pili:
      hub: {{ 直播hub }}
      room_token_expire_s: 3600
      playback_url: https://{{xxx}}-playback.com
      security_type: { { security_type } }
      publish_key: {{ publish_key }}
      publish_expire_s: 3600
      stream_pattern: qn_live_kit-%s
      publish_url:  rtmp://{{xxx}}-publish.com
      publish_domain: {{xxx}}-publish.com
      rtmp_play_url: rtmp://{{xxx}}-rtmp.com
      flv_play_url: https://{{xxx}}-hdl.com
      hls_play_url: https://{{xxx}}-hls.com
      media_url: https://{{xxx}}
    

字段名 | 类型 | 示例 | 说明  
---|---|---|---  
hub | string | live | 直播空间信息，参考：[直播云 __](https://developer.qiniu.com/pili)  
room_token_expire_s | int | 3600 |   
playback_url | string |  | 点播域名  
security_type | string | none/expiry/expiry_sk | 推流鉴权方式,详情见下表  
publish_key | string |  | 详情见下表  
publish_expire_s | int | 3600 |   
stream_pattern | string | qn_live_kit-%s |   
publish_url | string |  | 推流域名  
publish_domain | string |  | 推流域名  
rtmp_play_url | string |  | RTMP播放域名  
flv_play_url | string |  | FLV播放域名  
hls_play_url | string |  | HLS播放域名  
media_url | string |  |   
  
  * 直播推流鉴权说明：目前直播推流鉴权，支持三种方式：无鉴权，限时鉴权，限时鉴权SK，不同鉴权模式的配置方式如下

鉴权模式 | security_type | publish_key | publish_expire_s  
---|---|---|---  
无鉴权 | none | 无需指定，留空 | 过期时间秒。如：3600 表示 一小时后过期，推流URL 过期  
限时鉴权 | expiry | 使用配置的key 鉴权。从【直播空间设置】获取key | 同上  
限时鉴权SK | expiry_sk | 使用RTC 用户的SK 鉴权。无需配置，留空。 | 同上  
  
  

### cron配置

    
    
    cron:
      single_task_node: 1
    

字段名 | 类型 | 示例 | 说明  
---|---|---|---  
single_task_node | int | 1 | 单任务运行节点的ID。有些任务，需要全局单线程执行，只有节点ID 等于 single_task_node 的节点，才会运行单线程的任务。  
  
  

### Prometheus系统监控配置

    
    
    prome_config:
      client_mode: exporter
      exporter_config:
        listen_addr: ":9200"
    

或

    
    
    prome_config:
      client_mode: pusher
      pusher_config:
        url: "https://{{xxx}}"
        job: live
        instance: live_{{.node}}
        interval_s: 10
    

字段名 | 类型 | 示例 | 说明  
---|---|---|---  
client_mode | string | exporter/pusher | client_mode：指标导出模式配置，支持的模式如下  
exporter：exporter 模式，开启http 监听，由prometheus 服务来拉取。  
pusher：pusher模式，主动向prometheus-gateway 推送指标。  
exporter_config  
listen_addr | string | “:9200” | 在client_mode 为 exporter 时，需要配置。  
listen_addr： 监听的端口  
pusher_config  
url  
job  
instance  
interval_s | string |  | 在client_mode 为 pusher_config 时，需要配置。url：prometheus-gateway 的指标收集地址。  
job：任务名称  
instance：live 服务的实例ID。  
interval_s：推送间隔。单位：秒。  
|  |  |   
  
  

### callback

    
    
    callback:
      addr: https://niucube-api.qiniu.com/v1/live/callback
    

字段名 | 类型 | 示例 | 说明  
---|---|---|---  
addr | string | https://niucube-api.qiniu.com/v1/live/callback | 配置低代码服务的回调地址,该地址由业务服务来实现.  
低代码服务会将状态信息，通过回调的方式，通知给业务服务  
  
  

### kodo配置（三鉴模块）- censor

    
    
    censor:
      callback: https://{{xxx}}
      bucket: {{ censor_bucket }}
      addr: https://{{xxx}}
    

字段名 | 类型 | 示例 | 说明  
---|---|---|---  
callback | string |  | AI审核结果回调地址，配置为项目的域名。  
bucket | string |  | AI审核疑似违规照片的存储bucket。  
addr | string |  | bucket内存储文件的外链域名。  
存储的bucket，与外链域名配置，参考 [对象存储使用 __](https://developer.qiniu.com/kodo/8452/kodo-
console-guide)  
  
  

### 礼物模块配置 - gift

    
    
    gift:
      gift_addr: http://127.0.0.1:8099/manager/gift/test
    

字段名 | 类型 | 示例 | 说明  
---|---|---|---  
gift_addr | string | http://127.0.0.1:8099/manager/gift/test | 礼物支付的回调接口。礼物发送之前，需要业务服务提供礼物支付功能。  
live 服务在发送礼物之前，回调该接口，完成实际支付。  
只有支付成功的礼物，才会被发送。  
暂时通过 http://127.0.0.1:8099/manager/gift/test 接口返回模拟的支付成功  
  
#### 礼物支付的回调接口要求

Body 参数  
使用JSON 格式数据

参数 | 类型 | 必填 | 说明 | 举例  
---|---|---|---|---  
LiveId | string | 是 | 直播间ID | 1582200377771377896  
UserId | string | 是 | 用户ID | test_user  
BizId | string | 是 | 交易ID | 1574597777432780800  
AnchorId | string | 是 | 当前直播间主播ID | test_anchor  
GiftId | int | 是 | 礼物ID | 3  
Amount | int | 是 | 礼物数量 | 99  
  
举例如下

    
    
    {
        "biz_id": "1574597777432780800",
        "user_id":"test_user_001",
        "live_id":"1772215041443373056",
        "anchor_id": "test_user_002"  , 
        "gift_id":1  ,
        "amount": 99
    }
    

返回

    
    
    {
        "request_id":"xxxxx", //请求ID
        "code": 0,            //错误码：成功时为0；其他为失败
        "message": "success"  //code 非0 时，错误原因描述
    }
    

以上内容是否对您有帮助？