Backup discourse from the command line

:bookmark: This guide covers how to back up and restore your Discourse site using command line tools, specifically designed for self-hosted environments.

:person_raising_hand: Required user level: Administrator

:information_source: You can use the below placeholders to automatically fill out the command line prompts in this guide:

Backing up

To create a backup of your Discourse site, follow these steps:

  1. Enter the container:
./launcher enter app
  1. Run the backup:
discourse backup
exit

This will print out the final filename of your backup. Download the backup and container configuration (if needed) to your local machine:

scp =USER=@=HOST=:/var/discourse/shared/standalone/backups/default/=FILENAME= .
scp =USER=@=HOST=:/var/discourse/containers/app.yml .

Restoring

To restore a Discourse backup, follow these steps:

  1. Install a Discourse site on the server you are restoring to.

If you’re testing this procedure multiple times, you can wipe the data on your test server.

Wipe Discourse data (optional)
./launcher stop app
./launcher destroy app
rm -r /var/discourse/shared/standalone/
mkdir -p /var/discourse/shared/standalone/backups/default/

  1. Upload the backup file:
scp =FILENAME= =USER=@=HOST=:/var/discourse/shared/standalone/backups/default/
  1. Enter the container and start the restore:
./launcher enter app
discourse enable_restore
discourse restore =FILENAME=

If you happen to forget what the filename was, run the “discourse restore” command by itself to get a list of available backup files.

:information_source: For a two-container setup, use ./launcher enter web_only and replace standalone with web-only in the path to backups.

For additional information about restoring Discourse backups, see Restore a backup from the command line.

Last edited by @SaraDev 2024-08-23T20:50:17Z

Check documentPerform check on document:
40 лайков

Где я должен выполнить эту команду? В терминале моего облачного сервера или на локальной машине?
В любом случае я получаю ошибку «Permission denied».

На вашем локальном компьютере.

Используете ли вы SSH-ключ для подключения? Ошибка связана с этим.

Тогда команда должна выглядеть так:

scp -i /path_to_your_key/your_key.pem root@147.43.15.199:/var/discourse/shared/standalone/backups/default/discourse-2024-12-25-033740-v20241211222608.tar.gz .

У меня есть сценарий, в котором я хочу перенести установку Discourse на совершенно новый сервер.
Мой план был следующим:

  1. Создать новую пустую установку Discourse
  2. Сделать резервную копию старого Discourse, передать её на новый сервер через scp и восстановить
  3. Скопировать все данные из S3 (изображения и т. д.) в новый аккаунт S3

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

Есть ли рекомендуемое решение?

Я думал попробовать изменить имя бакета S3 в старом Discourse (перед созданием резервной копии), тогда при восстановлении система будет ожидать новый бакет. Но я боюсь, что произойдёт со старым Discourse, если я просто переключу его на несуществующий бакет.

Существует скрытая настройка, которая загружает файлы S3 и добавляет их в резервную копию.

Вам нужно настроить S3 в файле yml, как описано в Настройка провайдера объектного хранилища, совместимого с S3, для загрузок.

Затем при восстановлении резервной копии загрузка будет отправлена в новый бакет.

1 лайк

Вы так и не решили эту проблему?

Вам необходимо настроить S3 в переменных окружения, как описано в настройке провайдера объектного хранилища, совместимого с S3, для загрузки файлов.

Это особенно важно, если настройки S3 на новом сервере отличаются. Сохранение значений S3 в базе данных может вызвать множество проблем.

Однако для команды восстановления существует переключатель, который позволяет приостанавливать выполнение между различными этапами. Это может помочь.

Можно уточнить, что файл, который у вас в итоге получается здесь, совпадает с тем, что вы получаете при резервном копировании с сайта форума?

Я всегда собираю заново через командную строку, но сначала делаю резервную копию через сайт. На этот раз я забыл сделать резервную копию! Думаю, использование командной строки для обоих процессов может мне помочь :slight_smile: Удачи мне!

Скрипт резервного копирования вывел:

Завершено!
[УСПЕХ]
Резервная копия создана.
Файл вывода находится по адресу: /var/www/discourse/public/backups/default/FILENAME.tar.gz

Для начала я попытался скачать его по указанному пути, но он оказался неверным. Я нашёл файл в другом месте и только после этого заметил, что команды в этой теме указаны верно…

Привет! Просто хочу отметить, что для создания резервной копии без загрузки файлов используйте следующую команду:

discourse backup --sql-only

1 лайк

Отличное замечание — нам стоит добавить это (и ещё несколько полезных моментов) в исходное сообщение.

2 лайка

Привет, @supermathie! Рад тебя “увидеть”. Не уверен, что ты меня помнишь? Мы с тобой проводили собеседование некоторое время назад.

Кстати, было бы здорово, если бы параметр --help работал после выполнения команды discourse backup. Вместо этого резервная копия в итоге получает имя “–helpXXX”. :lolsob:

