Миграция на новый сервер с новой базой данных и новыми S3-бакетами для резервного копирования и загрузки файлов

Здравствуйте,

В настоящее время я занимаюсь миграцией нашего сервера с существующей развёртки на базе Bitnami (довольно старой версии) на официально поддерживаемую установку в AWS с использованием последней версии Discourse. Эта новая установка использует внешний экземпляр Elasticache и RDS, а также будет применять S3 для резервных копий и загрузок.

У меня два вопроса:

  1. Старый сервер Discourse работает на очень старой версии. Запустятся ли все необходимые команды обновления при выполнении резервного копирования и восстановления на новом сервере Discourse?
  2. Если я скопирую файл резервной копии в новый контейнер Docker с Discourse на новом сервере и инициирую восстановление через командную строку, будут ли перезаписаны новые значения бакета, которые я указал в конфигурации, в процессе восстановления, или будут использованы мои новые значения? Я предполагаю, что моя новая база данных будет заполнена данными из резервной копии, а после выхода из контейнера и запуска команды ./launcher rebuild app будут применены мои новые значения S3.

Если мои предположения верны, то перед выполнением восстановления я должен скопировать содержимое старых бакетов S3 в новые?

Есть ли какие-либо подводные камни при выполнении такого типа миграции с помощью резервной копии?

Заранее спасибо.

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

Две причины, по которым нам нужны новые бакеты:

  1. Я не на 100% уверен, что миграция с Bitnami пройдет без сбоев, поэтому мы не хотим затрагивать существующие данные на случай, если нам придется отменить миграцию.
  2. Мы изменили схему именования бакетов, поэтому решили, что проще будет создать два совершенно новых бакета для этой задачи.

Меня больше всего беспокоит пункт 1, поэтому я просто проявляю особую осторожность.

Какие проблемы вы видите с новым бакетом для загрузки? Старый сервер Discourse будет переведен в режим только для чтения. План таков: после запуска и проверки нового сервера мы остановим старый сервер, изменим DNS на указание нового сервера, затем очистим кэш CDN (CloudFront) и только после этого откроем доступ для публики.

Я упустил, что вы собираетесь перенести данные из старых бакетов. Посмотрел в AWS — всё выглядит просто. Если бы это было на мне, я бы не стал менять бакеты до переезда на AWS или на новый сервер где-либо ещё.

Официально поддерживаемой? Не уверен в этом.

Настоятельно рекомендую обновить Discourse перед переездом на новый сервер.
На старом экземпляре, если этого ещё не сделано, рекомендую перенести конфигурацию S3 в app.yml перед переездом.

Это можно легко протестировать, не затрагивая продакшн.

Лично я бы сделал всё возможное, чтобы не выполнять эти две задачи одновременно:

  1. Проверьте, можно ли вообще избежать перемещения бакетов.
  2. Если нет, сделайте это после миграции с Bitnami.

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

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

Спасибо за это. То есть, знакомство и, возможно, существующая инфраструктура.

Спасибо за ваши комментарии по этому вопросу.

Как уже отметил @RGJ, наша корпоративная инфраструктура использует внешние сервисы для таких задач, как кэширование, базы данных и т. д., поэтому мы применяем Elasticache и RDS. Это позволяет нам обеспечить полное резервное копирование и избыточность для этих сервисов, а также усилить контроль безопасности. С точки зрения Discourse это официальная и поддерживаемая установка — мы просто используем другой набор шаблонов: discourse_docker/samples/web_only.yml at main · discourse/discourse_docker · GitHub (возможно, слово «стандартная» было немного вводящим в заблуждение, приношу извинения).

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

Могу ли я спросить, какие проблемы могут возникнуть, если мы выполним восстановление с использованием существующих бакетов, а затем обновим файл app.yml, чтобы он ссылался на новые бакеты? Разве все переменные окружения DISCOURSE_ не имеют приоритета над любыми настройками в базе данных (если это применимо)? Или есть что-то ещё, что может вызвать проблемы?

Я бы так не делал.

Потому что, если вы сделаете это до миграции и что-то пойдёт не так, у вас возникнет проблема на старой инстансе Bitnami, а не на свежеустановленном стандартном. Кроме того, помимо старой версии, даже упоминание слова Bitnami значительно снизит шансы на получение поддержки здесь, на meta.

Да, имеют.

Ой, извини, Ричард, я неправильно понял твой пункт про изменения имен в S3 :+1:

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

Спасибо за всю твою помощь с этим до сих пор.

И да, слово на «Б» заставляет людей замолкать, поэтому хорошо, что мы отходим от него :slight_smile:

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

Отлично.

Ещё один вопрос, если можно: когда я запускаю восстановление из командной строки внутри контейнера Discourse, используется ли существующий файл конфигурации /var/www/discourse/config/discourse.conf для сведений о подключении к базе данных, подключении к Redis и т. д., или этот файл перезаписывается данными из файла резервной копии?

Спасибо ещё раз!

discourse.conf генерируется из app.yml и не включается в файл резервной копии.

Обычно параметры, указанные в discourse.conf, имеют приоритет над настройками сайта.

Таким образом, если у вас есть параметр setting_foo в базе данных, вы можете переопределить его, указав DISCOURSE_SETTING_FOO в файле app.yml. Это приведёт к генерации параметра setting_foo в файле discourse.conf.

Супер. Большое спасибо за всю помощь, @RGJ. Я напишу, когда миграция завершится, чтобы сообщить, как всё прошло.

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

RDS[1] — это PostgreSQL, а ElastiCache — это Redis, это допустимо.

Это должно сработать, мы делаем так для клиентов, переходящих на наше хостинг-решение.

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


  1. ok, PostgreSQL RDS ↩︎

Большое спасибо @supermathie

Я сделаю резервное копирование и восстановление без изменения названий бакетов, как также предложил @RGJ. Как я уже говорил, моя забота заключалась в том, чтобы никак не затронуть существующие данные на сервере, но если я сначала сделаю резервную копию существующих бакетов и убедлюсь, что существующий сервер находится в режиме только для чтения во время миграции, я думаю, что целостность загруженных данных в бакетах будет хорошо защищена.

Спасибо за информацию! Я ненавижу, когда я так смело демонстрирую свою неосведомленность.

Уточнение: если основная версия совпадает с той, что мы поставляем

Всем привет,

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

Спасибо всем за помощь в этом.