Openvidu 커스터마이징 하기

김윤빈·2021년 8월 22일
7

aws

목록 보기
2/2
post-thumbnail

Openvidu 커스터마이징 하기

openvidu는 Webrtc 에서 간단하게 사용해볼 수 있는 프레임워크다. 간단하게 사용하기에는 정말 쉽다. 하지만 openvidu를 가지고 커스터마이징을 하고, aws에 배포를 한다면 어마어마한 에러와 함께 날려보낸 10일을 적고자 한다.

WebRTC 와 Openvidu

WebRTC(Web Real-Time Communication)은 웹 애플리케이션과 사이트가 중간자 없이 브라우저 간에 오디오나 영상 미디어를 포착하고 마음대로 스트림할 뿐 아니라, 임의의 데이터도 교환할 수 있도록 하는 기술입니다. WebRTC를 구성하는 일련의 표준들은 플러그인이나 제 3자 소프트웨어 설치 없이 종단 간 데이터 공유와 화상 회의를 가능하게 합니다.

Openvidu는 웹 또는 모바일 애플리케이션에서 화상 통화를 쉽게 추가할 수 있는 플랫폼. 애플리케이션에 매우 쉽게 통합할 수 있는 완전한 기술 스택을 제공한다. 플랫폼이기에 쉽게사용할 수 있다 .

나의 상황

webrtc를 공부하면서 Openvidu를 사용한다면 쉽게 사용할 수 있고, 제공되는 튜토리얼도 정말 간단했다. 깃 클론받고 openvidu server를 도커로 띄워놓으면 모든것이 끝났다. 와 이게 왜되지??

왜 커스터마이징을 해야됐나?

우리는 화상공유를 통한 게임방을 만드는것이 목표였고, 게임을 하려면 실시간으로 키워드, 정답, 채팅등 모든것이 실시간으로 모든 유저들이 같은 정보를 주고 받을 수 있어야 했다.

그러기엔 Vue - Spring 사이에서는 1:1 통신이였기에 중간에 화상 통화역할을 위한 openvidu에 미디어서버의 역할을 입혀 게임부분의 실시간으로 통신할 수 있는 환경이 필요했다. 그러기에 openvidu의 server를 커스터마이징할 필요가 있었다.

우리의 통신은 클라이언트에서 요청을 보내면 openvidu 서버를 거쳐서 spring api를 들어가면 출제자나 키워드 같은 부분을 가져오거나 db에 저장, 방 관리등을 수행한다. 그리고 openvidu로 return을 보내는데 openvidu는 session에 있는 모든 사람에게 전부 데이터를 한번에 뿌려줄 수 있기 때문에 실시간으로 게임을 진행 할 수 있다고 판단햇다.

로컬테스트

일단 openvidu-server를 클론받자.

$ git clone https://github.com/OpenVidu/openvidu.git

openvidu 서버와 함께 필요한게 Kurento Media Server라는건데 미디어 트래픽이 통과하는 멀티미디어 미들웨어이다. 일단 KMS 부터 알아보자

KMS (Kurento Media Server)

Kurento는 WebRTC 미디어 서버이자 WWW 및 스마트폰 플랫폼용 고급 비디오 애플리케이션 개발을 간단하게 해주는 클라이언트 API 세트입니다.

Kurento는 별도의 플로그인이 필요없고 peer와 Peer 간의 P2P 연결을 통해 Video, data 스트리밍을 해줄 수 있다 .

왜 쓰는가?

유튜브, 인스트 라이브와 같은 대규모의 서비스를 하기 위해서는 한 명의 스트리머와 N명의 뷰어들이 존재한다. 대규모 서비스에서 1:N 스트리밍 또는 다양한 기능들을 추가하기에 P2P 방식을 사용한다면 무리가 있다. 스트리밍하고 있는 클라이언트에 10만명의 Viewer들이 연결되어 있다면?? 스트리머의 클라이언트는 터져버릴 것이다.

그렇기에 Peer의 중간에 미디어 서버가 필요한것이다.

사용법

사용법은 간단하다. 도커를 사용해서 사용할것이므로 먼저 도커가 깔려 있어야 한다.

$ docker pull kurento/kurento-media-server:latest

$ docker run -d --name kms --network host \
    kurento/kurento-media-server:latest

기본적으로 port는 8888을 사용하고 있다.

Openvidu Server

openvidu server를 다운받으면 여러가지가 많은데 openvidu-serveropenvidu-client가 가장 중요하게 필요하다

openvidu는 maven 프로젝트이므로 maven도 다운받아야한다...

ERROR

  • 여기서 먼저 kms가 실행중이여야한다.

    • 안그럼 에러뜸 .
    • 기억은 안나지만 shutdown 머라고 떴음. kms 닫혀있으면 안된다는 뜻
  • buildproperties가 안맞다고 아예 실행 조차 안된다?

    Consider revisiting the entries above or defining a bean of type 'org.springframework.boot.info.BuildProperties' in your configuration.
    • 아마 maven의 의존성을 다운받을때 오류가 나는듯함

    • openvidu의 프로젝트의 root에서 그리고 openvidu-server안에서 아래의 명령어로 설치를 다시 해준다.

      $ mvn clean install -U
  • .env error

    • application.properties에서 해당 도메인과 port설정을 넣어주면 된다. 로컬에서 돌릴꺼라 아래처럼 설정했다.

    • ...
      DOMAIN_OR_PUBLIC_IP=127.0.0.1
      ...
      HTTPS_PORT=5443
  • build시 에러

    • build하면 묶은 test 케이스들이 있는지 특정부분에서 build가 잘안되고 시간이 오래걸림. skiptest를 해주면 해결할 수 있음

    • $ mvn package -DskipTests
    • 하면 target 폴더에 jar 파일이 생성된다.

    • jar 파일만 있으면 배포할때도 잘되겠지 라는 생각에 jar 파일안의 application. properties와 여러가지 설정을 만져봤음

