Migrate a phpBB3 forum to Discourse

저도 동일한 오류가 발생했습니다. shared/standalone/import/mysql/imported 파일이 오래된 상태로 남아 있을 때 발생하는 것 같습니다. 해당 파일을 삭제하니 오류가 해결되었습니다.

2개의 좋아요

비밀번호 마이그레이션이 내 경우에는 작동하지 않은 것 같습니다.

phpbb 3.0 덤프에서 가져오기 전에 shared/standalone/import/settings.yml 파일에 passwords: true를 설정했습니다. containers/app.yml에는 다음 내용이 있습니다:

hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - git clone https://github.com/discourse/docker_manager.git
          - git clone https://github.com/discoursehosting/discourse-migratepassword.git

가져오기 이후에 ./launcher rebuild app을 실행했습니다. 가져오기는 전체적으로 성공적으로 수행된 것으로 보이지만, phpbb에서 사용하던 비밀번호로 로그인할 수 없습니다. 가져오기 과정에서 관련 오류 메시지는 발견하지 못했으며, 비밀번호 길이가 20자이므로 최소 길이 제한을 충족해야 합니다.

이 문제를 해결하기 위해 무엇을 확인해야 할까요?

추가 정보: 데이터베이스의 user_custom_fields 테이블에 import_pass 항목이 있으며, 이는 phpbb 데이터베이스에 있던 비밀번호 해시와 일치합니다. 따라서 그 부분은 정상적으로 작동한 것으로 보입니다.

수정: 아, 이제 원인을 파악했습니다. phpbb에서 LDAP 인증으로 전환한 사실을 완전히 잊고 있었습니다… 가져온 비밀번호들은 전혀 문제없었지만, 15년 전 것이었네요! 이제 LDAP에서 비밀번호 해시를 추출하기 위해 무언가를 만들어야 할 것 같습니다… :slight_smile:

1개의 좋아요

여러분 안녕하세요,

최근에 첨부파일과 함께 가져오기(import)를 실행하신 분이 계신가요?

사용자와 게시글은 완벽하게 작동하지만 첨부파일이 게시글에 추가되지 않습니다.

일부 게시글에는 여전히 bbcode가 남아 있습니다.

이상한 점은 files 폴더의 내용이 discourse의 uploads 폴더로 전송된다는 것입니다.

처음에는 phpbb 3.0.12 버전이 너무 오래되어서 그런 줄 알았지만, phpBB를 3.0.14로 업그레이드하고 Discourse와 uploads 폴더를 정리한 후 다시 가져오기를 시도해 보았습니다. 결과는 동일했습니다.

테스트 서버에서 phpbb 버전을 3.2.0으로 업그레이드(모드(mods)를 정리하기 위해 지원 툴킷을 실행한 후)하고 다시 시도해 보았지만, 역시 실패했습니다.

데이터베이스에 대해 더 깊이 조사하기 전에, 이 스크립트가 모든 사람에게 정상적으로 작동하는지 확인하고 싶었습니다.

설정 파일에서 실수를 했다고 생각하지는 않지만, 새로운 관점에서 살펴봐 주시면 도움이 될 수도 있을 것 같습니다.

# This is an example settings file for the phpBB3 importer.

database:
  type: MySQL # currently only MySQL is supported
  host: localhost
  port: 3306
  username: root
  password:
  schema: phpbb
  table_prefix: phpbb_ # Change this, if your forum is using a different prefix. Usually all table names start with phpbb_
  batch_size: 1000 # Don't change this unless you know what you're doing. The default (1000) should work just fine.

