Продолжение обсуждения из темы Перенос экземпляра Discourse на другой сервер:
Одной из проблем при миграции экземпляра Discourse на новый сервер или даже при восстановлении резервной копии на только что созданном экземпляре является то, что все активные сессии пользователей могут быть утеряны, что потребует от них повторного входа. В зависимости от сообщества это может быть нежелательно, поскольку:
- Некоторые пользователи могут отказаться от участия, если у них возникнут трудности с повторным входом.
- Некоторым пользователям потребуется помощь в восстановлении паролей.
- Некоторые пользователи могут создать новые учётные записи, что приведёт к разделению их истории публикаций и заметок о пользователях, оставив при этом «зомби-аккаунт».
Потеря сессий может произойти из-за того, что куки сессий Discourse зашифрованы с помощью случайно сгенерированного секретного ключа, который по умолчанию хранится в Redis. Данные Redis не включаются в резервную копию, поэтому при восстановлении сайта на новом хосте генерируется новый секретный ключ.
Преимущество такого подхода заключается в том, что скомпрометированный файл резервной копии не содержит ключа, необходимого для взлома сессий пользователей, что могло бы иметь крайне негативные последствия.
Однако при миграции экземпляра Discourse эту проблему можно обойти, выполнив следующие шаги по копированию секретного ключа, что позволит выполнить миграцию хоста с сохранением сессий пользователей.
Шаг 1: Получение секретного ключа
Зайдите в существующий экземпляр Discourse, запустите консоль Rails и получите секретный ключ:
admin@host:/var/discourse$ ./launcher enter app
root@host:/var/www/discourse# rails console
[1] pry(main)> GlobalSetting.safe_secret_key_base
=> "90.......fed"
Запишите значение, выведенное в последней строке, и храните его в надёжном месте.
Шаг 2: Установка секретного ключа в новом экземпляре
Предполагая, что у вас уже подготовлен экземпляр Discourse для приёма резервной копии с целью миграции вашей установки, отредактируйте файл app.yml, чтобы установить полученный вами секретный ключ. Добавьте его в секцию env:
env:
DISCOURSE_SECRET_KEY_BASE: "90.......fed"
После добавления этого параметра пересоберите экземпляр:
admin@newhost $ launcher rebuild app
Шаг 3: Проверка секретного ключа в новом экземпляре
Это тот же процесс, что и в Шаге 1, но команды выполняются на новом хосте:
admin@newhost:/var/discourse$ ./launcher enter app
root@newhost:/var/www/discourse# rails console
[1] pry(main)> GlobalSetting.safe_secret_key_base
=> "90.......fed"
Выведенный секретный ключ должен быть точно таким же, как и ключ, полученный на Шаге 1.
Шаг 4: Продолжение миграции
Переведите исходный экземпляр Discourse в режим только для чтения, создайте резервную копию, скопируйте её на целевой экземпляр Discourse и восстановите. Обновите записи DNS (или используйте обходной путь через файл hosts для тестирования), чтобы пользователи перенаправлялись на новый сайт.
Ранее активные сессии теперь должны сохраниться на новом хосте.
Предупреждение
Категорически не следует использовать один и тот же секретный ключ для нескольких экземпляров Discourse. Обладание секретным ключом позволит злоумышленнику расшифровать и изменить свою куку сессии на сайте, что может привести к серьёзным проблемам с безопасностью.
Как всегда, потренируйтесь и проверьте описанные выше шаги на тестовом экземпляре или в песочнице перед работой с реальным экземпляром Discourse. Готовьтесь к успеху!
И в заключение, огромная благодарность @david за описание этого метода — я лишь протестировал его и оформил здесь (и, пожалуйста, не стесняйтесь редактировать или улучшать этот материал!).