Migrate an SMF2 forum to Discourse

다시 답변드려 죄송합니다. 영구링크(permalinks)가 생성되지 않는 이유를 파악하는 데 어려움을 겪고 있습니다. :frowning:

요약하면 다음과 같습니다:
상위 루트 도메인에서 SMF2의 기본 URL(ugly URLs)을 사용하고 있습니다. Discourse는 해당 루트 도메인의 서브도메인에 설치되어 있습니다. 최신 Discourse 저장소의 smf2.rb 가져오기(importer)를 사용하여 SMF2를 Discourse로 변환했습니다(안내문 참고), 하지만 가져오기가 완료된 후에도 Discourse에 영구링크가 없습니다.

SMF2나 Discourse에서 실행 중인 특정 설정이나 플러그인 등 추가적인 단계가 필요한가요?

그 함수가 깔끔한 URL(Pretty URLs)용인 것 같네요. 따라서 코드를 그에 맞게 수정해야 합니다(코드를 놓친 부분이 없다면).

1개의 좋아요

마르코가 pretty URL을 사용하지 않았는데도 영구 링크(permalinks)가 생성되었고, 동일한 가져오기 스크립트를 사용했다는 점이 조금 혼란스럽습니다.

가져오기 스크립트 내의 pretty URL 함수는 다음과 같습니다: discourse/script/import_scripts/smf2.rb at main · discourse/discourse · GitHub

SMF의 기본 “우gly” URL이 작동하도록 설정하는 데 도움을 주시면 감사하겠습니다. 방향만이라도 알려주시면 큰 도움이 될 것입니다. :pray: 감사합니다.

잘 모르겠어요. 하지만 제가 드릴 수 있는 최선의 무료 답변은, 확인해 보셔야 할 것이 222번째 줄이라는 거예요:

           Permalink.find_or_create_by(url: "forums/index.php/board,#{c["id_board"]}.0.html", category_id: category.id)

그 영구 링크(permalink)를(혹은 다른 몇 개를?) 현재처럼 보기 싫은 형태로 바꾸시는 건가요? 저한테는 그게 꽤 보기 싫어 보이거든요. 파일 상단의 permalink_normalizations도 조정해 보실 수 있어요.

제이, 다시 답장해서 죄송하지만, 222번 줄이 어디에 있나요? smf2.rb의 222번 줄은 다음 내용뿐입니다:

if parent

음, 그러면 우리 둘은 서로 다른 버전을 보고 있는 거군요. 왜 그런지는 정확히 모르겠어요. 하지만 확인해야 할 부분은 Permalink에 관한 그 줄들이에요.

제가 링크한 버전이 가장 최신의 “공식” 버전인 것 같아서 혼란스럽습니다… 그런데 다른 버전을 언급하신 분이 두 번째입니다. 제가 놓치고 있는 부분이 있을까요? 말씀하신 버전을 어디서 구할 수 있을까요?

아하! 죄송합니다. smf1 스크립트를 클릭한 것 같습니다. 현재 보고 계신 smf2.rb 스크립트 바로 옆에 있는 smf1.rb1을 확인해 보세요.

smf1 스크립트를 살펴보거나, make_prettyurl_permalinks를 모델로 삼아 make_uglyurl_permalinks를 만드는 것도 방법입니다. 하지만 이 함수는 pretty URL 테이블에서 데이터를 읽어 오므로, smf1.rb를 모델로 사용하는 것이 더 쉬울 수 있습니다. 단, 확실하게 알기 위해서는 데이터베이스를 확인해 봐야 합니다. 아니, create_xxx 함수들을 수정하지 않는 한 그것도 큰 도움이 되지 않을 것 같습니다.

죄송합니다. 여기서 설명할 수 있는 해결책을 찾지 못하겠습니다.

1개의 좋아요

여기까지 진행은 했는데, 그 다음 단계로 넘어가지 못하겠습니다. MySQL 서버에서 네이티브 비밀번호를 가진 새 사용자를 생성해서 시도해 보았지만, 여전히 실패했습니다.

su discourse -c "bundle exec ruby script/import_scripts/smf2.rb /shared/smf2 -t UTC"
Loading existing groups...
Loading existing users...
Loading existing categories...
Loading existing posts...
Loading existing topics...
Traceback (most recent call last):
        7: from script/import_scripts/smf2.rb:701: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.7.0/gems/mysql2-0.5.3/lib/mysql2/client.rb:90:in `initialize'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/mysql2-0.5.3/lib/mysql2/client.rb:90:in `connect': RSA Encryption not supported - caching_sha2_password plugin was built with GnuTLS support (Mysql2::Error)

수많은 시간 동안 이것저것 시도해 보다가 마침내 문제를 파악했습니다. 저처럼 막히는 사람이 있을까 봐 여기에 공유합니다.

MySQL Docker 컨테이너 버전이 8입니다. 이로 인해 MySQL 템플릿이 가져오는 mariadb 라이브러리가 어떤 이유로든 작동하지 않는 문제가 발생했습니다.

