깨진 이미지와 해당 S3 URL

최근 2.5.0.beta7로 업데이트한 후 포럼의 모든 이미지가 깨졌습니다.
image

아바타도 기본 이미지로 대체되었습니다. 대시보드의 제 설정은 다음과 같습니다:

제 자산(Assets) 관련 스태프 게시물:

해당 이미지 중 하나: /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/ 경로에 있을 것입니다.
따라서 4064b…d.png 파일을 찾으려면 ls -R /var/discourse/shared/standalone/uploads/ | grep 4064b 명령을 실행해 보세요.

@masterakay 님과 같은 Discourse 인스턴스에 대해 이야기하고 있습니다.

우리는 2년 이상 전에 S3로 전환했으며, 로컬 업로드 디렉토리의 파일 중 2018년 이후의 것은 없습니다.

제 이해로는, 이미지는 “original” 폴더에 업로드되고, 처리(잘라내기, 크기 축소 등)된 후 “optimized” 폴더에 저장됩니다. Discourse가 이미지 업로드 시 사용하는 URL은 여전히 “/original/1X/” 폴더의 것입니다. 그런데 어찌된 일인지 업그레이드 후 “1X” 폴더가 사라졌습니다.

“default” 폴더에는 업로드된 파일(이미지 등)과 잘라낸 버전이 많이 포함되어 있습니다. 여기에는 약 10,000개의 파일이 있어 약 2.5GB를 차지합니다.

문제는 게시물의 이미지 URL이 항상 “original” 폴더를 가리키고 있다는 점입니다.
우리가 발견한 것은, 누락된 파일들이 “default” 폴더의 파일 부분집합이라는 것입니다.
새로 업로드하는 파일은 문제가 없이 "/original/2X/"에 저장됩니다.

누군가 “/original/1X/” 폴더가 어디로 사라졌는지, 그리고 이를 복원할 수 있는지 아이디어를 가지고 계신가요?

@sam @codinghorror 이 문제를 당신들에게까지 가져와서 정말 죄송합니다. 그런데 상황이 꽤 시급합니다. 우리는 학생이라, 학교에서 이미지 문제를 해결하라고 압박을 가하는데 정말 어찌할 바를 모르겠습니다.

저도 같은 현상을 겪고 있으며, 최근 업데이트 이후에 갑자기 발생하기 시작했습니다.

https://discourse.sesp.northwestern.edu

S3는 어떻게 설정하셨나요? app.yml에서 값을 설정하셨나요, 아니면 관리자 UI에서만 설정하셨나요? DISCOURSE_S3_BUCKET 또는 DISCOURSE_S3_BACKUP_BUCKET 값이 의도하지 않은 것으로 보입니다.

네, 제가 설명드린 것처럼 최근 업데이트까지 모든 것이 정상적으로 작동했습니다. 모든 단계를 따랐습니다.
특히, 다음과 같은 작업을 수행했습니다:

이 값들에 대해, app.yml에서 설정된 변수를 찾을 수 없는 것 같습니다. 이전에 이 설정은 필요하지 않았는데, 뭔가 변경된 건가요?

그렇습니다. 코드에 문제가 있을 수 있지만, 무엇이 왜 그런지 우리는 알지 못합니다. 따라서 더 많은 정보가 필요합니다.

S3를 설정하는 두 가지 다른 방법이 있습니다. app.yml에서 환경을 구성하거나 관리자 UI에서 값을 입력할 수 있습니다. 각 방법에서 변수 이름이 약간 다르게 표시됩니다.

링크하신 토픽은 관리자 UI에서 설정하는 방법을 설명하고 있습니다. 만약 사이트를 그렇게 설정했다면, **s3_upload_bucket**과 **s3_backup_bucket**의 값이 무엇인지 알려 주실 수 있나요?

@schleifer 저도 마찬가지입니다. 해당 설정에서도 아무것도 변경하지 않았습니다. 또한 AWS 자격 증명이 정상적으로 작동하는지 확인했습니다.

아, 그건 그거였군요.

해당 설정값이 같으면 안 되는데, 같은 값이어서 문제가 발생한 것입니다. 설정 관련 주제에서 "업로드와 백업에 서로 다른 버킷을 반드시 사용해야 하나요?"라는 항목을 검색해 보세요.

