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());
         }
     }

    }

相关推荐
忆~遂愿4 分钟前
CANN metadef 核心解析:计算图原型定义、算子元数据抽象与异构系统互操作机制
docker·容器
小Tomkk13 分钟前
数据库 变更和版本控制管理工具 --Bytebase 安装部署(linux 安装篇)
linux·运维·数据库·ci/cd·bytebase
赌博羊13 分钟前
ImportError: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.32‘ not found
linux·运维·gnu
消失的旧时光-194341 分钟前
Linux 入门核心命令清单(工程版)
linux·运维·服务器
艾莉丝努力练剑1 小时前
【Linux:文件】Ext系列文件系统(初阶)
大数据·linux·运维·服务器·c++·人工智能·算法
小天源1 小时前
Cacti在Debian/Ubuntu中安装及其使用
运维·ubuntu·debian·cacti
说实话起个名字真难啊1 小时前
用docker来安装openclaw
docker·ai·容器
Trouvaille ~1 小时前
【Linux】TCP Socket编程实战(一):API详解与单连接Echo Server
linux·运维·服务器·网络·c++·tcp/ip·socket
恬静的小魔龙1 小时前
【群晖Nas】群晖Nas中实现SVN Server功能、Docker/ContainerManager等
docker·svn·容器
芷栀夏1 小时前
深度解析 CANN 异构计算架构:基于 ACL API 的算子调用实战
运维·人工智能·开源·cann