가장 먼저, import Docker 컨테이너 설정 파일에 MySQL 템플릿 파일을 포함하지 않았습니다.

그 후 import 컨테이너를 빌드하고 ./launcher enter import 명령으로 컨테이너에 진입했습니다.

다음과 같이 실행했습니다:

echo "gem 'mysql2'" >> Gemfile
wget https://dev.mysql.com/get/mysql-apt-config_0.8.17-1_all.deb
dpkg -i mysql-apt-config_0.8.17-1_all.deb

이 과정에서는 대화형 프롬프트가 나타나며, 기본값(MySQL 8 with tools)을 선택할 수 있습니다.

이어서 표준 MySQL 8 라이브러리를 설치하고 빌드를 계속했습니다:

apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y libmysqlclient-dev
su discourse -c 'bundle config unset deployment'
su discourse -c 'bundle install --no-deployment --path vendor/bundle --jobs 4 --without test development'

이 모든 작업이 완료된 후에는 나머지는 동일했으며, 이제 import가 정상적으로 실행되고 있습니다.

Discourse 개발팀이 이 문제를 고려하여 import 스크립트를 조정하면 좋겠지만, 적어도 이제 포럼에 공유되어 저처럼 막히는 다른 사람들이 도움을 받을 수 있게 되었습니다.

3개의 좋아요
  1. 이 지침에 따라 제거하라는 말씀인가요? how-to-migrate-import-from-smf2-to-discourse/90129#cleanup-5

  2. 가져오기 전에 smf2에서 Discourse로 첨부파일 디렉터리를 수동으로 이전했고, 가져오기를 한 번 실행했지만 Discourse 게시글에 업로드된 파일이 표시되지 않습니다. 원인이 무엇일까요?

  3. S3를 활성화하지 않은 상태에서 가져오기를 이미 한 번 실행했는데, 이제 S3를 사용하려고 합니다. 어떻게 해야 하나요?

  1. 네
  2. 음… S3를 활성화하고 다시 가져오기를 시도해 보겠습니다.
  3. 가져오기를 시작하기 전에 S3를 활성화하세요.
1개의 좋아요

다만, 저는 이미 S3 없이 import를 한 번 실행해 보았습니다. 이미 import된 토픽의 업로드 파일은 delta import 과정에서 S3로 전송되나요?

가장 좋은 방법은 처음부터 다시 시작하여 가져오기 전에 S3를 활성화하는 것입니다.

사용자를 생성할 때 이 오류가 발생합니다:

oxipng worker: oxipngnot found; please provide proper binary or disable this worker (--no-oxipng argument or:oxipng => false through options)

그 후 게시글 생성을 시작합니다.

  • 이것이 Discourse에서 첨부파일이 표시되지 않는 이유일 수 있나요?
  • oxipng는 어디에 설치해야 하나요?

업데이트: Discourse 어디에서도 oxipng에 대한 정보를 찾을 수 없어 이 오류가 나는 이유가 궁금합니다. 또한 이 문제는 smf2 가져오기 스크립트를 실행할 때만 발생합니다. 이것이 관련이 있을까요? https://meta.discourse.org/t/faster-and-smaller-uploads-in-discourse-with-rust-webassembly-and-mozjpeg-blog

그것은 서버 측에서 사용하는 이미지 최적화 라이브러리가 출력하는 경고일 뿐이며, 아무것도 차단하지 않아야 합니다.

2개의 좋아요

그래서 내 임포트 문제가 S3 문제와 관련이 있을 것 같다고 생각했는데, 알고 보니 S3는 정상적으로 작동하는 것 같습니다. 제가 겪고 있는 문제는 S3를 활성화한 상태로 임포트 스크립트를 실행하고 임포트 컨테이너를 재구축한 후, Discourse의 모든 토픽에 smf2 토픽의 첨부 파일이었던 업로드 파일이 없다는 것입니다. 다시 말해, smf2의 해당 토픽에서는 첨부 파일로 명확히 표시되는 것과 달리, Discourse 토픽에서는 업로드 파일이 존재한다는 시각적 단서가 전혀 보이지 않습니다. S3를 비활성화한 상태로 임포트해도 결과는 동일합니다. 이제 막막한 상태입니다. :confused: 혹시 어떤 생각이 있으신가요?

게시물에 이미지가 첨부되어 있어 가져오기 스크립트가 이를 가져와야 한다는 것을 알 수 있지만, 게시물 본문에서 이미지가 참조되지 않아 표시되지 않을 수 있습니다. 이미지가 표시되도록 게시물 본문에 이미지 링크를 포함하도록 수정해야 합니다. 저는 다른 포럼에서 비슷한 상황을 본 적이 있습니다.

SMF2의 게시물을 수정해서 첨부 파일에 대한 링크를 포함시킨 다음, Discourse로 가져오라는 말씀이신가요?

음, 그 방법도 될 수 있겠네요.

하지만 저는 첨부 파일을 원본 게시물에 추가하도록 가져오기 스크립트를 수정하는 방법을 말하고 있습니다. 다음과 같은 방식으로요.