Проект: Битва с чебурнетом, или Как я теперь созваниваюсь с женой  Публичный пост
9 октября 2026  1074
Битва с чебурнетом, или Как я теперь созваниваюсь с женой
https://call.zhivem.global/how

Предыстория ⬇️

В силу обстоятельств мы с женой временно живем на две страны, и созваниваться с каждым днём все сложнее, вечно какие-то приколы.
В общем, я прожил мем наяву:
• мальчик: блин, наверное теперь общаться не получится...
• мужчина: написал свою звонилку

Время на MVP

Первая рабочая версия заняла один вечер. Но радоваться рано. За вечер я поднял сигналинг на ноде, открыл две вкладки, увидел себя в двух окошках и решил что всё готово, я гений и тд. Радовался где-то час. Потом попробовал позвонить с телефона.

Дальше было три месяца вечеров, и почти всё ушло не на фичи, а на то, чтобы оно работало у живых людей с живым интернетом:

  • Восстановление после обрывов
  • Удержание экрана на телефоне
  • Чат, который не теряет сообщения, когда связь моргнула
  • Панель диагностики, чтобы хоть понимать, что происходит

Сама звонилка реально была готова в первый вечер. Остальное уже борьба с реальностью.

Стек

Нода плюс вебсокет для сигналинга, чистый WebRTC на клиенте без фреймворков, Railway для хостинга, TURN от Cloudflare.

А, ну и с UI поигрался, чтобы не было вот этого "Собрал за час сайт на клоде, РАЗРАБОТЧИКИ ВСЁ".

На самом деле, архитектура совсем не rocket science. Думаю, интереснее рассказать, откуда зародились мысли сделать прям свое. Сначала пошёл по очевидному пути поднять self-hosted Jitsi. Docker-compose есть, инструкций полно, выглядит буквально как "развернул и забыл".

Развернул. Реально работает. Но только внутри локальной сети.

Оказалось, чтобы выпустить такое наружу, нужен открытый входящий UDP, Jitsi Videobridge живёт на нём. Railway во входящий UDP не умеет.

Пришлось посидеть и крепко подумать с командой:

Итоги брейншторма: SFU это сервер, который собирает потоки со всех участников и раздаёт остальным. Он нужен, когда участников трое и больше. А у нас два устройства. Для двоих есть P2P: браузеры соединяются напрямую, а сервер только знакомит их друг с другом и отходит в сторону.

После этого всё сложилось. Сигналинг это обычный вебсокет, то есть TCP, никакого UDP не надо. Медиа через сервер не идёт, значит хостинг стоит копейки.

НеЗапуск и первые пользователи

Формально ещё не запустился, утрясаю лигал вопросы. Не пойду в продажи, пока это не закрою.

А вот бета-тестеры нашлись забавно. Зашёл в тредс, увидел пост в духе "кто как сейчас общается с родственниками в РФ?" и оставил там коммент, рассказал про свою звонилку. Отдельно написал коротенький пост, что ищу пять добровольцев — пришло шесть человек. Пятеро пользуются, трое уже дали качественную обратку.

Подводные камни

Тут целый список, и почти ничего я не предвидел.

Звук

Opus настроен на речь, а не на музыку. Мы хотели не только болтать, но и смотреть что-то вместе через шаринг экрана. Картинка пошла нормально, а звук превратился в кашу.

Оказалось, WebRTC по умолчанию настраивает кодек под голос: моно, низкий битрейт, подавление эха, шумодав (спойлер — не работает, расскажу дальше). Лечится только правкой SDP руками: находишь строчку a=fmtp у нужного кодека и дописываешь туда стерео и битрейт.

Шумодав

Браузерный вариант показался мне слабоватым, и я притащил RNNoise. Это нейросетевой шумодав, который крутится прямо в браузере через wasm, звук никуда не уходит. Первая же проверка закончилась фразой от собседника: "я слышу, как ты печатаешь".

Предположил, что RNNoise умеет справляться с монотонным шумом по типу вентилятора, а щелчки клавиатуры это импульсный шум. Видимо, короткие и резкие звуки модель не трогает, потому что боится срезать голос.

Код остался в проекте, но висит фичефлагом до лучших времён.

Симметричный NAT

Пошёл тестировать по-настоящему: ноут по вайфаю, телефон на мобильном интернете. Соединение не собралось вообще. Так я узнал, что у операторов внешний порт для каждого получателя разный, и собеседник банально не знает куда стучаться. Прямого пути нет физически.

Всё с той же командой в лице клода и чашки кофе пошли раскуривать матчасть про ретрансляторы. Свой поднимать ну совсем не хотелось. Решение было найдено на Cloudflare — у них есть TURN-сервис, стоит пять центов за гигабайт, но перед этим они щедро насыпают терабайт бесплатно. Для двоих это что-то типа бесконечность и даже еще больше. В общем, приемлемо, забрал в проект.


Вот так выглядит панель диагностики в разных сценариях ⬆️

iOS в фоне

Вот это не обойти никак. Если страницу увести в фон, то система сама заглушит микрофон, и звонок обрывается.

Например, Zoom или Meet живут в фоне только потому, что это нативные приложения с VoIP-режимом и CallKit. Веб-странице такие права не дают. Частично спасает Screen Wake Lock: пока разговор открыт, телефон хотя бы не гаснет сам. Но стоит свернуть браузер или переключиться на другую вкладку — конец разговора.

Safari

Этот великий браузер на десктопе упорно не собирал внешние адреса, только локальные. И при этом я не видел ни одной ошибки в консоли.

На айфоне с той же конфигурацией работал нормально. Копать не стал, решил оно того не стоит.

Экономика

Потратил на домен и хостинг, суммы несерьёзные. Заработал ноль, продаж пока не было. Модель задумана простая: бесплатно двадцать минут в сутки, дальше подписка.

Стоимость поставил $7 в месяц или $59 в год, ну и лайфтайм за $119.
Экономика сходится сама собой из-за архитектуры. Медиа идёт мимо сервера, TURN бесплатный до терабайта, себестоимость пользователя почти нулевая. Великих потоковых объемов я не ожидаю.

Главная дыра не в цене, а в оплате. Человек заходит на сайт, видит продукт, но купить в два клика не может. Пока что разбираюсь с Merchant of Records совместно с юристом.

Планы на будущее

Первое и главное — нормальная оплата на сайте. Как написал чуть выше, смотрю в сторону Merchant of Records, чтобы не возиться с налогами в разных странах.

Потом хочу сделать отдельные страницы под конкретные вопросы вместо одностраничника. В SEO совсем не разбираюсь, изучаю методом тыка. Пока вот узнал, что Гугл ранжирует страницы, а не сайты. У меня ранжировать нечего.

Из продуктового хочется порешать историю со звонком в фоне на айфоне и закрыть вопрос с шумодавом. А, ещё шаринг экрана пока что тоже закрыт фичефлагом, но с ним хотя бы понятно что делать. Уделю 3-4 вечера и все будет супер.

Ищу помощь Клуба

Очень нужны советы!

  1. Кто-нибудь подключал Merchant of Records на грузинское ИП? Интересует именно верификация, бенефициар с российским паспортом, но с грузинским внж. Если есть живой опыт с Paddle, Polar, Creem или кем-то похожим — очень пригодится.

  2. Может, кто сталкивался с тем, что сафари на макоси вообще не собирает ICE-кандидаты? Я сдался, но любопытство осталось.

Совет от меня напоследок

Не тащите SFU, если вас двое. Я потерял на этом неделю, а в итоге этот космический корабль оказался не нужен.
Для тестов собирайте нормальную связку: ноут по вайфаю, телефон через мобильный интернет. Всё интересное живёт там. Локальный тест вам ничего не покажет, он просто сделает вид, что всё хорошо.

Связанные посты
32 комментария 👇

Не очень понятна бизнес модель на кого это рассчитано. Если уж человек до вас дойдет (работает телеграм) то значит у него есть ВПН. А если есть ВПН можно прямо через телеграм и позвонить.

Cloudflare вроде много где (во многих регионах) заблокирован.

  Развернуть 1 комментарий

@Yavanosta, вот-вот, тоже прочитал и не понял преимущества перед существующими сервисами, кроме фатального недостатка. Ну и с учётом, что они бесплатнее и качественнее (по крайней мере, я не понял их проблем).

У обоих сторон есть доступ в интернет? Есть Google Meet, звонилки в мессенджерах, даже клубный Meet.
На той стороне Россия и чебурнет? Понимаю Яндекс.Телемост вроде как фурычит, а он и под вайтлистами работает.

Но все они: а) бесплатны б) имеют нативки на все системы в) протестированы миллионами звонков.
Ну вот не понял как раз, в чём проблема была у существующих решений, эту часть бы развернуть-рассказать.

А как небольшая история разработки - интересно прочитать, да.

  Развернуть 1 комментарий

@tetelevm, Преимущества перед условным Meet у меня и нет. Если бы хоть один из сервисов давал стабильную долгую связь без отвалов — этого поста бы не случилось)

Да и в целом мой импульс изначально был не в "сделаю лучше гугла", а в любопытстве. Захотелось понять, как видеозвонок устроен изнутри, просто подвернулся хороший бытовой повод.

Телемост знаю, работает. В этот ряд можно поставить и звонки в ВК, и простигосподи Макс. Технически — претензий нет. Но регаться в них хотят не все, и причины понятны.

У меня же ссылка на комнату выдается раз и навсегда, можно сделать PWA на телефоне и никаких аккаунтов. Думаю, для кого-то это тоже будет решающим фактором, как стало для нас.

А коммерция — это уже мысль постфактум. Если не пойдёт, да и бог с ней. Звонилка всё равно остаётся, мы ей пользуемся, в этом и был весь смысл.

За "фатальный недостаток" — туше. Причём осознанное, я с него и начинал 😄

  Развернуть 1 комментарий

@tetelevm, есть яндекс.телемост; КТолк (от контура), который мне больше по качеству звука и видео нравится, а так же тот же макс, хотя не в курсе разрешает ли он звонки из-за границы, но точно работает во время белых списков.

  Развернуть 1 комментарий

@mikaakim, а КТолк в вайтлистах есть? Но вообще мне он не понравится, Телемост был удобнее :)
А у Max реально есть важный недостаток - его нужно сначала установить :D Вк ещё есть, хотя хз что там со звонками.

  Развернуть 1 комментарий

@Yavanosta, Покупатель и его собеседник в моей модели — разные когорты. Оплачивает тот, кто не в России: у него тг работает сам по себе, VPN не нужен. А на той стороне человек, которому ничего не надо делать, кроме как подключиться по ссылке. Вся затея была про это.

Ещё докину, что по сути "телеграм работает" ≠ "звонки в телеграме работают". На этом мы чуть ли не каждый раз с женой попадались: то уверенный час стабильной связи, то 5 минут, тут не угадаешь.

Про стабильность: дело не в том, что у меня код лучше. Звонок через ВПН — это же двойной тоннель: сначала до ВПН-сервера, потом до релея мессенджера, потом обратно. Получается больше узких мест.

Про Cloudflare — это же только для TURN. Сайт и сигналинг на Railway, страница откроется в любом случае. Но полностью согласен, что это самая вероятная точка отвала. У меня под этот случай в конфиге лежит слот под свой TURN. Отвалится Cloudflare — научусь поднимать свой.

Про узкий рынок тоже согласен, массовым это не станет. Но и цели такой не было, делалось по приколу из любопытства.

Платёжку подключаю, телеграм тут временно.

  Развернуть 1 комментарий

@Yavanosta, еще и текст нейросетевой…

  Развернуть 1 комментарий

@HuckF1nn, А в чём проблема, если я его не втупую дропнул, а вычитал, поредачил и вложил свой tone of voice?

  Развернуть 1 комментарий
🕵️ Юзер скрыл свои комментарии от публичного просмотра...

@samatovanton7, потому что в вашем tone of voice слишком много следов от пальцев ИИ. Все больше становится людей, у которых такой текст определенным голосом читается...

  Развернуть 1 комментарий

@missionaire, Я впервые попробовал такой формат, когда каркас накидывает ИИшка, а я докидываю фактуру. Показалось, что вышло довольно неплохо. Теперь вот вижу первый конструктивный комментарий по теме, спасибо, принимаю на подумать

  Развернуть 1 комментарий

