# 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:** 20
**Page:** 1

<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: [6월 8, 2020, 11:20오전 UTC](https://meta.discourse.org/t/rake-uploads-migrate-from-s3-fails/154171/1 "2020-06-08T11:20:20Z")

</div>

저는 [여기에 있는 단계](https://meta.discourse.org/t/stop-using-amazon-s3-for-uploads/107286/3?u=pnoeric)를 따르고, 사이트 전체를 백업한 뒤, AWS S3 버킷을 복제(clone)하고, Discourse 설정에서 버킷 이름을 원래 버킷에서 백업 버킷으로 변경한 다음, 설정에서 “S3에 업로드” 체크박스를 해제했습니다.

이제 마침내 S3에서 마이그레이션을 시작할 준비가 됐는데… 실패합니다. ☹

## 오류 메시지

```plaintext
root@ubuntu:/var/www/discourse# rake uploads:migrate_from_s3
Migrating uploads from S3 to local storage for 'default'...
rake aborted!
NoMethodError: undefined method `downcase' for nil:NilClass
/var/www/discourse/app/models/global_setting.rb:107:in `s3_bucket_name'
/var/www/discourse/app/models/site_setting.rb:157:in `absolute_base_url'
/var/www/discourse/lib/tasks/uploads.rake:138:in `migrate_from_s3'
/var/www/discourse/lib/tasks/uploads.rake:118:in `block in migrate_all_from_s3'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rails_multisite-2.2.2/lib/rails_multisite/connection_management.rb:68:in `with_connection'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rails_multisite-2.2.2/lib/rails_multisite/connection_management.rb:78:in `each_connection'
/var/www/discourse/lib/tasks/uploads.rake:118:in `migrate_all_from_s3'
/var/www/discourse/lib/tasks/uploads.rake:93:in `block in <top (required)>'
/usr/local/bin/bundle:23:in `load'
/usr/local/bin/bundle:23:in `<main>'
Tasks: TOP => uploads:migrate_from_s3
(See full trace by running task with --trace)

```

(여기가 [github에서 실패하는 라인](https://github.com/discourse/discourse/blob/f7d676dce19bc44f969d6b84ec820e2c72da3903/app/models/global_setting.rb#L107)입니다 – `s3_bucket` 값을 가져올 수 없는 것 같습니다?)

## 제가 시도해 본 다른 것들

- 명령줄에 자격 증명(credential)을 추가해 보았지만, 차이가 없었습니다. 예를 들어  
`DISCOURSE_S3_BUCKET="dn-forum-storage-backup" DISCOURSE_S3_REGION="us-east-1" DISCOURSE_S3_ACCESS_KEY_ID="xxxxxxxxxxxxxxxxxxxx" DISCOURSE_S3_SECRET_ACCESS_KEY="xxxxxxxxxxxxxxxxxxxx" DISCOURSE_S3_CDN_URL="https://dn-forum-storage-backup.s3.us-east-1.amazonaws.com" rake uploads:migrate_from_s3 `

- 또한 설정에서 S3 버킷 이름을 원래 버킷 이름으로 다시 변경해 보았지만, 여전히 운이 없었습니다. 같은 결과가 나왔습니다.

- 앱을 다시 빌드(rebuild)해 보기도 했습니다. 같은 결과였습니다.

@vinothkannans 무슨 일이 일어나고 있는지 아시나요?

도와주세요, Discourse的朋友们!

p.s. 작은 부연 설명: `rake --tasks` 명령은 이 태스크나 `uploads`로 시작하는 어떤 태스크도 목록에 표시하지 않습니다. 이것이 무언가를 의미하는지 모르겠습니다.

---

<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: [6월 8, 2020, 11:42오전 UTC](https://meta.discourse.org/t/rake-uploads-migrate-from-s3-fails/154171/2 "2020-06-08T11:42:04Z")

</div>

관련된 문제일 수 있나요? @mcdanlj 님에게 알림을 보냅니다.

> [@전역 설정과 사이트 설정 간 S3 구성 차이](https://meta.discourse.org/t/s3-configuration-expectations-between-global-and-site-settings/153766):
>
> I have a discourse instances where, months after initially creating the instance, we enabled “S3” (in our case, digital ocean spaces) for a while, only via admin settings, and never with any DISCOURSE\_ config options in the app.yml file. We never migrated everything to S3, but the bulk of our images were written while we had it enabled. Now we want to migrate everything off “S3” for a variety of reasons not important here. (I know this sounds like a support post so far. But it’s not…) In a rec…

---

<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: [6월 8, 2020, 12:09오후 UTC](https://meta.discourse.org/t/rake-uploads-migrate-from-s3-fails/154171/3 "2020-06-08T12:09:14Z")

</div>

@pnoeric 네, 정확히 같은 것처럼 보입니다. S3의 경우 `SiteSettings`와 `GlobalSettings`의 \_의도\_가 무엇인지 해당 이슈에서 아직 답변을 받지 못했기 때문에, 지금은 제 게시글의 1번 항목에서 언급했듯이 설정을 통해 `SiteSettings`에 추가하는 것 외에는 더 이상 도움을 드리기 어렵습니다.

---

<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: [6월 8, 2020, 2:14오후 UTC](https://meta.discourse.org/t/rake-uploads-migrate-from-s3-fails/154171/4 "2020-06-08T14:14:12Z")

</div>

안녕하세요, 답변 주셔서 감사합니다… `SiteSettings`와 `GlobalSettings`가 정확히 무엇을 의미하는지 저도 잘 모르겠어요. RoR 코딩을 잘 하지는 않고 전체 설정 구조를 충분히 이해하지 못해서요. 그냥 기본적인 설명만 따라 하고 있을 뿐입니다. 😉

하지만 @vinothkannans 님도 참여해 주시면 좋겠어요. 마이그레이션 작업 코드를 작성하신 분이라고 생각하거든요. 아니면 @team에서 이 부분을 아시는 다른 분도 마찬가지고요…

이 주제를 계속 지켜보겠습니다…

---

<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: [6월 8, 2020, 2:26오후 UTC](https://meta.discourse.org/t/rake-uploads-migrate-from-s3-fails/154171/5 "2020-06-08T14:26:39Z")

</div>

`s3_bucket`는 `GlobalSettings`에 있으며, 일반적으로 `app.yml` 파일의 환경 변수에서 생성되는 `config/discourse.conf` 파일에서 설정됩니다. `SiteSettings`는 앱의 관리자 설정에서 변경하는 항목들입니다.

처음 이 기능이 만들어졌을 당시에는 S3를 변경하려면 앱을 다시 빌드해야만 했던 것으로 보입니다. 최근에는 관리자 설정에 데이터를 입력하는 것이 가능해졌습니다. `SiteSettings`에 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: [6월 9, 2020, 8:19오전 UTC](https://meta.discourse.org/t/rake-uploads-migrate-from-s3-fails/154171/6 "2020-06-09T08:19:55Z")

</div>

음, @mcdanlj 확인차 여쭤보는데, `migrate_from_s3`가 실제로 작동하도록 하는 방법을 아직 찾지 못하신 거죠?

필요하다면 어떤 설정이나 저수준 파일이든 수정하는 데는 문제가 없습니다… S3 비용이 너무 많이 나와서 최대한 빨리 S3에서 벗어나야 하거든요.

---

<div class="post-metadata">

### Author: ![neounix](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/neounix/32/215617_2.png) [@neounix](https://meta.discourse.org/u/neounix)
#### Post date: [6월 9, 2020, 9:17오전 UTC](https://meta.discourse.org/t/rake-uploads-migrate-from-s3-fails/154171/7 "2020-06-09T09:17:01Z")

</div>

> [@mcdanlj](#):
>
> 처음 이 기능이 만들어졌을 당시에는 S3를 변경하려면 앱을 다시 빌드해야 하는 것으로 보입니다. 그리고 최근에는 관리자 설정에서 데이터를 입력할 수 있게 되었습니다. `SiteSettings`에 S3 설정이 추가될 때 단순히 일괄 마이그레이션을 수행하지 않은 의도가 무엇이었는지 알기 어렵습니다.

@pnoeric님과 @mcdanlj님, 안녕하세요.

디버깅 방법으로 rails 콘솔에 진입하여 s2 사이트 설정을 살펴보는 것이 도움이 될 수 있습니다.

예를 들어, 순수한 OOTB(Out Of The Box) discourse docker 단일 컨테이너 스탠드얼론 앱의 경우:

```plaintext
root@localhost:~# docker exec -it app rails c
[1] pry(main)> SiteSetting.s3_upload_bucket
=> ""
[2] pry(main)> SiteSetting.enable_s3_uploads
=> false
[3] pry(main)> 

```

rails 콘솔을 통해 확인한 SiteSettings를 다음에 나열된 기본값과 비교해 볼 수 있습니다:

> <https://github.com/discourse/discourse/blob/main/config/site_settings.yml>

이런 방식으로 디버깅하는 것이 도움이 될 수 있습니다(우리는 AWS나 S3를 사용하지 않아서 실제로는 잘 모르겠습니다). rails 콘솔이 조금이나마 도움이 될지도 모릅니다.

---

<div class="post-metadata">

### Author: ![itsbhanusharma](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/itsbhanusharma/32/180717_2.png) [@itsbhanusharma](https://meta.discourse.org/u/itsbhanusharma)
#### Post date: [6월 9, 2020, 10:27오전 UTC](https://meta.discourse.org/t/rake-uploads-migrate-from-s3-fails/154171/8 "2020-06-09T10:27:35Z")

</div>

> [@pnoeric](#):
>
> `rake --tasks` 명령어로 이 태스크나 `uploads`로 시작하는 태스크가 목록에 표시되지 않습니다. 이것이 어떤 의미를 가지는지 확실하지 않습니다.

`rake --tasks`는 설명(description)이 있는 태스크만 표시합니다. 모든 사용 가능한 태스크를 확인하려면 `rake -AT`를 사용할 수 있습니다.

> [@neounix](#):
>
> 이런 방식으로 디버깅하는 것이 도움이 될지도 모르겠습니다(우리는 AWS나 S3를 사용하지 않아서 정확히는 모르지만)? 아마 rails 콘솔이 조금 도움이 될 수도 있겠네요?

도움이 되지 않을 것 같습니다. 얼마 전 테스트 사이트에서 이 태스크들을 실행해 봤거든요. 두 태스크 모두 `env`에 S3 변수가 정의되어 있어야 하는 것 같습니다. 다만 몇 달 전 일이었고 `migrate_from_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: [6월 9, 2020, 10:51오전 UTC](https://meta.discourse.org/t/rake-uploads-migrate-from-s3-fails/154171/9 "2020-06-09T10:51:40Z")

</div>

> [@pnoeric](#):
>
> 흠, @mcdanlj, 확인차 질문드리는데, `migrate_from_s3`가 실제로 작동하도록 하는 방법을 아직 찾지 못하신 거 맞죠?

조금 까다로운 질문이네요. 제가 링크해 드린 게시물에 언급된 대로 `config/discourse.conf`에 `s3_bucket`을 설정했었고, 그로 인해 해당 특정 오류는 해결되었는데, 저도 그 게시물에서 언급했듯이요.

> [@mcdanlj](#):
>
> 기존 컨테이너의 `config/discourse.conf`에 `s3_bucket`을 넣어 테스트해 보았는데, 제 경우엔 오류가 해결되었습니다.

이 파일은 컨테이너 내부에 있습니다(`./launcher enter app`). 이 설정이 `./launcher rebuild app` 이후에도 유지되려면 `containers/app.yml` 파일의 `env` 섹션에도 `DISCOURSE_S3_BUCKET`을 추가해야 합니다.

제가 이를 수정했다는 점이 이 게시물이 개발 관련 게시물이지 지원 요청이 아니었던 이유입니다. 저는 계속 이 부분을 손보고 있는 중인데, 개발자분들이 _올바른_ 해결책이라고 생각하는 것이 무엇인지 의견을 구한 것이었습니다.

S3에 약 100GB의 파일이 있으므로 매우 신중하게 진행해야 합니다. 처리할 게시물의 수에 대한 제한을 구현했고, 다음으로 수정할 게시물의 수에 대한 제한을 구현해야 합니다. 저는 한 가지씩 시도해 보고 있습니다. 이 코드가 거의 사용되지 않는 것처럼 보임에도 불구하고 이 오류를 반복해서 확인하게 된 점이 코드 부패(code rot)에 대한 우려를 자아내며, 버그로 인해 사이트 전체가 망가질까 봐 걱정됩니다. 이번 작업이 그런 실수를 할 좋은 방법이 될 수 있어 보입니다.

- `upload://` (제 경우, 비동영상 업로드를 의미) 업로드의 경우, 지금까지는 작동하는 것으로 보입니다. 하나씩 진행한 후, 영향받은 게시물을 검토하여 모든 것이 정상 작동하는지 확인하고 있습니다.
- `upload://` 구문을 사용하지 않는 업로드(제 경우, 제 판단으로는 동영상 업로드를 의미)의 경우, S3 URL에 대한 직접적인 참조가 존재하는데, URL이 깨져 버립니다. 내가 무엇을 _으로_ 변경해야 하는지 정확히 파악할 수만 있다면 수정하기 어려운 버그는 아니지만, 아직 그 방법을 찾지 못했습니다. 따라서 이는 곧 올릴 PR 중 하나가 될 가능성이 높습니다.

이것은 제 여가 시간 프로젝트이므로, 완료 시점에 대한 약속은 드릴 수 없습니다.

---

<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: [6월 9, 2020, 4:18오후 UTC](https://meta.discourse.org/t/rake-uploads-migrate-from-s3-fails/154171/11 "2020-06-09T16:18:19Z")

</div>

> [@mcdanlj](#):
>
> 매우 까다로운 질문입니다. 제가 링크해 드린 게시물에서 언급했듯이 `config/discourse.conf`에 `s3_bucket`을 설정했고, 이는 제가 해당 게시물에서 언급했듯이 이 특정 오류를 해결했습니다.
> 
> 이 파일은 컨테이너 내부( `./launcher enter app` )에 있습니다. `./launcher rebuild app`를 실행해도 이 설정이 유지되려면 `containers/app.yml` 파일의 `env` 섹션에도 `DISCOURSE_S3_BUCKET`을 추가해야 합니다.

아, 감사합니다! 한번 시도해 보겠습니다.

---

<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: [6월 16, 2020, 10:16오전 UTC](https://meta.discourse.org/t/rake-uploads-migrate-from-s3-fails/154171/13 "2020-06-16T10:16:41Z")

</div>

아, 역시 안 되네요. @neounix @mcdanlj @vinothkannans. 여전히 실패합니다. 하지만 적어도 이전과 다른 새로운 오류 메시지가 뜨네요…

오늘 제가 시도해 본 내용은 다음과 같습니다:

1. 확실하게 하기 위해 최신 버전의 Discourse로 업그레이드했습니다.

2. `config/discourse.conf`에 제 s3\_bucket을 추가했습니다.

3. `./launcher enter app`을 실행했습니다.

4. `containers/app.yml` 파일을 편집하여 DISCOURSE\_S3\_BUCKET 변수를 추가했습니다.

5. `rake uploads:migrate_from_s3`을 시도했는데, 이제는 새로운 오류 메시지와 함께 실패합니다 (이전에는 `downcase`가 문제를 일으켰는데, 지금은 `start_with?`인 것 같습니다):

```plaintext
/var/www/discourse# rake uploads:migrate_from_s3
Migrating uploads from S3 to local storage for 'default'...
rake aborted!
NoMethodError: undefined method `start_with?' for nil:NilClass
/var/www/discourse/app/models/site_setting.rb:161:in `absolute_base_url'
/var/www/discourse/lib/tasks/uploads.rake:138:in `migrate_from_s3'
/var/www/discourse/lib/tasks/uploads.rake:118:in `block in migrate_all_from_s3'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rails_multisite-2.3.0/lib/rails_multisite/connection_management.rb:68:in `with_connection'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rails_multisite-2.3.0/lib/rails_multisite/connection_management.rb:78:in `each_connection'
/var/www/discourse/lib/tasks/uploads.rake:118:in `migrate_all_from_s3'
/var/www/discourse/lib/tasks/uploads.rake:93:in `block in <main>'
/usr/local/bin/bundle:23:in `load'
/usr/local/bin/bundle:23:in `<main>'
Tasks: TOP => uploads:migrate_from_s3
(See full trace by running task with --trace)

```

1. 그래서 `./launcher rebuild app`을 시도해 보았습니다.

2. 다시 `./launcher enter app`을 실행하고, `rake uploads:migrate_from_s3`을 실행했습니다.

완전히 동일한 문제입니다:

```plaintext
/var/www/discourse# rake uploads:migrate_from_s3
Migrating uploads from S3 to local storage for 'default'...
rake aborted!
NoMethodError: undefined method `start_with?' for nil:NilClass
/var/www/discourse/app/models/site_setting.rb:161:in `absolute_base_url'
/var/www/discourse/lib/tasks/uploads.rake:138:in `migrate_from_s3'
/var/www/discourse/lib/tasks/uploads.rake:118:in `block in migrate_all_from_s3'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rails_multisite-2.3.0/lib/rails_multisite/connection_management.rb:68:in `with_connection'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rails_multisite-2.3.0/lib/rails_multisite/connection_management.rb:78:in `each_connection'
/var/www/discourse/lib/tasks/uploads.rake:118:in `migrate_all_from_s3'
/var/www/discourse/lib/tasks/uploads.rake:93:in `block in <main>'
/usr/local/bin/bundle:23:in `load'
/usr/local/bin/bundle:23:in `<main>'
Tasks: TOP => uploads:migrate_from_s3
(See full trace by running task with --trace)

```

다른 아이디어가 있을까요?

참고로 이 과정은 정말 번거롭습니다. 포럼 중단 일자를 미리 예약하고 공지해야 하고, 당일에는 포럼에 접근할 수 없도록 메인 사이트를 변경해야 하며, 진행하기 전에 DigitalOcean에서 포럼 서버를 종료하고 스냅샷을 찍어야 합니다. 이것만 해도 약 30분이 걸립니다. 그런 다음 다시 서버를 시작해야 하고, 그 후에야 위의 단계를 시도할 수 있습니다. 미디어 저장을 위해 Amazon S3를 설정한 것을 정말 후회하고 있습니다! 그 선택을 되돌리려고 수 시간을 낭비했는데도 여전히 성공하지 못하고 있습니다 (그리고 매월 Amazon에서 여전히 큰 금액의 청구서가 나옵니다). 이 문제의 근본 원인을 파악하고 싶습니다. 제가 어떻게 도움을 줄 수 있을까요?

---

<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: [6월 16, 2020, 8:15오후 UTC](https://meta.discourse.org/t/rake-uploads-migrate-from-s3-fails/154171/14 "2020-06-16T20:15:04Z")

</div>

해당 줄은 다음과 같습니다:

```plaintext
        if SiteSetting.Upload.s3_region.start_with?("cn-")

```

` s3_region` 값도 필요한 것 같습니다. 왜 제가 그 문제를 겪지 않았는지는 저에게도 명확하지 않습니다.

말씀하신 논리를 잘 이해하지 못하겠습니다. 저는 약 100GB 분량의 콘텐츠를 정상적인 사이트 백업 후 라이브 상태로 마이그레이션할 계획입니다. 다만 저는 소규모로 시작하고 있기 때문에 한 번에 마이그레이션하는 양을 제한하는 작업을 진행해 왔습니다. 한 가지 경고: 현재 코드 상태에서는 비디오 업로드 시 리터럴 URL 변환에 대해 코드가 _잘못_ 작성되어 있는 것으로 보이므로, 비디오 업로드를 허용했다면 해당 부분에 문제가 발생할 수 있습니다.

---

<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: [6월 17, 2020, 11:23오전 UTC](https://meta.discourse.org/t/rake-uploads-migrate-from-s3-fails/154171/15 "2020-06-17T11:23:11Z")

</div>

> [@mcdanlj](#):
>
> `s3_region`도 필요해 보이는데, 내가 왜 그걸 겪지 않았는지는 내게도 명확하지 않네요.

그러면 위에서 했던 모든 단계를 반복하되, s3\_bucket, s3\_region, s3\_cnd\_url, s3\_secret\_access\_key 등(기본적으로 제가 가진 모든 변수)을 conf 파일과 yml 파일에 넣어야 할까요? 시스템이 실제로 작동할 수 있도록, (아마) 필요한 것보다 더 많은 정보를 주는 편이 낫다고 생각합니다.

> [@mcdanlj](#):
>
> 당신의 논리를 잘 따라가지 못하겠습니다. 제 경우 약 100GB 분량의 콘텐츠 마이그레이션은 일반적인 사이트 백업 이후에 라이브 상태로 진행할 계획입니다.

Discourse 팀의 누군가가 이 전환 작업을 시작하기 전에 로컬 사이트 전체를 백업하라고 제안한 것을 봤습니다. 그러려면 Digital Ocean 서버를 오프라인으로 만들어야 합니다. ☹

> [@mcdanlj](#):
>
> 하지만 저는 작게 시작하고 있어서, 한 번에 마이그레이션하는 양을 제한하는 작업을 해왔습니다.

맞아요. 저도 작게 시작하고 있죠… 시도할 때마다 0개 파일만 마이그레이션됩니다. 😁

> [@mcdanlj](#):
>
> 한 가지 경고: 비디오 업로드에서 확인하듯, 현재 코드 상태에서는 리터럴 URL 변환에 대해 코드가 _잘못_ 되어 있는 것 같습니다. 따라서 비디오 업로드를 허용했다면 해당 부분에 문제가 있을 수 있습니다.

다행히 제 포럼에서는 회원들이 JPG, GIF, PNG만 업로드할 수 있으므로 괜찮을 것입니다.

좋은 결과 있기를 바랍니다.

---

<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: [6월 17, 2020, 2:53오후 UTC](https://meta.discourse.org/t/rake-uploads-migrate-from-s3-fails/154171/16 "2020-06-17T14:53:58Z")

</div>

> [@pnoeric](#):
>
> 디스코urs 팀의 누군가가 이 전환을 시작하기 전에 로컬 사이트를 전체 백업하라고 제안한 것을 보았습니다.

백업과 스냅샷은 같은 것이 아닙니다. 스냅샷은 가장 단순한 형태의 백업입니다. 관리자 콘솔에는 백업 기능이 있습니다. 먼저 설정에서 섬네일(thumbnails)을 백업하도록 구성했는지 확인하세요.

> [@pnoeric](#):
>
> 맞습니다. 저도 작게 시작하고 있습니다… 시도할 때마다 파일 0개가 마이그레이션됩니다. 😁

사이트를 내릴 필요가 없다는 것을 알게 되셨으니, 이제 좀 더 편안해지실 수 있을 것입니다. `batch_migrate_from_s3`를 사용하여 업로드를 최대 특정 개수까지 마이그레이션할 수 있습니다. 현재 이 기능은 마이그레이션된 항목 수가 아니라 고려 대상인 게시물 수를 제한하고 있는데, 이는 제가 향후 PR에서 해결해야 할 버그입니다. 또한 비디오 업로드 버그도 해결해야 하고, 제한 기능의 목적 중 하나가 마이그레이션이 성공했는지 영향을 받은 게시물에서 확인할 수 있도록 하는 것이므로 피드백을 출력하는 것도 고려하고 싶습니다.

이 모든 작업을 향후 1~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: [6월 20, 2020, 9:54오후 UTC](https://meta.discourse.org/t/rake-uploads-migrate-from-s3-fails/154171/17 "2020-06-20T21:54:52Z")

</div>

@pnoeric 사이트 가동 시간(uptime)에 대해 우려하고 계시므로, 지금까지 파악한 내용을 공유해 드리려 합니다.

앞서 언급했듯이 저는 라이브 환경에서 마이그레이션을 수행했습니다. 마이그레이션에 속도 제한(rate-limit)을 걸지 않으면, 서로의 활동을 사용자에게 알림을 보내는 등의 작업을 처리하는 큐가 막히고 사이트의 사용자 경험이 저하됩니다.

저는 약 500개의 비디오 게시글과 약 3만 개의 이미지 게시글을 마이그레이션했는데, 이를 완료하는 데 약 2주가 소요되었습니다.

제가 사용한 코드를 시도해 보시려면, 현재는 다음 주소에 있습니다.

> <https://github.com/johnsonm/discourse/blob/mkj-fix-more-urls/lib/tasks/uploads.rake>

이 파일을 다운로드하여 앱에 복사한 뒤, `lib/tasks/uploads.rake`의 현재 내용을 대체하시면 됩니다.

이 코드를 사용하면 다음과 같은 작업을 수행할 수 있습니다:

```bash
bin/rake uploads:batch_migrate_from_s3[100,1000]

```

이 명령은 업로드가 포함된 총 1,000개의 게시글만 대상으로 하며, 최대 100개까지 파일을 마이그레이션한 후 중단됩니다. 업로드 마이그레이션 후 게시글이 실제로 수정될 때마다, 다음 게시글을 시작하기 전에 큐가 비어 있을 때까지 대기합니다.

이 파일을 복사해 넣으면, 변경 사항을 되돌리기 전까지 **_향후 사이트 업데이트가 깨질 것입니다._** 만족스럽게 작업이 끝난 후 이를 되돌리는 가장 쉬운 방법은 `./launcher rebuild app`을 실행하는 것입니다(개발자로서 저는 `git checkout HEAD lib/tasks/uploads.rake`를 사용하여 변경 사항을 되돌립니다…).

Digital Ocean Spaces의 경우, 마이그레이션이 성공하기까지 몇 번 재시도해야 하는 경우가 있다는 것을 확인했습니다. 현재 스크립트에는 이런 일이 발생했을 때 경고 메시지가 표시되지 않아, 계속 실행하고 결과를 기다려야만 합니다. 해당 경우 오류를 출력하도록 하는 PR이 리뷰 대기 중이므로, 적어도 문제가 발생했음을 알 수 있도록 하겠습니다.

…

단순한 짧은 재시도 루프와 오류 메시지를 추가했는데, 재시도 루프가 문제를 해결하는 것으로 보입니다. 또한, 현재 규칙에 대한 검증이 과거 게시글의 원본(raw) 콘텐츠에 대해 수행되고 있었는데, 이는 마이그레이션을 중단시키고 재베이크(rebake)가 필요한 게시글을 조용히 남겨둘 수 있었습니다. 이 문제도 수정했습니다. 마이그레이션을 수행할 때, 현재 리뷰 대기 중인 제 PR에 포함된 커밋 중 하나인 검증 수정 사항을 반드시 포함해야 합니다.

…

제 지식 범위 내에서 마이그레이션을 완료했습니다. 제 PR에는 마이그레이션을 완료하는 데 사용한 모든 코드가 포함되어 있습니다. 아직 리뷰를 받지 못했습니다. 원하시면 [Migrate\_from\_s3 problems](https://meta.discourse.org/t/migrate-from-s3-problems/119064) 주소를 따라가 보시길 권합니다.

---

<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월 1, 2020, 5:20오후 UTC](https://meta.discourse.org/t/rake-uploads-migrate-from-s3-fails/154171/18 "2020-07-01T17:20:52Z")

</div>

감사합니다! 며칠 안에 한번 시도해 볼게요.

---

<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월 1, 2020, 9:24오후 UTC](https://meta.discourse.org/t/rake-uploads-migrate-from-s3-fails/154171/19 "2020-07-01T21:24:32Z")

</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월 3, 2020, 12:02오후 UTC](https://meta.discourse.org/t/rake-uploads-migrate-from-s3-fails/154171/20 "2020-07-03T12:02:40Z")

</div>

진짜, 이거 나 더 미치게 만들 수 있어? 🤪

내가 한 작업은 다음과 같아:

1. 너의 새로운 `lib/tasks/upload.rake` 코드를 내 Discourse에 복사해 넣었어.
2. 내 Amazon `s3_` 변수를 전부 `config/discourse.conf`에 추가했어.
3. `app.yml`에도 추가했어 (이게 실제로 효과가 있는지 불분명하지만, 해보는 게 나쁘지 않으니까).
4. 이 명령어를 실행했는데…

```plaintext
root@:/var/www/discourse/config# rake uploads:batch_migrate_from_s3[100,1000]
You must disable S3 uploads before running that task.

```

그리고 확인해보니:

 ![image](https://global.discourse-cdn.com/meta/original/3X/3/6/36370aeaa2ce5d58ff34b67450c66e2bbaa8e561.png)

그래서, 알겠어. `uploads.rake` 파일을 편집해서 그 체크 부분을 그냥 제거했어.

이제 이런 메시지가 나와:

```plaintext
root@:/var/www/discourse/lib/tasks# rake uploads:batch_migrate_from_s3[100,1000]
Migrating uploads from S3 to local storage for 'default'...
Migrating up to 100 of 1000 posts...
... (여기서 출력 내용이 많음) ...
Modified 91/100: 28795: 28486/1 - https://example.com/t/topic-title-here/28486/1
... (여기서 출력 내용이 많음) ...

```

그러니까 작동하는 것 같았어! 좋아!

그 첫 번째 배치 100개를 처리한 후, sidekiq를 확인해보니 내 테스트 게시글이 큐에 들어 있는 것을 보고 그 작업이 끝나기를 기다렸어…

 ![image](https://global.discourse-cdn.com/meta/original/3X/b/d/bd33381ace8807379d5dc1355e20ce450bc31859.png)

…그리고 다시 돌아가서 확인해보니… 그 게시글의 이미지는 여전히 Amazon S3에서 가져오고 있어. ☹ 게시글에서 "Rebuild HTML"을 시도해봤지만 그것도 변하지 않았어.

그래서 이번에는 `rake`부터 시작해 전체 과정을 처음부터 다시 시도했는데, 결과는 똑같았어-- 같은 100개의 게시글이 처리되고, sidekiq에 같은 것들이 큐에 쌓였고, 실행을 마저 진행시킨 후에도 그 테스트 게시글의 이미지는 여전히 S3에서 가져오고 있어.

음, 다음에 뭘 시도해볼지 모르겠어. 🤷🏻‍♂️

@mcdanlj 조언이나 제안을 주시면 감사할게 😉

---

<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:12오후 UTC](https://meta.discourse.org/t/rake-uploads-migrate-from-s3-fails/154171/21 "2020-07-03T13:12:39Z")

</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월 3, 2020, 1:24오후 UTC](https://meta.discourse.org/t/rake-uploads-migrate-from-s3-fails/154171/22 "2020-07-03T13:24:42Z")

</div>

그들은 완전히 꺼져 있었습니다. (제 게시물에 있는 체크박스 이미지가 올바른 설정인가요?) 심지어 켰다가 다시 꺼보기도 했습니다. 그래도 안 됩니다.

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