В рамках кампании по смягчению говнометов: новый программистский пост!
Меня давно беспокоит инженерный вопрос: как вообще изнутри устроен хостинг тяжелых видосов? Потому что нам на ФКФВ хорошо бы иметь полные ТВ-рипы хотя бы самых памятных игр, чтобы можно было в два клика найти игру и посмотреть ее без головной боли.
Сначала я решил попробовать стрим-сервис от словенцев Банни, у которых у нас уже был в свое время cdn. У Банни прекрасный интерфейс, пачка пулл-зон по всему миру для быстрого кэширования и отдачи статики, мощное гпу-железо для ffmpeg-компрессии оригиналов видосов, удобные настройки, папки, тэги, ИИ-детект содержимого видоса (хз как это работает), прекрасный фронтендовый плеер, отличный ценник. Из одного стандартного рипа mkv Банни делал 3-4 прожатые версии за 10-12 минут, – кто работал с ffmpeg, тот знает, что это превосходная скорость. Один затык: РКН и их веерные блокировки айпишников по всему миру просто уже похоже на рандоме. Я понадеялся, что Банни, для которых рынок РФ (как я почему-то решил) довольно значим, в тихой борьбе с РКН постоянно ротируют айпишники или как-нибудь хитро маскируют трафик. Хаха, куда там. Без ВПН из РФ не работало просто ничего, и от Банни пришлось отказаться.
Поэтому я подумал, что можно попробовать совершенно долбанутый и даже опасный сетап, когда ffmpeg мы будем крутить прямо на нашей серверной машине. Я никогда этого никому не могу посоветовать, потому что это шаг ровно в обратную сторону от вменяемой: рельсовый монолит сам просится хотя бы что-то сгрузить куда-нибудь на сторону на выделенные специально для этого инстансы (например, постгрес или редис) – а тут мы де-факто предлагаем тяжелейший процесс ререндеринга многогигового видео гонять на машине для веба, это ж каким истуканом надо быть.
Тем не менее, иногда приходится быть истуканом и идти на крайние меры. Во-первых, под видео я сделал отдельную очередь в менеджере очередей Сайдкик, и строго отмерил ей потолок в 4 ядра и 4 треда. Во-вторых, я зарекся заливать что-то в пиковые дни Факела. В-третьих, ну а хули нет когда да, инженеры мы или не инженеры, почему бы не попробовать; главное влезть, там потом действуем по обстоятельствам.
Далее: ну ок, а где все собственно хранить-то? Я придумал, что можно заюзать тот же s3-совместимый сторадж на Яндекс Облаке, но с хитростью: бакет и все объекты – они COLD. Прикол холодного хранилища по сравнению с горячим таков: оно радикально дешевле для хранения как такового, но каждый запрос к объекту сильно дороже; и так как предполагается, что запросы случаются редко, то в общем решение выходит нормальное. Сторадж Яндекса кстати поддерживает и ICE хранение (то есть это как бы COLD на максималках), но оказалось, что в ICE нужно хостить объекты не менее, чем на год — довольно экстравагантное требование, и я пока решил остановиться на COLD, и пока по метрикам вижу, что вряд ли прогадал.
Еще оказалось, что для больших объемов видосов вообще-то есть специальные настройки cdn, которые позволяют просто на стороне эдж-сети прогружать видосы чанками, а не полными массивами в 3-4 гига. Разумеется, загрузка чанками это было бы круто и ровно как на ютюбе, но поскольку у нас все равно будет грошовый трафик, я пока cdn на видосы не вешал.
Итого: я написал простой интерфейс заливки видосов, прикрутил плеер Плюр (plyr), написал шелловый скрипт для ffmpeg и стал пробовать заливать рипы. 3,5 гига прожимались в ~1 гиг на 720p за ~35 минут, ну вроде как нормально. Все работает на шрайне, а не на Active Storage, поэтому пришлось повозиться с пониманием, какие деривативы оригиналов видосов нужны (да, Шрайн по дефолту предполагает, что оригинальный рип на облаке остается, просто мы к нему можем нагенерировать еще пачку прожатых). Оказалось, что это не только собственно прожатый видос, но нужно еще с рипа взять кадр для постера + хотя бы пяток тамнейлов в формате vtt (это когда листаешь полоску и тут же появляются вспомогательные картинки). Ютюб к каждому видосу делает просто кучу тамнейлов, но я подумал, для нас это перебор, 5 штук для красоты хватит.
Интересна экономика вопроса. Пока что в холодном бакете для видосов 43 гига (уже больше, чем в горячем бакете для картинок), и потребление всего облака за вчера вот такое:
Как вы видите, холодный сторадж за день снял всего 1,23 + 0,38 + 0,16 + 0,01 = 1,78 рубля в день, что вообще невероятно. Однако нужно посчитать еще и трафик, поэтому вечером как будет время откройте бутылочку пенного, отрежьте краюху пухлого и включите условный Краснодар — Факел (2022) или Динамо — Факел (2023), посмотрим, на сколько вы там нальете трафика и сколько с меня за это снимут. (Весь перечень готовых к просмотру полных рипов ищите в разделе Видео)
Но даже если сторадж выйдет за один, а еще вероятнее несколько ТБ (в чем у меня нет никаких сомнений), то предварительная оценка прайса за холодный сторадж более чем положительная.
И второе: даже если трафик и/или сторадж будет конский, то ничто не помешает мне только для видосов заюзать лоу-костер Васаби на медленных дисках. Короче, посмотрим (во всех смыслах!).
Такие дела. Мы продолжаем посильно лить рипы игр, следите за Кинозалом ФКФВ!