Migrate an SMF2 forum to Discourse

Duffield ocean에 문자가 잘못되었다는 티켓을 여는 것이 좋겠습니다.

putty와 같은 SSH 클라이언트를 사용하거나, Linux Subsystem for Windows(Linux용 Windows 하위 시스템)의 일부라고 생각되는 새로운 셸을 사용할 수 있습니다. 제가 마지막으로 사용했던 Windows 버전은 연도가 버전 설명으로 사용되었기 때문에 이 부분은 도움을 드리기 어렵습니다. Mac을 사용 중이라면 터미널을 열고 ssh를 사용하면 됩니다.

데이터베이스가 크다면 로딩에 시간이 걸리며, 완료될 때까지 새로운 프롬프트가 표시되는 것을 제외하고는 출력이 없습니다. 제 추측으로는 제대로 작동하고 있었던 것 같습니다.

2개의 좋아요

@pfaffman 감사합니다. 그 부분에 대해 그들에게 연락해 보겠습니다.

다른 SSH 클라이언트를 사용해 보겠습니다. 더 잘 작동할지 확인해 볼 생각입니다.

데이터베이스는 그렇게 크지 않습니다. 1시간째 같은 상태인데도 여전히 진행이 안 되고 있습니다. 서버의 CPU를 확인해 봤는데 사실상 유휴 상태입니다.

1개의 좋아요

네, 그게 문제였어요! @pfaffman 님, 다시 한번 감사합니다. 다시 진도를 내고 있습니다…

또 다른 해결 방법은 임포트를 수행하는 드롭렛에서 데이터베이스에 직접 액세스할 수 있도록 하여 로컬 데이터베이스를 사용하는 단계를 건너뛰는 것입니다.

1시간이 지났다면 해당 작업이 진행되지 않고 있을 가능성이 높습니다. 다음과 같은 명령을 시도해 볼 수 있습니다.

 cat database.sql | mysql
1개의 좋아요

한 발짝 전진, 한 발짝 후퇴.

Pups::ExecError: if [ -z "$LETSENCRYPT_ACCOUNT_EMAIL" ]; then echo "LETSENCRYPT_ACCOUNT_EMAIL ENV variable is required and has not been set."; exit 1; fi failed with return #<Process::Status: pid 1187 exit 1>

letsencrypt가 설치되어 있지 않아서 설치했습니다.

“Discourse 호스트와 컨테이너 가져오기 준비” 단계에서 누락된 부분은 LETSENCRYPT_ACCOUNT_EMAIL 환경 변수 줄의 주석을 해제하고 이메일 주소를 입력해야 한다는 것입니다. 이렇게 하니 해당 오류를 해결할 수 있었습니다.

계속해서, 이제 마지막 import 단계에 도달했습니다. import 컨테이너에 진입하여 import 스크립트를 실행했습니다. 하지만 즉시 다음과 같은 메시지와 함께 종료되었습니다:

Traceback (most recent call last):
        1: from script/import_scripts/smf2.rb:4:in `<main>'
script/import_scripts/smf2.rb:4:in `require': cannot load such file -- mysql2 (LoadError)

웹을 많이 검색해 보았지만 아직까지 해결책을 찾지 못했습니다.

수정: mysql이 컨테이너에 설치되어 있지 않은 것 같습니다. 'gem install mysql2’를 시도해 보았지만 다음과 같은 오류가 반환됩니다.

mysql client is missing. You may need to 'apt-get install libmysqlclient-dev' or 'yum install mysql-devel', and try again.

수정 2:
결국 mysql2를 설치하는 데 성공했습니다. 먼저 개발 도구를 설치해야 했는데, 제안된 소스는 사용할 수 없었습니다. 그래서 다음을 실행했습니다.

sudo apt-get install default-libmysqlclient-dev

이후 다음을 실행할 수 있었습니다.

gem install mysql2

하지만 여전히 동일한 오류가 발생했습니다. 그래서 스크립트에서 해당 require를 주석 처리해 보고 어떤 일이 일어나는지 확인해 보았습니다. 새로운 오류가 발생했습니다:

Traceback (most recent call last):
        6: from script/import_scripts/smf2.rb:627:in `<main>'
        5: from script/import_scripts/smf2.rb:19:in `run'
        4: from script/import_scripts/smf2.rb:447:in `parse!'
        3: from script/import_scripts/smf2.rb:502:in `parser'
        2: from script/import_scripts/smf2.rb:502:in `new'
        1: from /usr/local/lib/ruby/2.6.0/optparse.rb:1089:in `initialize'
script/import_scripts/smf2.rb:504:in `block in parser': can't modify frozen String (FrozenError)

이 오류를 조사해 보니 오래된 Ruby 버그로 나오는데, 이미 오래전에 수정되었기 때문에 다시 막혀 버렸습니다.

smf2.rb 파일로 가서 1행 또는 2행에 있는 동결(Frozen) 문자열의 값을 true에서 false로, 또는 그 반대로 변경하면 해결됩니다.

2개의 좋아요

고맙습니다 @Paracelsus! 해결되었습니다. true에서 false로 변경했습니다.

한 걸음 더 나아갔네요!

수정:
이상한 오류가 발생했는데, 잘못된 IP를 가리키는 것 같았습니다. Settings.php 파일에 비밀번호가 잘못 입력되어 있었습니다. 이제 수정했습니다.

이제 다음 문제를 해결 중입니다:

Traceback (most recent call last):
        7: from script/import_scripts/smf2.rb:627:in `<main>'
        6: from script/import_scripts/smf2.rb:28:in `run'
        5: from script/import_scripts/smf2.rb:28:in `new'
        4: from script/import_scripts/smf2.rb:62:in `initialize'
        3: from script/import_scripts/smf2.rb:274:in `create_db_connection'
        2: from script/import_scripts/smf2.rb:274:in `new'
        1: from /var/www/discourse/vendor/bundle/ruby/2.6.0/gems/mysql2-0.5.2/lib/mysql2/client.rb:90:in `initialize'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/mysql2-0.5.2/lib/mysql2/client.rb:90:in `connect': Plugin caching_sha2_password could not be loaded: /usr/lib/x86_64-linux-gnu/mariadb19/plugin/caching_sha2_password.so: cannot open shared object file: No such file or directory (Mysql2::Error::ConnectionError)