import:
  # Set this if you import multiple phpBB forums into a single Discourse forum.
  #
  # For example, when importing multiple sites, prefix all imported IDs
  # with 'first' to avoid conflicts. Subsequent import runs must have a
  # different 'site_name'.
  #
  # site_name: first
  #
  site_name:

  # Create new categories
  #
  # For example, to create a parent category and a subcategory.
  #
  # new_categories:
  # - forum_id: foo
  #   name: Foo Category
  # - forum_id: bar
  #   name: Bar Category
  #   parent_id: foo
  #
  new_categories: []

  # Category mappings
  #
  # For example, topics from phpBB category 1 and 2 will be imported
  # in the new "Foo Category" category, topics from phpBB category 3
  # will be imported in subcategory "Bar category", topics from phpBB
  # category 4 will be merged into category 5 and category 6 will be
  # skipped.
  #
  # category_mappings:
  #   1: foo
  #   2: foo
  #   3: bar
  #   4: 5
  #   6: SKIP
  #
  category_mappings: {}

  # Tag mappings
  #
  # For example, imported topics from phpBB category 1 will be tagged
  # with 'first-category', etc.
  #
  # tag_mappings:
  #   1:
  #   - first-category
  #   2:
  #   - second-category
  #   3:
  #   - third-category
  #
  tag_mappings:

  # Rank to trust level mapping
  #
  # Map phpBB 3.x rank levels to trust level
  # Users with rank at least 3000 will have TL3, etc.
  #
  # rank_mapping:
  #   trust_level_1: 200
  #   trust_level_2: 1000
  #   trust_level_3: 3000
  #
  rank_mapping:

  # WARNING: Do not activate this option unless you know what you are doing.
  # It will probably break the BBCode to Markdown conversion and slows down your import.
  use_bbcode_to_md: false

  # This is the path to the root directory of your current phpBB installation (or a copy of it).
  # The importer expects to find the /files and /images directories within the base directory.
  # You need to change this to something like /var/www/phpbb if you are not using the Docker based importer.
  # This is only needed if you want to import avatars, attachments or custom smilies.
  phpbb_base_dir: /shared/import/data

  site_prefix:
    # this is needed for rewriting internal links in posts
    original: ***.com   # without http(s)://
    new: https://****.org       # with http:// or https://

  # Enable this, if you want to redirect old forum links to the the new locations.
  permalinks:
    categories: true  # redirects   /viewforum.php?f=1            to  /c/category-name
    topics: true      # redirects   /viewtopic.php?f=6&t=43       to  /t/topic-name/81
    posts: false      # redirects   /viewtopic.php?p=2455#p2455   to  /t/topic-name/81/4
    # Append a prefix to each type of link, e.g. 'forum' to redirect /forum/viewtopic.php?f=6&t=43 to /t/topic-name/81
    # Leave it empty if your forum wasn't installed in a subfolder.
    prefix:

  avatars:
    uploaded: true  # import uploaded avatars
    gallery: false   # import the predefined avatars phpBB offers
    remote: false   # WARNING: This can considerably slow down your import. It will try to download remote avatars.

  # When true: Anonymous users are imported as suspended users. They can't login and have no email address.
  # When false: The system user will be used for all anonymous users.
  anonymous_users: true

  # Enable this, if you want import password hashes in order to use the "migratepassword" plugin.
  # This will allow users to login with their current password.
  # The plugin is available at: https://github.com/discoursehosting/discourse-migratepassword
  passwords: false

  # By default all the following things get imported. You can disable them by setting them to false.
  bookmarks: true
  attachments: true
  private_messages: false
  polls: false

  # When true: each imported user will have the original username from phpBB as its name
  # When false: the name of each imported user will be blank unless the username was changed during import
  username_as_name: false

  # Map Emojis to smilies used in phpBB. Most of the default smilies already have a mapping, but you can override
  # the mappings here, if you don't like some of them.
  # The mapping syntax is: emoji_name: 'smiley_in_phpbb'
  # Or map multiple smilies to one Emoji: emoji_name: ['smiley1', 'smiley2']
  emojis:
    # here are two example mappings...
    smiley: [':D', ':-D', ':grin:']
    heart: ':love:'
1개의 좋아요

이 문제는 구체적으로 import_phpbb3.sh가 올바른 경로에서 phpbb_mysql.sql 파일을 찾지 못할 때 발생합니다.

