첨부 파일이 서버에서 로컬로 제공되지만 공개되지 않음

문제 요약

라이브 Discourse 사이트(https://techenclave.com)에서 이미지 업로드 URL을 통해 접근할 때 404 오류가 발생합니다. 그러나 이미지는 디스크에 존재하며 내부적으로 정상적으로 서빙되고 있습니다. 게시물을 다시 베이킹(rebake)하고 앱을 재시작했으며 내부 서빙이 정상적으로 작동하는 것을 확인했지만, 외부에서는 여전히 404 오류가 발생합니다.


정상적으로 작동하는 부분

1. DB에 업로드 존재

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. 게시물 다시 베이킹

다음으로 게시물을 다시 베이킹했습니다:

Post.find(3125774).rebake!

6. 앱 재시작

다음 명령을 실행했습니다:

./launcher restart app

또한 다음도 시도했습니다:

sudo ./launcher rebuild app

(Daemon은 일시적으로 사용할 수 없었지만 나중에 수정되었습니다.)


작동하지 않는 부분

이미지 외부 접근

다음에 접근할 때:

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

다음과 같이 반환됩니다:

404 Not Found

이것은 모든 브라우저와 시크릿 모드에서 발생합니다.


도움이 필요한 부분

다음과 같은 원인을 식별하는 데 도움을 주실 수 있을까요?

  • localhost:3000을 통해 서빙되는 정상 작동하는 업로드,
  • 그러나 공개 도메인에서 외부적으로 404를 반환하는 경우?

무엇을 더 확인해야 합니까? 확인해야 할 관련 설정이나 로그가 있나요?

미리 감사합니다!

방금 업로드한 이미지조차 로드되지 않습니다. 404 오류가 발생하고 있습니다

아마도 이것은 표준 설치가 아닌가 봐요. 여기서는 주로 표준 설치만 지원됩니다.

Discourse를 어떻게 설치하셨나요?

다음에는 최근에 이사를 왔다는 점도 언급해 주시면 어떨까요?

temp.techenclave.com에서 techenclave.com으로 변경할 때 이 가이드를 따랐나요?

감사합니다.

설치는 GitHub에 있는 표준 Discourse 설치 가이드를 따랐습니다.

네, 노트북에서 로컬 마이그레이션을 수행했고, 백업을 만든 뒤 파일을 업로드하여 관리자 패널에서 백업 복원을 통해 서버에 복원했습니다. 하지만 성공적으로 표시되었음에도 불구하고 모든 첨부 파일이 복원되지 않아서 그렇게 했어야 하지 않았습니다. 어쨌든, 노트북의 로컬 설치에서 서버로 파일을 rsync하여 최신 상태로 동기화했습니다.

그다음은 하루 동안 설정을 테스트한 후 임시 도메인에서 루트 도메인으로의 도메인 마이그레이션이었습니다. 이것이 바로 당신이 올바르게 지적하신 부분입니다.

위 내용을 언급하지 않은 이유는, 위 활동 이후에 업로드된 최신 파일들도 여전히 표시되지 않기 때문입니다. 재빌드(rebuild)를 수행했음에도 불구하고요. 그래서 해당 정보가 관련이 없다고 판단했습니다.

아니요, 그 가이드를 따르지 않았습니다. 하지만 가이드를 다시 살펴보니, 제가 놓친 단계는 다음 두 가지뿐이었습니다:

  1. 설정에서 허용된 iframe 목록에 기존 도메인이 새 도메인과 함께 표시되었습니다.
  2. 게시물에서 도메인을 재매핑하는 작업이었습니다. 이 문제를 해결한 후 재배이크(rebake)를 수행할 예정이었기 때문에 나중에 처리하려고 했습니다. 해당 게시물은 이미 재배이크가 되었으며, 이미지 URL에는 기존 도메인이 포함되어 있지 않습니다.

이 두 가지가 관련 있는 포인트인가요?

심지어 테마 이미지에서도 404 오류가 발생합니다.

nginx 로그에 이미지에 대한 권한 거부(permission denied) 오류가 가득합니다.

또한 아래 현상을 확인했지만 권한을 수정하지 못했습니다. 설치를 잘못된 사용자로 실행하는 등 어떤 단계를 잘못 수행했을 수도 있습니다.

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

수정:
디렉터리 권한과 소유권을 변경하여 문제를 해결했습니다.