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-frontendmake build-backendmake run- Если всё соберётся успешно, то должен стать доступен сервис
http://localhost.