Скорость, кэш и новый плеер

Как уже знают читатели моего телеграм-канала, сейчас я работаю над запуском персонального сайта Стасу Васильеву на Орбите - Sasflix.ru.
Для этого я выкачал все заметки и видео с его Бусти, обработал, и закачал на арендованный сервер. В ходе этой работы и последующих тестов мы сделали много разных изменений движка, которые заказчик разрешил выложить обратно в Open Source.
Вот, выкладываю.

Кэширование проверки прав

Орбита - это блог с подписками, поэтому там везде встроена проверка прав на загрузку аудио и видеофайлов.
Грузятся они пачками по 10 секунд и проверка производится при каждом обращении. Если на сайт пришла пара сотен человек и смотит свежий видос, то это можно нормально так тормозить. Так что теперь результаты этой проверки кэшируются для каждого юзера, и сразу для всех гостей, по умолчанию на 1 час. Поменять время кэша можно настройкой CACHE_MEDIA_ACCESS_TIME.

Кэширование хранилища S3

Хранить видео на локальном диске сервера очень удобно, но дорого. Нормальным решением будет использовать встроенную функцию работы с S3-совместимым хранилищем. Но эти хранилища - сетевые, так что какое-то время уйдёт на подключение и загрузку нужных данных.
Поэтому теперь можно указать ненулевое значение мегабайт в настройках CACHE_S3_SIZE, после чего во временную директорию будут сохраняться чанки медиа, которые загружают пользователи.
Когда размер кэша превысит указанное значение, более старые файлы будут удалены так, чтобы размер кэша оставался в пределах выделенных мегабайт. Таким образом, у вас всё время будут закэшированы самые популярные видосы.

Кэширование фронтенда

Во время реальной эксплуатации с тысячами посещений оказалось очень накладым каждому гостю рендерить страницу на сервере. И тут я провёл довольно много времени пытаясь разработать простую систему - кэшировать страницы только для гостей. Как оказалось, никаких готовых решений для Nuxt нет, или я не нашёл.
Поэтому написал своё, используя возможности сервера Nitro.
Указываете время кэширования в CACHE_PAGES_TIME в секундах, и готовые страницы будут складываться в Redis. Кэш сбрасывается при изменении страниц или заметок, а так же при перезапуске фронтенд приложения.

Проигрыватель Vidstack

Проигрыватель Plyr, который я использовал в Орбите уже довольно-таки давно считается устаревшим, но раньше меня это не особо беспокоило. Работает - и ладно.
Но когда я попылся реализовать функционал разбиения видео по таймкодам, оказалось, что Plyr поддерживает их очень криво. И я решил попробовать Vidstack, который призван стать заменой Plyr.
В результате у нес теперь есть и таймкоды, и превьюшки, и более удобный плеер.
Единственное, что мне пришлось сделать свой форк для реализации плоского меню настроек без вложенных пунктов.
Постараюсь оформить эти изменения в Pull Request и предложить авторам.
Генерацию превьюшек можно выключить настройкой EXTRACT_VIDEO_THUMBNAILS_ENABLED, но зачем? Оно же прикольное.

Аудиоверсия

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

Обновление старых видео

Чтобы добавить превьюшки и аудиоверсию уже загруженным видосам, есть скрипт core/cli/add-new-features.php, который нужно запустить в контейнере PHP.
Это займёт какое-то время, потому что скрипт скопирует оригиналы видосов в локальную директорию, достанет всё нужное, и загрузит обратно.

Остальные изменения

Остальные изменения не такие крупные, поэтому просто списком:
  • Исправлен вывод даты в письме о покупке подписки.
  • Упростил работу с тёмной темой - убрал режим "авто". Теперь она "полу-авто", меняется при смене системной темы или вручную.
  • В боевом режиме файлы собранного фронта обслуживаются Nginx, а не сервером ноды - он отдаёт статику гораздо быстрее.
  • Больше подробностей о версиях видео и скорости их обработки в админке.
  • Живое обновление циферок в подвале заметок (просмотры, реакции) и форматирование тысяч.
  • Вывод статуса "ошибка" у платежей в админке и разделе юзера.
  • Улучшена работа фронтенда с единственной языковой версией - раньше он норовил где-нибудь вывести не тот язык при серверном рендере.
  • Можете разрешить юзерами скачивать ваши видео и аудиофайлы настройкой DOWNLOAD_MEDIA_ENABLED - она выводит кнопку заказчки в проигрывателях десктопной версии. На мобильных устройствах кнопка не нажимается, это глюк Vidstack, поэтому там она пока спрятана.

