# Migrate an SMF2 forum to Discourse

**URL:** https://meta.discourse.org/t/migrate-an-smf2-forum-to-discourse/90314
**Category:** Sysadmins
**Tags:** how-to
**Created:** [6월 20, 2018, 2:26오후 UTC](https://meta.discourse.org/t/migrate-an-smf2-forum-to-discourse/90314 "2018-06-20T14:26:51Z")
**Posts on this page:** 20
**Page:** 3

<div class="post-metadata">

### Author: ![Zup](https://avatars.discourse-cdn.com/v4/letter/z/c37758/32.png) [@Zup](https://meta.discourse.org/u/Zup)
#### Post date: [7월 18, 2020, 11:30오전 UTC](https://meta.discourse.org/t/migrate-an-smf2-forum-to-discourse/90314/42 "2020-07-18T11:30:09Z")

</div>

감탄할 만하네요! 제 구형 SMF가 예쁜 URL을 사용하지 않는 경우에도?

"실제로는 아니다"라고 한 게 무슨 뜻이에요?

---

<div class="post-metadata">

### Author: ![marcozambi](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/marcozambi/32/119505_2.png) [@marcozambi](https://meta.discourse.org/u/marcozambi)
#### Post date: [7월 18, 2020, 11:38오전 UTC](https://meta.discourse.org/t/migrate-an-smf2-forum-to-discourse/90314/43 "2020-07-18T11:38:58Z")

</div>

질문에 대한 답변입니다:

1. 네, 하지만…
2. '실제로는 아니다’라는 것은 주제 ID로 연결되는 링크(예: `index.php?topic=123`)는 영구 링크(permalink)로 생성되어 정상적으로 작동하지만, 특정 게시글을 가리키는 앵커 링크(예: `index.php?topic=123.msg789#msg789`)는 유지되지 않거나 더 이상 작동하지 않는다는 뜻입니다. 이러한 링크들은 주제 ID까지 잘립니다.

아래는 SMF2에서 가져온 내 포럼의 영구 링크 예시입니다.

![image](https://global.discourse-cdn.com/meta/original/3X/2/d/2dbe39618bbe08e94665e713acd111fa1e4af03d.png)

---

<div class="post-metadata">

### Author: ![Zup](https://avatars.discourse-cdn.com/v4/letter/z/c37758/32.png) [@Zup](https://meta.discourse.org/u/Zup)
#### Post date: [7월 18, 2020, 11:45오전 UTC](https://meta.discourse.org/t/migrate-an-smf2-forum-to-discourse/90314/44 "2020-07-18T11:45:38Z")

</div>

적어도 그 주제는 특정 게시물에 대한 참고 자료로 계속 사용될 수 있으니, 그것만으로도 충분히 좋습니다. 답변해 주셔서 정말 감사합니다. 또한 이런 설명을 정리해 주셔서 감사드립니다.

---

<div class="post-metadata">

### Author: ![Zup](https://avatars.discourse-cdn.com/v4/letter/z/c37758/32.png) [@Zup](https://meta.discourse.org/u/Zup)
#### Post date: [7월 18, 2020, 11:57오전 UTC](https://meta.discourse.org/t/migrate-an-smf2-forum-to-discourse/90314/45 "2020-07-18T11:57:30Z")

</div>

죄송합니다, 질문을 깜빡했네요 - 제 SMF가 카테고리-\>보드-\>서브보드 구조로 설정되어 있다면, Discourse로 올바르게 변환하려면 먼저 “보드” 카테고리를 제거해서 두 단계(포럼-\>서브포럼) 구조로 만들어야 하나요?

---

<div class="post-metadata">

### Author: ![Paracelsus](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/paracelsus/32/164912_2.png) [@Paracelsus](https://meta.discourse.org/u/Paracelsus)
#### Post date: [7월 18, 2020, 4:40오후 UTC](https://meta.discourse.org/t/migrate-an-smf2-forum-to-discourse/90314/46 "2020-07-18T16:40:14Z")

</div>

> [@marcozambi](#):
>
> 별로 그렇지 않습니다. 가져오기 도구가 기존 URL과 일치하는 영구 링크(permalinks)를 생성하여 새 경로로 리다이렉트합니다.

> [@marcozambi](#):
>
> 질문에 대한 답변입니다:
> 
> 1. 네, 하지만…
> 2. "별로 그렇지 않다"는 주제 ID에 대한 링크(예: `index.php?topic=123`)는 영구 링크로 생성되어 작동하지만, 특정 게시물에 대한 앵커(예: `index.php?topic=123.msg789#msg789`)는 유지되거나 작동하지 않는다는 뜻입니다.它们是 주제 ID로 잘립니다.
> 
> 아래는 SMF2에서 가져온 내 포럼의 영구 링크 예시입니다.
> 
> ![image](https://global.discourse-cdn.com/meta/original/3X/2/d/2dbe39618bbe08e94665e713acd111fa1e4af03d.png)

@marcozambi 님, 안녕하세요.

이것이 어떻게 작동하는지 궁금합니다. 10월 19일에 가져오기 도구를 사용하여 SMF에서 대규모 포럼을 Discourse로 가져왔는데, 모든 기존 형식의 링크가 기본적으로 손실되었습니다(즉, 기존 URL을 사용하면 404 오류가 발생합니다).

예를 들어, 기존 링크:

> **[Um Dia Negro](https://www.forumscp.com/t/um-dia-negro/25488)**
>
> Hoje atingimos a pior classificação de sempre na nossa história. Para além de termos ficado fora das competições europeias, conseguimos a proeza de não figurar, sequer, entre os sete primeiros lugares da tabela classificativa a uma escassa jornada...

다음 주제를 식별했습니다:

> **[Um Dia Negro](https://www.forumscp.com/t/um-dia-negro/25488)**
>
> Hoje atingimos a pior classificação de sempre na nossa história. Para além de termos ficado fora das competições europeias, conseguimos a proeza de não figurar, sequer, entre os sete primeiros lugares da tabela classificativa a uma escassa jornada...

당신의 "마법"을 공유해 주시겠어요? 😁

---

<div class="post-metadata">

### Author: ![marcozambi](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/marcozambi/32/119505_2.png) [@marcozambi](https://meta.discourse.org/u/marcozambi)
#### Post date: [7월 19, 2020, 7:29오전 UTC](https://meta.discourse.org/t/migrate-an-smf2-forum-to-discourse/90314/47 "2020-07-19T07:29:26Z")

</div>

특별한 마법은 없습니다.  
2018년 9월에 SMF에서 가져오는 작업을 수행했을 때, SMF2 가져오기 스크립트가 모든 작업을 처리했습니다.  
각 게시물을 가져온 후, 스크립트는 관련 영구 링크를 생성했습니다.  
그럼에도 불구하고, 이 주제의 첫 번째 게시물에서 자세히 설명한 대로 스크립트에 몇 가지 작은 커스터마이징을 수행했습니다.

---

<div class="post-metadata">

### Author: ![marcozambi](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/marcozambi/32/119505_2.png) [@marcozambi](https://meta.discourse.org/u/marcozambi)
#### Post date: [7월 19, 2020, 7:40오전 UTC](https://meta.discourse.org/t/migrate-an-smf2-forum-to-discourse/90314/48 "2020-07-19T07:40:37Z")

</div>

맞습니다. 기존 SMF 서브포럼 트리를 2단계로 '평탄화’해야 합니다.

---

<div class="post-metadata">

### Author: ![Paracelsus](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/paracelsus/32/164912_2.png) [@Paracelsus](https://meta.discourse.org/u/Paracelsus)
#### Post date: [7월 19, 2020, 8:00오전 UTC](https://meta.discourse.org/t/migrate-an-smf2-forum-to-discourse/90314/49 "2020-07-19T08:00:33Z")

</div>

> [@marcozambi](#):
>
> 특별한 마법은 없습니다.  
> 2018년 9월에 SMF에서 가져오는 작업을 수행했을 때, SMF2 가져오기 스크립트가 모든 마법을 수행했습니다.  
> 각 게시물을 가져온 후, 스크립트는 관련 영구 링크(permalink)를 생성했습니다.  
> 그래도 이 주제의 첫 번째 게시물에서 자세히 설명한 대로 스크립트에 약간의 커스터마이징을 수행했습니다.

네, 훌륭한 게시물에 감사드립니다. 자세히 살펴본 끝에 600만 개 게시물의 포럼을 성공적으로 마이그레이션할 수 있었습니다.

하지만 어쩌면 영구 링크가 실제로는 생성되었을 수도 있습니다. 어떻게 확인하시나요? 데이터베이스에 있다면, 제가 수정해야 할 nginx 문제일 수 있습니다.

---

<div class="post-metadata">

### Author: ![marcozambi](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/marcozambi/32/119505_2.png) [@marcozambi](https://meta.discourse.org/u/marcozambi)
#### Post date: [7월 19, 2020, 8:04오전 UTC](https://meta.discourse.org/t/migrate-an-smf2-forum-to-discourse/90314/50 "2020-07-19T08:04:27Z")

</div>

관리자 → 사용자 지정 → 영구 링크 메뉴로 이동하여 영구 링크 목록을 확인할 수 있습니다.  
필요한 경우, 해당 페이지에서 새로운 영구 링크를 생성할 수도 있습니다.

---

<div class="post-metadata">

### Author: ![Paracelsus](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/paracelsus/32/164912_2.png) [@Paracelsus](https://meta.discourse.org/u/Paracelsus)
#### Post date: [7월 19, 2020, 9:20오전 UTC](https://meta.discourse.org/t/migrate-an-smf2-forum-to-discourse/90314/51 "2020-07-19T09:20:35Z")

</div>

+1:

예상대로 비어 있었습니다. 즉, 스크립트의 일부가 우리 상황에서는 작동하지 않았다는 뜻이죠. 😑 뭐, 그래도 위에서 예시로 올린 것들은 수동으로 만들 수 있으니 괜찮습니다 (방금 시도해 봤고 성공했습니다).

---

<div class="post-metadata">

### Author: ![Zup](https://avatars.discourse-cdn.com/v4/letter/z/c37758/32.png) [@Zup](https://meta.discourse.org/u/Zup)
#### Post date: [8월 26, 2020, 10:44오후 UTC](https://meta.discourse.org/t/migrate-an-smf2-forum-to-discourse/90314/53 "2020-08-26T22:44:25Z")

</div>

> [@marcozambi](#):
>
> 1. MySQL 컨테이너를 생성하고 시작합니다.
> 
> ```plaintext
> 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
> 
> ```

이 단계에서 기존 smf2 데이터베이스의 상세 정보를 사용해야 하는지, 아니면 정확히 ‘user’, ‘pass’, 'db’로 설정해야 하는지 궁금합니다.

> [@marcozambi](#):
>
> 1. SMF2의 Settings.php 파일을 올바른 연결 상세 정보로 편집합니다. 완전히 명확히 하기 위해, 이 단계는 실제로는 필수적이지 않습니다. DB 연결 매개변수를 smf2.rb 가져오기 스크립트에 매개변수로 전달할 수도 있기 때문입니다. 하지만 이 솔루션이 더 빠르고 유연하다고 판단했습니다.
> 
> ```plaintext
> ########## Database Info ##########
> $db_type = 'mysql';
> $db_server = '172.17.0.X'; # This is the IP address of the mysql container - use yours!
> $db_name = 'db';
> $db_user = 'user';
> $db_passwd = 'pass';
> $ssi_db_user = '';
> $ssi_db_passwd = '';
> $db_prefix = 'smf_';
> $db_persist = 1;
> $db_error_send = 0;
> 
> ```

이 단계에서도 기존 smf2 데이터베이스의 상세 정보를 사용해야 하는지, 아니면 지정된 대로 ‘db’, ‘user’, 'pass’를 그대로 사용해야 하는지 궁금합니다.

> [@marcozambi](#):
>
> SMF2 DB 서버에서 SMF2 DB 덤프를 수행합니다.
> 
> ```plaintext
> /usr/bin/mysqldump -u<your_user> -p<your_password> --databases <your_smf2_db> > smf2.db
> 
> ```

기존 smf2 데이터베이스의 상세 정보를 사용해야 하는 단계는 이것뿐인가요?

---

<div class="post-metadata">

### Author: ![marcozambi](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/marcozambi/32/119505_2.png) [@marcozambi](https://meta.discourse.org/u/marcozambi)
#### Post date: [8월 27, 2020, 1:02오후 UTC](https://meta.discourse.org/t/migrate-an-smf2-forum-to-discourse/90314/54 "2020-08-27T13:02:23Z")

</div>

> [@Zup](#):
>
> 이 단계에서는 이전 smf2 데이터베이스 정보를 사용해야 하나요, 아니면 정확히 지정된 ‘db’, ‘user’, ‘pass’를 사용해야 하나요?

이것은 smf 포럼의 데이터베이스 덤프가 가져와진 도커화(Dockerized)된 MySQL 인스턴스에 연결하기 위한 자격 증명입니다.  
명확히 하자면, 도커화된 MySQL은 Discourse가 실행되는 동일한 서버에서 실행되며, smf 데이터베이스에서 수행했어야 하는 덤프를 포함하는 용도로만 필요합니다.

> [@Zup](#):
>
> 이것이 이전 smf2 데이터베이스 정보를 사용해야 하는 유일한 단계인가요?

이것은 smf2 원본 데이터베이스가 호스팅되는 서버에서 덤프를 가져오기 위해 실행해야 하는 명령어입니다. 가져온 덤프는 위에서 언급한 도커화된 MySQL 인스턴스에 가져와야 합니다.

---

<div class="post-metadata">

### Author: ![Zup](https://avatars.discourse-cdn.com/v4/letter/z/c37758/32.png) [@Zup](https://meta.discourse.org/u/Zup)
#### Post date: [8월 27, 2020, 7:25오후 UTC](https://meta.discourse.org/t/migrate-an-smf2-forum-to-discourse/90314/55 "2020-08-27T19:25:51Z")

</div>

답장 주셔서 감사합니다.

네, 이미 Docker화된 MySQL 인스턴스에 원본 SMF2 데이터베이스를 Discourse 서버로 가져왔습니다.

Settings.php에 Docker화된 MySQL 정보를 입력하고 가져오기 스크립트를 실행하면 다음과 같은 오류가 발생합니다:

> 기존 그룹 불러오는 중…
> 
> 기존 사용자 불러오는 중…
> 
> 기존 카테고리 불러오는 중…
> 
> 기존 게시글 불러오는 중…
> 
> 기존 주제 불러오는 중…
> 
> 그룹 생성 중
> 
> **Traceback** (most recent call last):
> 
> 11: from script/import\_scripts/smf2.rb:701:in `’
> 
> 10: from script/import\_scripts/smf2.rb:28:in `run’
> 
> 9: from /var/www/discourse/script/import\_scripts/base.rb:47:in `perform’
> 
> 8: from script/import\_scripts/smf2.rb:66:in `execute’
> 
> 7: from script/import\_scripts/smf2.rb:77:in `import\_groups’
> 
> 6: from script/import\_scripts/smf2.rb:281:in `query’
> 
> 5: from script/import\_scripts/smf2.rb:287:in `\_\_query’
> 
> 4: from /var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-mini-profiler-2.0.4/lib/patches/db/mysql2.rb:22:in `query’
> 
> 3: from /var/www/discourse/vendor/bundle/ruby/2.6.0/gems/mysql2-0.5.3/lib/mysql2/client.rb:130:in `query’
> 
> 2: from /var/www/discourse/vendor/bundle/ruby/2.6.0/gems/mysql2-0.5.3/lib/mysql2/client.rb:130:in `handle\_interrupt’
> 
> 1: from /var/www/discourse/vendor/bundle/ruby/2.6.0/gems/mysql2-0.5.3/lib/mysql2/client.rb:131:in `block in query’
> 
> /var/www/discourse/vendor/bundle/ruby/2.6.0/gems/mysql2-0.5.3/lib/mysql2/client.rb:131:in `\_query’: **Table ‘db.smf\_membergroups’ doesn’t exist (**  **Mysql2::Error** **)**

아무런 아이디어가 있을까요?

이 가이드를 여러 번에 걸쳐 A부터 Z까지 꼼꼼히 따랐지만, 항상 이 지점에서 막힙니다.

감사합니다.

---

<div class="post-metadata">

### Author: ![justin](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/justin/32/157614_2.png) [@justin](https://meta.discourse.org/u/justin)
#### Post date: [8월 27, 2020, 7:45오후 UTC](https://meta.discourse.org/t/migrate-an-smf2-forum-to-discourse/90314/56 "2020-08-27T19:45:19Z")

</div>

mysql 데이터베이스에서 `smf_membergroups` 테이블이 존재하는지 확인하십시오. 존재하지 않는 경우, 다음 중 하나를 수행해야 합니다.

1. 다른 테이블 이름을 반영하도록 스크립트를 수정하거나,
2. 그룹이 존재하지 않으면 그룹 가져오기를 건너뛰십시오

---

<div class="post-metadata">

### Author: ![marcozambi](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/marcozambi/32/119505_2.png) [@marcozambi](https://meta.discourse.org/u/marcozambi)
#### Post date: [8월 27, 2020, 8:09오후 UTC](https://meta.discourse.org/t/migrate-an-smf2-forum-to-discourse/90314/57 "2020-08-27T20:09:31Z")

</div>

> [@Zup](#):
>
> 설치 설명서에는 “smf2.db”라고 되어 있는데, “smf2.sql”이어야 하는 거 아닌가요?

파일 확장자는 중요하지 않습니다. 파일에 유효한 SQL 문장이 포함되어 있다면 확장자와 무관하게 로드됩니다.

---

<div class="post-metadata">

### Author: ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)
#### Post date: [8월 27, 2020, 10:50오후 UTC](https://meta.discourse.org/t/migrate-an-smf2-forum-to-discourse/90314/58 "2020-08-27T22:50:54Z")

</div>

또한, 데이터베이스의 접두사가 `smf_`와 다를 수도 있습니다. 많은 가져오기 도구가 이를 옵션으로 제공하지만, 이 도구는 확인해 보지 않았습니다.

---

<div class="post-metadata">

### Author: ![Zup](https://avatars.discourse-cdn.com/v4/letter/z/c37758/32.png) [@Zup](https://meta.discourse.org/u/Zup)
#### Post date: [8월 28, 2020, 12:19오전 UTC](https://meta.discourse.org/t/migrate-an-smf2-forum-to-discourse/90314/59 "2020-08-28T00:19:44Z")

</div>

Docker화된 MySQL 인스턴스에 SMF2 데이터베이스의 동일한 자격 증명을 사용하니 문제가 해결되었습니다. 감사합니다!

 ![Screen Shot 2020-08-27 at 2.13.41 PM](https://global.discourse-cdn.com/meta/original/3X/c/e/ce43f0dd72771368d96a2908165aacaa55b2d32b.png)

---

<div class="post-metadata">

### Author: ![Zup](https://avatars.discourse-cdn.com/v4/letter/z/c37758/32.png) [@Zup](https://meta.discourse.org/u/Zup)
#### Post date: [8월 28, 2020, 5:56오후 UTC](https://meta.discourse.org/t/migrate-an-smf2-forum-to-discourse/90314/60 "2020-08-28T17:56:58Z")

</div>

@Paracelsus 저도 비슷한 상황인 것 같습니다. 영구링크(permalinks)가 비어 있네요. ☹

제 smf2는 루트 도메인에서 실행되고 있고, Discourse는 smf2 루트 도메인의 서브도메인에서 실행되고 있습니다. 이것이 영향을 미칠까요?

---

<div class="post-metadata">

### Author: ![Paracelsus](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/paracelsus/32/164912_2.png) [@Paracelsus](https://meta.discourse.org/u/Paracelsus)
#### Post date: [8월 28, 2020, 6:17오후 UTC](https://meta.discourse.org/t/migrate-an-smf2-forum-to-discourse/90314/61 "2020-08-28T18:17:58Z")

</div>

음… 영구링크(permalink)는 좀 까다롭긴 하지만, 이제는 익숙해졌어요. 우리 포럼에 링크가 걸려 있는 모든 웹페이지를 구글에서 찾아서(구식 SMF 형식의 링크가 있는 경우), 해당 웹페이지에 가서 텍스트 문자열이나 단락을 복사하거나 받아 적은 다음, Discourse 포럼에서 그 내용을 검색해서 영구링크를 붙여 넣는 방식으로 했어요. 만약 아직 SMF 포럼을 운영 중이시라면, 지금 바로 이 작업을 해두시는 걸 추천드려요. 가끔 사람들이 웹페이지에 올리는 링크에는 인용문이나 텍스트 문자열이 없이 URL만 있는 경우가 있는데, 그럴 때라도 올바른 주제를 찾을 수 있으니까요.

우리는 forumscp.com을 SMF로 '운영 포럼’으로 유지하면서, discourse.forumscp.com을 첫 버전으로 사용하며 한동안 Discourse에서 기능 테스트를 하고 적응하는 시간을 가졌어요. 전환이 정상적으로 이루어질지 확인하기 위해 점진적 업데이트 과정을 몇 차례 테스트했고, 전환 당일에는 구 포럼을 내리고 SMF에서 Discourse로의 마지막 점진적 데이터베이스 업데이트를 수행한 뒤, 여기 어딘가에 나와 있는 지침에 따라 도메인을 변경했어요. 또한 nginx 설정을 확인하는 데 호스팅 업체의 도움이 필요했고, 정확히 기억은 안 나지만 DNS 관련해서 변경해야 할 부분이 있었지만, 단순히 호스팅 업체의 지시를 따랐을 뿐이라 모든 과정이 순조롭게 진행됐어요.

---

<div class="post-metadata">

### Author: ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)
#### Post date: [8월 28, 2020, 6:26오후 UTC](https://meta.discourse.org/t/migrate-an-smf2-forum-to-discourse/90314/62 "2020-08-28T18:26:23Z")

</div>

영구 링크(permalinks)를 지원하는 다른 임포터를 찾아서 코드를 복사해 보세요. vbulletin과 phpbb가 좋은 예가 될 수 있습니다.

[Previous page](https://meta.discourse.org/t/migrate-an-smf2-forum-to-discourse/90314.md?page=2)

[Next page](https://meta.discourse.org/t/migrate-an-smf2-forum-to-discourse/90314.md?page=4)