유지보수 작업이 백업 버킷의 내용을 대상으로 실행되었는데, 값이 겹쳐서 업로드에까지 영향을 미쳤습니다.

@sam 님, 이건 문서가 아니라 코드에서 강제하는 것이 좋겠습니다.

사이트를 복구하려면 두 단계가 필요합니다:

첫째, 백업 접두사를 변경해야 합니다. 설정 주제에 설명된 대로 끝에 /backups를 추가하면 충분합니다.

둘째, S3 버킷의 모든 내용을 올바른 위치로 되돌려야 합니다. 최상위 “default” 폴더에 있는 모든 내용은 최상위 레벨로 다시 이동해야 합니다.
예를 들어, 그곳에 “default/originals” 폴더가 있을 텐데, 이 폴더를 한 단계 위로 이동해야 합니다.

버킷을 탐색하려면 AWS 웹 콘솔이나 기타 도구를 사용해야 합니다.

네, 정말 감사합니다! 말씀해 주신 단계를 시도해 보고, 만약 문제가 발생하면 다시 찾아올게요. 갑자기 이런 일이 생긴 이유가 있을까요? :sweat_smile:

Hey @schleifer, 말씀하신 내용이 이해됩니다. 그래서 버킷 이름에 backups 접두사를 추가했습니다.

기존 업로드 파일의 경우, 모든 업로드가 /default/ 폴더 안에 있으며(서브폴더가 아닙니다). 게시물(그리고 다른 모든 곳)의 이미지 URL은 /original/* 또는 /optimized/*를 사용합니다.

기본 폴더 안의 모든 것을 한 단계 위로(루트로) 이동하면, 이미지는 /*에 위치하게 됩니다.
그리고 아니요, defaults 안에 하위 폴더는 없고 업로드 파일만 있습니다. 표준 40자 해시 파일명을 가진 파일과 “_2_10x10” 같은 접미사가 붙은 파일(최적화 과정에서 생성된 것으로 추정됩니다)이 섞여 있는 것 같습니다.

이 문제를 어떻게 해결하는 것이 좋을까요? 모든 게시물에 새 링크를 적용하는 데는 시간이 걸릴 텐데, 이 파일명을 기준으로 파일을 올바른 폴더에 그룹화하는 방법이 있을까요?

@schleifer 이 건에 대해 업데이트가 있나요?

그건… 예상치 못한 일이네요. 그러면 수동으로 다수 항목을 수정해야 할 것 같습니다.

가장 중요한 질문은 "새로운 업로드가 올바른 위치에 저장되고 있는가?"입니다.

그것이 사실이라면, 기존 업로드 파일을 알려진 위치로 이동하고 데이터베이스 항목을 조정하면 됩니다. /default/ 폴더에는 몇 개의 파일이 있나요?

다행히도 새로운 업로드가 서브폴더로 정상적으로 작동하고 있습니다. 게시물 내 링크도 올바른 위치를 가리키고 있습니다.

/default/ 폴더에는 10,000개 이상의 파일이 있습니다. 각 게시물을 수동으로 수정하는 것은 많은 작업이 될 것 같습니다. 이를 스크립트로 처리할 수 있는 방법이 있을까요? 모든 게시물에 정규식 치환을 적용하는 방식이 가능할까요?

네, 그런 계획입니다. 다음 단계는 모든 AWOL 파일을 알려진 위치에 두는 것입니다. 버킷 안에서 /original/ 아래에 어떤 하위 디렉터리가 있나요? /1X/가 있고, 다른 것들도 있을 수 있습니다.

이것은 전체 폴더 구조입니다. 새 업로드(정상 작동)는 /original/2X/*/.jpg에 저장됩니다.

/
|---backups
    |---default
        |---(다수의 백업 .tar.gz 파일)
|---default
    |---(업로드된 10,719개의 파일: 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}
            |---(위 폴더 이름 문자로 시작하는 업로드된 파일) (총 1,055개 파일)
|---original
    |---2X
        |---(optimized/2X와 동일, 520개 파일)
|---tombstone
    |---optimized
        |---1X
            |---(2개 파일)
    |---original
        |---2X
            |---(optimized/2X와 동일, 1개 파일)

다음으로 해야 할 일은 모든 소재불명(AWOL) 파일을 알려진 위치에 두는 것입니다.

/default/에는 이미 모든 이미지가 있는 것 같습니다.