Заключение

Как видите, изменений очень много.
Новый проигрыватель выглядит вполне себе как у взрослых - есть все основные функции стандартных видеохостингов.
Проект стал более крутым и быстрым, добавились опции кэширования, чтобы держать нагрузку в сотни и тысячи юзеров даже на не особо дорогом сервере.
Обновляемся как обычно:
git pull
service orbita restart

23 comments

Александр Наумов
Класс!!!
Василий, появилась какая-то проблема с редактированием страниц и топиков в которых есть загруженные фото. Поле с контентом пустое, когда пытаешься отредактировать, а страницы с фото вообще не показываются после создания, выдает ошибку: 
500 _b.find is not a function
В консоли браузера: 
Failed to load resource: the server responded with a status of 500 (Internal Server Error)
Может конечно это у меня на локальном компе, но хотя фото к превью топика грузится и редактируется потом нормально.
И на старых установках Орбиты, тоже нет этой проблемы.
А это ошибки, когда пытаюсь отредактировать топик:
Александр Наумов
Василий Наумкин
Мне кажется, у тебя первично, что сервер на загрузку картинки отвечает ошибкой 500, а потом уже от этого и ошибки в редакторе.
Проверяй log/error-дата.log, почему картинка не грузится.
Александр Наумов
Спасибо!
С топиками разобрался, файлы грузились но на них права не те ставились, после простановки 777, проблемы с топиками решилась. А вот у страниц файлы грузятся но изменение прав проблему не решает. Сейчас новая ошибка: 500 page.value.content?.blocks?.find is not a function 
В папке log почему-то вообще файлы не создаются. Буду разбираться.
Попробовал создать страницу с фото на сайте который ставил 24 марта и не обновлял, там все хорошо.
Александр Наумов
И еще на сайте от 24 марта в папке log файлы создаются.
Василий Наумкин
У тебя явно с правами на директории какие-то проблемы.
Я работу с логами и обычными страницами даже не трогал - можешь проверить по истории Git.
Александр Наумов
Спасибо, понял!
Александр Наумов
Василий, подскажи, пожалуйста.
Я с Git-ом на ВЫ, когда я пытаюсь обновить проект  который вносил изменения только в конфиги: git pull получаю ошибку: 
error: Your local changes to the following files would be overwritten by merge:
frontend/package-lock.json
Please commit your changes or stash them before you merge.
Я делаю следующее git stash, но понимаю, что это не правильно, а как нужно делать?
Василий Наумкин
Всё просто - надо удалить имеющиеся изменения, от package-lock ничего сохранять не надо.
git reset --hard
Отчего так получилось - я сам не понимаю, видимо я что-то немного накрутил с историей коммитов Git.
Александр Наумов
Спасибо!!!
Михаил Соловьёв
Заметка с вопросами об установке платная. Платежи не проходят. Напишу здесь.
В разделе примера конфигурации nginx начинается так:
server {
    listen 80;
    listen 443 ssl http2;
    server_name orbita-test.bezumkin.ru;
...
}
Но это нынче deprecated, должно быть так:
server {
    listen 80;
    listen 443 ssl;
    http2 on;
    server_name orbita-test.bezumkin.ru;
...
}
Но вообще это костыли, нынче модно так
server {
  listen        80;
  listen        [::]:80;
  server_name orbita-test.bezumkin.ru;
  return 301 https://orbita-test.bezumkin.ru;
}

server {
  listen        443 ssl;
  listen        [::]:443 ssl;
  http2 on;
  server_name orbita-test.bezumkin.ru;
...
}
Михаил Соловьёв
А. Ну и nginx -t для проверки, а только потом systemctl restart nginx тоже костыли. Просто nginx -s reload. Оно скажет если ошибка где, и оставит всё как есть, а если нет ошибок просто перегрузит сам свой демон с новым конфигом.
Михаил Соловьёв
Ещё порадовало это:
Теперь установливаем все нужные пакеты:
apt update
apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin 
apt install -y nginx certbot python3-certbot-nginx mc htop
Я конечно тоже люблю и midnight commander и htop. Но кажется скворечник не участвует в фестивале )
Можно кстати предложить пользователю, раз уж mc поставил mcedit вместо nano.
Посоветуйте, как запустить Орбиту на Synology в докере?
Добрый день!
Столкнулся с такой проблемой, Вроде всё поставил, сделал по инструкции, всё работает сайт запустился, но я не могу зайти в админку, логин и пароль admin, как будто не подходит? 
chown www-data:www-data tmp upload log
Дело в этом или нет, что то я совсем туплю
Василий Наумкин
А посмотрите в консоль браузера, скорее всего вы забыли указать верный адрес сайта в .env файле и запросы уходят на неверный адрес.
Как timeweb относится к большому трафику на свои S3 хранилища? На их сайте указана пропускная способность для хранилища 100 Мбит/с. Sasflix'у хватает?
Василий Наумкин
Хорошо относится, пока что не тарифицирует. Скорость вроде была до 1 Гбит, не знаю почему 100 Мбит на сайте написано.
Может, это на каждое подключение? В любом случае, нам хватает.
Обрадовали сегодня, похоже придется на ceph переходить
Василий Наумкин
Да, халява заканчивается. Тарифицироваться будет любой исходящий трафик, включая работу через API по локальной сети - я уточнил в поддержке.
Если скачивать на сервер и кэшировать, то расход будет меньше. Орбита умееет так делать, там есть кэширование S3 из коробки.
Отключаем DOWNLOAD_MEDIA_FROM_S3 и указываем ненулевой объём кэша в гигабайтах CACHE_S3_SIZE.
Вот у меня на графике видно прикольную ёлочку, как место занимается, и каждые 10 минут очищается.
А так - конкуренты всё равно выходят дороже, я смотрел Selectel, Yandex и VK Cloud.
Есть еще вариант арендовать отдельный сервер под своё хранилище (наверное ты это и имеешь в виду под ceph), но надо еще посчитать, будет ли это выгоднее. Например, на Selectel просто HDD на 10Тб в облаке стоит 93 000 руб.
Да, под ceph я имел ввиду собственный сервер, подходит для небольших нагрузок. Неплохо бы было выдавать разные S3 сервера для балансировки. У VK Cloud подешевел CDN с 80 до 60 копеек за гигабайт. Тыкался с R2 (аналог S3) от Cloudflare, в итоге, после всех этих тыканий, с моего ip хранилище сбрасывает соединение, а с VPN работает. Почему выбрали не colocation со своим сервером для Sasflix, когда полно недорогих бу серверов? И, если не секрет, какая пиковая нагрузка по трафику на S3 была? Спасибо!
Василий Наумкин
Для небольших нагрузок у Timeweb осталось 100 бесплатных гигабайт в месяц.
Про collocation не думали, потому что непонятно, что именно нужно. Это первый такой проект на Орбите и я много нового узнаю каждую неделю. Сейчас у нас уже 3й сервер, например.
Плюс, мы же Орбиту развиваем - и вырабатываем решения, которые должны быть универсальны более-менее для всех. Collocation явно не такое.
Трафик на Timeweb начали учитывать с 14го октября и сейчас у нас 118 Тб, из них 10 только за сегодня.
Интересный проект, буду следить за его развитием. Спасибо за информацию
Orbita
The latest news about the project and new functionality. You can log in to the admin panel with login and password demo. For help, please contact help@orbitacms.ru
Online
Егор
11/8/2024, 12:30:43
Интересный проект, буду следить за его развитием. Спасибо за информацию
Александр Наумов
11/5/2024, 20:24:52
Спасибо! Проблема решилась сама собой, пока не понял как, делал только перезагрузку nginx.
Василий Наумкин
8/19/2024, 04:44:55
Разобрался, это глюк редактора после обновления. Иногда он формирует массив с блоками, а иногда, поч...
Александр Наумов
7/9/2024, 00:06:38
Случайно забрел на Тинькофф Журнал https://journal.tinkoff.ru/friendship-ended-with-patreon/ и сразу...
Александр Наумов
6/25/2024, 10:22:06
Спасибо!!!
Александр Наумов
6/7/2024, 15:01:19
Василий, спасибо большое!
Александр Наумов
5/12/2024, 12:30:15
Спасибо!
Камиль Галиев
12/1/2023, 11:56:40
Да, теперь работает нормально!
Subscriptions
Тестировщик
RUB 100 per month
Базовая подписка. Все платежи проводятся в тестовом режиме!
Подписчик
RUB 250 per month
Средний уровень подписки. Все платежи проводятся в тестовом режиме!
Советник
RUB 500 per month
Максимальный уровень подписки. Все платежи проводятся в тестовом режиме!