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

Как уже знают читатели моего телеграм-канала, сейчас я работаю над запуском персонального сайта Стасу Васильеву на Орбите - 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

14 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 в докере?
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
Василий Наумкин
10/15/2024, 14:03:13
Это логика из моего движка Vesp. У каждого контроллера может быть scope, то есть требуемое разрешен...
acidtmn
9/12/2024, 16:24:51
Посоветуйте, как запустить Орбиту на Synology в докере?
Василий Наумкин
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
Максимальный уровень подписки. Все платежи проводятся в тестовом режиме!