Бессессийный дискурс с использованием AWS RDS/S3

Привет! Я только что настроил новую установку Discourse — спасибо за всю вашу тяжелую работу, благодаря которой всё так просто!

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

Встроенная функция резервного копирования и восстановления отличная, и я уже провёл несколько тестовых запусков с её помощью. Я храню app.yml, файлы загрузок и резервные копии в S3.

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

Мой вопрос: если я сделаю это, то теоретически ли я буду в безопасности, чтобы завершить работу экземпляра, а затем на новом сервере просто клонировать Discourse, получить свой app.yml и запустить ./launcher rebuild app? ИЛИ есть какое-то другое состояние помимо PostgreSQL/загрузок/app.yml? Возможно, в Redis?

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

Я думаю, что это в основном верно. Вам нужно убедиться, что у вас не запущены два экземпляра одновременно. При сборке нового контейнера вы выполните миграцию базы данных, что потенциально сделает её непригодной для использования другим контейнером (этого можно избежать с помощью skip_post_deployment_migrations). Данные в Redis считаются эфемерными и не резервируются. Я не совсем уверен, как и восстанавливается ли какая-то часть из них, но вам это, вероятно, не важно.

@phil22 — Я работал над настройкой, похожей на ту, что вы предлагаете, и она гораздо тоньше, чем вы думаете:

  • Команда Discourse выпускает несколько релизов в месяц, поэтому при клонировании на новый EC2 вам нужно оставаться на вашей исходной версии. Обычно можно бездумно обновлять приложение, но некоторые релизы включают серьёзные обновления базы данных (PG 12 → PG 13), и если вы не отслеживаете это и забываете обновить внешнюю RDS, вы можете оказаться в тупике.

  • Мы добились успеха, используя на EC2 том EBS, который также настроен для монтирования внутри контейнера вашего приложения. С его помощью мы храним всё содержимое папки /shared. Таким образом, даже когда ваши экземпляры EC2 появляются и исчезают, всё содержимое этой папки сохраняется на EBS. Кроме того, иногда вы можете передумать хранить файлы в S3. Наличие альтернативного места для хранения загруженных файлов (например, папка /shared) в таком случае очень полезно.

Надеюсь, это поможет.

Большое спасибо вам обоим, @pfaffman и @Poster_Nutbag — очень полезно!

EBS действительно звучит как более подходящий вариант — это позволит нам не отклоняться от discourse/docs/INSTALL-cloud.md at main · discourse/discourse · GitHub.

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

(По-моему, того же результата можно добиться и с помощью EBS, но из-за шифрования томов и необходимости использовать unix-команды для монтирования/размонтирования тома между экземплярами я немного боюсь процесса автоматизации этого).