1개의 좋아요

phpBB에도 이 문제가 적용되는 것으로 보입니다. v3.2.x부터 v3.3.3까지의 덤프를 가져오려고 시도하고 있는데, 부모 게시글이 누락된 경우가 수천 건에 달합니다. 여러 번 실행하고 여러 시점의 버전 백업을 순차적으로 사용해도 마찬가지입니다. 디버깅을 단순화하기 위해 스크립트가 메시지 ID에 해당하는 기존 포럼의 URL을 출력하도록 하면 참고 확인이 용이할 것입니다. (… viewtopic.php?p=57912)

1개의 좋아요

실제로 이참에, 분석을 위해 오류 메시지와 함께 실패한 임포트 행을 덤프 파일에 기록해서 공유하는 건 어떨까… 그냥 생각인데…

적어도 한 가지 경우는 viewtopic.php?f=3&t=1472 토픽이 있는데, 첫 번째 게시물인 viewtopic.php?p=145185가 삭제/제거/등으로 인해 현재 해당 토픽의 첫 번째 게시물이 "답글"인 viewtopic.php?p=145186이 되는 경우입니다.

분명함을 위해, 상위 토픽이 덤프에 실제로 존재하지 않는 건지, 아니면 재구성에 아직 임포트되지 않은 것인지를 명시적으로 언급하는 것도 좋을 것 같습니다.

1개의 좋아요

최근에 첨부 파일까지 전체 가져오기를 성공적으로 완료한 사람이 있는지 피드백을 좀 듣고 싶습니다. 저는 어떻게 해도 안 되거든요.

지금으로서는 이 문제가 스크립트 때문인지, phpbb 포럼의 데이터베이스 때문인지 판단이 안 서네요. :pray:

1개의 좋아요

이미지를 다운로드해서 올바른 위치에 넣으셨나요?

최근에는 안 해봤지만, 작동하지 않는다면 놀랄 것입니다.

1개의 좋아요

네, 폴더와 설정 파일을 두 번 확인해 보았습니다. 이상한 점은 이미지들이 기본/원본 폴더에는 가져와지는데, 게시물에는 통합되지 않는다는 것입니다.

매우 오래된 phpbb였고 몇 가지 플러그인이 설치되어 있었습니다. 조금 정리한 후 phpbb 3.0.12에서 최신 3.1 또는 3.2로 성공적으로 업그레이드했고, 각 버전에 대해 가져오기를 테스트해 보았지만 작동하지 않았습니다. 데이터베이스 관련 문제일 수 있습니다. 그래서 다음에 전체 가져오기에 성공하신다면 그 결과를 알려주시면 도움이 될 것입니다. 만약 phpbb의 데이터베이스 문제라면 도움을 받아서 심층적으로 조사해 보겠습니다. 스크립트 문제라면 기다릴 수 있습니다. 메시지 감사합니다!

1개의 좋아요

phpBB3 가져오기를 마지막으로 한 시점이 언제였는지 기억이 나지 않습니다. 스크립트가 너무 잘 작동하기 때문에 (하지만 확인할 방법은 없지만) 그런 것 같습니다.

게시물이 Discourse로 업로드되는 중이므로, 문제는 아마도 phpBB 게시글 내에서 해당 파일들이 어떻게 참조되고 있는지와 관련이 있을 것입니다. 실행할 때 오류가 표시됩니까? 오류 메시지가 단서를 줄 수 있습니다. 아니면 플러그인이 게시글 및/또는 데이터베이스 내 참조 방식을 변경했을 수도 있습니다. 아마도 좀 더 자세히 파고들어야 할 것 같습니다.

2개의 좋아요

이전 가져오기 과정에서도 몇 가지 “파일 누락”, “잘못된 게시 시간” 오류가 발생했기 때문에 큰 문제가 아니라고 생각합니다. 첫 번째 실행 시 “부모 게시물이 존재하지 않음” 오류가 많이 발생했지만, 이 스레드에서 이전에 언급된 바와 같이 스크립트를 두 번째로 실행하면 이 문제가 해결됩니다.

그 외에는 스크립트가 주요 문제 없이 꽤 잘 실행되었습니다.

파일들을 하위 폴더(월과 연도별)로 정리하는 플러그인(표현상 htaccess 파일인 것으로 보입니다. 저는 이 포럼을 운영하지 않았습니다)이 있었지만, 저는 모든 파일을 동일한 폴더로 정리했고 클린 버전의 phpbb에서 업그레이드를 진행했는데 정상적으로 작동했습니다. 가져온 모든 파일은 phpbb 3.1, 3.2에서 활성화되어 있었습니다.

데이터베이스를 좀 더 자세히 살펴볼 것입니다. 이전 가져오기에서 생성된 sql 파일이 있을 수도 있습니다. 테스트 서버에서 첨부파일 테이블과 게시물 테이블을 비교해 보겠습니다. 놓친 부분이 있을지도 모르겠습니다.

4개의 좋아요

맞습니다. TextProcessor::process_attachments에 버그가 있어 첨부 파일이 게시물의 마크다운에 제대로 임베드되지 않는 문제가 있었습니다. PR을 제출했습니다.

5개의 좋아요

훌륭합니다! 두 번의 패스를 거친 후, 가져온 결과가 아주 잘 보입니다. 감사합니다!

4개의 좋아요

안녕하세요, 방금 약 35k개의 게시물을 가져왔습니다. 가져오는 과정에서 "Parent post XXXXXX doesn’t exist. Skipping"라는 메시지가 많이 표시되었고, 처리가 끝난 후 Discourse 포럼을 확인해 보니 모든 "토픽"은(아마도) 존재했지만 답변이 하나도 없었습니다. 실질적으로 토픽 자체만 가져와졌고, 게시물(토픽 본문이 포함된 첫 번째 게시물을 제외하고)은 가져와지지 않았습니다.

또한, “import” 폴더 아래 올바른 디렉터리 구조에 아바타 파일을 넣어 두었음에도 불구하고 아바타도 가져와지지 않았습니다.

원래 포럼은 phpBB2였고, phpBB3로 정기적으로 가져와져 모든 게시물이 정상적으로 표시되고 있었지만, 이전에 오래된 메시지들을 많이 삭제했습니다. 다만 phpBB3에서는 모든 것이 정상으로 보입니다.

어떤 제안이 있을까요? 확인해 볼 수 있는 가져오기 스크립트가 있나요?

1개의 좋아요

몇 주/몇 달 전부터 이런 상태였지만 걱정 마세요. import_phpbb3.sh 명령을 다시 실행하면 가져오기가 완료됩니다.

3개의 좋아요

많이 감사합니다! 게시글에서는 작동했지만 아바타에서는 작동하지 않았습니다. 해결책을 계속 찾고 있습니다.

1개의 좋아요

이 주제를 여러 번 읽었고 몇 번의 마이그레이션을 수행했지만, 매번 이 플러그인으로 인해 혼란을 겪었고 유사한 버그에 직면했습니다. 세 번째 마이그레이션을 진행 중인데 정말 지칠 대로 지쳤습니다. 이 플러그인의 작동 방식이 마이그레이션을 수행하는 사용자를 혼란스럽게 할 수 있다고 생각합니다.

마이그레이션 과정 이후에 Discourse에서 플러그인을 활성화해야 한다는 점을 어딘가에 명시해야 합니다. 만약 이미 어딘가에 적혀 있다면 제가 놓친 것일 수 있고, 그렇다면 이 정보를 더 강조해야 할 것입니다.

제가 잘못 이해했다면 정정해 주십시오. :slight_smile:

1개의 좋아요

