@schleifer 이거 이후로 가이드라인을 받을 수 있을까요?
좋습니다, 이걸로 작업을 진행할 수 있겠네요. 먼저 /default/*에 있는 모든 파일을 /original/1X/*로 이동하세요.
이것은 우리에게는 알려져 있지만 데이터베이스에는 반영되지 않은 상태입니다. 다음 단계에서는 DB에 있는 모든 업로드 파일의 경로를 조정할 것입니다. 다만, 다른 것을 변경하기 전에 먼저 sanity check(정합성 검사)를 해보겠습니다.
데이터베이스 콘솔을 시작하세요:
cd /var/discourse
./launcher enter
rails db
이 쿼리를 실행하여 해당 쿼리를 확인해 보세요:
select id,url from uploads where id > 0 and url not like '//PREFIX/original/%'
여기서 PREFIX는 BUCKET + ‘.s3.dualstack.’ + REGION + '.amazonaws.com’으로 대체해야 하며, 그 결과 //pesioforum.s3.dualstack.us-west-2.amazonaws.com/original/%와 같은 형태가 됩니다.
이 쿼리 결과는 (0 rows)를 출력해야 합니다. 그렇지 않다면 추가적인 단계가 필요합니다.
쿼리에 대한 업로드가 7개 있으며, 그중 S3에서 온 것은 없습니다.
따라서 모든 S3 링크가 오리지널(원본)만 가리키고 있는 것이 맞나요? 이 7개의 업로드는 S3를 업로드로 사용하기 시작한 2018년 10월 이전에 이루어진 것입니다.
S3 링크(2,614개) 중
2,368개는 //pesioforum.s3.dualstack.ap-south-1.amazonaws.com을 사용하고
246개는 //pesioforum.s3.ap-south-1.amazonaws.com을 사용합니다.
두 링크 모두 작동하지만, 사용할 수 있는 정규식(regex)에 영향을 미칠 수 있으므로 참고용으로 언급합니다.
@schleifer 이걸 마무리하는 데 도와주세요. ![]()
OK, 이제 /default/에서 /original/1X로 파일을 이동해도 될 것 같습니다.
rake s3:upload_assets 를 실행하여 해당 파일들을 S3로 마이그레이션할 수 있습니다.
Dualstack 엔드포인트는 IPv6과 IPv4 모두에서 작동합니다. 다른 엔드포인트는 IPv4 전용입니다.
이미지에는 데이터베이스의 문자열을 다시 매핑하는 스크립트가 포함되어 있습니다. 실행하기 전에 항상 /admin/backups를 통해 백업을 수행해야 합니다(햄버거 메뉴 → 관리자 → 백업).
다음은 246개를 수정하는 명령입니다:
discourse remap '//pesioforum.s3.ap-south-1.amazonaws.com/original/' '//pesioforum.s3.dualstack.ap-south-1.amazonaws.com/original/'
모든 것을 /default/에서 /original/1X/로 이동한 후, DB에서 해당 파일들을 다시 매핑할 수 있습니다. 하지만 그 전에 /original/2X에 있는 모든 것이 실제로 존재하는지 확인해야 합니다.
이 쿼리가 해당 경로 아래 버킷의 실제 개체 수와 동일한 행 수를 반환합니까?:
select url from uploads where url like '//pesioforum.s3.dualstack.us-west-2.amazonaws.com/original/2X/%'
Hey @schleifer
rake s3:upload_assets을 실행하여 S3로 마이그레이션할 수 있습니다.
이 명령을 실행했는데, 웹사이트용 자산(js, css 등)은 업로드되었습니다. 하지만 7개 파일은 업로드되지 않았습니다.
rake uploads:migrate_to_s3를 찾았지만, 이것이 이 작업에 맞는 태스크인지 확인하고 싶습니다.
데이터베이스의 문자열을 재매핑하기 위한 스크립트가 이미지에 있습니다.
이 방법은 잘 작동했고, uploads 테이블에 더 이상 오래된 non-dualstack 링크가 남아 있지 않습니다.
하지만 그 전에
/original/2X에 모든 파일이 실제로 존재하는지 확인해야 합니다.
불행히도 그렇지 않습니다. S3 버킷에는 521개의 파일이 있지만, uploads 테이블에는 2186개의 레코드가 있습니다.
/original/2X/에 필요하지만 없는 몇몇 파일을 테스트해 보니, 모두 /default/에 있었습니다.
예: uploads 테이블에서,
https://pesioforum.s3.dualstack.ap-south-1.amazonaws.com/original/2X/8/806a660beb158e9f06d07ffcd2370b389bbd250b.jpeg 은 존재하지 않지만, 동일한 파일은
https://pesioforum.s3.dualstack.ap-south-1.amazonaws.com/default/806a660beb158e9f06d07ffcd2370b389bbd250b.jpeg 에 있습니다.
이 시점에서, 일회성 해킹으로 /original/2X/{}/의 모든 파일을 /original/1X/로 이동하고, 게시글 등에 새 링크를 업데이트하는 방식으로 처리하는 것은 괜찮습니다.
새로운 업로드는 어쨌든 2X에 올바르게 배치되고 있으니까요.
아하, 네, 실제로 제가 의도했던 것이 바로 그 태스크였습니다. 나머지 7개 파일을 올리는 데 사용될 것입니다.
실제로, 현재 시점에서 가장 좋은 옵션은 그것입니다. 모든 파일을 /2X/ 서브 접두어에서 복사하여 /1X/로 이동하십시오.
모든 것이 제자리에 놓인 후, 다음 명령은 모든 데이터베이스 항목을 업데이트해야 합니다:
discourse remap --regex "//pesioforum\.doublestack\.s3\.ap-south-1\.amazonaws\.com/original/[1234]X/([0-9a-f]/){0,}" "//pesioforum.doublestack.s3.ap-south-1.amazonaws.com/original/1X/"
(이전에 백업을 가져야 한다는 경고 사항을 기억하십시오.)
그 후 일부 게시글은 wrench 메뉴를 통해 HTML 버전을 다시 빌드해야 할 수 있습니다. 몇 개를 넘는 경우, rake posts:rebake로 모든 것을 다시 빌드할 수 있습니다.
@schleifer 잘 작동했습니다! 정규식을 수정하고 모든 게시물을 다시 처리한 결과, 대부분의 이미지와 업로드 파일이 잘 작동합니다.
게시물이 아닌 일부 이미지(예: 다른 테마의 로고 등)는 여전히 /optimized/ 경로로 연결되고 있지만, 이는 수동으로 수정할 수 있습니다.
도움 주셔서 정말 감사합니다!
안녕하세요, 저희 환경에서도 이와 유사한 문제에 직면했습니다. 해결을 위해 도움을 받으려 합니다.
저희 문제는 여러 측면에서 이 문제와 유사합니다:
s3 upload bucket와s3 backup bucket에 동일한 값이 지정되어 있습니다.- Discourse를 업그레이드할 때 이 문제가 발생했습니다:
기존 버전: v2.3.0.beta3
새 버전: v2.5.0.beta6
- discourse 컨테이너에 exec로 접속하여 데이터베이스를 조회했습니다:
SELECT id,url FROM uploads where id > 0 and url not like '//acme-forum.s3.dualstack.us-west-2.amazonaws.com/original/%';
id | url
----+----------------------------------------------------------------------------------------------------
1 | /uploads/default/original/1X/eb17xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxc33.png
2 | /uploads/default/original/1X/b87fxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxv21.png
78 | //acme-forum.s3-us-west-2.amazonaws.com/original/1X/1205xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxv045.png
(3 rows)
- discourse 컨테이너에 exec로 접속하여 데이터베이스를 조회했습니다:
select url from uploads where url like '//acme-forum.s3.dualstack.us-west-2.amazonaws.com/original/3X/%';
//acme-forum.s3.dualstack.us-west-2.amazonaws.com/original/3X/6/2/6267xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxf607c.jpeg
(7953 rows)
- ./original/3X/ 디렉토리에 있는 항목 수를 확인했는데,
251개였습니다.
질문:
dualstack을 사용하고 있으며, URL을 다시 매핑하여 dualstack을 사용하지 않도록 하는 것은 원하지 않습니다.- 저희 폴더 구조가 다릅니다.
3X/X/Y(예:3X/7/a)와 같은 구조를 가지고 있습니다. 그렇다면default에서3X/*로 모든 것을 어떻게 이동해야 할까요? 그렇게 해도 여전히 올바르게 매핑되지 않을 것 같습니다.
현재 제 생각은, 4단계의 출력을 참조하여 파일을 ./original/3X/X/Y 폴더로 되돌려 이동해야 할 위치를 파악하는 스크립트를 작성하는 것입니다.
유일한 문제는 그렇게 했을 때, dualstack이 아직 해당 파일을 호스팅하지 않는다는 점입니다. 즉, 파일을 original/3X/X/Y로 대체했을 때, 다음 URL로 접속하면 파일을 볼 수 있습니다:
깨진 상태 https://acme-forum.s3.dualstack.us-west-2.amazonaws.com/original/3X/6/b/6b6xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxa001.png
업데이트 dualstack 엔드포인트가 제가 생각했던 것처럼 깨져 있지 않은 것으로 드러났습니다. 이미지 파일을 ./original/3X/6/b로 복사할 때 모든 사용자에게 읽기 권한을 부여하는 것을 잊어버리는 실수를 했습니다.
따라서 제 질문은 다음과 같습니다:
./default에 있는 이미지 파일을 ./original/3X/x/y로 되돌려 놓고, 데이터베이스는 전혀 수정하지 않는 것이 실행 가능한 옵션이 될 수 있을까요?
네, 업데이트 사항이 있습니다.
./original 이미지가 어디에 위치해야 하는지는 예측할 수 있는 것 같지만, ./optimized/ 이미지를 어떻게 수정해야 하는지는 모르겠습니다.
우리 포럼에서 게시글을 열면 ./optimized 이미지를 표시하려고 시도합니다.
optimized 이미지인지 확인하는 방법이 있을까요?
최적화된 이미지는 _2_10x10.png로 끝나는 것 같다는 추측을 하고 있습니다. 이 추측이 타당할까요? 그렇다면 _2_10x10.png와 같은 패턴이 포함된 파일은 optimized 폴더로, 그렇지 않은 파일은 ./original 폴더로 복사하는 스크립트를 사용하는 것이 실행 가능한 해결책이 될 수 있을까요?
예시:
GET https://acme-forum.s3.dualstack.us-west-2.amazonaws.com/optimized/3X/c/c/ccaxxxxxxxxxxxxxxxxxxxxxxxxxxxx85_2_690x268.png
[HTTP/1.1 403 Forbidden 0ms]
감사합니다!
@41821 uploads 테이블의 URL이 정확하고 정상 작동하는데도 게시글이 최적화된 이미지를 로드하려고 한다면, optimized_images 테이블을 비우고 모든 게시글을 다시 생성(rebake)하면 해결됩니다: discourse=> delete from optimized_images;
피드백 정말 감사합니다. 결국 파일 이름을 기준으로 /default 디렉터리에서 /optimized 디렉터리로 이미지를 이동시키는 스크립트를 작성해서 문제를 해결했습니다(그렇게 말해도 될지 모르겠지만). 이렇게 하니 잘 작동했고, 더 이상 문제가 발생하지 않습니다.
앞으로 이런 문제가 다시 발생한다면, 여러분이 제안하신 대로 optimized_images 폴더의 내용을 모두 삭제하고 다시 베이킹하겠습니다.
감사합니다!
