Режимы только для чтения в Discourse

:bookmark: Это руководство объясняет различные режимы только для чтения, доступные в Discourse, как их включать и отключать, а также сценарии, в которых может потребоваться использование каждого режима.

:person_raising_hand: Требуемый уровень пользователя: Администратор

Управление активной онлайн-сообществом на Discourse иногда требует от администраторов временно ограничить активность пользователей. Такие ситуации могут включать проведение обслуживания сервера, создание резервных копий или миграцию серверов. В такие моменты крайне важно ограничить активность на форуме, не закрывая полностью доступ для пользователей.

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

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

Понимание режимов только для чтения

Discourse поддерживает два различных уровня режимов только для чтения, адаптированных под различные административные потребности. Это:

  1. Полный режим только для чтения
  • Ограничивает все операции записи на форуме, предотвращая создание или изменение контента любыми пользователями, например, публикацию сообщений, комментарии или лайки.
  • Позволяет «заморозить» форум в его текущем состоянии, так что пользователи могут продолжать читать и перемещаться по существующему контенту без влияния на базу данных.
  • Отключает возможность изменения любых настроек сайта администратора или кастомизаций сайта, чтобы сохранить текущее состояние базы данных.
  • Отключает новые входы в систему для обычных пользователей. Администраторы все еще могут входить, используя поток входа администратора по электронной почте (/u/admin-login).
  • API-вызовы могут читать (GET), но не могут записывать (POST/PUT/DELETE).
  • Очередные исходящие вебхуки будут доставлены, но новые вебхуки не будут запущены, так как действия, вызывающие их, будут заблокированы.
  • Входящие вебхуки (отскок электронной почты) будут заблокированы с ответом 503. Провайдеры электронной почты будут повторять попытку в соответствии со своими собственными графиками задержки.
  1. Режим только для записи сотрудников
  • Ограничивает обычных пользователей от операций записи на форуме, таких как публикация сообщений, комментарии или лайки. Нестандартные пользователи ограничены операциями только для чтения, но все еще могут входить в свои учетные записи.
  • Позволяет активности администраторов и модераторов продолжаться в обычном режиме. Администраторы могут изменять настройки сайта, а сотрудники могут выполнять операции записи, такие как публикация, лайки или изменение профилей.
  • API-вызовы могут читать (GET). Только API-ключи сотрудников могут записывать (POST/PUT/DELETE).
  • Очередные исходящие вебхуки будут доставлены. Действия сотрудников могут запускать новые исходящие вебхуки, которые также будут успешными, но действия не сотрудников не будут запускать вебхуки.
  • Входящие вебхуки (отскок электронной почты) будут заблокированы с ответом 503. Провайдеры электронной почты будут повторять попытку в соответствии со своими собственными графиками задержки.

Эти режимы обеспечивают гибкость в управлении работоспособностью форума в критические административные периоды.

Как включить/отключить режимы только для чтения

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

Полный режим только для чтения

Через консоль Rails

Если у вас есть доступ к установке Discourse, используйте командную строку Rails Discourse для выполнения следующей команды после входа в контейнер Docker с помощью ./launcher enter app, а затем запуска консоли Rails с помощью rails c:

Discourse.enable_readonly_mode(Discourse::USER_READONLY_MODE_KEY)

Через панель администратора

Если у вас есть административный доступ через веб-интерфейс, вы можете перейти в Admin > Backups > Enable Read-Only Mode, чтобы включить режим только для чтения.

Чтобы отключить режим только для чтения, выполните следующую команду Rails:

Discourse.disable_readonly_mode(Discourse::USER_READONLY_MODE_KEY)

Или используйте панель администратора, перейдя в Admin > Backups > Disable Read-Only Mode.

Режим только для записи сотрудников

:discourse: Режим только для записи сотрудников можно включить/отключить только через консоль Rails Discourse. Если ваш сайт размещен компанией Discourse, пожалуйста, обратитесь в team@discourse.org, если вы хотите включить или отключить этот режим.

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

Discourse.enable_readonly_mode(Discourse::STAFF_WRITES_ONLY_MODE_KEY)

Чтобы отключить:

Discourse.disable_readonly_mode(Discourse::STAFF_WRITES_ONLY_MODE_KEY)

Лучшие практики

  • Своевременное информирование: Сообщите сообществу о запланированных периодах только для чтения заранее, чтобы установить правильные ожидания.
  • Тестирование: Перед внедрением этих режимов во время критических операций проведите тесты в периоды низкой нагрузки, чтобы понять их влияние.
  • Документирование: Ведите подробные записи о том, когда и почему каждый режим был включен или отключен, чтобы помочь в будущем планировании операций.

