Restore a backup from the command line

:bookmark: This guide explains how to restore a Discourse backup from the command line without using the Discourse web UI.

:person_raising_hand: Required user level: Administrator

:wrench: Console access required

Here’s how to restore a Discourse backup from the command line, without ever booting the Discourse web UI. This is handy when you’re moving servers.

Prerequisites

Before you start, make sure you complete the following steps:

  1. Download the latest backup file from the source Discourse instance.
  2. Bootstrap the destination Discourse instance by running ./discourse-setup or copying your existing app.yml.
  3. Ensure the destination Discourse instance is on the latest version. Update it if necessary.

Transfer the backup

  1. SSH into the destination server, or otherwise create the backup folder there:

mkdir -p /var/discourse/shared/standalone/backups/default

  1. Upload your backup file to the destination server.

scp /path/to/backup/backup.tar.gz root@192.168.1.1:/var/discourse/shared/standalone/backups/default

Be sure to replace the paths, filenames, and server names with the ones you are using – but you do want the backup file to end up in:

/var/discourse/shared/standalone/backups/default

:mega: You can also upload and download your Discourse backup file from popular web storage sites such as Google Drive, Dropbox, OneDrive, etc – you’ll need to look up the specific command line instructions based on your preferred web storage provider.

:warning: DO NOT CHANGE THE FILENAME OF THE BACKUP! Discourse treats the backup filename as metadata, so if you change the filename, restoring will not work. Stick with the original file name.

Replace /path/to/backup/discourse-xyz.tar.gz with the local path of your backup file, and replace <server_ip_address> with the IP address of destination server.

:bulb: If Nginx is used as reverse proxy make sure all paths to the backup are readable by the container and Nginx can read the .sock file.

Restore the backup

  1. Access your destination server and navigate to the Discourse folder:
cd /var/discourse
  1. Enter the Discourse Docker app container:
./launcher enter app
  1. Enable restore functionality:
discourse enable_restore
  1. Restore the backup file:
discourse restore sitename-2019-02-03-042252-v20190130013015.tar.gz

:bulb: Tip: If you run discourse restore without a filename, it will list all available backup files.

:warning: If your site’s backup_location setting is configured to use S3, but you manually uploaded the backup file to the local filesystem, you need to specify --location local:

discourse restore --location local sitename-2019-02-03-042252-v20190130013015.tar.gz

Similarly, use --location s3 to restore directly from an S3 backup without downloading it first.

  1. Exit the Discourse Docker app container:
exit

Rebuild

After restoring the backup, you may choose to rebuild the destination instance to ensure all settings and configurations are applied correctly.

:mega: Now is a good time to update /var/discourse/containers/app.yml with full HTTPS, additional plugins or CDN configuration. Compare the app.yml configuration of both instances to make sure!

cd /var/discourse
./launcher rebuild app

Enable Email

When a backup is restored, outgoing mail for non-staff is disabled. You don’t want your test server, new server, or server that you just restored a backup for some other reason to start emailing your users! Change the disable_emails site setting to “no” to re-enable email.

:tada: That’s it. Your Discourse server is successfully restored.

Last edited by @pfaffman 2025-05-18T19:32:40Z

Check documentPerform check on document:
78 лайков
Move your Discourse Instance to a Different Server
Any other way to take backup and restore?
How easy is it to move to another server?
HELP! My Discourse just deleted everything?
Restore backup is broken
How to migrate Discourse from one server to another with the same DNS name
Best Practices for Backups
Problem upgrading Discourse
Upgrading v2.2.0.beta4 forum with unknown local changes
Set up file and image uploads to S3
Quick question about site backups
My install broke after updating, how can I fix it?
Is there any way to restore your site from backup in the terminal?
Migrating Discourse from one DigitalOcean droplet to another without downtime
Restore backup right away after installing Discourse
Unable to migrate to S3, therefore unable to restore from backup
Restore Failure - S3 (compatible) backup
"EXCEPTION: psql failed: DETAIL: Key (post_id)=(36946) is duplicated."
Migrate from another forum to Discourse
My install is 16,359 commits behind! Advice?
Trying to recover an installation
Migration failed: relation "user_required_fields_versions" already exists
How can I manually verify via the CLI and bypass the Congratulations, you installed Discourse! screen?
Configuring automatic backups
Migrating to a new server that has a new DB and new S3 buckets for backup and uploads
Intended path to migrate S3 to local
Problem when updating Discourse Forum
Failed to restore from the backup
Steps involved to downgrade from 2GB to 1GB on DO?
Forum offline: Restore is not working through web
Forum offline: Restore is not working through web
Testing Restore - not working
Entire site is a blank page after upgrade
"discourse: command not found" when trying to restore a backup from the command line
Stuck with 500 error after weird bugs and a rebuild
Plesk server migration
"Key is stored in legacy trusted.gpg keyring" warning
"Key is stored in legacy trusted.gpg keyring" warning
Discourse broken after moving servers
Stuck and lost updating forum, problems with PG migration
How to manually migrate s3 files to local?
Index_users_on_username_lower error during database restore: import failed
How can I get the current version information from my backup?
Backup Prod -> Snap -> Build Test -> Change Address
How to properly package discourse as an image
2FA with OTP broken after restoring from Backup
I'm trying to migrate an old discourse by creating a new discourse, but I'm having trouble
Recover from filesystem backup: can't rebuild nor start
Error: Can't notify admin while restoring backup during a migration to a fresh install
MKJ's Opinionated Discourse Deployment Configuration
Migrate from AWS to Digital Ocean with 2 containers, spaces and 2 CDNs
Cannot restore database: sql key is duplicated
Finding UI generated backup and restoring site
Backup discourse from the command line
Migration to a Self-Hosted solution from Kubernetes
How to download the backup file without SMTP function?
Redis Problems? (Forum broken after upgrade)
Can't upload backup
Can't upload backup
Can't upload backup
Rate limiter issues when uploading a backup file / can't disable rate limiter
Help restoring - system hung at midnight
Help restoring - system hung at midnight
Uploads missing after restore
My install is 16,359 commits behind! Advice?
Issues Rebuilding After Upgrade to Ubuntu 22.04

