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

    }

相关推荐
一杯咖啡Miracle2 小时前
UV管理python环境,打包项目为docker流程
python·算法·docker·容器·uv
iconball2 小时前
个人用云计算学习笔记 --36 MySQL
运维·笔记·学习·云计算
gsls2008082 小时前
服务器状态监控Uptime Kuma
运维·服务器·git
HIT_Weston2 小时前
78、【Ubuntu】【Hugo】搭建私人博客:文章分类
linux·运维·ubuntu
卓豪终端管理2 小时前
从安全配置开始,构建主动防御体系
运维·网络·安全
阿郎_20112 小时前
复用已知的ssh公私钥实现docker的ssh传输
docker·github·ssl
Allen_LVyingbo2 小时前
NVIDIA AI Enterprise (NVAIE) 运维实战:面向医疗行业的深度培训路径分析
运维·人工智能·知识图谱·健康医疗
刃神太酷啦2 小时前
Linux 底层核心精讲:环境变量、命令行参数与程序地址空间全解析----《Hello Linux!》(7)
linux·运维·服务器·c语言·c++·chrome·算法
杜子不疼.2 小时前
Linux + 容器技术:Docker 基础到实战,快速搭建轻量隔离环境
linux·运维·docker