現代フォーラムの選択肢、およびDiscuzフォーラムからnodebbへの移行
Discuzの更新停止後、代替フォーラムの選択が必要となり、いくつか試してみました。簡単に感想と移行方法を述べます。
以下はGithubのランキング順です。
discourse
これは第1位のフォーラムですが、rorベースです。rorは性能が低くメモリ消費も大きいため、小規模サイトには向かず、直接断念しました。
以前、rorサイトがクローラーによって数回ダウンしたことがあり、とても使いこなせません。
flarum
このインターフェースは非常に優れています。php+mysqlベースなので、性能上の問題はないはずですが、フォーラムのSQLクエリが最適化されておらず、空のフォーラムで最初の投稿を表示する際に100件のSQLクエリが発生し、読み込み速度は100msから始まります。低スペックのクラウドデータベースを使用している場合、200msも普通です。この速度に他の読み込み内容が加わると、待ち時間はほぼ1秒に達します。
nodebb
これはnosql+nodejsで作られており、性能が高く、CPU使用率も低いです。さらに、websocketの長い接続を基にしているため、応答速度が非常に速いです。メモリ使用量は初期で1Gですが、増加は緩やかです。プラグインとAPIが充実しているため、これを選択しました。
apache / answer
これも非常に優れており、知乎やstackoverflowに似ています。しかし、質問や採用といった機能を削除する方法を探しましたが見つかりませんでした。もし削除できれば、記事(長文のメイン投稿)を中心としたフォーラムとなり、多くの交流機能を必要とせず、攻略向けのフォーラムに適しています。
flaskbb / flaskbb
Pythonのフォーラムで、性能は非常に優れていますが、長い間更新されていません。
rafalp / Misago
一目で二次元フォーラムとわかります。これもPythonベースで、作者は開発を始めて数年ですが、非常に勤勉です。彼がPythonのSocialAuthライブラリを使用しているのを見ました。qq、weixin、googleなどのさまざまなログイン方法を統合でき、自身のサイトとの統合も容易です。
また、中国人による2つのフォーラムも良さそうです。一つはCasbinでv2exを高度に模倣しており、もう一つはbbs-goとsymphonyで、csdnのブログに似ていますが、どちらも試していません。
Discuz から nodebb への移行
自身のサイトをお持ちの場合、nodebbの移行パスポートには、nodebb-plugin-session-sharingまたはnodebb-plugin-sso-oauth2-multipleの2つの公式プラグインを使用できます。
discuzのインポートについては、自身でコードを書くしかありません。AIにPythonでフレームワークを書いてもらい、残りは自身で修正します。
投稿のみをインポートする必要がある場合、discuzのpostsテーブルをループし、各行が一つの投稿です。first=1が主題投稿です。
主題投稿の場合、nodebbのapi/v3/topics/インターフェースを呼び出し、返信の場合はapi/v3/topics/{tid}インターフェースを呼び出します。ユーザーについては、ユーザー作成インターフェースを使用できます。私はsession-sharingを使用しているため、api/session-sharing/userインターフェースを使用し、ユーザー検索はapi/session-sharing/lookup?id={passport_id}です。
APIの処理速度は1秒あたり5回なので、ゆっくり移行する準備をしてください。
呼び出し例:
async def create_topic(title, body, timestamp, category, tags, uid):
# 主題作成 POST
data = {
"cid": category, # カテゴリ番号
"title": title,
"content": body,
"timestamp": int(timestamp), # ミリ秒単位の時間
"tags": tags,
"_uid": uid # 投稿者
}
# api管理者キー
headers = {"Authorization": f"Bearer 1239383-3323-2323-2323-asd123123123"}
# 呼び出し
async with aiohttp.ClientSession() as session:
async with session.post(
'https://xxx.com/api/v3/topics/',
headers=headers,
json=data
) as response:
if response.status != 200:
# 「投稿内容を追加してください。1文字以上必要です」というエラーの場合、contentがエスケープされていません
response_text = await response.text()
raise Exception(f"Error creating topic {title}: {response_text}")
result = await response.json()
topic_object = result['response']
return topic_object['tid']注意:APIによる投稿とユーザーによる投稿は同じロジックであり、フォーラムのすべての文字数制限を受けます。また、同様に、timestampもこれにより設定が無効になり、依然として最新の時間で投稿されます。解決策は、src/api/helpers.jsの16行目のタイムスタンプを修正し、data.timestamp = Date.now();の行を直接コメントアウトすることです。移行後は元に戻すことを忘れないでください。そうしないと、ユーザーも時間を変更できるようになります。
この修正後、返信のAPIインターフェースapi/v3/topics/{tid}もtimestampを渡して時間を指定できるようになります。
b96cfe3