AWS

jar파일만으로는 견고하게 짜여진 openvidu 플랫폼을 사용할 수 없다.

결과적으로 바꾼 코드를 도커 이미지화시켜서 openvidu server를 갈아끼워 넣어서 해결했다.

ERROR

  • Postman 요청으로나 url링크로 openvidu 서버에 접근하면 정상적으로 html 페이지를 보여주지만

  • net:ERR_CERT_AUTHORITY_INVALID , net::ERR_CONNECTION_REFUSED 등 보안관련 문제인지 에러를 계속 뿜어냄

  • webrtc을 사용하려면 https가 필수적으로 사용해야 했기에 ubuntu에서 nginx를 certbot으로 https 보안 설정을 완료함

  • 보안을 걸어도 openvidu는 letsencrypt나 자체서명된 보안인증서를 사용했기에 안맞음

  • nginx proxy를 통해 /api 로 오는 부분은 백엔드 api로 , /openvidu/api로 오는 부분은 openvidu 서버로 프록시 설정을 해주어도 안됨
  • openvidu 자체 서명 keystore.p12(selfsigined) 대신 openssl 사용해봄

    • $ cd /etc/letsencrypt/live/i05c104.p.ssafy.io
      $ openssl pkcs12 -export -in fullchain.pem -inkey privkey.pem -out i05c104.p.ssafy.io.p12 --name ssafy -CAfile chain.pem -caname root
    • 자신의 캠은 나오는데 다른 사람의 캠은 보이지 않는다... (turn 서버 문제)

    • turn 서버 설정이 필요하다. (turn 서버의 개념은 따로 정리하겠음 )

    • ubuntu 내의 apt install coturn으로 설정을 하면 에러가 남 .

  • turn 서버의 설정을 해도 정상적으로 잡아내지 못하는 문제...

해결방법

openvidu의 jar 파일만으로는 Coturn 서버 설정이나 여러가지 견고하게 짜여진 openvidu의 서버를 사용하는것이 무리가 있다.

opnevidu의 on-promise 방법으로 aws 설정을 완료해보고 뭐가 다르기에 안되는지 체크를 하다가 aws에서 돌리려면 필요한 docker 요소들을 봤다.

server, nginx, redis, kms, coturn등 docker로 미리 올려져있고, dockerfile create시 가장 우선적인 환경변수를 집어 넣기에 설정상 뭘 해도 에러가 발생 했던 것이엿다.

nginx 설정

일단 docker nginx의 설정을 뽑아내서 unbuntu nginx 프록시에 우리 페이지에 맞게 변경해줬다.

설정이 매우 길어서 바꾼 부분만 기재

# etc/nginx/sites-enabled/deafult 
location / {
       #proxy_pass http://yourapp;
       root /home/ubuntu/S05P13C104/frontend/dist; # Openvidu call by default
       try_files $uri $uri/ /index.html;
    }

location /api-boot {
        allow all;
        deny all;
        proxy_pass http://backend;
    }

docker server

도커 서버는 기본적으로 dockerfile이 있다. 안의 create.sh 를 사용하면 간단하게 이미지를 만들 수 있다.

$ sudo mvn package -DskipTests
$ cd openvidu-server/docker/openvidu-server
$ chmod 777 create_image.sh #권한주기
$ ./create_image.sh 2.19.02 # 버전 하나씩 올리기 09까지함 애 

$ docker ps # 도커 이미지 잘 올라갔는지 확인 

docker compose

# opt/openvidu docker-compose.yml
$ vi docker-compose.yml
openvidu-server:
        image: openvidu/openvidu-server:2.19.04 # 버전 바꾸기 

:wq!


$ docker-compose up -d # compose 깔린거 재시작 

docker compose를 이용해서 image를 바꾸고 업데이트 될때마다 버전up을 해주는 방식으로 문제를 해결했다.

이 방식이 정답은 아니다. 최우선적인 환경이 잡혀져있어서 그리고 프로젝트의 남은 시간 때문에 일단 해결한 방식 그대로 버전업을 해서 무사히 배포를 완료했다.

더 좋은 방식이 있을 것이고, CI/CD 툴을 사용해서 자동화를 해보는것이 다음 목표이다.

profile
I'm yunbin

2개의 댓글

comment-user-thumbnail
2022년 4월 28일

좋은 글 감사합니다.
정말 잘 보고 갑니다!!

답글 달기
comment-user-thumbnail
2022년 7월 15일

yunbin님 Openvidu 배포 및 커스텀 된 파일 도커 이미지로 만드는 방법에서 궁금한 것이 있는데 혹시,
메일 주소 알려주실 수 있나요?

답글 달기