Миграция Discourse с одного Droplet DigitalOcean на другой без простоя

Мы переезжаем на новый Droplet DigitalOcean и попытались использовать образ из маркетплейса. При запуске скрипта настройки он завершается с ошибкой на раннем этапе, так как наше доменное имя всё ещё указывает на текущий экземпляр в продакшене.

Мне нужно запустить эту новую установку, чтобы восстановить её резервную копию, а затем обновить DNS-записи.

Ошибка:

Проверка вашего доменного имени . . .
ПРЕДУПРЕЖДЕНИЕ: Порт 443 компьютера, по-видимому, недоступен по имени хоста: x
ПРЕДУПРЕЖДЕНИЕ: Соединение с x (порт 80) также не удаётся.

Это означает, что x разрешается в какой-то IP-адрес, который не ведёт к этой машине, где вы устанавливаете Discourse.

Первое, что нужно сделать, — убедиться, что x разрешается в IP-адрес этого сервера.
Обычно это делается в том же месте, где вы покупали домен.

Если вы уверены, что IP-адрес разрешается корректно, проблема может быть в брандмауэре.
Поиск в интернете по запросу «открыть порты ВАШЕ ОБЛАЧНОЕ ОБСЛУЖИВАНИЕ» может помочь.

Доменное имя действительно отвечает на портах 80 и 443, поэтому это сообщение об ошибке также, по-видимому, неверно.

Привет, Мэтт,

Мы (команда Discourse) не управляем образом DO Marketplace, поэтому, боюсь, сможем оказать лишь ограниченную помощь в решении этой конкретной проблемы.

Но вы же этим управляете, да?

Даже в инструкциях по ручной установке есть этот шаг.

Наверное, я не первый, кто это делает. Как другие это делают?

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

./discourse-setup предназначен как простой способ настройки Discourse — чтобы избежать необходимости вручную редактировать текстовый файл при запуске нового сайта Discourse. Ваш случай не является «типичным», который обрабатывает скрипт настройки.

В вашем случае, скорее всего, лучше всего будет скопировать файл containers/app.yml с текущего сервера на новый. В качестве альтернативы вы можете отредактировать файл вручную самостоятельно, как предложено в строках 75/76:

Где можно найти файл app.yml по умолчанию? Я хочу начать с чистой стандартной установки.

Также, как запустить сервер без скрипта настройки? Доступ к IP-адресу всё ещё не отвечает, так как я не могу запустить скрипт настройки.

По умолчанию файл находится в samples/standalone.yml. Также доступен на GitHub.

Если вы следуете официальному руководству по установке, после выполнения команд в разделе «Установка Discourse» вам нужно сделать следующее:

Скопируйте файл YAML по умолчанию из samples в containers:

cp samples/standalone.yml containers/app.yml

Отредактируйте файл вручную:

nano containers/app.yml

Выполните начальную настройку и запустите Discourse:

./launcher rebuild app

Спасибо, это приблизило меня к решению.

Но теперь я не могу импортировать резервную копию, так как не могу активировать свой временный аккаунт администратора:

(6) Отказано в загрузке скрипта ‘’, поскольку он нарушает следующую директиву политики безопасности контента: “script-src ”. Обратите внимание, что ‘script-src-elem’ явно не задан, поэтому используется ‘script-src’ в качестве запасного варианта.

Есть ли прямой способ восстановить из резервной копии или отключить CSP до этого момента?

Подключитесь к серверу по SSH, затем выполните:

cd /var/discourse
sudo ./launcher enter app
rails c
SiteSetting.content_security_policy = false
exit
exit

Обратите внимание: я бы сначала попробовал восстановить резервную копию через CLI — это решает вашу основную проблему (восстановление резервной копии), а не текущее препятствие (CSP).

Спасибо за подсказки.

При запуске восстановления я получаю:

ERROR:  could not create unique index "index_incoming_referers_on_path_and_incoming_domain_id"
DETAIL:  Key (path, incoming_domain_id)=(/s/free+proxy+hideip.me, 1009) is duplicated.
EXCEPTION: psql failed: DETAIL:  Key (path, incoming_domain_id)=(/s/free+proxy+hideip.me, 1009) is duplicated.
/var/www/discourse/lib/backup_restore/database_restorer.rb:87:in `restore_dump'
/var/www/discourse/lib/backup_restore/database_restorer.rb:26:in `restore'
/var/www/discourse/lib/backup_restore/restorer.rb:51:in `run'
script/discourse:143:in `restore'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/thor-1.0.1/lib/thor/command.rb:27:in `run'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/thor-1.0.1/lib/thor/invocation.rb:127:in `invoke_command'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/thor-1.0.1/lib/thor.rb:392:in `dispatch'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/thor-1.0.1/lib/thor/base.rb:485:in `start'
script/discourse:284:in `<top (required)>'
/usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.3/lib/bundler/cli/exec.rb:63:in `load'
/usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.3/lib/bundler/cli/exec.rb:63:in `kernel_load'
/usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.3/lib/bundler/cli/exec.rb:28:in `run'
/usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.3/lib/bundler/cli.rb:497:in `exec'
/usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.3/lib/bundler/vendor/thor/lib/thor/command.rb:27:in `run'
/usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.3/lib/bundler/vendor/thor/lib/thor/invocation.rb:127:in `invoke_command'
/usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.3/lib/bundler/vendor/thor/lib/thor.rb:392:in `dispatch'
/usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.3/lib/bundler/cli.rb:30:in `dispatch'
/usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.3/lib/bundler/vendor/thor/lib/thor/base.rb:485:in `start'
/usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.3/lib/bundler/cli.rb:24:in `start'
/usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.3/exe/bundle:49:in `block in <top (required)>'
/usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.3/lib/bundler/friendly_errors.rb:130:in `with_friendly_errors'
/usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.3/exe/bundle:37:in `<top (required)>'
/usr/local/bin/bundle:23:in `load'
/usr/local/bin/bundle:23:in `<main>'
Попытка отката...
Выполняется откат...
Очистка временных файлов...
Удаление функций из схемы discourse_functions...
Удаление временной директории '/var/www/discourse/tmp/restores/default/2020-12-29-214249'...
Возобновление работы sidekiq...
Отметка восстановления как завершенного...
Уведомление 'system' об окончании восстановления...
Готово!
[FAILED]
Восстановление завершено.

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

Где-то есть тема с инструкциями по копированию файлов сырой базы данных (и let’s encrypt) со старого экземпляра. Наверное, именно это я бы сделал.

Что такое «rub run»?

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

У вас есть ссылка на это?

Перенос резервных копий через rsync и cronвозможно