질문 부활: Mattermost에서 마이그레이션

질문

Mattermost 팀 에디션 인스턴스에서 Discourse 인스턴스로 데이터를 마이그레이션하는 방법에 대한 최신 최적의 조언을 알고 싶습니다. (저는 두 플랫폼 모두를 관리하고 있습니다.)

마이그레이션을 조정하는 방법에 대한 조언은 이미 읽었으므로, 이제 데이터 마이그레이션에 관한 기술적 자원과 조언을 찾고 있습니다.

배경

현재는 2025년 10월이며, 저는 2018년 이 질문과 유사한 상황에 놓여 있습니다.[1]:

그러나 제 경우에는 압박이 더 명확합니다. Mattermost는 사실상 팀 에디션을 중단하고 있습니다.[2] (기술적으로는 중단하지 않지만, 저는 이러한 변경 사항을 오픈소스 약속 위반으로 봅니다).

여기서 시작된 원래의 토론은 두 플랫폼을 결합하라는 권고로 시작되었고, 이후 Discourse가 꽤 괜찮은 채팅 기능을 갖추고 있다는(특히 곧 출시될 채팅 검색 기능을 포함하여 실제로 그렇습니다) 성명으로 마무리되었습니다. 하지만 마이그레이션에 대한 조언은 포함되어 있지 않았습니다.


  1. 그 당시 토론은 Discourse 팀 멤버가 "Discourse가 Mattermost를 사용한다"고 말하며 마무리되었습니다 ↩︎

  2. 아이러니하게도 이 발표는 Discourse를 통해 게시되었습니다 ↩︎

안톤, 안녕하세요!

Mattermost에서 Discourse로의 마이그레이션은 확실히 가능하지만, 아직 사전에 작성된 스크립트가 없으므로 커스텀 가져오기(import) 스크립트를 작성해야 합니다 (사용 가능한 가져오기 스크립트 목록 보기). 기존 스크립트를 참고로 연구할 수 있지만, 일부 스크립트는 Discourse 테이블에 대한 오래된 참조를 포함하고 있을 수 있으므로 마지막 업데이트 날짜를 반드시 확인하고 그에 맞게 조정해 주세요.

Mattermost 가져오기 스크립트가 포함된 풀 리퀘스트는 커뮤니티에서 매우 환영할 것입니다!

채널 및 데이터 매핑

모든 것을 채팅 채널로 가져올 수도 있지만, 다른 유형으로 매핑할 수도 있습니다:

  • 채널을 카테고리(Categories)로: 각 Mattermost 채널을 Discourse 카테고리로 가져옵니다. 채널 내 스레드는 토픽이 되며, 각 메시지는 게시글이 됩니다. 또는 개별 게시글이 토픽의 첫 번째 글(OP)이 될 수도 있습니다.
  • 채널을 토픽(Topics)으로: 또 다른 접근 방식은 각 Mattermost 채널을 단일 토픽으로 만들고, 메시지를 답글로 만드는 것입니다. 이 경우 스레드는 순서대로 표시됩니다.
  • DM(개인 메시지): 이것들도 개인 메시지로 가져올 수 있습니다. 아카이빙이 필요한 토론에 좋은 아이디어입니다.

커뮤니티와 콘텐츠 볼륨에 가장 적합한 접근 방식이 무엇인지 신중하게 고려해 보세요.

토픽 제목

채팅을 토픽과 게시글로 매핑할 경우 각 토픽의 제목을 생성해야 합니다. 이를 수행하는 놀라운 방법 중 하나는 Discourse AI 를 사용하여 토픽의 실제 컨텍스트를 기반으로 제목을 생성하는 것입니다.

AI를 사용한 토픽 제목 생성

TL;DR 이 방법을 사용하세요:

def gen_title(llm, system_prompt, topic)
  begin
  content = topic.posts.map(&:cooked).join("\n").slice(0..10_000)
  message = [{type: :user, content: content}]
  prompt = DiscourseAi::Completions::Prompt.new(system_prompt, messages: message)

  title = llm.generate(
      prompt,
      user: Discourse.system_user,
      temperature: 0.3,
      feature_name: "ai_helper"
  )

  topic.title = title
  topic.save!
  puts "Topic: #{topic.id}, changed sucessfully."
  rescue ActiveRecord::RecordInvalid
    puts "validation error"
  end
