Kubuntu VM에서 myBB 포럼을 Discourse로 이전하기

너무나도 많은 시간을 보낸 끝에 거의 성공할 것 같았는데…

$ bundle exec ruby script/import_scripts/mybb.rb 
Loading existing groups...
Loading existing users...
Loading existing categories...
Loading existing posts...
Loading existing topics...

creating users
script/import_scripts/mybb.rb:96:in `block (3 levels) in import_users': undefined method `exists?' for File:Class (NoMethodError)

                  @uploader.create_avatar(newuser, filename) if File.exists?(filename)
                                                                    ^^^^^^^^
Did you mean?  exist?

여전히 실패했습니다 :-(,

제 이해가 맞다면, 해당 메서드는 비추천(deprecated) 대상이 된 후 현재 Ruby 버전에서 제거되었습니다:

이 변경 사항을 반영하도록 가져오기(import) 스크립트를 업데이트해야 합니다.


아래 링크에서 exists를 s 없이 exist로 교체해 보는 것은 어떨까요:

:slight_smile:

Ruby 문서: https://ruby-doc.org/3.2.2/File.html#method-c-exist-3F

응 - 그 이전에도 이미 오래전에 비추천(deprecated) 처리가 됐었거든. 관련 부분들을 grep으로 찾아서 수정해보려고 하는데, 이 길고 지금까지는 별로 성과가 없었던 작업에서 좀 쉬어줘야겠어 :wink:

음…

$ bundle exec ruby script/import_scripts/mybb.rb
Loading existing groups...
Loading existing users...
Loading existing categories...
Loading existing posts...
Loading existing topics...
/home/silverdr/sources/discourse/lib/site_setting_extension.rb:444:in `get': No setting named 'email_domains_blacklist' exists (Discourse::InvalidParameters)

새 이름은 사이트 설정에서 찾을 수 있습니다. email_domains_blocklist인 것 같습니다.

감사합니다.

$ grep -R email_domains_blocklist ./

은 아무것도 반환하지 않습니다.

$ grep -R email_domains_blacklist ./
./script/import_scripts/base.rb:      email_domains_blacklist: '',
./app/models/site_setting.rb:    email_domains_blacklist: "blocked_email_domains",

은 위와 같이 반환됩니다. 즉, 가장 가능성이 높은 값은 blocked_email_domains입니다. 한편, 이전 시도에서 @Paul_King 님이 위에 링크한 기스트(gist) 기반 파일로 원래의 script/import_scripts/base.rb를 대체했던 것을 깨달았습니다:

원본 파일로 복원했는데, 이번에는 진행이 된 것 같습니다. 너무 좋아서 믿기지가 않네요. 제가 무언가를 놓쳤거나, 파일 자체가 문제였을 것입니다 :wink: 이제 확인해 보겠습니다

이 긴 여정(이 포스트보다 훨씬 긴)을 요약하면 다음과 같습니다:

참고: 이 과정은 가상 머신에서 실행되는 Kubuntu 배포판을 사용했으므로, 다른 OS나 배포판에서는 결과가 다를 수 있음을 유념해 주세요.

0. Discourse 개발 환경 설치

이 포스트를 참고하고, 해당 포스트에 링크된 이 스크립트를 다음을 사용하여 실행합니다.

`bash <(wget -qO- https://raw.githubusercontent.com/discourse/install-rails/master/linux)` 
```\n그곳에 설명된 대로 소스 코드를 클론합니다.

git clone GitHub - discourse/discourse: A platform for community discussion. Free, open, simple. · GitHub ~/discourse

### 1. MySQL 데이터베이스 준비
스레드 상단에 설명된 대로 원래 `mybb` 데이터베이스의 덤프를 가져옵니다:

$ mysqldump -u USER_NAME -p DATABASE_NAME > mybb_dump.sql

그리고 이를 새로 설정된 개발 환경으로 복사/이동합니다.

MySQL 서버를 설치합니다.

$ sudo apt-get install mysql-server


최근 버전에서 MySQL 인증 방식이 변경되었습니다. 이제 MySQL에서 root 권한을 사용하려면 호스트에서도 root 권한이 있어야 하므로

$ sudo mysql

을 사용해야 하며, 이전처럼

$mysql -u root

을 사용할 수 없습니다.

물론 먼저 "sudoer"(관리자) 권한이 있어야 합니다.

$ sudo mysql
mysql> CREATE DATABASE mybb;
mysql> SHOW DATABASES;
mysql> CREATE USER ‘nonrootuser’@‘localhost’ IDENTIFIED BY ‘password’;
mysql> GRANT ALL PRIVILEGES ON mybb.* TO ‘nonrootuser’@‘localhost’;
mysql> quit
$ mysql -unonrootuser -ppassword mybb < mybb_dump.sql
<여기서는 커맨드 라인에 비밀번호를 제공하지 않는 것이 현명하지 않다는 경고가 나옵니다>

$ sudo mysql
mysql> USE mybb;
mysql> SHOW TABLES;
<여기서 모든 테이블이 존재하는지 확인하세요 - 원래 포스트 참조>

mysql> quit

### 2. Ruby gems 설치
현재 소스에서 `Gemfile`을 확인해 보면 

$ echo “gem ‘mysql2’, require: false” >> Gemfile

이 실제로는 필요하지 않음을 알 수 있습니다. 환경 변수 `IMPORT`를 `1`로 설정하는 것만으로도 충분합니다. 
필요한 것은 MySQL 클라이언트용 개발 파일이며, 아래 첫 번째 줄이 바로 그 목적입니다.

$ sudo apt-get install libmysqlclient-dev
$ cd ~/discourse
$ IMPORT=1 bundle install

### 2. Discourse 준비 (PostgreSQL 데이터베이스)

$ bundle exec rails db:drop
$ bundle exec rails db:create
$ bundle exec rails db:migrate
$ export DB_PW=“password”
$ export DB_USER=“nonrootuser”

### 3. 실제 가져오기 실행
다음 줄은 `mybb.rb` 가져오기 스크립트에서 오랫동안 비추천되어 현재는 이미 제거된 메서드 호출을 수정합니다. 작성 시점에는 여전히 존재하며, 이미 수정된 경우에도 아무것도 변경되지 않습니다.

$ sed -i.original ‘s/File.exists?/File.exist?/’ script/import_scripts/mybb.rb

이제 Redis가 여전히 실행 중인지 확인합니다. Rails 설치 스크립트는 Redis를 시작하지만 영구 서비스로 활성화하지 않으므로 재부팅, 충돌 등에서는 유지되지 않습니다.

$ ps -aux |grep redis
silverdr 2808 0.3 0.3 89972 14512 ? Ssl 05:25 2:04 redis-server *:6379
[…]

위와 같은 줄이 보이지 않는다면 다음을 실행하세요.

$ redis-server --daemonize yes

이는 처음 설치할 때 위의 Rails 설치 스크립트가 사용했던 것과 정확히 동일한 명령입니다.

마지막으로 :pray: 기도를 올리고

$ IMPORT=1 bundle exec ruby script/import_scripts/mybb.rb

이 시점에 스크립트가 YAE(또 다른 에러)로 중단되지 않았다면 그 병을 따고 마실 때입니다 :champagne:

#### 남은 몇 가지 사항
* OK - 가장 눈에 띄는 누락 부분은 사용자 비밀번호입니다. 두 애플리케이션 모두 해시와 솔트를 저장하지만, 해시 길이를 보면 "mybb"는 더 오래된 해싱 알고리즘을 사용하는 것으로 보입니다. 따라서 이는 이해할 수 있는 부분이며 치명적인 장애 요인은 아닙니다. 누구나 처음에는 비밀번호를 재설정할 수 있어야 합니다.
* 일부 bbcode가 변환되지 않습니다. 예를 들어 코드 블록에는 모노스페이스 Courier 폰트 등을 설정하는 태그가 있어 문제가 발생합니다. 이 부분을 더 자동화하려는 기력이 남아있지 않습니다. 만약 해결 방법을 찾으신다면 저/여기에 알려주세요! :man_bowing: