Современное веб-приложение для видеозвонков с поддержкой WebRTC, оптимизированное для Telegram WebView и native wrappers (iOS/Android).
- ✅ Групповые звонки - до 5 участников одновременно
- ✅ WebRTC (P2P) - прямое соединение для минимальной задержки
- ✅ Адаптивные раскладки - автоматический выбор оптимального отображения
- ✅ Быстрое создание - звонки по ссылкам с 6-значным кодом
- ✅ End-to-End шифрование - AES-GCM 128-bit шифрование видео/аудио потоков
- ✅ Insertable Streams API - шифрование на уровне кадров
- ✅ Синхронизация ключей - автоматическая передача ключей новым участникам
- ✅ Индикатор шифрования - визуальное подтверждение защищенного соединения
- Grid (Сетка) - все участники равного размера
- Spotlight (Фокус) - один большой, остальные миниатюрами снизу
- Sidebar (Сайдбар) - основное видео слева, миниатюры справа
- Auto (Авто) - автоматический выбор в зависимости от количества участников
- ✅ 10 эмодзи - ❤️ 👍 😂 😮 😢 🔥 🎉 👏 💯 🚀
- ✅ Летающая анимация - красивые эффекты появления
- ✅ Звуковые уведомления - приятные звуки при отправке
- ✅ Счетчики популярности - отслеживание самых используемых реакций
- ✅ Сортировка - автоматическая сортировка по популярности
- ✅ Индивидуальная громкость - настройка громкости для каждого участника (0-200%)
- ✅ Вертикальный слайдер - компактный дизайн регулятора
- ✅ Сохранение настроек - запоминание уровня громкости в localStorage
- ✅ Визуальные индикаторы - бейджи с текущим уровнем громкости
- ✅ Web Audio API - маршрутизация через gain nodes для точного контроля
- ✅ Полная ширина на десктопе - использование всего экрана на больших мониторах
- ✅ Мобильная оптимизация - удобный интерфейс на смартфонах
- ✅ Адаптивные сетки - от 2 до 4 колонок в зависимости от ширины экрана
- ✅ Увеличенные элементы - большие кнопки и шрифты на десктопе
- ✅ Breakpoints: 768px (mobile), 1024px (desktop), 1440px (wide desktop)
- ✅ Telegram WebView - оптимизация для работы в Telegram
- ✅ Шаринг в Telegram - встроенная кнопка для отправки ссылок
- ✅ Темная тема - автоматическая поддержка темной темы
- ✅ PWA-ready - готовность к установке как Progressive Web App
npm install# Production
npm start
# Development (с авто-перезагрузкой)
npm run dev
# Health check
npm run healthСервер запустится на http://localhost:3000
.
├── server.js # WebSocket signaling server
├── package.json # Зависимости и скрипты
├── public/
│ ├── index.html # Основной интерфейс
│ ├── app.js # WebRTC логика + шифрование + реакции
│ └── style.css # Адаптивные стили
├── .env.example # Пример переменных окружения
├── Procfile # Конфигурация для Heroku
├── railway.json # Конфигурация для Railway
├── render.yaml # Конфигурация для Render
└── README.md
- Node.js - серверная платформа
- Express - веб-фреймворк
- WebSocket (ws) - двунаправленная связь для сигнализации
- Vanilla JavaScript - без зависимостей
- WebRTC API - P2P видео/аудио связь
- Web Crypto API - E2E шифрование
- Insertable Streams API - шифрование на уровне кадров
- Web Audio API - управление громкостью
- CSS3 - современные возможности
- CSS Variables - динамическая кастомизация
- Media Queries - адаптивный дизайн
- Flexbox & Grid - гибкие раскладки
- Откройте приложение
- Нажмите "Создать звонок"
- Разрешите доступ к камере/микрофону
- Скопируйте код комнаты или ссылку
- Поделитесь ссылкой с участниками
- Откройте приложение
- Нажмите "Присоединиться"
- Введите 6-значный код комнаты
- Или откройте полученную ссылку напрямую
- 🎤 Микрофон - включение/выключение аудио
- 📹 Видео - включение/выключение камеры
- 🔒 Шифрование - включение E2E шифрования
- 😊 Реакции - отправка эмодзи-реакций
- 📱 Раскладка - выбор режима отображения
- 📞 Завершить - выход из звонка
- 🔊 Громкость - клик на видео участника для настройки громкости
- 📋 Копировать ссылку - быстрое копирование в буфер обмена
✈️ Telegram - отправка приглашения в Telegram
- Нажмите кнопку 🔒 во время звонка
- Шифрование включится для всех участников
- Индикатор "Защищено E2EE" подтвердит активацию
- Новые участники автоматически получат ключ
- Нажмите кнопку 😊
- Выберите эмодзи из списка
- Реакция появится у всех участников с анимацией
- Популярные реакции поднимутся в топ списка
- Кликните на видео участника
- Нажмите на появившуюся кнопку 🔊
- Настройте громкость слайдером (0-200%)
- Настройки сохранятся автоматически
- Создайте аккаунт на Railway.app
- Нажмите "New Project" → "Deploy from GitHub repo"
- Выберите этот репозиторий
- Railway автоматически развернет приложение
- Готово! ✅
- Создайте аккаунт на Render.com
- Нажмите "New" → "Web Service"
- Подключите GitHub репозиторий
- Render автоматически обнаружит конфигурацию из
render.yaml - Деплой! ✅
# Установите Heroku CLI
# https://devcenter.heroku.com/articles/heroku-cli
# Создайте приложение
heroku create your-app-name
# Деплой
git push heroku main
# Откройте приложение
heroku open# Установите Node.js на сервере
curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
sudo apt-get install -y nodejs
# Склонируйте репозиторий
git clone <your-repo-url>
cd try_git
# Установите зависимости
npm install
# Используйте PM2 для автозапуска
npm install -g pm2
pm2 start server.js
pm2 startup
pm2 save- HTTPS обязателен - WebRTC требует HTTPS для доступа к камере/микрофону
- WebSocket - Убедитесь, что ваш хостинг поддерживает WebSocket
- Порты - Настройте через
process.env.PORT(по умолчанию 3000) - TURN серверы - Уже настроены несколько бесплатных TURN серверов
- CORS - Сервер настроен на работу с любым origin
- Создайте бота через @BotFather
- Получите токен бота
- Создайте файл
telegram-bot.js:
const TelegramBot = require('node-telegram-bot-api');
const TOKEN = 'YOUR_BOT_TOKEN';
const WEB_APP_URL = 'https://your-domain.com'; // URL вашего веб-приложения
const bot = new TelegramBot(TOKEN, { polling: true });
bot.onText(/\/start/, (msg) => {
const chatId = msg.chat.id;
bot.sendMessage(chatId, '📞 Добро пожаловать в сервис видеозвонков!\n\n' +
'✨ Возможности:\n' +
'• Групповые звонки (до 5 человек)\n' +
'• End-to-End шифрование\n' +
'• Реакции и эмодзи\n' +
'• Индивидуальная громкость\n\n' +
'Нажмите кнопку ниже для начала:', {
reply_markup: {
inline_keyboard: [[
{
text: '📞 Создать звонок',
web_app: { url: WEB_APP_URL }
}
]]
}
});
});
bot.onText(/\/call/, (msg) => {
const chatId = msg.chat.id;
bot.sendMessage(chatId, 'Запуск звонка...', {
reply_markup: {
inline_keyboard: [[
{
text: '📞 Открыть',
web_app: { url: WEB_APP_URL }
}
]]
}
});
});- Установите зависимости и запустите:
npm install node-telegram-bot-api
node telegram-bot.jsПриложение использует AES-GCM 128-bit шифрование через Insertable Streams API:
- Генерация ключа - используется Web Crypto API
- Шифрование кадров - каждый видео/аудио кадр шифруется индивидуально
- Уникальные IV - для каждого кадра генерируется уникальный вектор инициализации
- Обмен ключами - ключи безопасно передаются через WebSocket
- Синхронизация - все участники используют один ключ
- Случайная генерация 6-значных кодов (A-Z, 0-9)
- 36^6 = 2,176,782,336 возможных комбинаций
- Рекомендуется использовать комнаты разово
- Автоматическая очистка при выходе последнего участника
- Включайте шифрование для конфиденциальных звонков
- Не делитесь кодами комнат публично
- Используйте HTTPS в production
- Разверните собственные TURN серверы для критичных применений
Отредактируйте CSS переменные в public/style.css:
:root {
--primary-color: #667eea; /* Основной цвет */
--primary-hover: #5a67d8; /* Цвет при наведении */
--primary-gradient: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
--danger-color: #f56565; /* Цвет завершения звонка */
--success-color: #48bb78; /* Успешное подключение */
--bg-color: #f7fafc; /* Фон (светлая тема) */
--surface-color: #ffffff; /* Поверхности */
--text-color: #2d3748; /* Цвет текста */
}В файле public/app.js настроены несколько бесплатных TURN серверов. Для production рекомендуется использовать собственные:
const config = {
iceServers: [
// STUN server
{ urls: 'stun:stun.l.google.com:19302' },
// Ваш TURN server
{
urls: [
'turn:your-turn-server.com:3478',
'turn:your-turn-server.com:443?transport=tcp'
],
username: 'your-username',
credential: 'your-password'
}
],
iceCandidatePoolSize: 10,
iceTransportPolicy: 'all'
};В файле public/app.js:
const MAX_PARTICIPANTS = 5; // Измените на нужное значениеПримечание: Большее количество участников требует больше ресурсов.
В файле public/app.js:
this.reactions = ['❤️', '👍', '😂', '😮', '😢', '🔥', '🎉', '👏', '💯', '🚀', '🎵', '⭐'];Откройте Chrome DevTools → Console:
// Проверка доступа к медиа устройствам
navigator.mediaDevices.enumerateDevices()
.then(devices => console.log(devices));
// Проверка WebRTC
console.log(RTCPeerConnection);
// Проверка поддержки Insertable Streams
const sender = new RTCRtpSender();
console.log('Insertable Streams:', !!sender.createEncodedStreams);- ✅ Убедитесь, что используется HTTPS (или localhost)
- ✅ Проверьте разрешения в браузере (Settings → Privacy → Camera/Microphone)
- ✅ Проверьте, не блокирует ли браузер доступ к медиа
- ✅ Попробуйте другой браузер (рекомендуется Chrome/Edge)
- ✅ Проверьте, что сервер запущен (
npm start) - ✅ Проверьте порт (по умолчанию 3000)
- ✅ Убедитесь, что WebSocket не блокируется firewall
- ✅ Проверьте консоль браузера на ошибки
- ✅ Проверьте доступность TURN серверов
- ✅ Попробуйте другую сеть (возможно блокировка корпоративным firewall)
- ✅ Используйте iceTransportPolicy: 'relay' для принудительного использования TURN
- ✅ Проверьте поддержку браузером Insertable Streams API
- ✅ Используйте Chrome 86+ или Edge 86+
- ✅ Проверьте консоль на ошибки шифрования/дешифрования
- ✅ Убедитесь, что все участники получили ключ
# Установите Capacitor
npm install @capacitor/core @capacitor/cli
npx cap init
# Добавьте платформы
npx cap add ios
npx cap add android
# Скопируйте веб-файлы
npx cap copy
# Откройте в IDE
npx cap open ios # Xcode
npx cap open android # Android StudioiOS (Info.plist):
<key>NSCameraUsageDescription</key>
<string>Требуется для видео звонков</string>
<key>NSMicrophoneUsageDescription</key>
<string>Требуется для аудио звонков</string>Android (AndroidManifest.xml):
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.INTERNET" />- Запись звонков
- Виртуальные фоны
- Текстовый чат
- Демонстрация экрана
- Отдельные комнаты (breakout rooms)
- Аутентификация пользователей
- История звонков
- Календарь/планирование звонков
- Интеграция с календарями (Google Calendar, etc.)
- Whiteboard (виртуальная доска)
- Групповые звонки (до 5 участников)
- E2E шифрование
- Система реакций
- Индивидуальная громкость
- Адаптивный дизайн
- Множественные раскладки
{
iceServers: [...], // STUN/TURN серверы
iceCandidatePoolSize: 10, // Предварительный сбор ICE кандидатов
iceTransportPolicy: 'all', // Использовать все типы соединений
bundlePolicy: 'max-bundle', // Объединение медиа потоков
rtcpMuxPolicy: 'require' // Мультиплексирование RTCP
}{
video: {
width: { ideal: 1280 },
height: { ideal: 720 },
facingMode: 'user'
},
audio: {
echoCancellation: true, // Подавление эха
noiseSuppression: true, // Шумоподавление
autoGainControl: true // Автоматическая регулировка усиления
}
}- Mobile: ≤ 768px - вертикальная раскладка, ограничение 600px
- Tablet: 769px - 1023px - переходный режим
- Desktop: ≥ 1024px - полная ширина, большие элементы
- Wide: ≥ 1440px - 4-колоночные сетки, расширенный sidebar
- ✨ Добавлен адаптивный дизайн для десктопа и мобильных устройств
- 🔧 Уменьшена ширина панели управления громкостью
- ✨ Добавлена индивидуальная регулировка громкости для каждого участника
- 🔊 Web Audio API для точного контроля звука
- 💾 Сохранение настроек громкости в localStorage
- ✨ Добавлена система реакций с 10 эмодзи
- 🎭 Летающая анимация реакций
- 🔔 Звуковые уведомления при отправке реакций
- 📊 Автоматическая сортировка по популярности
- 🔒 Добавлено E2E шифрование (AES-GCM 128-bit)
- 🔐 Insertable Streams API для шифрования кадров
- 🔑 Автоматический обмен ключами с новыми участниками
- 📐 Добавлены режимы отображения: Grid, Spotlight, Sidebar, Auto
- 🎨 Улучшен дизайн интерфейса
- 👥 Поддержка групповых звонков (до 5 участников)
- 🔄 Динамическая сетка видео
- ⚡ Улучшена обработка ICE кандидатов
- 🌐 Добавлены TURN серверы
- 🔧 Исправлены race conditions в WebRTC
- 🏥 Добавлен health check endpoint
- 🎉 Первый релиз
- 📞 P2P видеозвонки
- 🎨 Адаптивный дизайн
✈️ Интеграция с Telegram
MIT License - свободное использование в коммерческих и некоммерческих проектах.
Pull requests приветствуются! Для крупных изменений, пожалуйста, сначала откройте issue для обсуждения.
- Fork репозиторий
- Создайте feature branch (
git checkout -b feature/AmazingFeature) - Commit изменения (
git commit -m 'Add some AmazingFeature') - Push в branch (
git push origin feature/AmazingFeature) - Откройте Pull Request
Если у вас возникли вопросы или проблемы:
- 🐛 Создайте Issue
- 💬 Обсудите в Discussions
- 📧 Напишите в поддержку
- WebRTC API
- Web Crypto API
- Insertable Streams API
- Бесплатные TURN серверы
- Open Source сообщество
Сделано с ❤️ для открытого и безопасного общения
Примечание: Для работы в России убедитесь, что используете STUN/TURN серверы, доступные в вашем регионе, или разверните собственные.