Zum Inhalt springen
Moderne Forum-Alternativen und Migration von Discuz zu NodeBB

Moderne Forum-Alternativen und Migration von Discuz zu NodeBB

2025-02-17 14:14

Nachdem Discuz nicht mehr weiterentwickelt wird, braucht man eine Alternative. Ich habe mehrere ausprobiert und fasse hier kurz meine Eindrücke sowie Migrationsmethoden zusammen.

Die folgende Liste orientiert sich an der GitHub-Rangfolge.

discourse

Dies ist das auf Platz 1 gelistete Forum, basiert jedoch auf Ruby on Rails (RoR). Die Leistung von RoR ist nicht gerade berauschend, und der Speicherverbrauch ist hoch, daher habe ich es direkt verworfen.

Ein Beispiel: Unser vorheriges Anmeldesystem war mit RoR gebaut. Als Webcrawler unser Discuz-Forum durchsuchten, gab es unter jedem Beitrag einen Anmeldelink mit unterschiedlichen from-Parametern. Einige weniger intelligente Crawler haben jeden davon aufgerufen. Diese Seiten renderten nur das Anmeldeformular, was jedoch ausreichte, um das RoR-Anmeldesystem lahmzulegen. Das gleichzeitig gecrawlte Discuz-Forum zeigte hingegen keinerlei Beeinträchtigungen. Wer an die Geschwindigkeit und Wirtschaftlichkeit von Discuz gewöhnt ist, sollte sich darauf vorbereiten und überlegen, ob er/sie das akzeptieren kann.

flarum

Das Interface ist sehr ansprechend. Es basiert auf PHP+MySQL, daher sollten Leistungsprobleme eigentlich kein Thema sein. Allerdings sind die SQL-Abfragen des Forums nicht optimal implementiert. Der Zugriff auf die ersten Beiträge eines leeren Forums löst etwa 100 SQL-Abfragen aus, die Ladezeit beginnt bei 100 ms. Mit einer günstigen Cloud-Datenbank sind 200 ms normal. Diese Zeit plus weitere Ladevorgänge führt zu fast einer Sekunde Wartezeit.

nodebb

Dieses Forum basiert auf NoSQL+Node.js, ist leistungsstark und hat eine geringe CPU-Auslastung. Zudem nutzt es WebSocket-Langzeitverbindungen, was zu sehr schnellen Antwortzeiten führt. 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 entschieden.

apache / answer

Auch dieses ist sehr gut, ähnlich wie Zhihu oder StackOverflow. Ich habe jedoch keine Möglichkeit gefunden, Funktionen wie “Frage stellen” oder “Antwort akzeptieren” zu deaktivieren. Wenn man diese entfernen könnte, wäre es ein forum, das sich auf Artikel (längere Hauptbeiträge) konzentriert, geeignet für Foren, die weniger Austausch benötigen und eher anleitungsorientiert sind.

flaskbb / flaskbb

Ein Python-Forum mit sehr guter Leistung, das jedoch seit längerer Zeit nicht mehr aktualisiert wird.

rafalp / Misago

Auf den ersten Blick ein Anime-/Manga-Forum, ebenfalls in Python. Der Autor hat die Entwicklung erst vor wenigen Jahren begonnen, ist aber sehr fleißig. Ich habe gesehen, dass er die Python-Bibliothek SocialAuth verwendet, was die Integration von Anmeldemethoden wie QQ, WeChat, Google usw. sowie die Integration in die eigene Website sehr einfach macht.

Außerdem gibt es zwei chinesische Foren, die vielversprechend aussehen: Casbin ist eine starke Nachbildung von v2ex, und bbs-go sowie symphony ähneln CSDN-Blogs. Diese habe ich jedoch nicht getestet.

Discuz zu NodeBB migrieren

Falls du eine eigene Website hast, kannst du für die Benutzerkonten-Migration die offiziellen Plugins nodebb-plugin-session-sharing oder nodebb-plugin-sso-oauth2-multiple verwenden.

Für den Import von Discuz-Inhalten musst du hingegen eigenen Code schreiben. Lass dir von KI (z.B. mit Python) einen Grundrahmen erstellen und passe den Rest selbst an.

Wenn du nur Beiträge importieren möchtest, durchlaufe die posts-Tabelle von Discuz in einer Schleife. Jede Zeile entspricht einem Beitrag, first=1 kennzeichnet einen Themen-Startbeitrag (Themen-Ersteller).

Für Themen-Startbeiträge rufst du die NodeBB-API api/v3/topics/ auf, für Antworten die API api/v3/topics/{tid}. Für Benutzer kannst du die Benutzererstellungs-API verwenden. Da ich session-sharing nutze, verwende ich die API api/session-sharing/user. Die Benutzerabfrage erfolgt über api/session-sharing/lookup?id={passport_id}.

Die API-Verarbeitungsgeschwindigkeit liegt bei etwa 5 Anfragen pro Sekunde. Bereite dich also auf eine langsame Migration vor.

Beispielaufruf:

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-Administratorschlü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üge Inhalte hinzu, muss mindestens 1 sein" 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']

Beachte: Das Posten über die API folgt derselben Logik wie das Posten durch Benutzer und unterliegt allen Zeichenbegrenzungen des Forums. Ebenso wird der übergebene timestamp oft ignoriert, und der Beitrag wird mit der aktuellen Zeit veröffentlicht. Die Lösung besteht darin, den Zeitstempel in src/api/helpers.js Zeile 16 zu ändern, indem du die Zeile data.timestamp = Date.now(); einfach auskommentierst. Vergiss nicht, dies nach der Migration rückgängig zu machen, sonst können Benutzer ebenfalls die Zeit ändern.

Nach dieser Änderung unterstützt auch die Antwort-API api/v3/topics/{tid} die Übergabe eines timestamp-Parameters zur Zeitangabe.

Zuletzt bearbeitet
hugo-builder
hugo-builder · · 自动翻译 about.md 2... · 248520b
Weitere Mitwirkende
...