Часто задаваемые вопросы

  • Сколько времени занимает включение/отключение режима только для чтения?

    • Изменение вступает в силу немедленно. Однако опыт пользователей может незначительно различаться в зависимости от их действий в период перехода.
  • Помогите! Я заблокирован от доступа к своему сайту из-за режима только для чтения — что я могу сделать, чтобы снова получить доступ к сайту?

  • Я заметил, что в discourse/lib/discourse.rb перечислены другие режимы READ-ONLY. Что делают эти режимы?

    • READONLY_MODE_KEY в основном используется для процесса резервного копирования и восстановления и запускается самим приложением. Этот режим также можно включить или отключить через командную строку Discourse с помощью discourse enable_readonly и discourse disable_readonly. Однако этот ключ не сохранится после перезапуска контейнера.
    • USER_READONLY_MODE_KEY используется, когда администратор нажимает кнопку только для чтения в интерфейсе администратора. Особенность этого ключа заключается в том, что мы не устанавливаем его как истекающий ключ, так как режим только для чтения, включенный пользователем, должен сохраняться после перезапуска контейнера. Другие ключи устанавливаются с TTL (60 секунд для READONLY_MODE_KEY, 300 секунд для PG_READONLY_MODE_KEY), и у нас есть поток, который продлевает срок действия каждые 30 секунд, чтобы гарантировать, что приложение никогда не застрянет в режиме только для чтения.
    • PG_READONLY_MODE_KEY и PG_FORCE_READONLY_MODE_KEY используются для переключения резервного копирования PostgreSQL. Первый устанавливается как истекающий ключ, а второй — как не истекающий.
9 лайков

Я не вижу разницы! Можно ли скорректировать эти описания, если разница действительно существует?

1 лайк

Я обновил руководство, чтобы внести здесь дополнительную ясность. Пожалуйста, дайте нам знать, если у вас останутся какие-либо вопросы о режимах только для чтения. :slightly_smiling_face:

1 лайк

Но что делает

discourse enable_readonly?

Он использует READONLY_MODE_KEY, который устанавливает ttl равным 60, поэтому режим отключается через некоторое время. Теперь я вижу, что

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

На мой взгляд, гораздо более разумным поведением для discourse enable_readonly было бы выполнение Discourse.enable_readonly_mode(Discourse::STAFF_WRITES_ONLY_MODE_KEY). Жаль, что я не обратил на это внимания много лет назад!

Могу ли я отправить PR, например, такой:

  desc "enable_readonly", "Включить режим только для чтения, разрешив запись сотрудникам"
  def staff_writes_only
    load_rails

    Discourse.enable_readonly_mode(Discourse::STAFF_WRITES_ONLY_MODE_KEY)
    puts 'Сайт теперь в режиме только для чтения с разрешённой записью для сотрудников.'
  end

Я не очень хорошо знаком с этим, но мне кажется, что было бы запутанно, если бы enable_readonly_mode переводил сайт в режим staff_writes_only_mode. Это разные режимы: при выполнении определённых операций вы не хотите, чтобы у сотрудников была возможность записи в БД (например, во время восстановления их права будут удалены).

Возможно, вместо этого мы могли бы сделать здесь несколько других вещей:

  1. уточнить, что режим «только для чтения» устанавливает TTL в описании задачи
  2. добавить задачу, вызывающую keep_readonly_mode, чтобы её можно было продлить более чем на 60 минут
  3. добавить задачи enable_staff_writes_only и disable_staff_writes_only
2 лайка

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

Я почти уверен, что скрипт восстановления сам включает режим только для чтения, поэтому эта команда на него не влияет.

Я бы предпочёл, чтобы при включении режима явно указывалось, что он установлен на X минут. Описание найти не так-то просто.

Возможно. Не совсем понятно, кто будет её использовать.

Это было бы отлично!

Также нам нужно чётко разграничить rake-задачи и команды, доступные через утилиту discourse.

2 лайка

Согласен. Есть ли у вас возможность оформить это как PR? То же самое касается команд enable_staff_writes_only и disable_staff_writes_only, если возможно. Спасибо!

3 лайка

Меня интересует, какие часы останавливаются после включения режима только для чтения? Будут ли происходить обновления тем после установки режима только для чтения?

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

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

Это странно. Я вижу кнопки «Включить» и «Отключить», и они работают нормально. Не могли бы вы прислать скриншот того, что вы видите?

Привет, @Lucian_Chung,

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