Поиск резервной копии, созданной через интерфейс, и восстановление сайта

Привет, Discourse,

Вчера вечером я занимался обновлением Discourse и пересобрал приложение, что привело к множеству ошибок PostgreSQL. Я понял, что это следствие недавнего обновления, но продолжал получать ошибки «отказано в доступе» и другие проблемы (да, я изменил владельца всех файлов на 700, так что доступ не был глобальным). Поэтому я переместил свою исходную папку /var/discourse в место, которое должно было быть временным, и установил свежий экземпляр Discourse, чтобы хотя бы обновить PostgreSQL.

А теперь самое интересное. У меня была резервная копия сайта (только база данных; загрузки сохранены на отдельном томе), созданная через интерфейс три дня назад. По крайней мере, так я думал. Сейчас у меня есть файл с именем wacky-writers-forum-2021-04-06-033906-v20210328233843.sql.gz, и, как я понял, это не тот самый tar.gz-файл, в котором должна находиться настоящая резервная копия.

Сейчас я перенаправил всех посетителей на посадочную страницу и надеюсь, что кто-то сможет подтвердить, что всё ещё возможно восстановить настоящий .tar.gz-файл с сервера за три дня до этого, и объяснить, как именно это сделать.

Мои резервные копии и загрузки сохраняются на блочное хранилище Digital Ocean, и у меня всё ещё есть папка discourse от старой рабочей установки. Однако попытка переместить или скопировать её обратно в /var/discourse снова ломает всё, включая ошибки PostgreSQL. Я работаю над этим уже 9 часов подряд и почти дошёл до отчаяния. Не мог бы кто-нибудь помочь или хотя бы подсказать правильное направление? :pray: Мы только что достигли отметки в 1000 пользователей, и мне очень-очень хотелось бы избежать потери всех этих данных.

Редактировано: уточнил настройку загрузки.

Если ваша конфигурация S3 находится в файле app.yml, вы можете просто выполнить восстановление через командную строку, и оно загрузит резервную копию из S3.
Так как ваши файлы хранятся в S3, резервная копия содержит только базу данных.

Вам достаточно клонировать новую директорию /var/discourse, скопировать туда ваш файл yml, выполнить пересборку и запустить восстановление через командную строку.

Использование объектного хранилища для загрузки файлов (S3 и клонирование)

Восстановление резервной копии через командную строку

Похоже, я использовал неверный термин для описания настройки моих резервных копий и загрузок. Я использовал этот метод: Move Uploads and Backups to DigitalOcean Block Storage

Я уточню: мои загрузки и резервные копии не хранятся локально в основной папке Discourse (частично именно поэтому всё началось — я пытался перенести нас на DigitalOcean Spaces). Поэтому, к сожалению, у меня нет никакой конфигурации S3, так как я просто сохранял данные на смонтированное хранилище.

Резервные копии сохранялись в mnt/my_storage/shared/standalone, но когда я зашел туда, чтобы посмотреть на них, я нашел только файл wacky-writers-forum-2021-04-06-033906-v20210328233843.sql.gz. Я действительно пытался восстановить систему из этого файла, так как не придумал ничего лучшего (что, вероятно, было ошибкой), но получил ошибку «отказано в доступе». Уверен, что проблема связана с тем, как именно создаются эти резервные копии.

Значит, ваши загрузки всё ещё находятся в объектном хранилище DO?

Да, все загрузки в полном порядке.

Хорошо, отлично.

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

Существует два типа резервных копий: sql.gz, который не включает загрузки, и tar.gz, который их включает. У вас оказалась резервная копия не того типа, но тот факт, что загрузки находились на внешнем томе, спас вам положение.

Я зашел в приложение и восстановил этот sql.gz, но получил ошибку «отказано в доступе». Есть какие-то идеи, почему это могло произойти?

Вы меня понимаете!! :slight_smile:

(Предполагая, что вы имеете в виду chmod). Если файлы имеют неверного владельца, то они не будут доступны для записи.

Думаю, это именно то, что вызвало ошибку «отказано в доступе».

Каково точное сообщение об ошибке?

Да, спасибо, я не спал всю ночь и немного ошалел.

