Изображения утеряны при резервном копировании/восстановлении, смена домена, невозможность загрузки новых

Наша группа использовала временный домен для работы Discourse в течение двух месяцев, пока мы не согласовали наш основной домен. Вчера я попытался перенести весь контент со старого домена на новый. Весь текстовый контент, учётные записи пользователей и даже ссылки между темами перенеслись корректно. Но теперь:

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

Вот как я действовал:

  • Развернул новое приложение Discourse на новом сервере DigitalOcean (droplet).
  • Привязал новый домен к этому серверу.
  • Убедился, что оба приложения Discourse и все плагины обновлены до последних доступных версий.
  • Перевёл старый Discourse в режим только для чтения, чтобы предотвратить добавление нового контента.
  • Сделал резервную копию старого Discourse.
  • Загрузил резервную копию в новый Discourse.
  • Обновил адрес электронной почты в Discourse со старого домена на новый.
  • Провёл тест уведомлений, и они работали в новом Discourse.
  • Просмотрел все настройки Discourse, чтобы заменить упоминания старого домена на новый.
  • Настроил перенаправление старого поддомена на правильный домен и временно добавил там заметку и ссылку на новый Discourse.

Как указано выше, большая часть контента перенеслась безупречно. Однако через день мы обнаружили, что старые вставки изображений потеряны, и загрузка новых изображений невозможна. Отображается только их альтернативный текст (alt). Ниже приведён скриншот примера.

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

Только что я попытался решить проблему следующим образом:

  • Подключился к серверу по SSH.
  • Перешёл в каталог Discourse и вошёл в приложение.
  • Запустил команду rake posts:missing_uploads. Результат:
Looking for missing uploads on: default

0 post uploads are missing.
  • Запустил команду rake uploads:missing. Результат — длинный список:
/var/www/discourse/public/uploads/default/original/1X/bbc547e72f080561282be277749165709cbb0983.ico
/var/www/discourse/public/uploads/default/original/1X/0a421ccd1a08047895e2355f44c332f8b069107d.jpeg
/var/www/discourse/public/uploads/default/original/1X/034e0353b7558a26252c82982de53002fda0a33f.jpeg

[…]

/var/www/discourse/public/uploads/default/original/1X/f7a6164ffa55af4ee2706d2386227183ef6c2d61.png
96 of 281 uploads are missing
/var/www/discourse/public/uploads/default/optimized/1X/997bc5536763d84a8d035ff7becd98277a158680_2_45x45.png

[…]

/var/www/discourse/public/uploads/default/optimized/1X/8944afba36549c9050ef074b391625ef93d4d0e3_2_1035x582.jpeg
/var/www/discourse/public/uploads/default/optimized/1X/8944afba36549c9050ef074b391625ef93d4d0e3_2_10x10.png
247 of 761 optimized_images are missing
  • Запустил команду rake uploads:recover_from_tombstone. Вывода нет.

Честно говоря, я не знаю, что именно делают эти команды Rake.

Я также вижу в файле containers/app.yml, что переменная DISCOURSE_HOSTNAME содержит правильный (новый) поддомен и домен.

Выполнение команды ./launcher rebuild app не даёт видимых изменений.

Кто-нибудь может помочь, пожалуйста? Спасибо.

Вы пробовали пересобрать посты?

cd /var/discourse
./launcher enter app
rake posts:rebake

Спасибо за предложение. Я только что ввёл ваши команды, но разницы не заметил. Старые изображения всё ещё не отображаются. Новые изображения по-прежнему не загружаются. К слову, консоль веб-браузера выдаёт ошибку «GET 404» после завершения попытки загрузки.

Обновление:

Я не знаю, какая именно команда улучшила ситуацию, но она стала лучше, хотя проблема ещё не решена.

  • Я могу создавать и загружать новые файлы типов TXT, DOCX, XLSX, JPG и PNG.
  • Большинство (но не все) старые загрузки всех типов теперь отображаются и скачиваются корректно.

Проблемные загрузки раньше отображались и скачивались без каких-либо замечаний. Однако после повторной загрузки в новых тестовых постах они отказываются отображаться. В качестве примера:

Это изображение: https://www.frontiersin.org/files/Articles/470644/fphys-10-00944-HTML-r1/image_m/fphys-10-00944-t001.jpg

Корректно отображается (в моём Discourse), если ввести URL на отдельной строке, как показано ниже:

