Перенос экземпляра дискуссии на новый сервер

Прежде чем задавать вопрос, вы уже искали информацию? Нажмите :magnifying_glass_tilted_left: в правом верхнем углу для поиска.

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

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

Проблема

В настоящее время я использую сервер Hetzner для размещения экземпляра Discourse. К нему подключены тома для Uploads и Backups. Текущие контейнеры и образы Docker, а также файл app.yml и другие конфигурационные файлы, хранятся непосредственно на сервере в каталоге /var/discourse.

Этот сервер работает уже 3–4 года и более, и всё это время я постоянно сталкивался с проблемой нехватки места на самом сервере (не в томах). Каждый раз, когда я пытался пересобрать или перезапустить приложение, возникали проблемы с пространством, так как образы и контейнеры Docker устанавливались на локальный сервер, а не в том. Мне постоянно приходилось удалять Docker, а также все образы и контейнеры, чтобы выполнить чистую переустановку и затем пересобрать приложение. Кроме того, я полагаю, что данные SQL также хранятся на локальном сервере, а не в томе.

Цели

Я не уверен, какой вариант будет для меня наилучшим в будущем. Стоит ли переместить определённые папки или файлы в новый том для базы данных Postgres и образов Docker? Если да, то я был бы очень признателен за помощь в этом вопросе. Или же лучше начать с нуля, запустив новый сервер, создав резервную копию текущего сервера и восстановив её на новом сервере с правильно настроенными томами?


Исходя из всего вышесказанного, я хотел бы получить помощь в настройке файла app.yml таким образом, чтобы для всех ресурсов, занимающих место (например, резервные копии, загрузки, база данных или образы Docker), были правильно настроены тома. Это позволит мне масштабировать их по отдельности при необходимости.

Я смогу предоставить свой файл app.yml позже сегодня, так как сейчас нахожусь на работе и хочу подготовиться заранее.

Я размещаю свой Discourse на AWS и пока добился отличных результатов, храня /var/discourse на отдельном подключаемом томе EBS и подключая этот том к разным экземплярам EC2 по мере необходимости миграции. Я даже полностью изменил архитектуру с x64 на ARM (перешёл с экземпляров EC2 t3a.large на r7g.large), и после повторного подключения тома /var/discourse я снова был онлайн после простого запуска launcher rebuild app, даже с учётом смены архитектуры.

В сухом остатке: если ваш /var/discourse хранится на подключаемом томе, то вы сохраняете полное состояние своего форума в практически переносимом виде. Как только вы сможете настроить хост и установить Docker, вы сможете подключить к нему том /var/discourse, выполнить launcher rebuild app и запустить форум. (При условии, что такие параметры, как имя хоста и другие настройки, указанные в app.yml, остаются неизменными между хостами.)

Не могли бы вы привести пример файла app.yml для такой настройки? А также так ли это просто, как переместить содержимое из «/var/discourse» на другой том, или мне нужно клонировать репозиторий в новый том?


А что насчет файлов базы данных?

Вот обезличенная копия моего текущего рабочего файла app.yml:

## это шаблон контейнера Docker Discourse «всё в одном», автономный
##
## После внесения изменений в этот файл вы ОБЯЗАНЫ выполнить пересборку
## /var/discourse/launcher rebuild app
##
## БУДЬТЕ *ОЧЕНЬ* ОСТОРОЖНЫ ПРИ РЕДАКТИРОВАНИИ!
## YAML-ФАЙЛЫ ЧРЕЗВЫЧАЙНО ЧУВСТВИТЕЛЬНЫ К ОШИБКАМ В ПРОБЕЛАХ ИЛИ ВЫРАВНИВАНИИ!
## при необходимости проверьте этот файл на сайте http://www.yamllint.com/

templates:
  - "templates/postgres.template.yml"
  - "templates/redis.template.yml"
  - "templates/web.template.yml"
  - "templates/web.ratelimited.template.yml"
  - "templates/web.ssl.template.yml"
  - "templates/web.letsencrypt.ssl.template.yml"
  - "templates/cloudflare.template.yml"

## какие TCP/IP-порты должен открывать этот контейнер?
## Если вы хотите, чтобы Discourse использовал один порт с другим веб-сервером, например Apache или nginx,
## см. https://meta.discourse.org/t/17247 для подробностей
expose:
  - "80:80"   # http
  - "443:443" # https

params:
  db_default_text_search_config: "pg_catalog.english"

  ## Установите db_shared_buffers максимум на 25% от общего объёма памяти.
  ## будет установлено автоматически при загрузке в зависимости от обнаруженной оперативной памяти, либо вы можете переопределить
  db_shared_buffers: "4096MB"

  ## может улучшить производительность сортировки, но увеличивает использование памяти на каждое подключение
  db_work_mem: "40MB"

  ## Какую ревизию Git должен использовать этот контейнер? (по умолчанию: tests-passed)
  #version: tests-passed

