Предоставить статический экспорт сайта Discourse во время обновления Discourse

Сейчас я администрирую два отдельных форума Discourse, каждый из которых размещён на собственном экземпляре Scaleway и обновляется следующим образом:

# Обновление Docker-окружения Discourse
cd /var/discourse
git pull origin master

# Пересборка Discourse
/var/discourse/launcher rebuild app

При этом форум становится недоступен примерно на 5–15 минут.

Один из сайтов находится за прокси Cloudflare, поэтому он без проблем отдаёт кэшированную офлайн-версию. Второй же не использует Cloudflare.

Интересует, может ли Discourse экспортировать статическую версию сайта, содержащую только, скажем, публичные темы для анонимного пользователя, с отключёнными кнопками взаимодействия и баннером вверху с текстом «Этот сайт временно работает в режиме только для чтения, так как в настоящее время выполняется обновление», и отдавать эту версию во время обновления форума, а после восстановления работы форума — удалять статический кэш.

1 лайк

Если DNS управляется Cloudflare (даже если прокси не используется), обновление обычно происходит за несколько секунд. Во время обновления вы можете перенаправить домен на другой сервер (например, на страницу обслуживания на Netlify/Vercel/Firebase/Surge и т. д., где все пути указывают на файл index.html).

Я ещё не пробовал, но возможно, можно временно обслуживать другой бэкенд с помощью resolveOverride в Cloudflare Worker (функция “serverless”).

1 лайк

Да, будь то изменение DNS или запуск временного контейнера Docker с nginx, слушающего на том же порту и обслуживающего что-то — это самая простая часть.

Сейчас самая сложная часть — это статический экспорт с отключенной интерактивностью и добавленным баннером, который должен корректно работать на страницах тем, постов, категорий и главной страницы (поиск может быть отключён). Затем нужно интегрировать эту замену в процесс обновления, но это, в общем-то, несложно.

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

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


Интересно, подойдёт ли вариант из How do I export the complete forum as static html pages? - #3 by wangerin, хотя, похоже, всё равно потребуется отключить интерактивные элементы и добавить баннер.

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

3 лайка

Да, я так думаю. Можете направить меня к рекомендуемым вариантам с двумя контейнерами?

(Move from standalone container to separate web and data containers), но, возможно, вам потребуется перетащить и поискать другие варианты.

Также узнайте о переменной SKIP_POST_DEPLOYMENT_MIGRATIONS=1. Кратко: установите её при пересборке контейнера bed, чтобы не повредить базу данных существующего контейнера, а затем выполните миграцию без неё после запуска нового контейнера.

2 лайка