Moderne Forum-Alternativen und Migration von Discuz zu NodeBB
Nachdem Discuz nicht mehr weiterentwickelt wird, braucht man eine Alternative. Ich habe mehrere ausprobiert und fasse hier kurz meine Eindrücke und Migrationsmethoden zusammen.
Folgende Foren sind nach GitHub-Ranking sortiert.
discourse
Dies ist das am höchsten bewertete Forum, basiert aber auf Ruby on Rails (RoR). RoR hat eine schlechte Performance und einen hohen Speicherverbrauch, was für kleinere Websites ungeeignet ist. Daher habe ich es direkt verworfen.
Wir hatten bereits mehrere RoR-Seiten, die durch Crawler zum Absturz gebracht wurden – einfach nicht praktikabel.
flarum
Die Oberfläche ist sehr ansprechend. Es basiert auf PHP+MySQL, daher sollten Performance-Probleme eigentlich kein Thema sein. Allerdings sind die SQL-Abfragen des Forums nicht optimiert. Selbst beim Aufruf des ersten Beitrags in einem leeren Forum werden 100 SQL-Abfragen ausgeführt, die Ladezeit beginnt bei 100ms. Mit einer günstigen Cloud-Datenbank sind 200ms normal. Zusammen mit anderen Ladeinhalten kommt man schnell auf fast eine Sekunde Wartezeit.
nodebb
Dieses Forum basiert auf NoSQL+NodeJS, hat eine starke Performance und geringe CPU-Auslastung. Außerdem nutzt es WebSocket-Langzeitverbindungen, was die Reaktionsgeschwindigkeit erheblich erhöht. Der Speicherverbrauch startet bei 1 GB, wächst aber langsam. Da es über umfangreiche Plugins und APIs verfügt, habe ich mich für dieses Forum entschieden.
apache / answer
Auch sehr gut, ähnlich wie Zhihu oder StackOverflow. Ich habe jedoch keine Möglichkeit gefunden, Funktionen wie “Frage stellen” oder “Als Lösung akzeptieren” zu deaktivieren. Wenn man diese entfernen könnte, wäre es ein forumartiges System mit Artikeln (ausführlichen Hauptbeiträgen) im Zentrum, geeignet für Foren, die weniger auf Diskussionen und mehr auf Anleitungen ausgerichtet sind.
flaskbb / flaskbb
Ein Python-Forum mit guter Performance, wird aber seit langer Zeit nicht mehr aktualisiert.
rafalp / Misago
Auf den ersten Blick ein Anime-/Manga-Forum, ebenfalls in Python. Der Autor hat vor einigen Jahren mit der Entwicklung begonnen, ist aber sehr aktiv. Ich habe gesehen, dass er die Python-Bibliothek SocialAuth verwendet, wodurch sich Logins über QQ, WeChat, Google und andere Dienste einfach integrieren lassen, ebenso wie die Integration der eigenen Website.
Außerdem gibt es zwei chinesische Foren, die vielversprechend aussehen: Eines ist Casbin, eine starke Nachbildung von v2ex, und bbs-go sowie symphony ähneln eher einem Blog wie CSDN. Diese habe ich aber nicht getestet.
Discuz zu NodeBB migrieren
Wenn Sie eine eigene Website haben, können Sie für die Benutzerauthentifizierung bei NodeBB die offiziellen Plugins nodebb-plugin-session-sharing oder nodebb-plugin-sso-oauth2-multiple verwenden.
Für den Import von Discuz-Daten müssen Sie jedoch eigenen Code schreiben. Lassen Sie sich von KI (z.B. mit Python) einen Grundrahmen generieren und passen Sie den Rest selbst an.
Wenn Sie nur Beiträge importieren möchten, durchlaufen Sie die posts-Tabelle von Discuz. Jede Zeile entspricht einem Beitrag, first=1 kennzeichnet einen Themenstart (Originalpost).
Für Themenstartbeiträge rufen Sie die NodeBB-API api/v3/topics/ auf, für Antworten die API api/v3/topics/{tid}. Für Benutzer können Sie die Benutzererstellungs-API nutzen. Da ich session-sharing verwende, nutze ich die API api/session-sharing/user. Die Benutzerabfrage erfolgt über api/session-sharing/lookup?id={passport_id}.
Die API verarbeitet etwa 5 Anfragen pro Sekunde. Machen Sie sich also auf eine langsame Migration gefasst.
Aufrufbeispiel:
async def create_topic(title, body, timestamp, category, tags, uid):
# Thema erstellen POST
data = {
"cid": category, # Kategorie-ID
"title": title,
"content": body,
"timestamp": int(timestamp), # Zeit in Millisekunden
"tags": tags,
"_uid": uid # Autor
}
# API-Admin-Schlüssel
headers = {"Authorization": f"Bearer 1239383-3323-2323-2323-asd123123123"}
# Aufruf
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:
# Bei Fehlern wie "Bitte fügen Sie Inhalte hinzu, mindestens 1 Zeichen" wurde der Content nicht escaped.
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']Beachten Sie: Das Posten über die API folgt der gleichen Logik wie das Posten durch Benutzer und unterliegt allen Forenregeln wie Mindestzeichenzahl. Ebenso wird der übergebene timestamp oft ignoriert und der Beitrag mit der aktuellen Zeit erstellt. Die Lösung ist, den Zeitstempel in src/api/helpers.js Zeile 16 zu ändern, indem Sie die Zeile data.timestamp = Date.now(); einfach auskommentieren. Vergessen Sie nicht, dies nach der Migration rückgängig zu machen, sonst könnten Benutzer ebenfalls Zeiten manipulieren.
Nach dieser Änderung unterstützt auch die Antwort-API api/v3/topics/{tid} die Übergabe eines timestamp-Parameters zur Zeitangabe.
b96cfe3