많은 Yahoo 그룹이 Yahoo의 업로드된 콘텐츠 삭제 결정의 영향을 받고 있으며, 대체 제공업체를 찾고 있습니다. 가장 자연스러운 선택지는 groups.io로, 기능 면에서 동등한 수준을 제공하며 모든 그룹 콘텐츠를 자동으로 이전해 줍니다. 그러나 (1) 이전을 위해 첫 해에 220달러의 비용이 발생하며(이후 저장 공간 요구 사항이 1GB 미만이면 무료), (2) 여전히 Yahoo Groups와 동일한 이메일 중심 형식을 사용합니다. 다른 주제(Yahoo Groups to Discourse migration?)에서 이전 스크립트가 언급되고 있지만, 제가 볼 수 있는 범위(솔직히 아직 많지는 않습니다)에서 판단하면 메시지만 이전하는 것 같습니다.
그룹의 이동을 촉발할 Yahoo의 변경 사항이 파일 및 사진 저장소의 상실이라는 점을 고려하면, 두 가지 질문이 남습니다:
Yahoo 그룹에서 업로드된 콘텐츠를 Discourse 인스턴스로 자동으로 이동하는 방법이 있나요?
Discourse에서 해당 콘텐츠를 다른 사용자에게 제공/표시하기 위한 옵션은 무엇인가요? 제가 볼 수 있는 유일한 방법은 사용자의 업로드 콘텐츠를 해당 사용자의 한 개 이상의 주제에, 아마도 별도의 범주로 배치하는 것일 것입니다. 사진의 경우 이는 비교적 간단할 수 있지만, 그룹에 업로드된 다른 문서(대부분 PDF, 일부 .doc 및 .xls 파일)의 경우 몇 가지 설정 변경이 필요해 보이지만 치명적인 문제는 아닙니다. 그런데 다른 옵션이 있을까요?
업로드된 콘텐츠라고 설명하시는 것이 무엇인지 정확히 모르겠네요 - 저는 야후 그룹을 그렇게 사용해 본 적이 없습니다. 야후에서 그 파일들을 꺼내고 디스코르스를 위해 준비하는 방법에 대한 옵션이 무엇인지 모르겠습니다. 수동적인 과정이 될 수도 있고… 더 이상 필요 없는 것을 정리하고 조직화할 좋은 기회가 될 수도 있습니다.
하지만 그렇습니다, 디스코르스는 토론에 초점을 맞추고 있으므로 모든 콘텐츠는 주제(Topic) 안에 있습니다. 주제를 위키로 설정하여 그룹이 유지 관리하고 첨부 파일을 추가/삭제할 수 있도록 하는 것이 가능합니다. 또한 개인 메시지도 있어, 자신이나 신중하게 선택한 다른 사람들과 대화할 수 있으며, 거기서 사람들이 일부 콘텐츠를 보관할 수 있다고 생각합니다. 파일 공유를 위해 SSO를 지원하는 다른 도구를 살펴보는 것이 더 쉬울 수 있습니다. 제 커뮤니티에서는 SSO를 처리하는 플러그인이 있는 워드프레스를 사용하는데, 꽤 매끄럽게 작동합니다. 많은 파일에 대해 이야기하고 있다면, nextcloud 인스턴스를 설정할 수 있습니다.
재밌게 하세요!
업데이트: 와… 확실히 이사를 가야 할 때인 것 같습니다. 야후 그룹의 유용성을 제한하기 위해 정말 극단적인 조치를 취하고 있고, 매우 곧입니다. 10월 28일, 이틀 후에 새로운 콘텐츠 업로드가 중단됩니다! 그리고 콘텐츠는 12월 14일에 삭제될 예정입니다.
야후 그룹은(정확히는 과거에는) 그룹을 위해 사진(100GB)과 기타 파일(2GB)에 대한 저장 공간을 제공했습니다. 제가 속해 있는 그룹들은 이 공간을 그룹 멤버들의 사진, 그룹에 관심 있는 항목, 그리고 기타 다양한 파일에 사용하고 있습니다. 야후 그룹 내에서 멤버들끼리 비공개로 공유되는 내용은 대부분 이메일로 전송되었을 것이며, 야후 측에는 그 기록이 없을 것입니다. 그런 것의 이전은 가능하기는 커녕 우선순위조차 되지 않을 것이라 생각합니다. 하지만 많은 그룹에는 그곳에 저장되어 있는 정보가 많으며, 이전 시 이를 보존하고 싶어 할 것입니다.
그럴 수도 있습니다. 다시 말하지만, 야후 그룹의 구식 포맷을 소폭 변경만 해서 유지하는 것으로 보이는 턴키(turnkey) 대체 사이트가 하나(제 지식 범위 내에서는 유일하게) 있습니다. 만약 그룹이 어쩔 수 없이 이전을 해야 한다면, 더 현대적인 것으로 이전하는 것이 좋겠다고 생각합니다. Discourse는 여전히 이메일과 꽤 잘 연동되는데(많은 다른 포럼 패키지는 그렇지 않습니다), 이는 저처럼 이메일로 메일을 받아보고 이메일로 답장하는 데 익숙한 구식 세대에게는 여전히 그 방식을 사용할 수 있음을 의미합니다. 그리고 비용을 조금 아끼는 것도 좋은 점이죠.
은 그룹의 콘텐츠를 일괄 다운로드하는 데 꽤 잘 작동하는 것 같습니다. 모든 메시지, 파일, 첨부 파일 등을 가져옵니다. 메시지는 각각 두 개의 .json 파일로 다운로드되며, 하나는 "raw"이고 다른 하나는 HTML입니다. 첫 번째 파일은 다음과 같습니다:
{
"userId": 185744666,
"authorName": "vhsproducts@aol.com",
"from": "vhsproducts@...",
"profile": "vhsproducts",
"replyTo": "LIST",
"senderId": "fc-T6L4xNaFRDleu_7gutRzgA_WWujKXanij68LOf7iz0WXh-BolDsmiqlo19adwRPTjwe0FpCYycg",
"spamInfo": {
"isSpam": false,
"reason": "0"
},
"subject": "Re: [MicroTrak] Mint-Trak300 completed",
"postDate": "1181013131",
"msgId": 4,
"canDelete": false,
"contentTrasformed": false,
"systemMessage": false,
"headers": {
"messageIdInHeader": "PGM3ZC5lNWZlOTFjLjMzOTYyZThiQGFvbC5jb20+"
},
"prevInTopic": 3,
"nextInTopic": 6,
"prevInTime": 3,
"nextInTime": 5,
"topicId": 3,
"numMessagesInTopic": 4,
"msgSnippet": "Outstanding work! I see you have the first gen of the Micro-Trak ( although we still sell them for people with TT3 SMT s) How long will a 9 volt run your GPS? ",
"rawEmail": "Return-Path: <VHSProducts@...>\r\nX-Sender: VHSProducts@...\r\nX-Apparently-To: MicroTrak@yahoogroups.com\r\nReceived: (qmail 18487 invoked from network); 5 Jun 2007 03:13:19 -0000\r\nReceived: from unknown (66.218.67.36)\n by m50.grp.scd.yahoo.com with QMQP; 5 Jun 2007 03:13:19 -0000\r\nReceived: from unknown (HELO imo-m23.mx.aol.com) (64.12.137.4)\n by mta10.grp.scd.yahoo.com with SMTP; 5 Jun 2007 03:13:19 -0000\r\nReceived: from VHSProducts@...\n\tby imo-m23.mx.aol.com (mail_out_v38_r9.2.) id r.c7d.e5fe91c (29679)\n\t for <MicroTrak@yahoogroups.com>; Mon, 4 Jun 2007 23:12:11 -0400 (EDT)\r\nMessage-ID: <c7d.e5fe91c.33962e8b@...>\r\nDate: Mon, 4 Jun 2007 23:12:11 EDT\r\nTo: MicroTrak@yahoogroups.com\r\nMIME-Version: 1.0\r\nContent-Type: multipart/alternative; boundary="-----------------------------1181013131"\r\nX-Mailer: 9.0 Security Edition for Windows sub 5365\r\n(snip)"
}
…반면 후자는 다음과 같은 형태입니다:
{
"userId": 185744666,
"authorName": "vhsproducts@aol.com",
"from": "vhsproducts@...",
"profile": "vhsproducts",
"replyTo": "LIST",
"senderId": "oChpSVZSELyeHvFRyDX_nG5dfpdVZTLBKFMDvOg33fSsrDk5l-zpPohl42rhz6OhM9tFfSjAxxGsRg",
"spamInfo": {
"isSpam": false,
"reason": "0"
},
"subject": "Re: [MicroTrak] Mint-Trak300 completed",
"postDate": "1181013131",
"msgId": 4,
"canDelete": false,
"contentTrasformed": false,
"systemMessage": false,
"headers": {
"messageIdInHeader": "PGM3ZC5lNWZlOTFjLjMzOTYyZThiQGFvbC5jb20+"
},
"prevInTopic": 3,
"nextInTopic": 6,
"prevInTime": 3,
"nextInTime": 5,
"topicId": 3,
"numMessagesInTopic": 4,
"msgSnippet": "Outstanding work! I see you have the first gen of the Micro-Trak ( although we still sell them for people with TT3 SMT s) How long will a 9 volt run your GPS? ",
"messageBody": "<div id=\"ygrps-yiv-810547383\">\n<html><head>\n \n</head> \n\n<font id=\"ygrps-yiv-810547383role_document\"\n face=\"Arial\" color=\"#000000\" size=\"2\">\n<div>Outstanding work! I see you have the first gen of the Micro-Trak ( although \nwe still sell them for people with TT3 SMT's) How long will a 9 volt run your \nGPS?</div>\n(snip)",
"specialLinks": []
}
그룹에 따라 이러한 파일이 수백 개에서 수십만 개에 이를 수 있습니다. 야후(Yahoo)답게 일반 사용자의 이메일 주소를 마스킹(가리기)합니다. 그룹 소유자는 이를 볼 수 있고, 아마도 모더레이터도 볼 수 있지만, 나머지는 볼 수 없습니다. 이제 Discourse 인스턴스에 이를 일괄 가져오는 비교적 간단한 방법이 있는지, 아니면 위에서 언급한 도구를 사용하는 것이 더 나은지 확인해 봐야 합니다.
이 도구는 파일과 사진도 다운로드하며, 투표, 캘린더 및 제가 크게 신경 쓰지 않지만 다른 사람들은 분명히 원할 다른 항목들도 함께 다운로드합니다.
한 가지 더 언급할 점으로, 야후의 메시지를 더 주의 깊게 읽어보니 파일과 사진뿐 아니라 메시지 아카이브도 폐기한다는 것을 알 수 있었습니다. 이는 야후를 어떤 목적으로든 사용할 수 없게 만들 것입니다.
우리는 더 많은 독립적인 웹사이트를 필요로 하며, 대형 독점 플랫폼에 의존하는 사람은 줄어들어야 합니다.
몇 년 전 저는 지역 커뮤니티를 Yahoo Group에서 Discourse로 이주한 적이 있으며, 그 이후로 한 번도 뒤를 돌아본 적이 없습니다. 공유 커뮤니케이션 리소스에 추가할 수 있는 개인적인 디테일만으로도 그 가치가 충분하지만, 추가 기능들은 그야말로 아이스크림 위의 체리라고 할 수 있습니다.
불행히도, 우리는 이메일 목록을 제외하고는 완전히 새로 시작했기 때문에 이주에 대한 유용한 경험을 제공해 드리기 어렵습니다. 기존 Yahoo Group 사이트를 그대로 유지하면서 링크를 제공하는 것은 어떨까요? 실제로 유지해야 할 첨부 파일은 얼마나 될까요? 가장 중요한 파일만 선택해 옮기는 것은 어떨까요?
제가 직접 결정할 권한은 없지만, 그쪽으로 이사를 가는 쪽으로 기울어져 있습니다. 그리고 제가 가장 걱정하는 그룹의 경우, 파일이나 사진이 큰 문제가 되지는 않을 것 같습니다. 이미 모든 것을 다운로드해 두었으며, 개수가 적어서 수동으로 주제에 끌어다 넣는 것이 큰 부담이 되지 않을 것입니다.
2~4단계는 추론에 의한 것입니다. 하지만 이것이 따를 올바른 단계처럼 보이나요? 그렇다고 믿고 진행했습니다. 4단계까지는 잘 실행되었습니다 — yg-export.rb는 약 1시간 동안 실행되어 모든 항목에 대해 SUCCESS를 보고하고 약 38k개의 메시지를 저장했습니다. syncro 데이터베이스에는 약 85MB의 데이터가 존재합니다. 그 시점에서 VM 스냅샷을 촬영했습니다.
하지만 가져오기 스크립트에서 문제가 발생하고 있습니다. bundle exec ruby script/import_scripts/yahoogroup.rb를 실행하면 다음과 같은 오류가 나옵니다:
dan@ubuntu:~/discourse$ bundle exec ruby script/import_scripts/yahoogroup.rb
Traceback (most recent call last):
script/import_scripts/yahoogroup.rb: Bootsnap::LoadPathCache::FallbackScan
7: from script/import_scripts/yahoogroup.rb:4:in `<main>'
6: from /home/dan/.rbenv/versions/2.6.2/lib/ruby/gems/2.6.0/gems/zeitwerk-2.1.10/lib/zeitwerk/kernel.rb:23:in `require'
5: from /home/dan/.rbenv/versions/2.6.2/lib/ruby/gems/2.6.0/gems/bootsnap-1.4.4/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:26:in `require'
4: from /home/dan/.rbenv/versions/2.6.2/lib/ruby/gems/2.6.0/gems/bootsnap-1.4.4/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:40:in `rescue in require'
3: from /home/dan/.rbenv/versions/2.6.2/lib/ruby/gems/2.6.0/gems/bootsnap-1.4.4/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:21:in `require_with_bootsnap_lfi'
2: from /home/dan/.rbenv/versions/2.6.2/lib/ruby/gems/2.6.0/gems/bootsnap-1.4.4/lib/bootsnap/load_path_cache/loaded_features_index.rb:89:in `register'
1: from /home/dan/.rbenv/versions/2.6.2/lib/ruby/gems/2.6.0/gems/bootsnap-1.4.4/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:22:in `block in require_with_bootsnap_lfi'
/home/dan/.rbenv/versions/2.6.2/lib/ruby/gems/2.6.0/gems/bootsnap-1.4.4/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:22:in `require': cannot load such file -- mongo (LoadError)
이상하네요. mongo 제보를 이미 설치했다고 생각했거든요. 뭐, 다시 설치해 보겠습니다:
dan@ubuntu:~/discourse$ gem install mongo
Successfully installed mongo-2.10.2
Parsing documentation for mongo-2.10.2
Done installing documentation for mongo after 4 seconds
1 gem installed
다시 가져오기 스크립트를 실행했는데, 결과는 동일합니다. 시스템 수준에서 설치하는 것이 영향을 미칠까요?
dan@ubuntu:~/discourse$ sudo apt install ruby-mongo
[sudo] password for dan:
Reading package lists... Done
Building dependency tree
Reading state information... Done
ruby-mongo is already the newest version (2.5.1-1).
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
수정: 아, 가져오기 프로세스가 75분 동안 실행되었고 이제 게시물이 제대로 들어와 있습니다. 훌륭하네요. 사용자도 함께 생성되었는데, 이 부분은 궁금했었습니다. 그런데 사용자 관련해서 몇 가지 문제가 보입니다:
Yahoo 사용자 이름은 모두 올바르게 가져온 것 같습니다(목록 회원으로서 많은 이름을 알고 있습니다) 하지만 잘못된 메시지에 연결되었습니다. 일관되게 그랬습니다—제가 작성한 모든 메시지가 동일한 다른 사용자로 표시되고 있습니다—그래도 수동으로 정리하려면 상당한 고통이 따를 심각한 오류입니다.
가져온 모든 사용자는 앞으로 200년간 정지 상태입니다.
이 두 가지 모두 Yahoo에서 다운로드한 데이터에 유효한 이메일 주소가 없어서 생긴 문제라고 의심합니다. 저는 그룹 관리자가 아니기 때문이죠. 후자의 문제는 그 이유가 명시적으로 언급되어 있지만, 전자도 같은 원인 때문인지 알 수 없습니다. 의견 있으신 분 계신가요?
만약 그게 문제라면 추적해볼 단서가 생기지만, 동시에 잠재적인 문제이기도 합니다. 이 그룹에는 생존해 있는 관리자가 두 명이라는 것은 알고 있지만, 소유자는 지난 1년 내에 별세하셨습니다. 누군가 그 정보에 접근할 수 있기를 바랍니다…
제가 필요한 기능과는 조금 다릅니다. 이 인스턴스에서 관리자 계정을 제외하고 존재하는 사용자는 Yahoo에서 가져온 사용자들뿐입니다. 문제는 잘못된 사용자 이름이 잘못된 게시물에 연결되어 있다는 점입니다. 제 게시물은 일관되게(제가 보기에는) 다른 사람의 사용자 이름에 연결되어 있고, 다른 사람의 게시물은 제 사용자 이름에 연결되어 있습니다.
이제 이 그룹에 대한 관리자 권한을 부여받았습니다. 이는 실제 이메일 주소가 포함된 메시지를 다운로드하는 데 충분한 권한입니다. VM(가상 머신)을 다시 빌드하고(이 작업에는 VM이 좋습니다) 가져오기를 다시 수행한 후, 이 문제가 해결되는지 확인해 보겠습니다.
안녕하세요, 네, 제가 발견한 내용과는 조금 다릅니다. 제 커뮤니티에서는 가져온 게시글 중 기존 커뮤니티의 어떤 사용자와도 연결된 것이 하나도 없었습니다.
링크된 주제에 설명된 대로 카테고리를 가져온 경우, 사용자 목록에 중복된 사용자(또는 새로운 사용자)만 생성되었습니다.
가져오기 도구가 게시글을 잘못된 사용자에게 할당했지만, 그 과정 자체는 올바르게 수행되었습니다. 즉, 제가 Yahoo!에서 직접 작성한 게시글이 "Hans"라는 사용자에게 할당되었다면, 제 모든 게시글이 "Hans"에게 할당된 것입니다.
저는 제 커뮤니티 포럼에서 사용자 ID 1을 가지고 있지만, 제가 개발용으로 설정한 Discourse 포럼의 이름과는 다릅니다. 따라서 제 계정은 덮어쓰기되지 않았지만, 같은 이름을 가진 또 다른 계정이 생성되었습니다. 하지만 이 계정이 잘못된 게시글과 연결되어 있습니다.
이제 링크된 플러그인을 사용하여 모든 사용자를 제 포럼의 올바른 사람으로 각각 병합하고 있습니다. 시간이 많이 걸리지는 않지만, 어떤 게시글이 어떤 사용자에게 속하는지 파악하는 것은 어렵습니다.
좋습니다. 전체 이메일 주소를 포함한 그룹 메시지 다운로드를 받았습니다. 그리고 개발 환경에서 몇 가지 문제가 있었지만, 이제 다시 가져오기 작업을 진행할 수 있습니다. 여전히 몇 가지 문제를 발견하고 있습니다:
잘못된 사용자 이름이 잘못된 게시글과 연결되는 문제는 여전히 남아 있습니다.
위의 문제의 원인(또는 그 원인 중 하나)으로, 가져오기 대상 사용자의 대부분이 유효하지 않은 이메일 주소로 판정됩니다. yahoo-export 스크립트가 생성한 Mongo 데이터베이스에서, From 필드(가져오기 스크립트가 이메일 주소를 읽으려고 시도하는 곳)는 대부분의 사용자에게 다음과 같이 표시됩니다:
First Last <user@domain.com>
…이것은 Discourse가 유효하지 않은 이메일 주소로 거부합니다. 그 결과, 대부분의 사용자에게 5dc3e1b4f4d821bd7de3ce456eaf26d5@email.invalid와 같은 이메일 주소가 할당됩니다–예외는 전체 이름이 첨부되지 않은 이메일을 보낸 사용자들인 것으로 보입니다.
가져온 메시지에는 특히 인용 부호와 대소괄호 기호를 위한 HTML 엔티티가 여러 개 포함되어 있습니다.
가져온 메시지의 상당수(모두는 아니지만)는 제목 줄에 그룹 이름이 포함되어 있습니다: Re: [SpareOom] some subject. 이것을 제거하면 좋겠습니다.
마지막 세 가지 항목에 대해, 데이터베이스 전체에서 간단한 찾기/교체 작업을 수행하면 해결될 수 있는지 궁금합니다–그리고 만약 그렇다면, MongoDB를 처음 접하는 저로서 어떻게 진행해야 할지 알고 싶습니다.
별개의 문제는 메시지를 지정된 카테고리로 가져오는 것입니다. yahoogroup.rb 상단의 주석에는 스크립트를 실행하기 전에 export CATEGORY_ID=<CATEGORY_ID>를 수행하면 이 작업을 할 수 있다고 되어 있지만, <CATEGORY_ID>가 무엇을 가리키는지 명확히 하지 않습니다. 카테고리의 일반 이름과 “카테고리 슬러그”(대소문자를 제외하고는 둘 다 동일합니다)를 모두 시도해 보았지만, 두 경우 모두 가져오기 스크립트가 다음과 같은 오류로 실패합니다:
1: from /home/dan/discourse/lib/topic_creator.rb:36:in `create'
/home/dan/discourse/lib/topic_creator.rb:115:in `setup_topic_params': category (Discourse::InvalidParameters)
수정: 이를 피하기 위해 다른 경로를 시도해 보았습니다. Nokogiri에 대한 많은 제안들을 보았지만, 유용하긴 해도 제가 찾은 제안들은 각괄호 엔티티를 디코딩하지 않았습니다. 이것은(지금도) 제 가장 즉각적인 필요였습니다. 그래서 다시 HTMLEntities로 돌아갑니다. Yahoo 가져오기 스크립트 상단에 require 'mail'과 require 'htmlentities'를 추가하고, 75번째 줄(필요한 항목을 추가하기 전에는 73번째 줄이었습니다)을 위와 같이 변경했습니다. 여전히 오류가 발생하지만, 이전에 놓쳤던 점은 실제로 죽기 전에 한 사용자를 올바르게 파싱하고 가져온다는 것입니다:
dan@ubuntu:~/discourse$ bundle exec ruby script/import_scripts/yahoogroup.rb
Loading existing groups...
Loading existing users...
Loading existing categories...
Loading existing posts...
Loading existing topics...
(snip)
connected to db....
Importing from Mongodb....
Importing users
User created: user@host.tld
Traceback (most recent call last):
8: from script/import_scripts/yahoogroup.rb:163:in `<main>'
7: from /home/dan/discourse/script/import_scripts/base.rb:47:in `perform'
6: from script/import_scripts/yahoogroup.rb:39:in `execute'
5: from script/import_scripts/yahoogroup.rb:58:in `import_users'
4: from /home/dan/discourse/script/import_scripts/base.rb:247:in `create_users'
3: from /home/dan/discourse/script/import_scripts/base.rb:247:in `each'
2: from /home/dan/discourse/script/import_scripts/base.rb:259:in `block in create_users'
1: from /home/dan/discourse/script/import_scripts/base.rb:290:in `create_user'
/home/dan/discourse/script/import_scripts/base.rb:385:in `find_existing_user': undefined method `downcase' for #<Mail::ToField:0x00005575597e63b8> (NoMethodError)
(이 출력의 이메일 주소는 마스킹되어 있지만, 소스 데이터베이스에는 전체 이름과 각괄호 엔티티가 포함되어 있습니다–따라서 스크립트에 대한 제 변경 사항이 정확히 원하는 효과를 낸 것으로 보입니다). downcase는 기본적으로 사용 가능한 것으로 이해하고 있었기 때문에 이 부분은 약간 혼란스럽습니다.
(위에서 언급한 두 개의 requires 줄을 추가했기 때문에 두 줄 번호 모두 원본 스크립트보다 +2입니다). 완벽하게 작동했습니다. 터미널 출력은 변경되지 않았습니다(이는 105번째 줄에 해당하는데, 실행을 시작하고 나서야 그 사실을 알게 되었습니다). 하지만 가져온 인스턴스의 주제 제목과 본문은 깔끔하게 정리되었습니다.
따라서 이 방법은 주제 제목과 메시지 본문을 정리하는 데 완벽하게 작동하는 것으로 보입니다. 하지만 이메일 주소에는 적용되지 않습니다. 이 부분에 대해 무엇을 찾아봐야 할지 아이디어가 있으신가요? 이 부분은 좀 막막합니다.