스크립트 튜닝 파일의 이 줄이 이 문제를 해결하기 위한 것이라고 추측합니다:

ALTER USER 'user'@'%' IDENTIFIED WITH mysql_native_password BY 'pass';

이것을 임포트 컨테이너 내부 어딘가에 추가해야 하나요?

자, 위에서 언급한 문제를 해결했습니다. 이는 최신 버전의 MySQL에서 발생하는 문제입니다. 더 이상 이전 버전의 네이티브 비밀번호를 지원하지 않기 때문입니다. 이 문제를 해결하는 가장 쉬운 방법은 MySQL 5.7을 사용하여 이 프로세스를 실행하는 것입니다. 3단계를 다음 내용으로 변경하세요:

docker run -d -e MYSQL_ROOT_PASSWORD=pass -e MYSQL_USER=user -e MYSQL_PASSWORD=pass -e MYSQL_DATABASE=db -v ~/smf2:/backup --name=mysql mysql

다음과 같이 바꾸면 됩니다.

docker run -d -e MYSQL_ROOT_PASSWORD=pass -e MYSQL_USER=user -e MYSQL_PASSWORD=pass -e MYSQL_DATABASE=db -v ~/smf2:/backup --name=mysql mysql:5.7

그러면 정상적으로 작동할 것입니다. 이제 제 임포트가 마침내 실행되고 있습니다.

2개의 좋아요

새로운 질문이 있습니다: 사용자 아바타가 가져와지지 않는 것 같습니다. 원래 이런 건가요?

크기 조정이 필요한 아바타는 SMF의 표준 폴더가 아닌 커스텀 폴더에 저장되어 있는데, 이것이 원인이 될 수 있을까요?

그 외에는 지금까지 잘 되고 있습니다. 이 가이드가 정말 훌륭하고, 증분 데이터베이스 가져오기도 잘 작동합니다 :+1:.

2개의 좋아요

우리의 경우 추가 단계 없이 그대로 넘어왔습니다. SMF가 아바타를 어디에 저장하는지 바로 떠오르지 않네요. 첨부 파일도 가져오셨나요? 저는 SQL DB와 첨부 파일만 가져왔기 때문에, 아마 그 안에 들어 있을 것 같습니다.

네, 거기 있었어요. 그런데 아바타를 다른 폴더로 옮겼다가, 가져오기 과정에서 사용자와 매칭에 사용되는 아바타 폴더로 복사하는 걸 깜빡했어요. 이제 해결됐어요 (가져오기를 처음부터 다시 해야 했지만요).

이제 새로운 문제가 생겼는데… 차단된 사용자가 가져오기 시 정지 상태로 표시되지 않고 비활성 상태로만 나와요. 정지 상태로 표시되게 하는 방법이 있을까요?

1개의 좋아요

SMF v2.0.17의 최신 버전인 v2.50 beta2를 사용 중인데, 현재 templates/import/mysql-dep.template.yml 파일 때문에 smf2.rb가 다르게 생성되고 있습니다.

4단계에서 설명한 대로 "quote ="를 대체하는 현재 반복문은 다음과 같습니다:

quote = +“\n[quote="#{params[‘author’]}”

그리고 추가로 다음 부분이 없습니다:

하지만 일단 가져오기를 진행했고, 불행히도 "IGNORE_BBCODE do you mean IgnoreUser."라는 오류로 실행이 중단되었습니다.
죄송합니다. Traceback의 스크린샷을 찍어야 했는데 그러지 못했습니다. 어쨌든 제 기억으로는 이렇습니다.

어떤 아이디어가 있으신가요?
감사합니다.

최근 이 스크립트를 업데이트했습니다. 확인해 보겠습니다.

1개의 좋아요

정말 감사합니다! 처음부터 다시 시작하면 이미 가져온 데이터(예: 사용자, 카테고리)가 덮어쓰기되나요?
감사합니다!
G.

일반적으로 그렇지 않습니다. 가져오기 스크립트는 마지막으로 중단한 위치부터 이어서 실행되도록 설계되어 있습니다!

1개의 좋아요

@tradenet 은 이제 여기에서 수정되었습니다:

죄송합니다!

모든 체크가 완료되는 대로 tests-passed에서 사용할 수 있게 될 것입니다.

3개의 좋아요

관심 가져주셔서 감사합니다.
G.

2개의 좋아요

Discourse로 변환한 후 기존 SMF URL이 깨지나요?

별로 아닙니다. 가져오기 도구가 기존 URL과 일치하는(그리고 리다이렉트하는) 영구 링크를 생성하여 새 경로로 연결합니다.