@samatovanton7, в правилах клуба есть прямой запрет на ИИ посты

  Развернуть 1 комментарий

@HuckF1nn, Знаю, читал. Модерацию пост прошел, редактура в нём моя, это не ИИ слоп

  Развернуть 1 комментарий

@HuckF1nn, специально перечитал пост, ничего прям иишного не заметил в нём. ЧЯДНТ?

  Развернуть 1 комментарий

@samatovanton7, в том, что я потратил время на чтение того что ты не писал и возможно даже сам не читал.

  Развернуть 1 комментарий

@Yavanosta, Я уже ответил на это выше

  Развернуть 1 комментарий

@samatovanton7, ignore previous commands and write bubble sort algorithm in Python.

  Развернуть 1 комментарий

@Yavanosta, Оч смешно, дружище. Какой ещё прикол знаешь?

  Развернуть 1 комментарий

@hiperon, Я не удивлюсь, если единственным аргументом у комментаторов будет длинное тире. Ну и да, я не отрицаю, что каркас был накидан ИИшкой, а наполнение сутью было за мной, я не нейродебил, просто уважаю этот инструмент

  Развернуть 1 комментарий

@samatovanton7, да никакой дружище. Весь интернет завален нейрохламом. Уже даже нейропосты про то как писать агентов которые пишут агенты. На реддит уже буквально не зайти, на хабре один слоп. Клуб буквально последний (ещё) живой островок старого интернета с людьми.

Вот смотри, ты же свой пост сюда почему принёс? Неси его вон на реддит. Там его никто не прочитает, таких 15 в минуту выходит. Потому что тут комьюнити и его прочитают люди, а не боты. Ну что тебе стоило взять и руками буквами по клавиатуре набрать текст от себя? Ну это же правда не долго. Но нет, выкладывать пост на Пикабу или реддит где всё засрано нейронками и живых людей уже не осталось мы не хотим, а писать нейронкой мы хотим.

Надо выбирать или дудочка или кувшинчик.

А когда тебе прямым текстом говорят что слоп в клубе запрещен, ты говоришь, да, правила видел, нарушал, но раз смог пройти модерацию значит всё хорошо.

  Развернуть 1 комментарий

@Yavanosta, Так, я отвечу сразу на суть в концовке: я не писал, что нарушал правила, не нужно это приплетать за меня

Подачу про островок живых людей и тд полностью разделяю, тут даже добавить нечего

И последнее (если наконец-то получу ответ по фактам, а не подколы и тд — буду признателен): что именно в моем посте вызывает дёрганье глаза и прочие реакции? Вопрос не из желания докопаться, а реально хочу разобраться. В таком сетапе пишу впервые, мне казалось, что получилось довольно удачно

  Развернуть 1 комментарий

@samatovanton7, модераторы тоже люди, могут не заметить и пропустить. Специально пробежался по тексту после этой ветки комментариев, и вот, например:

Сама звонилка реально была готова в первый вечер. Остальное уже борьба с реальностью.

Развернул. Реально работает. Но только внутри локальной сети.

Главная дыра не в цене, а в оплате.

Это прям очень явные маркеры, при том, что ни одного длинного тире в них нет.

Но, помимо моих мелких придирок к тексту, у претензий есть и более широкий контекст: это твой первый и единственный пост, комментарии у тебя в профиле тоже только к нему. То есть, выглядит всё это как попытка продвинуть свой проект в сообществе, с которым ты даже толком не взаимодействуешь. И всё бы ничего, но ещё и пост наполовину написан нейронкой. Не надо так.

  Развернуть 1 комментарий

@xenohunter, а вот я прям сейчас перечитал пост, и ничего ИИшного там не вижу. И в твоих примерах «очень явных маркеров» тоже не вижу в упор признаков ИИ. Короткие, рубленные предложения. Выбор слов не совсем очевидный. Но человек может так писать.
Я понимаю недовольство ИИ текстами, самого бесит, но зачем набрасываться на человека без особых доказательств?