Эти инструкции помогли нам восстановить систему из резервной копии, но нам пришлось изменить команду discourse restore на:

discourse restore --location local sitename-2019-02-03-042252-v20190130013015.tar.gz

(в моём примере используется имя файла из приведённого выше примера), чтобы восстановление нашло резервные копии, которые мы разместили в директории /var/discourse/shared/standalone/backups/default (в отличие от резервных копий, хранящихся в S3).

2 лайка

Необходима ли пересборка после восстановления?

Также я восстановил систему на новый сервер, где стоит обратный прокси NGINX, который затем пересылает запросы к upstream-серверу Discourse. Поэтому я отключил SSL на Discourse, но заметил, что во время восстановления:

Remapping 'https://example.com' to 'http://example.com'

Эта перенастройка затрагивает все внутренние ссылки? Можно ли отменить это так же просто, как выполнив discourse remap http://example.com https://example.com?

Нет.

Похоже, что да. Да, вы можете их переназначить.

Вы должны установить переменную force_https.

1 лайк

Если размер резервной копии составляет 15 ГБ, сколько места потребуется для восстановления?

1 лайк

Это только база данных или тоже загрузок?

Наверное, в 3–5 раз больше.

1 лайк

Это база данных плюс загрузка 15 ГБ. У меня есть 20 ГБ свободного места на жестком диске объемом 60 ГБ, но восстановление каждый раз не удаётся. Мне нужно хотя бы 50–60 ГБ свободного места для восстановления?

1 лайк

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

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

2 лайка

Я подтвердил свою учетную запись администратора на собственном хостинге и загрузил резервную копию в формате .sql.gz, а не .tar.gz.

Восстановление через интерфейс не дало результата, поэтому я выполнил его через командную строку с помощью команды «Restore the backup». В конце процесса discourse restore появилось сообщение [FAILED]. Возможно ли, что процесс завершился бы успешно, если бы входной файл с официального хостинга был в формате .tar.gz?

Мой официальный хостинг существует всего несколько дней, а мой собственный сервер начал корректно работать сегодня после изменения значений SMTP в файле container.yml.

1 лайк

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

1 лайк

Где-то есть документация для discourse restore? Так как, похоже, есть переключатель --location local, я предполагаю, что должен быть и аналогичный для S3.

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

РЕДАКТИРОВАНИЕ: Неважно. Я только что выяснил, что discourse restore --location s3 $filename работает отлично.

2 лайка

Поскольку я включил S3 в app.yml, простая команда discourse restore <filename> сработала без проблем.

Думаю, если вы поищете backup restore s3, то найдёте нужный пост.

2 лайка

Привет! Я завершил этот процесс, используя s3(-cli) в качестве scp и сменив провайдера исходящей почты с MailGun на Brevo.

После восстановления я не могу найти способ убрать баннер?

Самый простой способ убрать баннер — включить отправку электронной почты в настройках сайта

3 лайка

Верно. Также можно скрыть его с помощью CSS! :joy:

1 лайк

Верно. Я был немного осторожен, рекомендуя это, потому что мне нужно было подумать о Air theme hides "outgoing email disabled" warning

1 лайк

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

Я обновил исходный пост соответственно:

2 лайка

Примечание к инструкции:

Если вы регулярно восстанавливаете резервные копии для тестирования и ваш тестовый сервер правильно настроен, чтобы отправлять письма в отладочный почтовый сервис (например, GitHub - maildev/maildev: 📫 SMTP Server + Web Interface for viewing and testing emails during development. · GitHub), вам может потребоваться включить отправку писем через скрипт:

docker exec -it app /bin/bash --login \
-c "rails runner 'SiteSetting.disable_emails=\"no\";'"

В этом случае, возможно, стоит установить DISCOURSE_DISABLE_EMAILS в значение no в файле app.yml (а также DISCOURSE_ENABLE_RESTORE, чтобы упростить восстановление).

1 лайк