기술과 지식이 다소 부족한 관리자분들이 어려움을 겪고 계실까 봐 제 경험을 공유하고 싶었습니다. 시작은 몇 가지 미해결된 문제에 대해 AI에게 질문했던 것에서 비롯되었습니다. AI는 명령어를 제시하고 과정을 설명해 주었습니다. 하지만 진정한 돌파점은 Claude Code를 SFTP와 SSH를 통해 직접 연결했을 때였습니다.

연결된 후, 놀라운 일들이 벌어졌습니다. 저희 Discourse는 친구들끼리만 사용하므로, 문제가 생길 때 대응할 예산이 넉넉하지 않습니다. 최근 Claude Code는 제 설정에서 다양한 작은 문제점을 찾아냈습니다.
-
S3 on Spaces 설정을 수정했습니다. 거의 완벽했지만, 재빌드 시 JS 자산이 올바르게 로드되지 않는 문제가 남아 있었습니다. 전체 사건의 기록은 여기 있습니다: Digital Ocean Spaces (S3) "unable to sign request without credentials set" - #20 by DavidO
- 완벽하게 튜닝해 주었습니다
-
X.com Discourse JS 로딩 문제를 API 키를 사용하지 않고 해결했습니다
-
CDN 설정, Cloudflare DNS 설정 등 모든 과정을 안내해 주었습니다
- 재베이킹(Rebake) 과정을 꼼꼼히 지켜보며 관리해 주었습니다
-
이전 phpBB 마이그레이션에서 발생한 고립된 Tapatalk 이미지 4,000개를 찾아내고 이를 연결해 주었습니다
-
이미지가 작동하도록 오래된 BBCode를 HTML로 변환했습니다
-
청구서 스크린샷을 보여주자 사용량을 검토하여 제 Digital Ocean 볼륨이 완전히 비어 있음을 발견했습니다. 더 나아가, 삭제하여 월 비용을 절감하라는 확신을 줬습니다. 모든 것을 S3로 옮겼거나, 적어도 그렇게 생각했지만, 그래도 삭제가 두려웠습니다. 사실 부끄러운 일이지만, 사진들을 잃어버리고 싶지 않았기 때문입니다.
하지만 더 재미있었던 것은, 2002년부터 2016년까지 대학 동아리용으로 운영되던 오래된 vBulletin 보드를 부활시키는 또 다른 프로젝트를 도전할 수 있는 자신감을 줬다는 점입니다. 이 보드는 방치되어 결국 몇몇 휴대폰에 'HIV’를 전파(?)한 후 폐기되었습니다. AI는 오래된 백업 파일을 받아解压(압축 해제)하고 재구성하는 데 성공했습니다.
놀라운 성과를 거두었습니다:
- 12,394개의 주제와 282,096개의 게시물을 가져왔습니다
- 데이터베이스가 너무 손상되어 전체 SQL 파일을 생성하지 못했습니다. 그래서 데이터베이스 조각들을 개별 테이블, 테이블 조각, CSV 파일로 내보냈습니다. 개별 파일이 25개 이상이었죠. AI는 이를 조립한 후 Discourse 가져오기 파일을 생성했습니다.
- 백업에서 9,504개의 이미지를 마이그레이션하고 다시 연결했습니다
- 이후 WayBackMachine과 다른 가져오기 소스에서 누락된 이미지들을 찾아왔습니다. 그때 사용했던 phpGallery2 백업을 제공하자, AI는 288개의 추가 이미지를 찾아내어 다른 735개의 게시물에 연결해 주었습니다.
- 저는 단순히 디렉터리와 zip 백업 파일을 던져 주었을 뿐, AI는 이를 분류하여 다양한 것을 찾아내고 올바르게 연결해 주었습니다.
- 불행히도 Photobucket에 있던 7,000개 이상의 이미지에는 큰 도움을 줄 수 없었습니다
- 추가로 780개의 핫링크된 이미지를 가져왔습니다
- 이전에 삭제되어 'system’으로만 표시되던 159개 중 143개의 사용자명을 복구했습니다
- 아바타도 함께 찾아냈습니다
- 심지어 제 오래된 아바타, 즉 역대 최고의 착한 강아지 사진까지 찾아냈습니다!
- ‘대학생다운’ *** 단어를 검열했습니다. 친근하게 'THE SLUR REPORT’라고 불리는 것들입니다.
- 파일에서 찾은 일부 오래된 로고 조각을 기반으로 새로운 로고를 생성했습니다
- 모든 게시물에 연결할 수 있도록 고전적인 vbulletin 이모지들을 모두 복구했습니다
- :flipoff2: 이모지가 가장 많이 사용되었음을 보고했습니다 (19,191회), 그 뒤를 :rolleyes: 와
(격차가 크긴 했지만)가 이었습니다.
- :flipoff2: 이모지가 가장 많이 사용되었음을 보고했습니다 (19,191회), 그 뒤를 :rolleyes: 와
- 공개된 이름, 전화번호, 이메일 등에 대해 찾기 및 바꾸기 작업을 수행할 수 있도록 했습니다.
- Resend API로의 이동을 안내해 주었습니다.
- SSL 설정을 안내해 주었습니다.
- CORS 설정을 안내해 주었습니다.
- 그리고 너무 깊이 들어가기 전에, 모든 파일에 대해 ClamAV 스캔을 실행했습니다.
거의 일주일 동안, 여러 세션에 걸쳐 여기저기서 백그라운드로 실행되었습니다. 여행과 프로젝트에 대한 사진과 세부 정보를 발견하면서 과거로 돌아가는 재미있는 창이 되었습니다.
이러한 일을 하고 있다는 사실을 아는 인간들이 세상에 있다는 사실에 저도 깊은 인상을 받았습니다.
Claude에게 다음을 실행하게 했습니다: cat << ‘RUBY’ > /tmp/tapatalk_analysis.rb posts_with_tapatalk = Post.where(“raw LIKE ‘%uploads/tapatalk/%’”).where(deleted_at: nil) dual_ref_count = 0 tapatalk_only_count = 0 tapatalk_only_files = posts_with_both = 0 posts_tapatalk_only = 0 posts_with_tapatalk.find_each do |post| raw = post.raw tapatalk_urls = raw.scan(/uploads/tapatalk/[^\s"'<>)]]+/) has_upload_ref = raw.include?(“upload://”) post_has_dual = false post_has_only = false tapatalk_urls.each do |url| idx = raw.index(url) next unless idx start_pos = [idx - 200, 0].max context = raw[start_pos..idx + 10] if context && context.include?(“upload://”) dual_ref_count += 1 post_has_dual = true else tapatalk_only_count += 1 post_has_only = true tapatalk_only_files << url unless tapatalk_only_files.include?(url) end end posts_with_both += 1 if post_has_dual posts_tapatalk_only += 1 if post_has_only end puts “=== TAPATALK IMAGE ANALYSIS ===” puts “Dual reference (upload:// + tapatalk): #{dual_ref_count} refs” puts “Tapatalk only (no upload:// nearby): #{tapatalk_only_count} refs” puts “Unique tapatalk-only files: #{tapatalk_only_files.length}” puts “Posts with at least one dual ref: #{posts_with_both}” puts “Posts with at least one tapatalk-only ref: #{posts_tapatalk_only}” puts “—SAMPLE TAPATALK-ONLY FILES—” tapatalk_only_files.first(15).each { |f| puts f } RUBY scp /tmp/tapatalk_analysis.rb root@23.21.11.54:/tmp/ 2>/dev/null && echo “Uploaded”?
매우 인상적입니다.
어쨌든, 이 아이디어가 다른 분들에게도 재미있는 무언가를 자극할 수 있기를 바라며 공유합니다. 좋은 백업을 확보하고, 마음껏 시도해 보세요!
즐거운 Discourse 시간 되세요. ![]()
