Сломанные изображения и их S3-URL

После недавнего обновления до 2.5.0.beta7 все изображения на форуме перестали отображаться.
image

Аватар также был заменён на стандартный. Вот мои предложения на панели управления:

Мои сообщения сотрудников для активов:

Одно из таких изображений: /original/2X/4/4064b1cc32199de63ad2fa2b5bd2a0c5b6872c6d.png

Однако на моём S3 такого изображения нет: (почему это произошло?)

Мой фавикон и другие логотипы отсутствуют: /original/1X/b32666bfe0e0eac40aacb178c7430c9f7873b397.png

Однако на моём S3 есть только эти файлы:

Обратите внимание, что URL указан неверно, и внутри папки original нет папки 1X.

Я попытался следовать руководству из этого поста:

Но это ничего не исправило.

Могу ли я отметить, что этого изображения нет в вашем бакете, оно называется 4061…41.png? :thinking:
Оно есть локально?

Извините, неверно сформулировал. Я имел в виду, что заметил: его нет в бакете S3, ни одного из них нет.

Как мне проверить это локально?

Ах, действительно, теперь всё становится на свои места :sweat_smile:
Вы можете проверить это локально с помощью любого SSH-клиента, который вам удобен. В зависимости от вашей конфигурации файлы должны находиться где-то вроде /var/discourse/shared/standalone/uploads/default/original/2X/
Так что вы можете выполнить ls -R /var/discourse/shared/standalone/uploads/ | grep 4064b, чтобы найти файл 4064b…d.png

Речь идёт об одном и том же экземпляре Discourse, что и у @masterakay.

Мы перешли на S3 более двух лет назад; ни один файл в локальной директории загрузок не новее 2018 года.

Насколько я понимаю, изображения загружаются в папку «original», обрабатываются (обрезаются, уменьшаются в размере и т. д.) и помещаются в папку «optimized». URL-адреса, которые Discourse использует при загрузке изображений, всё ещё ведут на папку «/original/1X/». Однако после обновления папка «1X» исчезла.

Существует папка «default», в которой также находится множество загрузок (изображения и т. д.), включая обрезанные версии. Здесь около 10 тысяч файлов, что составляет примерно 2,5 ГБ.

Проблема в том, что URL-адреса изображений в постах всегда указывают на версию «original».
Мы заметили, что отсутствующие файлы — это подмножество файлов из папки «default».
Новые загрузки работают без проблем и сохраняются в папку «/original/2X/».

У кого-нибудь есть идеи, куда могла деться папка «/original/1X/», и можно ли её восстановить?

@sam @codinghorror Извините, что втягиваю вас в это, но ситуация довольно срочная. Мы студенты и в какой-то степени беспомощны перед лицом давления со стороны колледжа, требующего исправить изображения.

Я тоже это наблюдаю, и это началось сразу после более недавнего обновления.

https://discourse.sesp.northwestern.edu

Как вы настроили S3? Вы задали какие-либо значения в app.yml или только через административный интерфейс? Похоже, что для DISCOURSE_S3_BUCKET или DISCOURSE_S3_BACKUP_BUCKET указано что-то неожиданное.

Да, как я уже объяснял, всё было в порядке до последнего обновления. Мы выполнили все шаги.
В частности, мы сделали вот что:

Что касается этих значений, я не могу найти ни одной переменной, установленной в app.yml. Раньше это не требовалось. Что-то изменилось?

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

Существует два способа настройки S3: вы можете настроить окружение в файле app.yml или ввести значения через административный интерфейс. Имена переменных в каждом случае немного отличаются.

Тема, на которую вы ссылаетесь, описывает настройку через административный интерфейс. Если вы настраивали свой сайт именно так, сообщите, пожалуйста, какие значения у вас указаны для s3_upload_bucket и s3_backup_bucket?

@schleifer У меня то же самое. Я тоже ничего не менял в этих настройках. Я также проверил, что мои учетные данные AWS работают.

А, теперь всё понятно.

Проблема возникла из-за того, что эти настройки не должны иметь одинаковое значение — поищите в теме настройки строку «Действительно ли мне нужно использовать отдельные бакеты для загрузок и резервных копий?».
Фоновая задача обработки данных в бакете резервных копий затронула загрузку файлов, поскольку их значения пересекались.

@sam, вероятно, нам стоит закрепить это в коде, а не только в документации.

Чтобы исправить ситуацию на вашем сайте, нужно выполнить два шага:

Сначала измените префикс резервных копий — достаточно добавить /backups в конец, как описано в теме настройки.

Затем переместите все объекты из бакета S3 обратно в правильное место. Всё, что находится в верхней папке «default», нужно вернуть на верхний уровень.
Например, там, скорее всего, есть папка «default/originals», которую следует переместить выше.

Для этого вам придётся использовать веб-консоль AWS или другой инструмент для просмотра содержимого бакета.

Хорошо, большое спасибо! Я попробую выполнить эти шаги и вернусь сюда, если что-то пойдет не так. Есть какие-то идеи, почему это вдруг произошло? :sweat_smile:

Привет @schleifer, это имеет смысл, я добавил префикс backups к имени бакета.

Что касается существующих загрузок, все они находятся в /default/ (не в подпапках). Ссылки на изображения в постах (и везде еще) используют /original/* или /optimized/*.

Если мы переместим всё из папки default на уровень выше (в корень), то изображения окажутся в /*.
И нет, внутри defaults нет никаких папок, только файлы загрузок. Похоже, там содержатся файлы со стандартными именами из 40 символов хеша, а также некоторые с суффиксами вроде “_2_10x10” (которые, я предполагаю, относятся к оптимизированным).

Как ты предлагаешь это исправить? Исправление всех постов с новыми ссылками займет время. Возможно ли как-то сгруппировать файлы в правильные папки на основе этого имени файла?

@schleifer есть какие-то новости по этому вопросу?

Это… неожиданно. Придётся вручную исправить кучу вещей.

Самый важный вопрос: «будут ли новые файлы загружаться в правильное место?»

Если это так, вы можете переместить старые файлы в известное место и обновить соответствующие записи в базе данных. Сколько файлов находится в /default/?

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

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

Да, это в наших планах. Следующий шаг — разместить все отсутствующие файлы в известном месте. В бакете какие подкаталоги находятся под /original/? Там должен быть /1X/, а также могут быть другие.

Это полная структура папок. Новые загрузки (работают корректно) сохраняются в /original/2X/*/.jpg

/
|---backups
    |---default
        |---(набор файлов резервных копий .tar.gz)
|---default
    |---(10719 загруженных файлов: pdf, изображения и др.)
|---inventory
    |---1/pesuioforum/{optimized,original}/[DATE]/manifest.{checksum,json}
|---optimized
    |---1X
        |---(2 файла)
    |---2X
        |---{0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f}
            |---(загруженные файлы, имена которых начинаются с символа имени папки выше) (всего 1055 файлов)
|---original
    |---2X
        |---(То же, что и optimized/2X, 520 файлов)
|---tombstone
    |---optimized
        |---1X
            |---(2 файла)
    |---original
        |---2X
            |---(То же, что и optimized/2X, 1 файл)

Следующий шаг — поместить все отсутствующие файлы в известное место.

В /default/ уже, похоже, находятся все изображения.