Сегодня я вам расскажу вам о сервисе webtor.io для проигрывания и скачивания торрентов онлайн. О том что он умеет, зачем нужен, а также с какими трудностями пришлось столкнуться в процессе разработки читаем далее.
Что это такое и что умеет
Webtor предоставляет онлайн-доступ к содержимому любого торрент-файла, если конечно есть доступные пиры. Контент можно не только скачать, его также можно и просмотреть. Всё работает через обычный браузер без каких-либо расширений, т.е. будет работать даже на мобильных устройствах. Причем если проигрывание контента не поддерживается нативно в браузере (например mkv), то осуществляется его транскодирование на лету. Проигрывание начинается без ожидания полной загрузки файла из BitTorrent-сети, т.е. почти сразу. Всё бесплатно и без регистрации. Загружать можно как публичные, так и приватные торренты. Загрузки абсолютно анонимны и безопасны, ip-адрес пользователя не виден участникам BitTorrent-сети.
Помимо самого сайта webtor.io существует расширение для Google Chrome и SDK для встраивания плеера в любой другой сайт.
Код почти всех компонентов был передан в open source, посмотреть можно здесь.
В чем отличие от обычного сидбокса
Стандартные сидбоксы обычно работают по подписке. Чем дороже подписка тем больший объем хранилища и трафика предоставляется. В Webtor решили переосмыслить работу сидбокса и предложить пользователям загружать контент из BitTorrent-сети за просмотр рекламы без возможности длительного хранения в облаке. Основной целью было сократить количество действий пользователя для получения контента.
Технические детали
Вся система работает под управлением Kubernetes, практически весь бэкенд написан на golang. Каждая загрузка торрента - это отдельная задача (job) в кластере. Общение между сервисами осуществляется через GRPC. Фронтенд написан на Vue.js. Фронт с бэком общается через специальный прокси который проверяет авторизацию и связывает с нужным сервисом внутри кластера. Сборка проектов проходит через Google Cloud Build. Для мониторинга используется Promethus и Grafana.
История появления
Когда-то давно я разрабатывал один сайт. Он агрегировал видео-торренты со всех популярных отечественных трекеров, группировал их по конкретному кинопроизведению и подтягивал данные с кинопоиска. В итоге получалась видео-витрина и как-то я подумал, что было бы неплохо реализовать там возможность не только скачивать торрент-файлы, но и онлайн-просмотр. Я пробовал подтягивать соответствующее видео с VK, но это было всё не то, хотелось настоящего стримминга контента из BitTorrent-сети. В какой-то момент, времени стало не хватать на поддержку сайта и пришлось его забросить, а идею забыть... на время...
Год спустя (где-то в 17-ом году) я наткнулся на проект, который произвёл на меня сильное впечатление, это был webtorrent.io. "Как раз то что надо" - подумал я. Всё там хорошо, можно проигрывать торрент-файлы через браузер, никакой торрент-клиент устанавливать не нужно, но есть нюанс, доступны только те торренты которые раздаются с использованием webtorrent. И тут появилась идея разработать сервис который позволил бы объединить лучшее из обоих миров и в случае если нет раздающих пиров в webtorrent-сети загружать контент через стандартную BitTorrent-сеть. Для реализации необходимо было разработать сервис, который начинал бы загрузку торрент-файлов и передавал полученные фрагменты по http на лету. Под руку попалась гибридная версия всё того же webtorrent которая могла загружать контент через стандартную BitTorrent-сеть, но уже в исполняемой среде Node.js. Кроме того подкупала возможность разработать проект целиком на JavaScript. Спустя некоторое время удалось разработать прототип который вполне исправно работал. Функционально всё работало хорошо, но после релиза, с увеличением потока посетителей, выяснилась одна неприятная особенность, у приложения были большие аппетиты и оно периодически съедало всю доступную оперативную память, что приводило к полной перезагрузке и обрыву всех текущих соединений. Было потрачено много ночей на поиск утечки памяти, но кардинально изменить ситуацию не удалось. Наверное можно было всё и бросить на этом моменте, учитывая что были и добрые люди которые уверяли, что проект "не взлетит" поскольку доход с проекта никогда не превысит затрат на хостинг. Но тут я не стал унывать и решил двигаться дальше.
Чем дальше я углублялся в поиски решения тем более отчётливо становилось понятно, что бэкенд необходимо переписать заново. В конце концов выбор пал на golang в основном из-за его малой требовательности к ресурсам. Опыта разработки на нём у меня было на тот момент довольно мало, но к счастью все необходимые библиотеки уже были кем-то написаны (это также было одной из ключевых причин выбора). Ну и, чтобы добавить драматизма в происходящее решено было построить всё на базе Kubernetes. Решение оказалось выигрышным, удалось без особых сложностей переписать весь имеющийся функционал. В процессе работы было создано порядка дюжины сервисов.
Сервис стал работать довольно стабильно, люди начали интересоваться проектом. Кто-то хотел проигрывать торрент-контент у себя на сайте, кто-то хотел хостить бэкенд у себя на оборудовании и использовать в личных целях. Для удовлетворения потребностей обеих групп населения весь бэкенд был передан в open-source, а также был разработан SDK для встраивания торрент-плеера на сайт.
Проект за свою жизнь уже пережил порядка 5 переездов по разным причинам и каждый переезд занимал не более суток. Я не раз становился бета-тестером различных Kubernetes-as-a-service решений от различных хостеров и приходилось разбираться в проблемах различной степени тяжести. Весь полученный опыт мне удалось успешно применить в работе.
Спасибо за внимание!
naim
А смотрели тот же peertube https://www.opennet.ru/opennews/art.shtml?num=54372 ?
vintikzzz Автор
Было дело, у меня идея менее глобальная. Хотя была мысль добавить поддержку RTMP-потоков помимо торрентов.
naim
Насчет RTMP Можешь плиз поподробнее?
vintikzzz Автор
Есть кнопка "Вещание RTMP". При нажатии на которую формируется уникальная ссылка на RTMP. Принимать RTMP и конвертировать в HLS при помощи какого-нибудь arut/nginx-rtmp-module.