phpBB 3.0.7에서 가져올 때 이모지 변환에 대한 수정 사항을 보고합니다.

  • 일부 이모지가 Discourse로 제대로 변환되지 않았습니다:


    (하지만 항상 그런 것은 아니고, 이유를 알 수 없습니다. 동일한 이모지가 어떤 경우에는 표시되고 어떤 경우에는 표시되지 않았습니다. 처음에는 무작위인 것처럼 보였습니다)

  • 또한, 일부 이모지는 단순히 사라졌습니다:
    phpBB:
    image
    Discourse:
    image

이 문제는 다음에서 사용되는 정규식에서 비롯되었습니다:
replace_smilies(text) 함수에서

잘못된 정규식:

<!-- s(\S+) --><img src="\{SMILIES_PATH\}\/.+?" alt=".*?" title=".*?" \/><!-- s?:\S+ -->

정규식의 시작 부분에는 : 문자가 있다고 가정하지 않는다는 점에 주목하십시오:
<!-- s
하지만 정규식의 끝에는 : 문자가 있다고 가정합니다:
<!-- s?:
(또한, 정규식의 끝에는 s 문자를 0개 또는 1개 일치시키는 ?가 있는 반면, 정규식의 시작에는 그런 것이 없는 이유가 궁금합니다)

이 정규식에서 :를 제거했고, 제 두 가지 이모지 문제가 완전히 해결된 것 같습니다.

제 phpbb 포럼에서 많은 이모지가 실제로 :mrgreen:이나 :evil:처럼 :으로 시작했지만, 8-)이나 ;)처럼 시작하지 않는 것도 있었습니다.
기존 정규식으로 인해 이모지가 잘못 캡처되었습니다. 예를 들어, 서로 인접한 여러 이모지가 하나의 이모지로 캡처되었습니다.


수정된 정규식:

<!-- s(\S+) --><img src="\{SMILIES_PATH\}\/.+?" alt=".*?" title=".*?" \/><!-- s?\S+ -->

git 사용에 익숙하지 않고, 또한 다른 phpBB 버전에서 가져오는 데 영향을 미칠지 확신이 서지 않아 Discourse 저장소에서 코드를 직접 수정하지 않았습니다. 아무것도 망가뜨리고 싶지 않기 때문입니다.


어쨌든, 저와 같은 문제에 직면하는 사람들을 위해 해결책을 공유합니다.

4개의 좋아요

phpBB 3.0.7 마이그레이션 과정에서 제 상황을 겪고 있는 분들에게 도움이 될 수 있는 또 다른 문제를 수정했습니다.

어떤 이유에서인지, 제 phpBB 포럼 게시물 내용 중 일부 줄의 시작 부분에 공백이 여러 개 연속으로 들어가 있는 경우가 있었습니다. 메시지 작성 시 일부 사용자가 공백 키를 무의식적으로 여러 번 누르는 것을 좋아한다고 추측해 봅니다. 렌더링된 페이지에서는 이러한 여러 공백이 무시되었기 때문에 실제로는 중요하지 않았죠:

phpBB 원본 텍스트 내용:

Salut tous  <!-- s:) --><img src="{SMILIES_PATH}/icon_e_smile.gif" alt=":)" title="Sourire" /><!-- s:) --> 
  
     Alors voilà, le combi n'a pas roulé beaucoup ces derniers temps cause CT pas OK  <!-- s:evil: --><img src="{SMILIES_PATH}/icon_evil.gif" alt=":evil:" title="Diable" /><!-- s:evil: --> mais il a fait ces 2000 kms sans broncher  <!-- s;) --><img src="{SMILIES_PATH}/icon_e_wink.gif" alt=";)" title="Clin d\'oeil" /><!-- s;) -->  
Maintenant le CT est OK . Merci L'Atelier Du Raz  8-')

    Je dois donc changer le joint-spi au bout de 40 000 kms en 10 ans  <!-- s:roll: --><img src="{SMILIES_PATH}/icon_rolleyes.gif" alt=":roll:" title="Yeux tournants" /><!-- s:roll: --> 
C'est un silicone et j'ai vu qu'il y avait des &quot;doubles lèvres &quot; !? 
What's About ?

             Je trouve ça un peu limte  <!-- s:evil: --><img src="{SMILIES_PATH}/icon_evil.gif" alt=":evil:" title="Diable" /><!-- s:evil: --> 
