Представляем предварительно скомпилированные JS-активы для тех, кто размещает сервисы самостоятельно

:mega: Discourse теперь публикует заранее собранные JavaScript-ресурсы, что значительно ускорит установку и обновления, особенно для серверов с ограниченными ресурсами.


Компиляция и оптимизация JavaScript-ресурсов всегда были одной из самых ресурсоемких задач при работе с Discourse. По мере развития нашей кодовой базы и экосистемы JavaScript этот процесс стал еще более требовательным.

В наших тестах эти изменения сократили время сборки ресурсов на виртуальном сервере Digital Ocean с 1 ГБ ОЗУ с 45 минут до всего 3 минут.

Как это работает?

При каждом коммите, слитом в ветку main, рабочий процесс GitHub Actions собирает и упаковывает ресурсы в файлы .tar.gz (один для продакшена, один для разработки). Эти пакеты публикуются через релизы GitHub в специальном репозитории. Мы гарантируем публикацию ресурсов до того, как любой коммит перейдет в статус tests-passed.

При создании собственного сайта Discourse теперь проверяет наличие соответствующего заранее собранного пакета и загружает его. Затем поверх него собираются плагины. Если пакет не найден или произошла ошибка, Discourse возвращается к сборке из исходного кода.

Влияет ли это на конечных пользователей?

Нет. Ресурсы по-прежнему предоставляются конечным пользователям с вашего собственного сервера или CDN.

Можно ли отказаться от этой функции?

Да! Если вы предпочитаете собирать ресурсы самостоятельно и у вас достаточно мощный сервер, установите DISCOURSE_DOWNLOAD_PRE_BUILT_ASSETS: 0 в вашем файле app.yml.

Что если я использую форк или модифицированную версию Discourse?

Пакеты ресурсов именуются по хешу коммита. Если вы используете форк, пакет не будет найден, и ресурсы будут собираться из исходного кода. Если ваша копия Discourse модифицирована (т. е. рабочее дерево git не чистое), Discourse не попытается загрузить пакет.

А как насчет других шагов сборки, связанных с ресурсами?

На данный момент эта оптимизация применяется только к основным JS-ресурсам. В будущем мы можем расширить её на некоторые плагины и другие шаги, такие как сжатие gz/brotli.

А как насчет стабильной ветки?

Заранее собранные ресурсы для стабильной ветки будут публиковаться начиная со следующего крупного обновления версии, запланированного на август 2025 года.

55 лайков

Только что выполнил пересборку https://discourse-on-a-pi5.falco.dev/, и это заняло всего 3 минуты 35 секунд — это очень впечатляет!

23 лайка

Настройка из двух контейнеров и без базы данных занимает около 8 минут.

5 лайков

Ого :scream: :person_bowing:

У меня в конфигурации нет этой опции. Нужно ли мне добавить её со значением 1, чтобы подключиться? Или всё это произойдёт автоматически при следующем обновлении?

FYI вот что происходит, когда ваша установка не соответствует требованиям:

I, [2025-08-01T06:43:09.560655 #1]  INFO -- : > cd /var/www/discourse && su discourse -c 'bundle exec rake assets:precompile:build'
[assemble_ember_build] Ограничение размера кучи Node.js меньше 2048 МБ. Устанавливаем --max-old-space-size=2048 и CHEAP_SOURCE_MAPS=1
[assemble_ember_build] Файл информации о сборке не найден.
[assemble_ember_build] Рабочая директория Git не чистая. Невозможно загрузить предварительно собранные ресурсы.
[assemble_ember_build] Запуск полной сборки ядра...

Я вношу некоторые изменения в config/initializers/100-sidekiq.rb в app.yml, чтобы добавить поддержку счетчика повторных попыток для всех задач Sidekiq (полагаю, это единственный способ добиться этого, и не через плагин? Но можно пересмотреть), поэтому, считаю, этого достаточно, чтобы не соответствовать требованиям…

2 лайка

Это включено по умолчанию. Указывать конфигурацию нужно только в том случае, если вы хотите отключить функцию.

Да, именно так. Любые изменения в git-репозитории приведут к остановке процесса.

Касательно Sidekiq: если вы создадите тему об этом, я уверен, мы сможем найти способ реализовать это либо через плагин, либо, возможно, внедрить новое GlobalSetting для этой цели.

4 лайка

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

time ./launcher rebuild app

(или аналогичную для вашего контейнера, если вы используете не один контейнер)

В конце сборки она покажет затраченное время :stopwatch:

11 лайков

Приятное изменение. У меня получилось:

real 2m41.898s
user 0m0.372s
sys 0m0.583s

Спасибо за вашу работу

4 лайка

Вау, дата определения Impressive уже установлена? Моя версия — a81eaacb1c53581912519ae6574fa3523ef215dd. Мне стоит подождать перед пересборкой?

О, здорово :star_struck:

Спасибо тебе, @merefield — не могу поверить, что я узнаю об этом только сейчас, спустя 7 лет и несколько сотен пересборок через командную строку :grin:

5 лайков

Если вы используете наш стандартный канал релизов, вы можете пересобрать прямо сейчас и получить все преимущества.

4 лайка

The Only Ones! Спасибо.

1 лайк

4 минуты на восстановление! Я сделал это несколько раз сегодня, полностью перенёс! Впечатляющий Discourse! При следующем восстановлении напомню использовать эту прекрасную команду. Спасибо всем.

1 лайк

Возможно, стоит ограничить это только app/assets и config/locales для ядра и плагинов? Сейчас это также вызывает полную пересборку при применении только Ruby-патчей (например, по безопасности).

Да, это возможно, мы можем ещё больше ограничить это. Однако в случае с обновлениями безопасности они довольно часто затрагивают и JS-приложение… поэтому полная пересборка всё равно потребуется.

2 лайка

Только что попробовал, это фантастика, около 3 минут! Какая умная и потрясающая функция. :star_struck:
Теперь хочется установить каждый существующий плагин по очереди. :rofl:

5 лайков

Правда-правда, это здорово

На самом деле, если я правильно понимаю, это только усугубит ситуацию.

Дело в том, что он может использовать только скомпилированные ресурсы для встроенного базового кода (кстати, это во многом объясняет недавнее решение включить популярные базовые плагины в сборку!)

При сборке ему приходится компилировать и объединять любой «неизвестный» плагин, поэтому наличие множества таких плагинов значительно замедлит процесс.

2 лайка

Обновление до версии 3.6.0.beta1 завершено, но собранные заранее ресурсы не найдены

Загрузка и извлечение https://get.discourse.org/discourse-assets/3.6.0.beta1-d63a2431/production.tar.gz...
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
100     9  100     9    0     0     24      0 --:--:-- --:--:-- --:--:--    24
curl: (22) Запрошенный URL вернул ошибку: 404
[assemble_ember_build] Не удалось загрузить собранные заранее ресурсы: Команда завершилась с кодом ошибки 22: curl
[assemble_ember_build] Запуск полной сборки ядра...

2 лайка

Вы нацеливаетесь на тег beta для этой установки?