Migrate a XenForo forum to Discourse

게시글은 겨우 5천 개, 회원은 약 1천 명 정도입니다

3개의 좋아요

저는 18m 포럼 게시물을 시도하고 테스트하기 위해 big board importers를 여전히 기다리고 있습니다.

3개의 좋아요

Xenforo를 위한 건가요? 다른 대량 가져오기 기능은 있지만, 1800만 개의 게시글에 대해서는 정말로 매우 느릴 수 있습니다!

4개의 좋아요

우리는 2,700만 개의 게시물에 사용할 자체 내부 일괄 가져오기 도구를 개발하고 있습니다. 첨부 파일을 제외하면 1주일 넘게 걸리던 작업이, 모든 것을 포함해도 하루 미만이 걸리도록 개선되었습니다. 어제 첫 번째 가져오기 테스트를 오류 없이 완료했습니다. 정말 기대되는 성과입니다.

4개의 좋아요

Justin, 감사합니다. 저도 빠르게 확인해 봤는데, 이렇게 하면 괜찮을까요? (원하시면 공식 임포터에 추가하셔도 됩니다)

  XENFORO_DB = "xenforo_db_3"
  TABLE_PREFIX = "xf_"
  BATCH_SIZE = 1000
  ATTACHMENT_DIR = '/FULL/PATH/TO/attachments'
  AVATAR_DIR = '/FULL/PATH/TO/avatars'

(마지막 줄 추가^^ - 아바타를 해당 경로로 복사해야 한다는 뜻입니다)

  def execute
    import_users
    import_categories
    import_posts
    import_avatars
  end

(마지막 줄 추가^^)

  def import_avatars
    if AVATAR_DIR
      users = User.all
      users.each do |u|
        unless u.custom_fields["import_id"].nil?
          import_id = u.custom_fields["import_id"]
          if import_id.to_i < 1000
            dir_num = "0"
          elsif import_id.to_i > 1000
            dir_num = import_id.first
          end
        
          avatar_filename = "#{import_id}.jpg"
          file_path = "#{AVATAR_DIR}/l/#{dir_num}"
          file_path_and_name = "#{file_path}/#{avatar_filename}"

          if File.exists?(file_path_and_name)
            upload = create_upload(u.id, file_path_and_name, avatar_filename)
            if upload.persisted?
              u.import_mode = false
              u.create_user_avatar
              u.import_mode = true
              u.user_avatar.update(custom_upload_id: upload.id)
              u.update(uploaded_avatar_id: upload.id)
            else
              puts "Error: Upload did not persist for #{u.username} #{avatar_filename}!"
            end
          end
        end
      end
    end
  end

여기서 시간이 아주 늦어서 실수를 했거나 누락된 부분이 많을 수 있지만, 모든 아바타가 .jpg 형식이라고 가정했습니다(제 아바타는 모두 그런 것 같습니다). u.import_mode 전환 부분은 확실하지 않아서 주석 처리해 두었습니다.

아직 전혀 테스트하지 않았습니다(여기서 거의 새벽 5시네요 :zzz:)

개발 머신에서 10만 개의 게시물이 있는 포럼으로 테스트를 해봤는데 90분이 걸렸습니다. 임포트를 진행하려는 포럼은 몇백만 개의 게시물이 있으므로 10배 정도 더 오래 걸릴까요?

좋네요! 우리에게 공유해 주실 건가요? 언제쯤인지 감이 잡히나요?

4개의 좋아요

현재 목표는 완벽하게 작동하는지 확인하는 것입니다. 그리고 우리 사이트가 마이그레이션된 후에는 다른 사람들이 사용할 수 있도록 Discourse 저장소에 배포할 계획입니다.

5개의 좋아요

단계별 가이드도 매우 도움이 될 것 같습니다. 부탁드립니다 :slight_smile:

1개의 좋아요

5천 개의 게시글과 약 600개의 첨부 파일이 있는 경우, 구형 Xeon 프로세서와 SSD 디스크를 사용했을 때 약 10분이 소요되었습니다. 성능이 충분한 기계를 확보해 오프라인으로 가져오기를 수행하고, 처리가 끝날 때까지 방치해 두는 것이 좋습니다.

5개의 좋아요

멋져요! 기대되고 있어요.

1개의 좋아요

음, 아주 빠르게 테스트를 해봤는데 스크립트에 추가한 부분들은 잘 작동하는 것 같아요. 이제 몇 천 명의 멤버와 10만 개의 게시물을 대상으로 제대로 된 테스트를 진행할게요. 잘 작동하면 다시 알려드릴게요…

1개의 좋아요

안녕하세요, 새로운 소식 있나요? 테스트 관련해서 도움이 필요하시면 기꺼이 도와드릴게요.

xenforo 스크립트를 실행할 때 users 테이블이 존재하지 않는다는 오류가 발생합니다. 도움을 주시면 감사하겠습니다!

한 시간 동안 관련 자료를 찾아보았지만 아직 원인을 파악하지 못했습니다.

스크립트 상단에 몇 가지 변수가 있습니다. 이 값을 채워 넣어야 xenForo MySQL 데이터베이스에 연결하고 데이터를 쿼리할 수 있습니다. "import_db"가 플레이스홀더 값일 것으로 생각됩니다. 해당 값들이 올바르게 채워져 있는지 다시 확인해 주세요.

3개의 좋아요

@Ghan 이 명령어로 import_db에 가져오는 건지 모르겠어요: mysql -u root -p import_db < /shared/db.sql

제 xenforo.rb 파일은 다음과 같습니다:

아, 그렇군요. 그게 데이터베이스 이름이라면, 테이블 이름이 올바른지 확인해 보세요. 테이블이 접두사가 포함된 xf_user일 수 있고, 그렇게 되면 문제가 발생할 수 있습니다. 스크립트에는 TABLE_PREFIX 변수도 포함되어 있어야 합니다.

4개의 좋아요

@Ghan 감사합니다!

지금도 import 스크립트에서 막혀 있습니다.
사용자와 카테고리를 순회하는 부분은 문제없이 잘 작동합니다. 그런데 import_posts 함수에서는 몇 시간 동안 멈춰 있다가 결국 타임아웃이 발생합니다.

import_posts에서 값을 출력하며 디버깅을 시작했습니다:

results 변수에 할당된 이후의 모든 출력 문은 실행되지 않습니다.

혹시 vb3 포럼을 가져오려는 분이 계신다면, Xenforo 라이선스도 함께 보유하고 있다면 이 가이드가 도움이 될 수 있습니다:

2개의 좋아요

이 가져오기 도구가 스레드와 함께 해당 스레드에 연결된 태그를 Xenforo에서 가져오나요?

소스 코드를 살펴보는 것은 항상 좋은 생각입니다.

답은 … 네라고 생각합니다 (다만 Xenforo 데이터 구조에 대해 아주 익숙하지는 않아요):

3개의 좋아요

그래서 특정 조건에서 누군가의 태그를 최소한 한 번은 가져온 것으로 보입니다. 운이 좋으면 여러분에게도 작동할 거예요!

3개의 좋아요