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

    }

相关推荐
Wang's Blog3 小时前
Java 项目部署之 Docker工具快速入门: Docker 是什么以及它如何解决部署环境问题
java·开发语言·docker
ajassi20003 小时前
AI语音智能体开发日记(十八)智能体服务器xiaozhi-esp32-server源码部署指南
运维·服务器·人工智能·ai·ai编程
‎ദ്ദിᵔ.˛.ᵔ₎3 小时前
linux 进程信号(下)
linux·运维·服务器
Mikko74 小时前
Linux 磁盘满了但 du 找不到?LVM 扩容 df 不变?fstab 写错开不了机?三台真机实测磁盘排查
linux·运维·centos
蓝胖的四次元口袋4 小时前
Jenkins知识梳理(2)
运维·jenkins
yumgpkpm4 小时前
Acceldata ODP 3.3.6.4 vs CDP Private Cloud Base 7.3.2 对比
大数据·运维·服务器·hadoop·华为·zookeeper·hbase
AIGC大时代4 小时前
LLM Agent 执行沙箱闸门:失败含义与当天最小实验
docker·沙箱·闸门·bubblewrap·llm agent
Liuqy-054 小时前
特殊进程——孤儿、僵尸、守护进程
linux·运维·服务器
考研保研资料分享5 小时前
自动化控制保研经验合辑:上交夏令营、北工大预推免与跨专业面试复盘(2025)
运维·面试·自动化
灯澜忆梦5 小时前
【docker】#2 | 基础命令
docker·容器·eureka