ИСКЛЮЧЕНИЕ: lib/discourse.rb:93:in `exec': Не удалось скопировать архив во временную директорию.
cp: невозможно открыть '/var/www/discourse/public/backups/default/wacky-writers-forum-2021-04-06-033906-v20210328233843.sql.gz' для чтения: Отказано в доступе

Попробуйте chmod 644 /var/www/discourse/public/backups/default/*

Хорошо, я сейчас разберусь с этим и скоро отпишусь. Спасибо, что нашли время мне помочь.

Это сработало для запуска восстановления, СПАСИБО. :pray:

Теперь мне осталось только понять, почему сайт всё ещё не загружается. :grimacing:

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

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

Вы можете загрузить его из S3 и поместить в

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

После этого вы сможете восстановить данные из командной строки.

Однако после этого вам следует настроить конфигурацию S3, как описано по ссылке выше; это упростит работу.

Спасибо, Джей. Да, это абсолютно мой план.

Хорошо, вот где я сейчас нахожусь.

  • Восстановление из файла .sql.gz прошло успешно. (ура! Ещё раз спасибо, Ричард.)
  • Убедился, что app.yml настроен так же, как и до того, как всё сломалось.
  • ./launcher rebuild app
  • Пересборка прошла успешно с Postgres 13 (наконец-то).

Однако сам сайт всё ещё недоступен. Я использую Cloudflare, но сейчас включён режим разработки, и кэш DNS очищен. Всё указывает туда, куда должно. Шаблон Cloudflare указан в app.yml.

DNS разрешается корректно, имена хостов актуальны, установка Discourse выполнена с правильным URL, и я уже исчерпал идеи.

https://forum.wackywriters.com — это адрес, но я получаю ошибку «сервер недоступен». Чувствую, что хожу по кругу (извините), но есть ли какие-то предложения?

Редактирование: При запуске ./discourse-doctor я вижу, что в Docker запущено два экземпляра приложения:

Это нормально? (Кажется, что нет, но за последние 24 часа всё, что я знал о Discourse, было перевернуто с ног на голову :sweat_smile:)

Редактирование 2: Я откладывал это как крайнюю меру, но теперь решил попробовать настроить совершенно новый сервер с чистой установкой Discourse. Боюсь, что из-за всех моих экспериментов что-то пошло не так, и я не могу понять, что именно сломалось. К счастью, у меня всё ещё есть резервная копия и все загрузки на блочном хранилище, так что, если повезёт, я смогу подключить их к новому дроплету и перенести оттуда. Если у кого-то есть дополнительные советы или рекомендации, я буду признателен за более опытный взгляд.

Редактирование 3: Даже с новым сервером и IP-адресом, который уже распространился (nslookup и ping показывают хорошие результаты, whatsmydns.net тоже в порядке), форум не загружается. Всё ещё получаю ошибки подключения. Создаётся впечатление, что IP-адрес не связывается с экземпляром Discourse, а вместо этого пытается загрузить статическую страницу, которой, конечно же, в данном случае не существует.

Итак, после почти 24 часов борьбы я понял, почему сайт отказывался загружаться после начала процесса восстановления.
:point_down:

Из-за стольких сбросов, переустановок и чёрт знает чего ещё я достиг лимита запросов, поэтому временно закомментировал SSL-шаблоны и верну их в строй через неделю.

Сайт «функционирует», пока я пересобираю все посты, чтобы исправить битые изображения, но я искренне благодарен Джей и Ричарду за помощь сегодня — вы помогли мне пройти те этапы, которые я сам никак не мог понять.

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

Если вы поищете, то обнаружите способ добавить второй домен, чтобы он считался отдельным запросом для Let’s Encrypt. Но проще просто подождать.

Я рекомендую отключить прокси Cloudflare (серое облако), чтобы не использовать ускорение.

@pfaffman, разве вы не путаете объектное хранилище с блочным? Объектное хранилище — это S3, но TS утверждает, что они использовали блочное хранилище, которое представляет собой просто диск, смонтированный в их каталоге загрузок:

Ой. :man_facepalming:

Да, получается, что всё, что я сказал, не имеет смысла.

Спасибо, что заметили это, Ричард.

Ну, большинство вещей, которые ты сказал, действительно имели смысл, но ты меня здесь запутал :slight_smile: