Skip to content

kryoz/videocall

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

5 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Private VideoCalls

🇬🇧 English version

Fullstack-проект на базе golang + ReactJS, реализующий видео/аудио звонки посредством WebRTC.

Как это работает

  • Инициатор звонка создаёт комнату с паролем. В этот момент через REST API создаётся сущность комнаты.
  • Инициатор (или гость) входит в комнату - поднимается websocket-соединение с бекендом. Этого участника далее именуем как Инициатор.
  • Присоединяется второй участник в комнату (далее Ведомый). У него тоже поднимается websocket и посылает hello-команду.
  • Инициатор hello запрашивает у бекенда список TURN/STUN-серверов и запускает инициализацию WebRTC протокола.
  • Далее Инициатор отсылает команду answer с метаданными для установления соединения WebRTC Ведомому.
  • Происходит обмен ICE-кандидатами WebRTC через websocket (т.н. signalling) для согласования оптимального канала коммуникации.
  • По завершении согласования поднимается дуплексная трансляция между участниками комнаты.

Архитектурные моменты

  • Caddy выбран для удобства локального развёртывания. На проде лучше nginx (см. пример).
  • В качестве своего TURN-сервера можно использовать coturn, но стоит внимательно изучить документацию по конфигурированию (как минимум обратить внимание на SSL, external-ip и фаервол)
  • Используется REST API /api/ с защитой через JWT
  • WebSocket слушает /api/signal и тоже защищён JWT
  • Данные по комнатам лежат in-memory. При необходимости резервирования потребуется переписать на внешнее хранилище, например redis.

Быстрый старт (локально)

  • Скопировать backend/.env.example в backend/.env и подправить TURN_HOST, чтобы соответствовал реальному IP вашего локалхоста
  • Сделать пустой файл touch frontend/.env (или сконфигурировать из env.example)
  • make build-frontend
  • make build-backend
  • make run
  • Если всё соберётся успешно, то должен стать доступен сервис http://localhost.