Вызывать AdminDashboardGeneralData.refresh_stats при загрузке?

https://www.pfaffmanager.com/ получает информацию из /admin/dashboard/general.json для получения данных о версии. Это очень удобно — иметь такую возможность прямо в интерфейсе. К сожалению, данные обновляются периодически, а не при запуске сервера, поэтому после пересборки информация остаётся неактуальной в течение довольно долгого времени (до 30 минут), пока не сработает следующее обновление. Мой план — заставить инструменты Ansible вручную вызывать AdminDashboardGeneralData.refresh_stats после запуска нового контейнера, но это кажется немного нелогичным.

Разумно ли запускать эту задачу при загрузке, а не каждые 30 минут? Есть ли способ обновлять данные без перезагрузки? Если нет, то почему задача выполняется каждые 30 минут? По крайней мере, я так предполагаю. Я подтвердил, что выполнение refresh_stats выше приводит к обновлению general.json.

В целом мы не любим запускать что-либо «при загрузке». Хотя это может иметь смысл в среде с одним сервером без мульти-сайтов, при масштабировании всё усложняется.

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

Мы также стремимся убедиться, что серверы могут успешно загружаться, даже если база данных или Redis находятся в режиме только для чтения.

В данном конкретном случае с pfaffmanager у вас есть пользовательский плагин и/или шаблон discourse_docker, работающий на сайтах? Извне Discourse вы можете запустить его так:

rails runner "About.refresh_stats

Спасибо. Всё это имеет смысл.

Нет! Один из ключевых принципов заключается в том, что всё работает точно так же, как при стандартной установке. Зависимостей, специфичных для pfaffmanager, нет вообще. Если кто-то увидит здесь, что нужно, например, выполнить пересборку, добавить плагин или переменную окружения в app.yml, pfaffmanager сделает это точно так же, как если бы пользователь знал, что такое ssh, и мог вводить команды. При установке используется discourse-setup, при обновлении — ./launcher rebuild (или bootstrap, destroy, start для конфигураций с двумя контейнерами). Если версия Postgres устарела, выполняются процедуры из статьи Обновление PostgreSQL 13, и так далее. Несколько раз меня соблазняло создать дополнительный плагин поддержки, но я в основном хочу этого избежать. У меня уже хватает дел с Ansible, Rails и Ember — добавлять ещё один компонент не очень привлекательно.

Однако тот момент с runner оказался очень полезным. Я просто запущу это после перезапуска только что собранного контейнера:

docker exec web_only bash -c 'rails runner AdminDashboardGeneralData.refresh_stats'

Огромное спасибо. Это было именно то, что мне нужно.