임포터 조정 (인용구 버그 수정, bbcode 지원 개선 (youtube 포함), 첨부파일 댓글)
소프트 삭제된 게시물이 일반 게시물로 가져오기
저는 아주 까다로운 편이라, 따라 하시면 꽤 좋은 결과를 얻으실 수 있을 것입니다.
phpbb에서 discourse로 이동을 고려하고 있습니다 (설치된 버전 히스토리: 3.2.1 - 3.2.8).
문제는 DB에 postgresql을 사용한다는 점입니다. 조언이 있을까요? 아직 시도해 보지는 않았지만, OP(최초 게시자)의 내용 기준으로 아직 지원되지 않는 것으로 추정됩니다.
새로운 임포트 스크립트가 출시된 적이 있나요? 그 내용이 약 1년 전의 것이었기 때문입니다.
저는 PostgreSQL에서 MySQL로 전환하는 문제를 직접 다루어 본 적은 없지만, phpBB에서 Discourse로 마이그레이션하는 관점에서만 말씀드리면, 마이그레이션을 완료하기 위해 무엇이든 하라는 것이 제 의견입니다.
저는 phpBB 포럼 두 개를 Discourse로 마이그레이션해 보았는데, 어떤 변화에서도 흔히 볼 수 있는 소수의 사용자 불만이 있었음에도 불구하고, Discourse의 이점은 충분히 가치가 있습니다! Discourse는 유지보수와 관리가 훨씬 쉬운 것은 물론, 내장된 사용자 참여 기능, 이미지 처리, 사용자 커스터마이징, 가독성 등이 phpBB에 비해 압도적으로 앞서 있어 비교 자체가 어렵습니다. 또한 Discourse에서는 훨씬 더 나은 지원을 받을 수 있습니다.
저는 전문가가 아니지만, 간단한 검색을 해 보니 스키마 덤프를 수행한 후 스키마 선언의 데이터 유형을 MySQL에서 사용하는 유형으로 변경하고, 수정된 스키마를 사용하여 MySQL 데이터베이스에 테이블을 생성한 뒤, 테이블별 CSV 내보내기 및 가져오기를 수행함으로써 PostgreSQL에서 MySQL로 마이그레이션할 수 있을 것 같습니다.
MySQL 데이터베이스를 확보한 후에는 정적인 phpBB 마이그레이션 스크립트를 사용하여 모든 첨부 파일을 가져올 수 있습니다.
MySQL Workbench가 제대로 작동했다면 좋았을 텐데, 옵션을 살펴보니 관련 오류 보고서가 많이 보여서 추천하지 않았습니다.
스키마 덤프와 CSV 내보내기/가져오기 방법을 전에 한 번 언급했고, 이번에는 훨씬 더 쉽게 사용할 수 있도록 약간 수정해서 한 번 더 언급한 뒤 더 이상 이 주제에 대해 이야기하지 않겠습니다.
GUI를 사용하려는 경우:
현재 사용 중인 phpBB3 버전과 동일한 버전의 phpBB3가 MySQL/MariaDB에서 실행 중인 정상적인 사본의 모든 테이블에 대한 구조 전용(structure-only) 내보내기를 확보하세요. MySQL/MariaDB를 실행하는 대부분의 웹 호스팅 업체에서 사용할 수 있는 phpMyAdmin을 사용하면 이를 만드는 데 고작 2분이면 충분합니다. (대안으로, 누군가가 구조 전용 내보내기를 대신해 주지 않을 경우 phpBB3 설치 스크립트에서 필요한 CREATE TABLE 문장을 가져올 수 있거나, 저렴한 웹 호스팅 계정으로 MySQL/MariaDB 환경에 해당 버전의 phpBB3를 깨끗하게 설치한 후 생성된 테이블의 데이터를 삭제하여 빈 MySQL/MariaDB 데이터베이스를 만드는 방법도 있습니다.)
MySQL/MariaDB와 phpMyAdmin이 있는 웹 호스팅에 접근하여 데이터베이스를 생성하고, phpMyAdmin을 사용하여 1단계에서 만든 구조 전용 내보내기 파일에서 구조를 가져오세요.
postgresql 데이터베이스에서 각 테이블에 대해 CSV 내보내기를 생성하고, 새로 만든 MySQL/MariaDB 데이터베이스에서 phpMyAdmin을 사용하여 해당 테이블에 CSV를 가져오세요.
이렇게 하면 문자 집합(charset)과 인코딩 관련 문제를 방지할 수 있고, postgre에서 스키마 덤프를 수동으로 변환하려 할 때 필요한 모든 대응 데이터 타입과 필드 크기를 파악할 필요도 없습니다.
구조 전용 SQL 문장을 제공할 수는 있지만, 제가 아직 가지고 있는 DB는 phpBB3 3.3.8 버전의 것이므로, v. 3.2.x를 사용 중이라면 오히려 더 많은 문제를 야기할 수 있습니다.
phpbb_smilies
├── phpbb_smilies.xlsx # 결정을 돕기 위한 마스터 참조 자료
├── import.yml # 두 옵션이 포함된 설정 파일
├── orig_phpbb_smilies.csv # 원래 phpbb 데이터
├── orig_files # 원래 phpbb 이모지 파일
│ ├── icon_arrow.gif
│ └── ...
└── new_files # 스프레드시트의 `new_shortcode` 열과 일치하도록 이름이 변경된 이모지 파일
├── phpbb_arrow.gif
└── ...
마이그레이션된 postid와 topicid는 정확하지만 사용자 이름이 누락되었습니다. 이로 인해 인용 블록이 비인터랙티브(noninteractive) 상태가 됩니다. 사용자 이름이 빈 문자열일 경우, 인용 블록이 확장되지 않으며 원본 게시글로 이동하기 위해 클릭할 수도 없습니다.
importer를 개선하지 않고 더 나은 경험을 기대할 수 있을까요? 즉, 제가 뭔가 잘못하고 있는 건가요?
수입(import)이 끝나고 앱 컨테이너를 시작하면, 아직 남아 있는 phpbb 서버에 엄청난 트래픽이 몰리는 것을 확인했습니다. sidekiq의 후처리(post processing) 단계에서 일어나는 일이라고 생각합니다.
phpbb는 여전히 www.example.com에 있고, discourse는 dc.example.com에 있습니다.
실제로 무슨 일이 일어나고 있는지 이해하려고 합니다. 이 테스트 마이그레이션 중에 어떤 설정이 적절한지, 그리고 최종 마이그레이션 시에는 어떤 설정이 의미 있는지도 알고 싶습니다. 또한 sidekiq 후처리를 위해 phpbb를 실행해 두어야 하는지도 궁금합니다. 후처리 단계에서 정확히 무슨 일이 일어나는지 전혀 모르기 때문에 물어봅니다.
현재 settings.yml에서 관련이 있을 수 있는 설정 몇 가지입니다:
import:
# 여러 phpBB 포럼을 단일 Discourse 포럼으로 가져올 경우 이 값을 설정합니다.
site_name:
site_prefix:
# 게시물 내부의 내부 링크를 다시 작성하는 데 필요합니다.
original: example.com # http(s):// 없이
new: https://dc.example.com # http:// 또는 https:// 포함
확인해 봐야 할 다른 사항이 있다면 알려 주세요.
또한 www 서브도메인에 대해서도 명확하지 않은 부분이 있습니다. 현재 phpbb를 위해 nginx에서 www로 리다이렉트하고 있습니다. 따라서 위 예시에서 original: example.com으로 설정하는 것과 original: www.example.com으로 설정하는 것 중 차이가 있을까요? 최종 마이그레이션 시 new 설정에 대해서도 같은 질문을 하고 싶습니다. 제 사용자들은 실제로 discourse에 www.example.com으로 접속하게 될 텐데, 어떤 것이 모범 사례인지 잘 모르겠습니다.
저는 포럼 마이그레이션에 대해 꽤 까다로운 편이라, 가져오기(importer) 기능을 계속 개선하고 있습니다. 가져오기 기능이 비추천(deprecated) 상태이고, 일부 수정 사항은 제 포럼에 다소 특화되어 있어서 PR을 만들까 고민 중입니다. 하지만 이 브랜치에는 제 모든 수정 사항이 포함되어 있으니, 누군가에게 유용할 수 있습니다:
인용문 문제, 몇 가지 흔히 추가되는 BBCode 지원, YouTube 링크 파싱 오류 수정, 그리고 멘션/심플멘션(mentions/simplementions) 확장 기능 지원을 추가했습니다. example.com과 www.example.com으로 된 링크가 포럼에 있는 경우와 같이 여러 사이트 접두사(prefix)를 지원하도록 하는 등 더 개선할 부분이 많습니다.
비바닐라(non-vanilla) 기능도 일부 지원하지만, 확장 기능이 없는 표준 phpBB 포럼에서 실행하는 데에는 문제가 되지 않을 것입니다. 어쨌든 제 버전을 사용하는 것을 권장합니다.
가장 쉬운 사용법은 제 브랜치를 어딘가로 받아온 다음, 컨테이너 내부의 가져오기 스크립트 디렉토리를 바인드 마운트(bind mount)로 덮어쓰는 것입니다.
예를 들어, 제 변경 사항을 어딘가로 받아오기:
git clone --filter=blob:none --no-checkout https://github.com/ftc2/discourse.git discourse_dev
cd discourse_dev
git sparse-checkout set --cone
git switch phpbb_import
git sparse-checkout set script/import_scripts