end

이에는 LLM과 마스터 프롬프트가 필요합니다.

llm = DiscourseAi::Completions::Llm.proxy(SiteSetting.ai_helper_model)

system_prompt = <<-PROMPT
  I want you to act as a title generator for written pieces. I will provide you with a text,\nand you will generate a title. Please keep the title concise and under 20 words,\nand ensure that the meaning is maintained. The title will utilize the language type of the topic.\nI want you to only reply the proposed title and nothing else, do not write explanations.\nNever ever use colons in the title. Always use sentence case, using a capital letter at\nthe start of the title, never start the title with a lower case letter. Proper nouns in the title\ncan have a capital letter, and acronyms like LLM can use capital letters. Format some titles\nas questions, some as statements. Make sure to use question marks if the title is a question."
PROMPT

그 후 원하는 대로 토픽 목록을 반복할 수 있습니다:

# gen everything
Topic
  .joins(:_custom_fields)
  .where('topic_custom_fields.name = ?', 'import_id')
  .find_each { |topic| gen_title(llm, system_prompt, topic) }

# filter PMs
Topic
  .joins(:_custom_fields)
  .where('topic_custom_fields.name = ?', 'import_id')
  .where.not(archetype: "private_message")
  .find_each { |topic| gen_title(llm, system_prompt, topic) }

중요한 고려 사항

  • 반응(Reactions): Mattermost는 게시글당 여러 반응을 지원합니다. Discourse 게시글로 가져오는 경우, Discourse Chat(여러 반응을 기본적으로 지원)으로 매핑하지 않는 한 하나만 제한해야 합니다.
  • 커스텀 이모지: 커스텀 이모지를 가져올 수 있으며, Discourse Reactions 플러그인 문서를 참고하세요.
  • 팀 및 권한: Mattermost의 "팀"은 Discourse로 직접 매핑되지 않지만, 적절한 그룹 기반 액세스 제어를 갖춘 카테고리/채널을 설정할 수 있습니다.
  • 첨부 파일: Mattermost 첨부 파일(이미지 및 문서)은 Discourse와 달리 콘텐츠에 내장되어 있지 않습니다. 가져올 때 첨부 파일 링크(Markdown)를 추가하거나 게시글 본문에 내장해야 합니다.

참고 자료


우리는 채팅 플랫폼 마이그레이션에 대한 경험이 있습니다. 팀의 도움이 필요하시다면 Discourse 마이그레이션 서비스 페이지를 참고해 주세요.

스크립트 개발 중 또는 매핑 결정 시 구체적인 질문이 있으시면, 조언을 구하기 위해 Meta에 자유롭게 질문해 주세요!

이렇게 좋은 요약 감사합니다! 마이그레이션 시기가 되면 자세히 살펴보겠습니다. 스크립트를 만들게 되면 커뮤니티에 꼭 공유하겠습니다.

지금은 채팅을 채팅 채널로 가져오는 쪽으로 기울고 있습니다. 곧 구현될 검색 기능 부재 외에 다른 관련 고려 사항이 있을까요?

이 경우 대부분의 작업은 메시지 파싱에 사용될 것입니다. 몇 가지 관련 사항은 다음과 같습니다:

  • 멘션은 데이터베이스에 기록이 필요하며, 확인 방법: mention.rbgroup_mention.rb.
  • 첨부 파일도 upload로 가져와 메시지 마크다운에서 참조해야 합니다. 또는 이미지를 원하는 임시 서버에 업로드하고, 게시물에 해당 링크를 추가한 후 download_remote_images_to_local 설정을 활성화할 수도 있습니다.
  • 채널에 대한 권한을 설정하려면 여전히 카테고리를 생성해야 합니다.
  • SSO를 사용하는 경우, Identity provider에서 사용자를 직접 가져올 수 있습니다. 확인 방법: Sync DiscourseConnect user data with the sync_sso route.