env:
  LC_ALL: en_US.UTF-8
  LANG: en_US.UTF-8
  LANGUAGE: en_US.UTF-8
  # DISCOURSE_DEFAULT_LOCALE: en

  ## Сколько одновременных веб-запросов поддерживается? Зависит от объёма памяти и количества ядер CPU.
  ## будет установлено автоматически при загрузке в зависимости от обнаруженных процессоров, либо вы можете переопределить

  ## Изменено Lee 2025/8/2
  # UNICORN_WORKERS: 8
  UNICORN_WORKERS: 10

  ## TODO: Доменное имя, на которое будет реагировать этот экземпляр Discourse
  ## Обязательно. Discourse не будет работать с чистым IP-адресом.
  DISCOURSE_HOSTNAME: discourse.spacecityweather.com

  ## TODO: Список адресов электронной почты через запятую, которые станут администраторами и разработчиками
  ## при первоначальной регистрации, например 'user1@example.com,user2@example.com'
  DISCOURSE_DEVELOPER_EMAILS: [redacted]

  ## TODO: SMTP-сервер, используемый для проверки новых учётных записей и отправки уведомлений
  ## SMTP ADDRESS обязателен
  ## ВНИМАНИЕ: пароль SMTP следует заключить в кавычки, чтобы избежать проблем
  DISCOURSE_SMTP_ADDRESS: [redacted]
  DISCOURSE_SMTP_PORT: [redacted]
  DISCOURSE_SMTP_USER_NAME: [redacted]
  DISCOURSE_SMTP_PASSWORD: [redacted]
  DISCOURSE_SMTP_DOMAIN: [redacted]
  DISCOURSE_NOTIFICATION_EMAIL: [redacted]

  ## Если вы добавили шаблон Lets Encrypt, раскомментируйте ниже, чтобы получить бесплатный SSL-сертификат
  LETSENCRYPT_ACCOUNT_EMAIL: [redacted]

  ## ID учётной записи и лицензионный ключ Maxmind для геолокации по IP-адресу
  ## см. https://meta.discourse.org/t/-/173941 для подробностей
  DISCOURSE_MAXMIND_ACCOUNT_ID: [redacted]
  DISCOURSE_MAXMIND_LICENSE_KEY: [redacted]

  ## Мусор для резервного копирования S3
  ## Добавлено Lee 2025/7/20
  DISCOURSE_USE_S3: true
  DISCOURSE_S3_REGION: [redacted]
  DISCOURSE_S3_USE_IAM_PROFILE: true
  DISCOURSE_S3_BACKUP_BUCKET: [redacted]
  DISCOURSE_BACKUP_LOCATION: s3

  ## Возможно, исправит ошибки Sidekiq из-за чрезмерного использования памяти?
  UNICORN_SIDEKIQ_MAX_RSS: 1024

  ## Добавлено Lee 2025/8/2
  SIDEKIQ_CONCURRENCY: 6
  RUBY_GC_HEAP_GROWTH_MAX_SLOTS: 40000
  RUBY_GC_HEAP_GROWTH_FACTOR: 1.1
  RUBY_GLOBAL_METHOD_CACHE_SIZE: 131072
  MALLOC_ARENA_MAX: 2

## Контейнер Docker не сохраняет состояние; все данные хранятся в /shared
volumes:
  - volume:
      host: /var/discourse/shared/standalone
      guest: /shared
  - volume:
      host: /var/discourse/shared/standalone/log/var-log
      guest: /var/log

## Аргументы Docker?
docker_args: "--add-host spacecityweather.com:[redacted] --add-host theeyewall.com:[redacted]"

## Плагины размещаются здесь
## см. https://meta.discourse.org/t/19157 для подробностей
hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - git clone https://github.com/discourse/docker_manager.git

## Любые пользовательские команды для запуска после сборки
run:
  - exec: echo "Начало пользовательских команд"
  ## Если вы хотите установить адрес электронной почты в поле 'From' для вашей первой регистрации, раскомментируйте и измените:
  ## После получения первого письма регистрации снова закомментируйте строку. Выполнять нужно только один раз.
  #- exec: rails r "SiteSetting.notification_email='info@unconfigured.discourse.org'"
  - exec: echo "Конец пользовательских команд"

И все содержимое БД хранится в /var/discourse? Значит, если я перемещу всё содержимое /var/discourse на подключаемый том, оно должно продолжить использовать все существующие данные?

Я использую стандартную одноконтейнерную установку на собственном хостинге, поэтому всё настроено в соответствии с настройками по умолчанию!

Вопрос: несмотря на то, что я переместил папку /discourse на монтируемый том, у меня всё ещё возникают проблемы с Docker. Контейнеры и образы продолжают запускаться на локальном диске, а не на томе. Есть ли какие-либо идеи, как это исправить?