Как я за 9 месяцев сделал свой видеосервис: сначала потому что надо было, а потом потому что понравилось

от автора

Привет, Хабр!

Я — обычный, среднестатистический (с натягом) житель глубинки — электрик. Не хотел никого взрывать, переводить чьи-то деньги на безопасный счёт и заниматься прочими непотребными и преступными штуками. Но именно из-за вот этих вот преступных штук (со слов«компетентных») мне отрубили возможность разговаривать по видео привычным для меня способом.

Неприятное чувство, когда лес рубят другие, а в тебя щепки летят. И ладно, если бы лес рубили, так… травку косят, а летят брёвна.

Как раз я только-только начал, шутки ради и безделья для, общаться с нейросетью. И на фоне летящих брёвен возьми и спроси: «Можешь сделать звонилку?» Та в ответ: «Могу». Я начал спрашивать, потом ещё спрашивать, потом ещё…

Слово за слово, ликбез поверх ликбеза, с чистого листа и меня — полного ноля, мы начали ваять. Чем больше она рассказывала про WebRTC, STUN, TURN-серверы, ICE-кандидаты и прочие страшные слова, тем интереснее мне становилось. Это как кроличья нора, из которой не хочется вылезать. Когда появились первые положительные результаты — первая удачная попытка созвона — к делу подключилась страсть, и это стало моим хобби. DeepSeek — с самого начала и по сей день. Не потому что эта нейронка выделяется своими способностями, а потому что она первая попалась мне под руку. Ее оказалось достаточно, чтобы прийти к внятному и вполне рабочему инструменту для встреч по видео. Начал понимать некоторые технические тонкости, расширять свой кругозор относительно того, как работать с нейронками. Вы бы видели моё лицо, когда я впервые столкнулся с тем фактом, что чат не бесконечен.

Начинал в буквальном смысле на коленках — у меня был один телефон, на котором я создавал проект, редактируя файлы в nano.

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

Программистом я, конечно, не стал. Да и не стремлюсь, ведь программист — это профессия. Профессия у меня есть, мне нужно было хобби. И теперь моё хобби — pet-проект «Визави».

«Визави» — P2P WebRTC, браузерное исполнение с собственным STUN и TURN в московском дата-центре и российским доменом — уход всей страны в Чебурнет он даже не заметит.

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

Интерфейс обычной комнаты

Интерфейс обычной комнаты

Моя архитектурная идея заключается в том, что «Визави» — это здание со множеством отдельных комнат. Если в комнату зашло двое, то они видят и слышат друг друга. Каким образом ваш будущий собеседник узнает, в какой вы комнате, — ваша задача. Скидывайте ему ссылку на комнату или при личной встрече договаривайтесь. У «Визави» в этом смысле есть только одна изюминка — возможность передать ссылку на комнату голосом. Прямо по телефону, когда понадобилось видео, один говорит другому: «Заходи в комнату 777 (последовательность цифр может быть любой)» — «Хорошо». Оба заходят на https://ви-за-ви.рф/ и набирают 777, оказываясь в одной комнате.

Принципиально: без регистрации, скачиваний приложения, логирования ip, записи сообщений и разговоров. Механизмы и логика работы обычных комнат уже созданы. Если кому-то зайдёт такой способ видеосвязи — пользуйтесь, вся хвала Всевышнему.

Закончив с базой, я продолжил развитие проекта. И следующим моим шагом стало создание VIP комнат. Те же базовые механизмы, но уже с немного другой логикой, предполагающей иерархию. Есть владелец VIP комнаты и есть приходящие к нему гости. У владельца в руках все дополнительные функции (запись встречи, он может открыть или закрыть чат, выгнать гостя, и ему доступны настройки комнаты), у гостя (наряду с владельцем) есть возможность демонстрировать экран ноутбука и передать файл. Постоянная ссылка. Можно оставить сообщение владельцу у входа в комнату. Если пришло несколько гостей сразу, то они выстраиваются в очередь.

Все зримые изменения в функционале выкладываю в t.me/videozvonkivizavi

После VIP комнат планирую создать третий вид — «комнаты для наблюдения», с той же базой, но со спецификой иерархии, по воли Всевышнего. Одно устройство будет подключаться в роли камеры, второе в роли монитора. Конечно это будет не полноценное видеонаблюдение, а что-то вроде радионяни, только её не надо будет покупать, а просто достать старый смартфон из ящика с хламом. Тут пока больше вопросов, чем понимания.

Техническая сторона проекта (этот абзац писал с помощью ИИ):

  • Всё крутится на арендованном VPS в московском дата-центре.

  • 1 ядро процессора

  • 512 МБ оперативной памяти.

  • 10 ГБ SSD-диска (из них занято около 3,3 ГБ).

  • Debian 11.

На этом же сервере развернуты: Coturn — собственный STUN/TURN сервер. Node.js (сигнальный сервер), который управляется через PM2. Nginx — reverse-прокси. Он принимает запросы на 80 и 443 порты, отдает статику напрямую, а запросы к сокетам проксирует на внутренний порт Node.js. SSL через Certbot (Let’s Encrypt) версии 1.12.0 с автоматическим обновлением по таймеру. UFW, Fail2Ban. И клиент, и сервер написаны на чистом JavaScript. Express отвечает за отдачу статики (HTML, CSS, JS) и REST API для проверки статуса VIP-комнат. Socket.io держит постоянное WebSocket-соединение для обмена WebRTC-сигналами (offer, answer, ICE-кандидаты) в реальном времени. Вместо баз данных используются JSON-файлы.

Админ-панель: текущие соединения

Админ-панель: текущие соединения

Созданная с нуля админ-панель — отдельная история. Много раз она открывала мне глаза на то, что у меня происходит. Не «под капотом», а «за окном»

В процессе индексации сайта в Яндекс и Гугл, обнаружил, что интернет просто кишит разного рода снифферами, сканерами, ботами и прочей живностью. ИИ толком мне не смог объяснить (или я не смог понять) с какими целями приходят орды ботов ко входу в мой сайт. Может уважаемая публика Хабра прольет свет на эту кучу цифровых гнусов:

Админ-панель: логи сервера

Админ-панель: логи сервера

Эти ребята не выполняют JavaScript, и сервер, вместо отправки стандартного пакета с файлами скриптов, отдает им легкий site.html с SEO текстом.

Вход в VIP комнату

Вход в VIP комнату

Сквозное шифрование у P2P WebRTC — классика жанра, тут без меня все придумали, но вот исключительно мои наработки уже под большим вопросом конфиденциальности:

Чат во время встречи хранится в localstorage браузера «как есть» (при закрытии чата владелец VIP комнаты может сохранить чат в виде html странички) Оставленные у входа в VIP комнату сообщения пока хранятся в json в открытом виде. Понятно, что никто не станет пользоваться таким способом для передачи информации, чувствительной к постороннему вниманию. Но хотелось бы более профессионального отношения к данным. Что посоветуете с учетом скромных технических характеристик VPS?

Я изучал похожие сервисы. Каждый из них требует от пользователя сделать как минимум один шаг до того как начнется подключение. И я не имею в виду выдачу разрешений на камеру и действия по передачи ссылки. Где‑то надо регистрироваться, где‑то надо имя свое указать и прочее. На Визави этот шаг не нужен. Набрав https://ви‑за‑ви.рф/, пользователь уже оказывается подключенным к комнате и готов ко встрече.

Чем больше выбора, тем лучше. Пусть каждый найдёт себе то, что по душе. Вся хвала — Всевышнему.

ссылка на оригинал статьи https://habr.com/ru/articles/1025120/