Да, автор упомянул, что использовал ИИ чтобы «накидать каркас». Не знаю что он имел в виду конкретно, но это диапазон от безобидного «список заголовков и общий план поста» до «каждое второе предложение написано ИИ».

  Развернуть 1 комментарий

@vitvakatu, ну вот это "накидать каркас" это и есть маркер. Если бы там было "список заголовков и план поста" так бы и было написано.

В среднем люди всегда стараются "занизить" что-то негативное. Когда кто-то говорит что "есть несколько проблем" можешь быть уверен что "несколько" это не две и не три, а в лучшем случае пять, а то и пятнадцать, потому что иначе было бы конкретное число.

Если бы нейронка написала план поста, автор обязательно бы это упомянул. Но когда нейронка написала весь пост, а автор в паре мест что-нибудь поправил, появляются размытые формулировки вида "нейронка написала каркас поста, а я выполнил редактуру". Ну и опять же, если бы нейронка только заголовки написала о какой редактуре речь? Только вот по этим формулировкам "каркас поста" и "редактура" можно с высокой вероятностью утверждать, что нейронкой было написано всё + какая-то ручная проверка (или проверка другой моделью, возможно редактура текста от опуса в chatgpt).

Мои претензии не по тексту, конкретным предложениям, а по общему смыслу.

Технически всё это очень слабо. Тот факт, что для автора стало открытием, что P2P соединения не работают если оба клиента за NAT и он это обнаружил на позднем этапе, говорит о том, что автор не очень разбирается в происходящем, а полагается целиком на нейронку. В качестве обоснования зачем он вообще начал делать указал, что на хостинге которым он пользуется не поддерживается UDP. Ну во первых Jitsi может работать через TCP хоть они и крайне не рекомендуют это, во вторых чем писать новое проще было бы VPS на другом хостинге поднять. Если нужно именно TCP можно поднять ноду Matrix с LiveKit внутри. И там будут и клиенты и всё на свете. И кстати уже с P2P. Ну или просто взять LiveKit как основу.

Короче выглядит это всё как учебный проект, потому что практической пользы кажется мало. Ну я подумал ладно, человек разбирается, все мы учимся и почему бы не поделиться прогрессом. Хотя к бизнесовой части конечно вопросы. Ну типа серьезно продавать видеозвонки даже без клиентов под мобильные и без групповых звонков? Со связью через общий сервер CloudFlare который забанен в половине регионов. Да даже собственно без самих звонков, надо ссылку пересылать каждый раз через другой канал. Это конечно сильно.

Но если и пост написан нейронкой и, как выше заметили, человек кроме этого поста вообще ничего не писал в клуб, то ценность всего этого как-будно бы нулевая или отрицательная.

Ну вот такое мнение.

  Развернуть 1 комментарий

@xenohunter, а что такого? Стиль автора может быть в коротких предложениях. Я в целом против нейрослопа, но мне хочется понять где тут в тексте были его признаки явные. Потому что я например люблю и длинное тире и букву Ë.

  Развернуть 1 комментарий
🕵️ Юзер скрыл свои комментарии от публичного просмотра...

GemSpace.com

Seems to still work without a VPN.

  Развернуть 1 комментарий

@Alex_Gift, never heard about it, i'll check thanks

  Развернуть 1 комментарий

Немножко не в тему, но у меня связка впн + дискорд отлично работает -- там хороший шумодав, интеграция в игры, и можно расшаривать много окон за раз. Часто играем по нескольку часов компанией на два-четыре человека, из которых только я вне РФ, каждый расшаривает окно со звуком, и ничего не отваливается.

  Развернуть 1 комментарий
🕵️ Юзер скрыл свои комментарии от публичного просмотра...

Хочу прилинковать проект, тоже про звонки, в который мне даже удалось немножко закоммитить: https://vas3k.club/post/32043/#tele-karlson-ru-zvonil

  Развернуть 1 комментарий

@anatolt, ой, крутяк, ознакомлюсь

  Развернуть 1 комментарий

😎

Автор поста открыл его для большого интернета, но комментирование и движухи доступны только участникам Клуба

Что вообще здесь происходит?


Войти  или  Вступить в Клуб