Как работает TiniTalk
Это техническое описание для тех, кому интересно, что происходит под капотом. Чтобы пользоваться TiniTalk, разбираться в этом не обязательно.
Общая архитектура
В TiniTalk есть Android-приложение для звонков, экспериментальный web-клиент, сервер на вашем VPS и отдельное приложение TiniTalk Admin для владельца сервера. Центрального облака TiniTalk между ними нет: каждый сервер живёт отдельно и обслуживает только своих пользователей.
Android-клиент
Kotlin, Jetpack Compose, WebRTC, системные уведомления, экран входящего вызова Android и показ экрана.
Web-клиент
Экспериментальный PWA-клиент для iPhone и браузера: аудио- и видеозвонки, контакты, история и Web Push.
Сервер
Go, один основной бинарник, HTTPS API, WSS-сигналинг, встроенный TURN и SQLite.
TiniTalk Admin
Отдельное Android-приложение для установки сервера, проверки его состояния и управления пользователями.
Постоянные данные
SQLite хранит пользователей, устройства, контакты и компактную историю звонков.
Как проходит звонок
-
Клиент обращается к серверу
Когда человек нажимает «Позвонить», приложение отправляет запрос на свой сервер. Сервер проверяет авторизацию, находит собеседника и понимает, можно ли начинать вызов.
-
Сервер передаёт служебные события
Через защищённый WSS-канал идут только команды звонка: вызвать, принять, сбросить, завершить, передать WebRTC-предложение и ICE-кандидаты. Сам разговор по этому каналу не передаётся.
-
Телефон просыпается для входящего
Если приложение закрыто или телефон спит, сервер отправляет короткое Web Push-уведомление. Для его доставки TiniTalk использует штатный механизм push-уведомлений Android и инфраструктуру Google — так приложение может проснуться и показать входящий звонок. Через серверы Google проходит только зашифрованное служебное уведомление: аудио и видео туда не передаются.
-
Телефоны соединяются через WebRTC
После принятия вызова телефоны стараются соединиться напрямую. Обычно это лучший путь: меньше задержка и меньше нагрузка на VPS. WebRTC шифрует аудио, видео и показ экрана между телефонами.
-
TURN помогает, если прямой путь закрыт
Когда прямое соединение невозможно из-за NAT или сетевых ограничений, используется TURN-сервер. Тогда медиапоток идёт через VPS, и нагрузка зависит уже от числа таких разговоров.
Несколько серверов
На одном телефоне можно держать аккаунты с нескольких совместимых серверов TiniTalk. Это не федерация: серверы не обмениваются пользователями между собой. Приложение показывает контакты и историю из разных аккаунтов в одном интерфейсе. Выбранный контакт автоматически определяет, какой аккаунт и сервер используются для звонка.
Данные и приватность
У авторов TiniTalk нет общей базы пользователей и звонков. Основные данные хранятся на VPS владельца выбранного сервера: пользователи, устройства, контакты, сессии и история вызовов. Приложение сохраняет на телефоне необходимые данные для входа и подключения. Звук, видео и показ экрана идут через WebRTC напрямую или через TURN, если другого пути нет. Для входящего звонка Web Push-дистрибьютор получает зашифрованное служебное уведомление; звук и видео через Web Push не передаются.
Имена, которые вы задаёте контактам, сохраняются на вашем сервере. Выбранные вами фотографии контактов хранятся только на телефоне и не отправляются на сервер.
Описанная здесь приватность относится к вашему собственному серверу, работу которого вы контролируете. Она зависит от того, как вы настроили и защитили сервер. Если вы подключаетесь через приложение к чужому серверу TiniTalk, вам приходится доверять его владельцу или администратору: он контролирует серверное ПО, базу данных и журналы и может изменить работу сервера. TiniTalk не может отвечать за то, что происходит на чужой установке.
Авторы TiniTalk не имеют доступа к вашему серверу. Мы не отслеживаем пользователей, не собираем телеметрию и не встраиваем аналитику.
Слабая сеть
Для звонков требуется подключение к интернету. В TiniTalk предусмотрены механизмы, которые помогают сохранять и восстанавливать связь при слабом мобильном интернете, сложных международных маршрутах, переходах между Wi-Fi и мобильной сетью и кратковременных обрывах.
- для передачи голоса используются WebRTC и Opus;
- голос получает приоритет перед видео;
- при плохой связи WebRTC снижает качество видео и показа экрана, а при потере медиасоединения приложение временно останавливает камеру и возобновляет её после восстановления связи;
- после смены сети приложение пытается восстановить сигналинг и WebRTC-соединение;
- если прямое соединение невозможно, используется TURN на вашем сервере;
- отдельные звуковые сигналы помогают понять: идёт дозвон, занято, связь пропала или восстановление ещё продолжается.
Нагрузка
В обычном случае сервер занимается авторизацией, сигналингом, Web Push, историей и управлением пользователями. Если телефоны соединяются напрямую, звук и видео не нагружают VPS. Даже слабый сервер с 1 vCPU и 512 MB RAM подходит для семьи, небольшого сообщества, сотен зарегистрированных пользователей и десятков параллельных разговоров. Более мощный тариф обычно нужен только если ожидается много одновременных видеозвонков.