업데이트 소식입니다 - 결국 문제를 해결했습니다. 여기서 배운 몇 가지 교훈이 다른 분들에게 도움이 될 수 있을 것 같아 아래에 상세히 정리했습니다. Unix 권한 관련 주의사항은 원글(OP)에 추가할 가치가 있을 것 같습니다.
첨부 파일 폴더의 Unix 권한
SMF2 가져오기(importer)는 잘 작동했지만, 첨부 파일의 Unix 권한과 관련된 작은 함정이 있었습니다. 가져오기 스크립트를 실행할 때 discourse 사용자로 실행되는데, 첨부 파일 볼륨 마운트에 대해 읽기 및 쓰기 권한을 모두 반드시 가져야 하는 것은 아닙니다.
가져오기 과정에서 가져오기 도구가 같은 디렉터리 내에 작은 임시 파일을 생성하는 것 같습니다. 따라서 올바른 사용자에게 읽기 및 쓰기 권한이 모두 있는지 반드시 확인해야 합니다. 저는 호스트에서 해당 디렉터리를 discourse 사용자로 재귀적으로 chown하여 처리했지만, 매우 개방적인 권한을 설정하거나 액세스 제어 목록(ACL)을 사용하는 등 다른 방법들도 있습니다.
실패한 업로드를 디버깅하는 것은 어렵습니다
SMF2 가져오기 도구가 어떤 이유로든 업로드에 실패하면 동일한 방식으로 실패를 보고하므로, 첨부 파일/업로드가 왜 실패했는지 파악하기가 어려울 수 있습니다.
원인은 다음과 같은 것들을 포함할 수 있습니다:
- 첨부 파일이 파일 시스템에서 잘못된 위치에 있는 경우.
- 첨부 파일의 권한이 불충분한 경우(
rw필요). - Docker 볼륨 마운트가 올바르게 설정되지 않은 경우.
- SMF2 데이터베이스에 첨부 파일이 있어야 한다고 보고되어 있지만, 실제 첨부 파일 폴더에는 더 이상 존재하지 않는 경우(약 20년 된 저희 SMF2 포럼에는 ‘분실’된 첨부 파일이 꽤 많았습니다 - 이러한 경우엔 할 수 있는 것이 거의 없습니다…)
- 업로드 객체가 Discourse 데이터베이스나
/shared/standalone/uploads디스크에 올바르게 저장되지 않는 경우. - 업로드 링크를 위한 마크다운이 생성되지 않는 경우.
저는 첨부 파일 처리 과정의 모든 단계를 끝에서 끝까지 테스트하고, smf2.rb 코드에 상당数量的 추가 디버깅용 puts 문장을 추가하여 업로드 생성 과정의 어느 부분이 작동하지 않는지 파악했습니다. 제 경우엔 여러 가지 작은 문제들이 있었는데, 결국 하나씩 해결해 나갔습니다.
게으름을 피우지 마세요, 마커스
그리고 마지막에 게을러져서 데이터베이스를 완전히 제로로 초기화하지 않았습니다. 그래서 모든 것이 성공적으로 수행되었는데도 문제가 발생했습니다. 가져오기 도구는 이미 가져온 주제(Topic)나 게시물(Post)을 덮어쓰지 않기 때문이죠. 따라서 업로드를 참조하는 마크다운, 즉 다음과 같은 형태여야 할 것이:
---

게시물에 삽입되지 않았습니다.
이를 해결하기 위해 Discourse 인스턴스의 데이터베이스를 가져오기 이전 상태로 되돌렸습니다. 일반적으로 모든 것을 shared/standalone에서 삭제하는 것을 권장하지만, 그렇게 했다면 모든 커스터마이징, 브랜딩, 테마 설정, 구성, 셋업, 그리고 또 다른 포럼에서 수동으로 가져온 상당수의 주제들이 모두 사라졌을 것입니다. 그래서 대신 가져오기를 수행하기 전의 매우 초기 백업을 복원했는데, 이것이 작동했습니다. 오래된 백업은 설치된 Discourse 버전도 함께 롤백하지 않는 한 100% 호환성이 보장되지 않을 수 있으므로 약간 더 위험한 접근 방식입니다. 이 방법으로 해결되었고, 가져오기를 다시 실행할 수 있었는데, 사용 가능한 모든 첨부 파일이 성공적으로 처리되었고, 마크다운 업로드 링크가 올바르게 삽입되었습니다.
정상 작동 여부 테스트
이 모든 것이 끝에서 끝까지 정상적으로 작동하는지 테스트하는 방법으로 찾은 방법은 다음을 실행하는 것입니다:
Post.where("raw LIKE ?", "%upload://%").count
이를 Rails 콘솔에서 실행하면, 실제로 올바른 업로드 링크가 포함된 게시물의 수를 반환합니다. 이 숫자는 가져오기 과정 동안 점진적으로 증가하며, 이는 안심되는 요소입니다.