Merci tous, fred

브라우저에서 렌더링된 페이지:


그러나 phpBB → Discourse로 가져오는 과정에서, 이러한 기존 공백들이 코드 블록으로 변환되었습니다:

다음과 같이 표시되어야 합니다:


각 줄의 시작 부분 공백을 제거하는 정규식을 추가하여 수정했습니다.

 text.gsub!(/^[^\S\r\n]+/, "\n")

이것은 해당 파일의 process_smilies(text) 바로 전에 추가했습니다:


또 다른 문제를 발견했습니다.
이 코드(여전히 text_processor.rb 안에 있음)에서:

    def clean_bbcodes(text)
      # Many phpbb bbcode tags have a hash attached to them. Examples:
      #   [url=https&#58;//google&#46;com:1qh1i7ky]click here[/url:1qh1i7ky]
      #   [quote=&quot;cybereality&quot;:b0wtlzex]Some text.[/quote:b0wtlzex]
      text.gsub!(/:(?:\w{8})\]/, ']')

제 데이터베이스에서는 이러한 해시 길이가 5자에서 8자 사이이지만, 정규식은 정확히 8자 길이의 해시만 제거합니다. 그래서 제 가져오기 과정에서 더 짧은 해시는 제거되지 않고 남아 있었습니다.
이것은 정규식을 다음과 같이 변경하여 수정했습니다:

text.gsub!(/:(?:\w{5,8})\]/, ']')

같은 파일에서 발견한 사소한 문제 하나를 더 추가합니다. [color] BBCode 태그를 제거하는 정규식은 #으로 시작하는 16진수 값을 기대합니다. 그러나 [color]는 “red”, “blue” 등의 문자열도 값으로 허용합니다. 그래서 원래 정규식을 수정했습니다:

      # remove color tags
      text.gsub!(/\[\/?color(=#[a-z0-9]*)?\]/i, "")

#를 선택적으로 만들도록 # 뒤에 ?를 추가했습니다.
수정된 코드:

      # remove color tags
      text.gsub!(/\[\/?color(=#?[a-z0-9]*)?\]/i, "")

제 문제가 phpBB 가져오기에서 흔한 것인지, 아니면 제 사례에 매우 특이한 것인지는 모르겠습니다. 후자라면, 여기에서의 제 설명이 환영받지 못하거나 불필요하지 않기를 바랍니다. 만약 그렇다면 어색하지 않도록 알려주시면 감사하겠습니다. :grinning_face_with_smiling_eyes:


수정: 마이그레이션 후 모든 기존 사용자가 기존 모든 토픽을 "읽음"으로 설정할 수 있는 방법이 있을까요?

목표는 마이그레이션 후 기존 사용자가 기존(때로는 오래된) 토픽을 클릭했을 때, 마이그레이션 전에 이미 읽었던 해당 토픽의 첫 번째 메시지로 이동하지 않도록 방지하는 것입니다.

이상적으로는, 기존 사용자가 기존 토픽을 클릭할 때 첫 번째 메시지가 아닌 마지막 메시지가 열리도록 하는 것입니다(물론 마이그레이션 완료 시점 기준이죠).

이것은 사소한 품질 개선(QoL) 문제일 뿐이며(사용자들이 포럼을 사용하면서 토픽을 읽게 되면 몇 주 후 자연스럽게 사라질 것입니다), 이 제안에 대해 질문을 받았기 때문에 공유합니다.

7개의 좋아요

이 수정 사항들을 공유해 주셔서 감사합니다!

과거 마이그레이션 작업에서도 정규식(regexp)에 비슷한 조정을 해야 했기 때문에, 앞으로의 phpbb 가져오기 작업에 도움이 될 것 같습니다.

이 토픽이 도움이 될 수 있습니다: How to mark imported posts as read - #2 by stuwest

3개의 좋아요