Привет! Я только что настроил новую установку 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) в таком случае очень полезно.
Следуя вашим советам, я думаю, что выберу RDS, но привяжусь к конкретной коммиту репозитория discourse_docker. Хотя это, вероятно, усложнит процесс обновлений, я надеюсь, что в случае проблем с сервером все данные будут надежно сохранены в RDS, и мы сможем быстро восстановить работоспособное состояние без ручного восстановления.
(По-моему, того же результата можно добиться и с помощью EBS, но из-за шифрования томов и необходимости использовать unix-команды для монтирования/размонтирования тома между экземплярами я немного боюсь процесса автоматизации этого).