С наилучшими пожеланиями!

С помощью искусственного интеллекта мы подготовили исчерпывающий список подкоманд для команды discourse.

Командная строка discourse (реализована через script/discourse с использованием гема Thor) предоставляет 13 основных подкоманд, сгруппированных по категориям: Резервное копирование и восстановление, Управление сайтом и режимы, Утилиты базы данных и Миграция данных (Импорт/Экспорт).


Краткая справка по командам

Категория Подкоманда Основное назначение
Резервное копирование и восстановление backup Создает полный архив резервной копии или только базы данных.
restore Восстанавливает данные из архива .tar.gz в экземпляр форума.
enable_restore Разрешает выполнение команд восстановления.
disable_restore Запрещает выполнение команд восстановления.
rollback Откатывает состояние базы данных после неудачного восстановления.
Режимы сайта enable_readonly Включает временный режим «только для чтения» на всем сайте.
disable_readonly Отключает режим «только для чтения», возвращая возможность записи.
request_refresh Отправляет запрос на обновление страницы всем подключенным клиентам.
Операции с БД remap Выполняет глобальный поиск и замену текста в таблицах базы данных.
Миграция данных export_category Экспортирует одну категорию, её темы и связанных пользователей.
import_category Импортирует архив категории в текущий форум.
export_topics Экспортирует определенные темы по ID и аккаунты их авторов/ответивших.
import_topics Импортирует архив тем в текущий форум.

Подробная документация по подкомандам

1. Команды резервного копирования и восстановления

discourse backup [FILENAME]

  • Описание: Создает полную резервную копию базы данных форума и файлов.

  • Флаги:

  • --sql-only: (Булево, по умолчанию: false) Выгружает только базу данных PostgreSQL, пропуская локальные загруженные файлы.

  • --s3-uploads: (Булево, по умолчанию: false) Принудительно включает файлы, хранящиеся в S3, в архив резервной копии (игнорируется, если установлен флаг --sql-only).

  • Пример:

discourse backup
discourse backup --sql-only

discourse restore [FILENAME]

  • Описание: Восстанавливает резервную копию форума из локального архива .tar.gz, расположенного в /var/www/discourse/public/backups/default.
  • Предварительное условие: Требуется сначала выполнить discourse enable_restore.
  • Пример:
discourse restore discourse-2026-07-22-120000-v2026xxxx.tar.gz

discourse enable_restore и discourse disable_restore

  • Описание: Включает или отключает флаг приложения, разрешающий или запрещающий выполнение задач восстановления через консоль или веб-интерфейс.
  • Последовательность использования:
discourse enable_restore
discourse restore <filename>
discourse disable_restore

discourse rollback

  • Описание: Откатывает схему и состояние базы данных к моменту перед неудачным выполнением восстановления.

2. Состояние сайта и управление клиентами

discourse enable_readonly и discourse disable_readonly

  • Описание: Устанавливает или сбрасывает ключ READONLY_MODE_KEY в Redis.
  • Детали:
  • Запрещает запись в базу данных, сохраняя возможность чтения сайта пользователями.
  • Использует цикл с коротким временем жизни (TTL), который обновляется во время действия режима, предотвращая постоянную блокировку сайта в случае сбоя терминальной сессии.

discourse request_refresh

  • Описание: Отправляет системное сообщение через MessageBus, указывая всем активным веб-сессиям перезагрузить страницу. Полезно после развертывания обновлений файлов или глобальных изменений темы.

3. Переотображение базы данных (Remapping)

discourse remap [OPTIONS] FROM TO

  • Описание: Выполняет прямой поиск и замену строк в текстовых столбцах базы данных. Критически важно при изменении доменных имен, путей к CDN или префиксов загрузок изображений.

  • Флаги:

  • --global: (Булево) Сканирует и переотображает данные во всех таблицах, а не только в стандартных таблицах контента.

  • --regex: (Булево) Интерпретирует параметр FROM как регулярное выражение, а не как буквальную строку.

  • Пример:

discourse remap "old-domain.com" "new-domain.com"
discourse remap --global "/uploads/default/" "/cdn-uploads/"

4. Селективный импорт и экспорт данных

discourse export_category [CATEGORY_ID]

  • Описание: Сериализует одну категорию, включая все вложенные темы, сообщения и профили участников, в файл архива JSON.

discourse import_category [FILE_PATH]

  • Описание: Читает архив, созданный командой export_category, и объединяет данные категории с целевым экземпляром.

discourse export_topics [TOPIC_IDS...]

  • Описание: Принимает один или несколько разделенных пробелами ID тем и экспортирует эти темы, сообщения и соответствующие аккаунты пользователей.
  • Пример:
discourse export_topics 102 105 210

discourse import_topics [FILE_PATH]

  • Описание: Импортирует архив JSON, созданный командой export_topics, в целевой экземпляр Discourse.
1 лайк