# Rake 업로드: migrate\_from\_s3 실패

**URL:** https://meta.discourse.org/t/rake-uploads-migrate-from-s3-fails/154171
**Category:** Self-hosting
**Tags:** s3
**Created:** [6월 8, 2020, 11:20오전 UTC](https://meta.discourse.org/t/rake-uploads-migrate-from-s3-fails/154171 "2020-06-08T11:20:20Z")
**Posts on this page:** 12
**Page:** 2

<div class="post-metadata">

### Author: ![mcdanlj](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/mcdanlj/32/131829_2.png) [@mcdanlj](https://meta.discourse.org/u/mcdanlj)
#### Post date: [7월 3, 2020, 1:28오후 UTC](https://meta.discourse.org/t/rake-uploads-migrate-from-s3-fails/154171/23 "2020-07-03T13:28:47Z")

</div>

네, 하지만 2번 항목에서 그것을 덮어쓰셨기 때문에, 결국 다시 파일을 S3에 저장하는 것과 같습니다.

---

<div class="post-metadata">

### Author: ![mcdanlj](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/mcdanlj/32/131829_2.png) [@mcdanlj](https://meta.discourse.org/u/mcdanlj)
#### Post date: [7월 3, 2020, 1:36오후 UTC](https://meta.discourse.org/t/rake-uploads-migrate-from-s3-fails/154171/24 "2020-07-03T13:36:35Z")

</div>

app.yml 파일의 설정은 컨테이너를 다시 빌드할 때만 사용되며, 빌드 중인 컨테이너의 config/discourse.conf 파일을 채우는 데 사용됩니다.

---

<div class="post-metadata">

### Author: ![pnoeric](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pnoeric/32/177144_2.png) [@pnoeric](https://meta.discourse.org/u/pnoeric)
#### Post date: [7월 3, 2020, 1:43오후 UTC](https://meta.discourse.org/t/rake-uploads-migrate-from-s3-fails/154171/25 "2020-07-03T13:43:30Z")

</div>

> [@mcdanlj](#):
>
> 네, 하지만 2번 항목에서 이를 무시(over-rode)했기 때문에 그렇게 하면 결국 S3에 파일을 저장하는 것과 같습니다.

아! 그러면 `conf/discourse.conf` 파일에 `s3_` 변수가 있으면 Discourse가 S3 업로드가 활성화된 것으로 인식하는 건가요? 알겠습니다… 이해했어요… 그 부분을 제거하고 다시 시도해 보겠습니다.

---

<div class="post-metadata">

### Author: ![mcdanlj](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/mcdanlj/32/131829_2.png) [@mcdanlj](https://meta.discourse.org/u/mcdanlj)
#### Post date: [7월 3, 2020, 2:33오후 UTC](https://meta.discourse.org/t/rake-uploads-migrate-from-s3-fails/154171/26 "2020-07-03T14:33:45Z")

</div>

아마도 중요한 것은 하나뿐일 겁니다… 지금 컴퓨터 앞에 없어서 무엇이 그 문제를 유발할 수 있는지 확인해 볼 수 없지만, 만약 그 체크가 트리거된다면, 새로운 업로드가 모두 S3로 업로드되고 있다고 기대할 것입니다.

---

<div class="post-metadata">

### Author: ![pnoeric](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pnoeric/32/177144_2.png) [@pnoeric](https://meta.discourse.org/u/pnoeric)
#### Post date: [7월 6, 2020, 3:56오후 UTC](https://meta.discourse.org/t/rake-uploads-migrate-from-s3-fails/154171/27 "2020-07-06T15:56:54Z")

</div>

동작합니다, 동작합니다 동작합니다 동작합니다! yay!!! 모든 작업과 제가 해야 할 일을 인내심을 갖고 설명해 주셔서 정말 감사합니다. 이렇게 시작하게 되어 정말 좋습니다.

그래서 상황을 좀 더 잘 이해할 수 있도록 몇 가지 간단한 질문을 드리고 싶은데요…

저는 한 번에 100개씩 배치로 실행하고 있습니다. 처음 몇 주 동안은 도구가 게시글을 마이그레이션(?)하는 것처럼 보였는데, 지금은 이미지만 복사하고 있습니다. 게시글이 수천, 수만 개 있고 각각 대개 이미지 1개만 첨부되어 있는데… 게시글이 "다 소진"되었다는 것이 어떻게/왜 그런지 모르겠습니다. 게시글을 마이그레이션한다는 것은 정확히 무엇을 의미하나요? 그래서 질문 1은 정확히 무슨 일이 일어나고 있는지입니다. 😉

질문 2는 좀 더 간단합니다. 지금은 실행하면 이미지만 복사하는데, 로컬의 3X 폴더에 2X 이미지가 복사되는 것을 확인했습니다:

`Downloaded 27/100: //my-forum-storage.s3.dualstack.us-east-1.amazonaws.com/original/2X/1/14c56ef9f1dddb7b7a6f14e920234e0f714ea699.jpeg to /uploads/default/original/3X/1/4/14c56ef9f1dddb7b7a6f14e920234e0f714ea699.jpeg`

URL이 `2X/1/xyz.jpeg`에서 `3X/1/4/xyz.jpeg`로 변경되고 있다는 점에 주목해 주세요 (여기에 추가적인 폴더 경로가 있습니다)

이것이 모두 정상적인가요?

마지막으로, 이미지를 표본 검사해 보니 문제가 없어 보이지만, 해당 이미지가 어떤 게시글과 연관되어 있는지 전혀 알 수 없기 때문에 포럼에서 "실시간"으로 확인하여 사용자가 올바른 것을 보고 있는지 100% 확신할 수 없습니다. jpeg 이미지 파일명을 포럼 게시글과 어떻게 매핑할 수 있을까요?

---

<div class="post-metadata">

### Author: ![mcdanlj](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/mcdanlj/32/131829_2.png) [@mcdanlj](https://meta.discourse.org/u/mcdanlj)
#### Post date: [7월 8, 2020, 4:31오후 UTC](https://meta.discourse.org/t/rake-uploads-migrate-from-s3-fails/154171/28 "2020-07-08T16:31:30Z")

</div>

정확히 어떤 명령어를 입력하셨나요? 모든 게시물을 포함하도록 제한 범위를 늘려야 합니다.

그래서 다음 단계로 넘어갈 것이라고 확신한 시점에, 다음과 같이 큰 제한 값을 지정했습니다:

```plaintext
bin/rake uploads:batch_migrate_from_s3[100,100000]

```

이것은 게시물에서 찾은 업로드를 먼저 마이그레이션합니다. `post.raw`의 참조와 데이터베이스의 업로드 객체 사이에 참조 무결성이 없기 때문입니다. 원격 콘텐츠를 나타내는 일반 URL 또는 `upload://` 의사 프로토콜 URL에 대한 참조가 있는 게시물을 찾습니다. 이러한 경우 마이그레이션 후 게시물을 다시 렌더링(re-cook)해야 하며, S3를 직접 가리키는 기본 URL의 경우 수정 사항을 저장해야 할 수도 있습니다. 마이그레이션이 필요한 콘텐츠가 게시물에 없으면 다음 항목으로 넘어갑니다.

경로 변경은 마이그레이션 스크립트에서 직접 주도되는 것이 아니라, Discourse가 파일을 저장하는 위치를 변경하는 것입니다. 파일이 많을 때 성능 향상에 도움이 되도록 디렉터리 레벨을 하나 더 추가하는 것이 좋습니다. 또한 많은 다른 시스템들이 파일을 분산시키기 위해 두 개, 때로는 세 개의 디렉터리 레벨을 사용합니다.

저와 같은 문제에 직면할 수 있습니다. 다른 업로드를 마이그레이션하는 과정에서 Discourse가 사용자의 프로필 사진을 추적하지 못하게 된 것입니다. 백업에서 복원하기에는 너무 늦은 시점까지 이 문제를 인지하지 못했고, 결국 영향을 받은 사용자에게 메시지를 보내 사과하며 아바타를 수정해 달라고 요청했습니다. 거기서 정확히 무엇이 잘못되었는지는 여전히 알지 못합니다.

---

<div class="post-metadata">

### Author: ![pnoeric](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pnoeric/32/177144_2.png) [@pnoeric](https://meta.discourse.org/u/pnoeric)
#### Post date: [7월 8, 2020, 5:26오후 UTC](https://meta.discourse.org/t/rake-uploads-migrate-from-s3-fails/154171/29 "2020-07-08T17:26:59Z")

</div>

아, 그렇군요. 좋습니다. 진행 출력에서 이 내용을 확인했습니다:

```plaintext
All Post uploads migrated. Migrating profile uploads...
All profiles uploads migrated. Migrating other non-post uploads...

```

“non-post uploads”(게시물 외 업로드)란 무엇인가요? 대부분의 작업이 이 부분에 남아 있는 것 같습니다. 게시물과 프로필 업로드를 마이그레이션해도 아무런 변화가 없거든요.

원본 업로드 경로에 대한 안심시켜 주셔서 감사합니다!

> [@mcdanlj](#):
>
> 다른 업로드를 마이그레이션할 때 제가 겪었던 문제, 즉 Discourse가 사용자의 프로필 사진을 추적하지 못하게 되는 문제가 발생할 수 있습니다.

그 일이 일어나고 있는지 확실하지는 않지만 괜찮습니다. 제 사이트는 SSO를 사용하므로 사용자가 로그인할 때마다(또는 메인 사이트에서 사진을 변경할 때마다) 아바타 URL을 전달하기 때문입니다.

---

<div class="post-metadata">

### Author: ![mcdanlj](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/mcdanlj/32/131829_2.png) [@mcdanlj](https://meta.discourse.org/u/mcdanlj)
#### Post date: [7월 8, 2020, 9:33오후 UTC](https://meta.discourse.org/t/rake-uploads-migrate-from-s3-fails/154171/30 "2020-07-08T21:33:59Z")

</div>

솔직히 나머지 것들이 무엇이었는지 모르겠습니다. 참조 무결성이 문제가 될 경우 외래 키 제약 조건이 있을 거라고 기대했고, 그렇지 않으면 업로드를 조회해서 어디에 있든 그냥 사용하리라고 생각했습니다. 사용자 프로필에 첨부된 업로드 두 건에 대해 특별한 조치가 필요함을 보여주는 지표로 외래 키 제약 조건에 실제로 부딪히기도 했습니다.

---

<div class="post-metadata">

### Author: ![pnoeric](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pnoeric/32/177144_2.png) [@pnoeric](https://meta.discourse.org/u/pnoeric)
#### Post date: [7월 14, 2020, 6:48오전 UTC](https://meta.discourse.org/t/rake-uploads-migrate-from-s3-fails/154171/31 "2020-07-14T06:48:14Z")

</div>

음, 작동하는 것 같긴 한데… 오늘 아침에 심각한 문제가 생겼어요… 갑자기 디스크 사용량이 25%나 급증하면서 드라이브가 가득 차서 포럼이 완전히 충돌했거든요.

지금 rake를 실행하면 배치 실행 중에 이미지가 바로 다운로드/업로드되는 것 같아요. `rake` 명령어를 입력하면 정확히 300개의 이미지를 처리하고(300개씩 배치로 실행 중) 끝나버리거든요.

그래서 중요한 질문은 이거예요: S3에서 로컬 디스크로 이미지를 이동하는 작업만 큐에 넣으면 될까요? 그렇게 하면 5시에 어떤 종류의 배치 작업이 쌓여서 포럼을 다운시켰을 수 있을까요? ☹

---

<div class="post-metadata">

### Author: ![mcdanlj](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/mcdanlj/32/131829_2.png) [@mcdanlj](https://meta.discourse.org/u/mcdanlj)
#### Post date: [7월 14, 2020, 11:39오전 UTC](https://meta.discourse.org/t/rake-uploads-migrate-from-s3-fails/154171/32 "2020-07-14T11:39:30Z")

</div>

게시글을 이관하는 동안, 각 새 게시글을 작성하기 전에 큐가 비어질 때까지 기다리도록 설정했습니다. 각 새 프로필 업로드 세트, 그리고 그 외의 업로드도 마찬가지입니다. 이미지가 이동된 직후에 모든 이미지가 처리되어야 합니다. (표준 버전은 처리가 완료될 때까지 요청을 쌓아 큐를 막아버리는데, 제 경우라면 이미지 재처리 동안 10~12일 동안 포럼 알림을 전혀 보내지 못했을 것입니다.)

그런 스파이크가 발생한 원인에 대해 떠오르는 것은 없는데, 혹시 거대한 업로드들이 몰린 건 아니었을까요?

---

<div class="post-metadata">

### Author: ![pnoeric](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pnoeric/32/177144_2.png) [@pnoeric](https://meta.discourse.org/u/pnoeric)
#### Post date: [7월 14, 2020, 12:01오후 UTC](https://meta.discourse.org/t/rake-uploads-migrate-from-s3-fails/154171/33 "2020-07-14T12:01:43Z")

</div>

네, 저한테는 여전히 수수께끼예요. 솔직히, 저는 그다지 자주 배치 작업을 실행하지 않거든요. 매번 수동으로 명령어를 입력하고 실행 과정을 지켜보고 있어요. 더 이상 마이그레이션할 게시글이나 프로필이 없고, 나머지는 전부 "기타 업로드"입니다. 배치 작업을 실행하면 S3에서 다운로드해서 디지털 오션에 실시간으로 다시 업로드하는 것처럼 보입니다. (그리고 사이드킥에서 대기열에 추가되는 것을 나타내는 어떤 로그도 보이지 않아요.)

아침 5시 35분에 무슨 일이 있었는지 보여줄 다른 로그를 찾아보고 있습니다.

---

<div class="post-metadata">

### Author: ![Bathinda](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/bathinda/32/135888_2.png) [@Bathinda](https://meta.discourse.org/u/Bathinda)
#### Post date: [4월 24, 2021, 9:51오전 UTC](https://meta.discourse.org/t/rake-uploads-migrate-from-s3-fails/154171/34 "2021-04-24T09:51:04Z")

</div>

토픽 전체를 읽어보았습니다.

하지만 대부분이 제게는 혼란스러워 보였습니다. Docker/컨테이너 명령어와 기본적인 Rails 명령어에는 익숙합니다.

저도 비슷한 문제를 겪고 있습니다(많은 게시물의 이미지가 누락되거나, 클릭하기 전에는 일부 이미지가 표시되지 않음).

1년 중 서로 다른 두 시기에 서로 다른 두 개의 S3 버킷을 사용했습니다. 약 1000개의 게시물과 그에 해당하는 수의 이미지가 있습니다.  
이제 S3 버킷의 모든 이미지를 로컬 서버로 복사했습니다. Discourse URL을 어떻게 재매핑해야 이 이미지들이 게시물에 올바르게 연결되는지 알려주실 수 있는 분이 있을까요?

[이전 페이지](https://meta.discourse.org/t/rake-uploads-migrate-from-s3-fails/154171.md?page=1)
