Вложения обслуживаются локально на сервере, но не публично

Краткое описание проблемы

При попытке доступа к загруженному изображению по URL на рабочей версии сайта Discourse (https://techenclave.com) возникает ошибка 404, хотя файл физически присутствует на диске и корректно отдается при внутреннем обращении. Я перезагрузил пост (rebake), перезапустил приложение и убедился, что внутренняя отдача работает, но внешняя по-прежнему возвращает 404.


Что работает

1. Загрузка присутствует в базе данных

Через консоль Rails я подтвердил, что запись о загрузке существует со всеми правильными метаданными:

Upload.find_by(sha1: 'a8fbe877e685e6a6994532c946c446b1279da7d2')

Вывод включает:

  • url: "/uploads/default/original/3X/a/8/a8fbe877e685e6a6994532c946c446b1279da7d2.jpeg"
  • Имя файла: IMG202506252257011.jpg
  • ID: 170265
  • Используется в посте с ID: 3125774

2. Файл присутствует на диске

Проверено, что файл существует внутри контейнера:

ls -l /shared/uploads/default/original/3X/a/8/a8fbe877e685e6a6994532c946c446b1279da7d2.jpeg

:check_mark: Файл существует с правильными правами доступа и владельцем:
discourse:www-data, -rw-r--r--.


3. Символическая ссылка из публичной папки работает

Символическая ссылка public/uploads целая:

ls -l /var/www/discourse/public/uploads
# => /shared/uploads

4. Discourse может отдавать файл внутренне

Проверено через:

curl -I http://localhost:3000/uploads/default/original/3X/a/8/a8fbe877e685e6a6994532c946c446b1279da7d2.jpeg

Результат: HTTP/1.1 200 OK


5. Пост перезапечен (rebaked)

Выполнено:

Post.find(3125774).rebake!

6. Приложение перезапущено

Выполнено:

./launcher restart app

Также пробовал:

sudo ./launcher rebuild app

(Демон Docker временно был недоступен, но позже проблема была решена.)


Что не работает

Внешний доступ к изображению

При обращении по адресу:

https://techenclave.com/uploads/default/original/3X/a/8/a8fbe877e685e6a6994532c946c446b1279da7d2.jpeg

Возвращается:

404 Not Found

Это происходит во всех браузерах и в режиме инкогнито.


В чем нужна помощь

Может ли кто-то помочь определить, что может вызывать:

  • Рабочую загрузку, которая отдается через localhost:3000,
  • но возвращает 404 при внешнем доступе по публичному домену?

Что еще стоит проверить? Есть ли связанные конфигурации или логи для анализа?

Заранее спасибо!

Даже недавно загруженные изображения не загружаются. Ошибка 404

Полагаю, это не стандартная установка? Здесь в основном поддерживается только это.

Как вы установили Discourse?

В следующий раз, возможно, стоит упомянуть, что вы недавно выполнили миграцию?

Вы следовали этому руководству, когда меняли домен с temp.techenclave.com на techenclave.com?

Спасибо.

Установка была выполнена по стандартному руководству по установке Discourse на GitHub.

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

Далее последовала миграция домена — как вы верно отметили, с временного на корневой после одного дня тестирования конфигурации.

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

Нет, я не следовал этому руководству. Но, глядя на него, я вижу, что был пропущен только один шаг:

  1. Старый домен отображается в списке разрешённых iframe вместе с новым доменом в настройках.
  2. Переотображение домена в постах, что я всё равно планировал сделать позже, включая повторную обработку (rebake) после решения этой проблемы. Затронутый пост был повторно обработан, и в URL изображения больше нет старого домена.

Эти два момента имеют значение?

Даже изображение темы выдаёт ошибку 404.

Я вижу, что логи nginx переполнены ошибками «permission denied» для изображений.

Кроме того, я вижу это, но не могу исправить права доступа. Возможно, я ошибся на каком-то шаге, например, запускал setup от имени неправильного пользователя.

root@ip-172-26-0-app:/var/www/discourse# ls -ld /shared/uploads/default/optimized/3X
drwx---r-x 18 discourse www-data 4096 Jun 29 17:52 /shared/uploads/default/optimized/3X
root@ip-172-26-0-app:/var/www/discourse# ls -ld /shared/uploads/default/optimized
drwx---r-x 5 discourse www-data 4096 Jun 29 17:52 /shared/uploads/default/optimized

Редактирование:
Исправил, изменив права доступа к директории и владельца.