官方地址: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
一、快速部署(最简单的方式)
- 使用官方部署脚本
bash
# 下载部署脚本
wget https://s3-eu-west-1.amazonaws.com/aws.openvidu.io/install_openvidu_latest.sh
运行部署
sudo bash install_openvidu_latest.sh
- 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
三、生产环境部署
- 使用 Docker Swarm
bash
# 初始化 Swarm
docker swarm init
部署 Stack
docker stack deploy -c docker-compose.yml openvidu
- 多节点部署配置
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 集成
- 添加依赖
xml
<dependency>
<groupId>io.openvidu</groupId>
<artifactId>openvidu-java-client</artifactId>
<version>2.31.1</version>
</dependency>
- 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);
}
}
-
创建会话服务
@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(); }}
-
控制器
@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()); } }}