Docker 部署 OpenVidu

官方地址:https://docs.openvidu.io/en/2.32.0/

Docker 部署 OpenVidu

Docker 方式

bash 复制代码
docker run -p 4443:4443 --rm -e OPENVIDU_SECRET=MY_SECRET openvidu/openvidu-server-kms:2.32.1

一、快速部署(最简单的方式)

  1. 使用官方部署脚本
bash 复制代码
# 下载部署脚本
wget https://s3-eu-west-1.amazonaws.com/aws.openvidu.io/install_openvidu_latest.sh

运行部署

复制代码
sudo bash install_openvidu_latest.sh
  1. Docker Compose 方式
    docker-compose.yml:
yaml 复制代码
version: '3.1'

services:
  openvidu-server:
    image: openvidu/openvidu-server:2.28.0
    container_name: openvidu-server
    restart: unless-stopped
    network_mode: host
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./certificates:/opt/openvidu/certificates
      - ./recordings:/opt/openvidu/recordings
    environment:
      - OPENVIDU_SECRET=${OPENVIDU_SECRET}
      - DOMAIN_OR_PUBLIC_IP=${DOMAIN_OR_PUBLIC_IP}
      - CERTIFICATE_TYPE=${CERTIFICATE_TYPE}
      - LETSENCRYPT_EMAIL=${LETSENCRYPT_EMAIL}
      - HTTP_PORT=5443
      - KMS_URIS=[\"ws://${DOMAIN_OR_PUBLIC_IP}:8888/kurento\"]
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "3"

  kurento:
    image: kurento/kurento-media-server:latest
    container_name: kurento
    restart: unless-stopped
    network_mode: host
    ulimits:
      core: -1
    environment:
      - KMS_MIN_PORT=40000
      - KMS_MAX_PORT=57000
      - GST_DEBUG=Kurento*:4
    volumes:
      - /opt/openvidu/kurento:/opt/kurento

二、详细部署步骤

步骤 1:创建部署目录

bash 复制代码
# 创建工作目录
mkdir openvidu-docker
cd openvidu-docker

下载官方配置文件

复制代码
curl -o docker-compose.yml https://raw.githubusercontent.com/OpenVidu/openvidu/master/openvidu-server/docker/openvidu-docker-compose.yml
curl -o .env https://raw.githubusercontent.com/OpenVidu/openvidu/master/openvidu-server/docker/.env

步骤 2:配置环境变量

bash 复制代码
# 编辑 .env 文件
vi .env
.env 配置示例:
properties 复制代码
# OpenVidu 配置
OPENVIDU_SECRET=MY_SECRET  # 改为强密码
DOMAIN_OR_PUBLIC_IP=your-domain.com  # 或服务器公网IP
复制代码
# SSL 证书配置
CERTIFICATE_TYPE=letsencrypt  # 或 selfsigned
LETSENCRYPT_EMAIL=admin@your-domain.com

# 端口配置
HTTP_PORT=5443
HTTPS_PORT=5443
KMS_URIS=["ws://your-domain.com:8888/kurento"]

# 录制配置
OPENVIDU_RECORDING=true
OPENVIDU_RECORDING_PATH=/opt/openvidu/recordings
OPENVIDU_RECORDING_PUBLIC_ACCESS=false

# CDR 配置
OPENVIDU_CDR=true
OPENVIDU_CDR_PATH=/opt/openvidu/cdr

步骤 3:启动 OpenVidu

bash 复制代码
# 启动服务
docker-compose up -d

# 查看日志
docker-compose logs -f

查看运行状态

docker-compose ps

三、生产环境部署

  1. 使用 Docker Swarm
bash 复制代码
# 初始化 Swarm
docker swarm init

部署 Stack

复制代码
docker stack deploy -c docker-compose.yml openvidu
  1. 多节点部署配置
yaml 复制代码
# docker-compose.cluster.yml
version: '3.8'

services:
  openvidu-server:
    image: openvidu/openvidu-server:2.28.0
    deploy:
      replicas: 3
      placement:
        constraints:
          - node.role == manager
    networks:
      - openvidu_net
    environment:
      - OPENVIDU_SECRET=${OPENVIDU_SECRET}
      - DOMAIN_OR_PUBLIC_IP=${DOMAIN_OR_PUBLIC_IP}
      - KMS_URIS=["ws://kurento:8888/kurento"]
  
  kurento:
    image: kurento/kurento-media-server:latest
    deploy:
      replicas: 2
    networks:
      - openvidu_net
    environment:
      - KMS_MIN_PORT=40000
      - KMS_MAX_PORT=57000

networks:
  openvidu_net:
    driver: overlay

四、Nginx 反向代理配置

nginx 复制代码
# /etc/nginx/conf.d/openvidu.conf
upstream openvidu {
    server 127.0.0.1:5443;
}

server {
    listen 80;
    server_name your-domain.com;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;
    server_name your-domain.com;
    
    # SSL 配置
    ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem;
    
    # WebSocket 支持
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    
    location / {
        proxy_pass https://openvidu;
        proxy_read_timeout 90;
        proxy_buffering off;
    }
    
    location /openvidu/live {
        proxy_pass https://openvidu;
        proxy_read_timeout 90;
        proxy_buffering off;
    }
}

五、与 SpringBoot 集成

  1. 添加依赖
xml 复制代码
<dependency>
    <groupId>io.openvidu</groupId>
    <artifactId>openvidu-java-client</artifactId>
    <version>2.31.1</version>
</dependency>
  1. SpringBoot 配置
java 复制代码
@Configuration
public class OpenViduConfig {
    
    @Value("${openvidu.url}")
    private String OPENVIDU_URL;
    
    @Value("${openvidu.secret}")
    private String OPENVIDU_SECRET;
    
    @Bean
    public OpenVidu openVidu() {
        return new OpenVidu(OPENVIDU_URL, OPENVIDU_SECRET);
    }
}
  1. 创建会话服务

    @Service
    public class VideoCallService {

    复制代码
     @Autowired
     private OpenVidu openVidu;
     
     public String createSession() throws OpenViduJavaClientException, OpenViduHttpException {
         SessionProperties properties = new SessionProperties.Builder()
                 .mediaMode(MediaMode.ROUTED)
                 .recordingMode(RecordingMode.ALWAYS)
                 .defaultRecordingProperties(new RecordingProperties.Builder()
                         .outputMode(OutputMode.COMPOSED)
                         .hasVideo(true)
                         .build())
                 .build();
         
         Session session = openVidu.createSession(properties);
         return session.getSessionId();
     }
     
     public String generateToken(String sessionId) throws Exception {
         Session session = openVidu.getActiveSession(sessionId);
         if (session == null) {
             session = openVidu.createSession();
         }
         
         ConnectionProperties properties = new ConnectionProperties.Builder()
                 .type(ConnectionType.WEBRTC)
                 .role(OpenViduRole.PUBLISHER)
                 .data("user_data")
                 .build();
         
         Connection connection = session.createConnection(properties);
         return connection.getToken();
     }

    }

  2. 控制器

    @RestController
    @RequestMapping("/api/video")
    public class VideoCallController {

    复制代码
     @Autowired
     private VideoCallService videoCallService;
     
     @PostMapping("/sessions")
     public ResponseEntity<?> createSession() {
         try {
             String sessionId = videoCallService.createSession();
             return ResponseEntity.ok(Map.of("sessionId", sessionId));
         } catch (Exception e) {
             return ResponseEntity.status(500).body(e.getMessage());
         }
     }
     
     @PostMapping("/sessions/{sessionId}/connections")
     public ResponseEntity<?> createConnection(@PathVariable String sessionId) {
         try {
             String token = videoCallService.generateToken(sessionId);
             return ResponseEntity.ok(Map.of("token", token));
         } catch (Exception e) {
             return ResponseEntity.status(500).body(e.getMessage());
         }
     }

    }

相关推荐
zyl837213 小时前
Docker 使用手册
运维·docker·容器
古月方枘Fry3 小时前
MGRE实验
运维·服务器
stolentime4 小时前
FreeDomain 本地开发环境快速搭建指南
运维·服务器·网络
“码”力全开5 小时前
解耦异构算力与多协议接入:基于Docker与源码交付的开源企业级GB28181/RTSP边缘计算AI视频管理平台架构深度解析
人工智能·docker·开源
bush45 小时前
嵌入式linux学习记录四
linux·运维·学习
maomao大哥闯天下6 小时前
K8s如何实现滚动更新、健康检查与探测机制
docker·容器·kubernetes
kaisun646 小时前
Docker 构建网络问题排查
网络·docker·eureka
lihao lihao6 小时前
软硬链接
linux·运维·服务器
TOWE technology6 小时前
智能安防监控系统如何做好防雷?——视频信号SPD综合应用方案解析
运维·服务器·防雷产品·信号保护·信号防雷·spd
楼田莉子6 小时前
Docker学习:Docker介绍及其架构介绍
运维·后端·学习·docker·容器·架构