Но после завершения публикации поста и обновления страницы оно исчезает из поста, оставляя, по-видимому, только одну пустую строку. Просмотр исходного кода показывает элемент изображения с атрибутом SRC, указывающим на путь на моём домене в формате https://discourse.my_domain_name.org/uploads/default/original/1X/61ae2bdeff3dfe334ad6803409560b667d7dc246.jpeg. При открытии этого пути в новой вкладке загружается страница ошибки NGINX 404.

Когда я скачиваю изображение из исходного источника на свой ноутбук и загружаю его в свой Discourse (как я сделаю здесь, в этом посте ниже), оно не работает в моём Discourse.

В моём Discourse оно выглядит так:

Если я нажму Ctrl и кликну по этому неработающему изображению, а затем выберу «Открыть изображение в новой вкладке», загрузится страница ошибки NGINX 404.

Я вижу в этом диалоге создания сообщения, что Discourse меняет расширение изображения с JPG на JPEG, но, думаю, это не должно иметь значения.

Если я открою скачанное изображение в приложении Affinity Photo, экспортирую его без сжатия как новый JPG и снова загружу в свой Discourse, оно корректно отображается в моём Discourse.

Это говорит мне о том, что проблема всё ещё связана с моим Discourse, а не с загруженными файлами.

Я столкнулся с этой проблемой во время недавнего переноса.

Самый простой нетехнический способ решения — зайти на ваш оригинальный сайт/хост через FileZilla, перейти по пути:

VAR/Discourse/Uploads

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

Более быстрый альтернативный способ — использовать метод резервного копирования, описанный ниже. Это ручной процесс, но он также хорошо сработал.

Спасибо за ответ. Я никогда не использовал приложение FileZilla. Я использую Transmit для работы с FTP. Но я не знаю, как подключиться к своему приложению Discourse на сервере DigitalOcean через FTP.

Я могу подключиться к своему серверу по SSH и перейти в директорию /var/discourse/, но там нет папки uploads.

Даже если бы я вручную переместил файлы изображений со старого места на новое, как это решило бы проблему с повторной загрузкой тех же изображений?

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

Я немного поэкспериментировал с настройками, так как беспокоился о нехватке места на диске.

На вашей панели администратора проверьте их (в разделе «Files»). Существует множество настроек для контроля размера и габаритов изображений. Это может быть связано с вашей проблемой с «выбивающимися» изображениями (если я правильно её понял). Например, ваше переформатированное изображение всё ещё не укладывается в заданные критерии.

Моя проблема при переносе хостинга с Digital Ocean на Hetzner заключалась в том, что некоторые изображения (и аватары) просто не отображались (похоже на ваш первый скриншот). Моим решением стал перенос их через FTP (грубый, но рабочий способ). Не уверен на 100%, почему это сработало. Сначала я переносил только оптимизированные изображения, и это не решило проблему, но когда я перенёс все изображения, проблема исчезла.

Приношу извинения за ошибку в названии папки — я писал по памяти. Структура папок следующая: VAR/Discours/Shared/Standalone/Upload

Войти через FTP-клиент на Digital Ocean очень просто:

Хост: IP-адрес вашего Discourse
Порт: 22
Имя пользователя: root
Пароль: ваш пароль SSH

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

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

Мое решение заключалось в перемещении файлов через FTP (грубо, но сработало). Не уверен на 100%, почему. Сначала я переместил только оптимизированные изображения, и это не исправило проблему, но когда я переместил все изображения, моя проблема решилась.

Спасибо за более подробную инструкцию о том, как подключиться по FTP к моим двум установкам Discourse. Папка uploads занимала около 125 МБ на старой установке Discourse и 60 МБ на новой. Поэтому я скопировал старую папку на рабочий стол своего ноутбука. Затем я поэлементно скопировал её содержимое, папку за папкой, в новую установку Discourse, пропуская дубликаты.

И к моему удивлению, похоже, это решило проблему. Все загрузки изображений, кажется, исправлены: как в темах, созданных до моей миграции на Discourse, так и в темах, которые я создал сегодня в процессе устранения неполадок.

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

Еще раз большое спасибо.

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

В вашем случае это помогло бы включить их, активировав параметр сайта include_thumbnails_in_backups перед созданием резервной копии.

В качестве альтернативы после восстановления можно было бы выполнить команду rake posts:rebake_uncooked_posts. В противном случае оптимизированные изображения будут сгенерированы фоновой задачей, но это займет некоторое время… В конце процесса восстановления появляется сообщение в логе, которое точно об этом информирует.