Eng Roulette — это веб-приложение для случайных разговоров на английском языке. Пользователи подключаются к комнатам через WebRTC в формате "рулетки" и общаются с другими участниками для практики английского.
- Авторизация по никнейму и Google OAuth
- Комнаты с видеосвязью, WebRTC видеочат между участниками
- Интеграция с биллингом (опционально)
- Backend: Rust (axum + websocket, actix, sqlx, webrtc-rs)
- Frontend: TypeScript + React
- Базы данных: PostgreSQL
- Инфраструктура: Docker Compose + Traefik API Gateway + Github Actions CI (проверка cargo fmt, clippy, test)
- Авторизация и аутентификация реализованы в сервисе
account
с использованием HS256 JWT-токенов и подхода гексагональной архитектуры. - Присутствуют интеграционные и unit-тесты с использованием библиотеки моков mockall. Запуск через
make test
- Сервис
room
содержит собственный WebRTC SFU (Selective Forwarding Unit) — сервис видеоконференций, написанный на базе библиотеки webrtc-rs, поддерживающий несколько участников в одной комнате. - Идиоматичный Rust-код:
Result
,?
,anyhow
,thiserror
, pattern matching, кастомныеextractors
дляAxum
. - Структурированные логи через
env_logger
- Dev-инфраструктура: проект можно запускать локально через туннель с HTTPS-доступом через публичный API Gateway сервер. Удобно для тестирования, демонстраций и интеграции с внешними сервисами.
.
├── account/ # Сервис авторизации и управления пользователями на Actix
├── src/
├── tests/ # Интеграционные тесты
├── ...
├── room/ # Сервис видео комнат с WebRTC на Axum + Websocket + WebRTC
├── frontend/ # React SPA
├── scripts/ # Вспомогательные скрипты
- Скопируйте
.env.example
в.env
и отредактируйте переменные. - Сгенерируйте и добавьте env
SECRET_KEY
для JWT-токенов с помощью команды:
SECRET_KEY=$(openssl rand -hex 32)
echo -e "\SECRET_KEY=${SECRET_KEY}" >> .env
- Добавьте переменные
OAUTH_GOOGLE_CLIENT_ID
иOAUTH_GOOGLE_CLIENT_SECRET
в.env
- Создайте базу данные
CREATE DATABASE roulette;
и выполнитеaccount/init.sql
- Запустите контейнер postgres, запустите сервис
account
иroom
, а затемfrontend
:
docker-compose up postgres
cargo run --bin account # запускаем сервис account
cargo run --bin room # запускаем сервис room
npm run dev # запускаем сервис react spa
Frontend будет доступен на http://localhost:5157
⚠️ Важно: Для корректной работы видеосвязи в браузере может потребоваться HTTPS. Браузеры (Chrome, Firefox и др.) могут блокировать доступ к камере и микрофону на сайтах без HTTPS. В scripts/compose.yaml уже включены сервисы traefik, proxy и tunnel, чтобы можно было запускать dev-проект на сервере с поддержкой HTTPS через скрипт tunnel.sh.
Для организации HTTPS-соединения и публичного доступа к dev-проекту можно использовать связку make tunnel
+ публичный traefik сервер:
- На сервере
example.com
:- Скопируйте содержимое директории scripts/ и файл compose.yaml на публичный сервер.
- Измените
domains
иemail
вtraefik.yml
, поменяйте адресbotenza.org
по умолчанию на свой - Выполните команду:
SERVER=example.com docker compose up -d
Это поднимет сервисы traefik, proxy и tunnel, необходимые для туннеля и HTTPS.
- Локально:
- в папке
frontend
выполните командуcp .env.example .env
- в
.env
добавьтеVITE_ACCOUNT_API=https://example.com/api/account
иVITE_ROOM_API=https://example.com/api/room
- Запустите tunnel и frontend
- в папке
make tunnel SERVER=example.com
npm run dev
Этот скрипт установит безопасный туннель между локальным окружением и сервером. Теперь ваш локальный проект будет доступен по HTTPS через домен, настроенный на сервере.
- Подбор случайного собеседника
- Рейтинговая система
- Интеграция с AI (например, для подсказок и переводов)
- Интеграция с биллингом (опционально)