Aller au contenu
Choix d'un forum moderne et migration de Discuz vers NodeBB

Choix d'un forum moderne et migration de Discuz vers NodeBB

2025-02-17 14:14

Après l’arrêt des mises à jour de Discuz, il est nécessaire de choisir un forum alternatif. J’en ai testé plusieurs et je vais brièvement partager mes impressions ainsi que les méthodes de migration.

Voici les options classées par ordre de classement sur GitHub :

discourse

C’est le forum numéro un, mais il est basé sur RoR. Les performances de RoR sont médiocres et sa consommation mémoire est élevée, ce qui ne convient pas aux petits sites. Je l’ai donc directement abandonné.

Nous avons déjà eu plusieurs sites RoR qui ont été mis à genoux par des robots d’indexation, c’est vraiment trop lourd à gérer.

flarum

Son interface est très réussie. Basé sur PHP+MySQL, il ne devrait normalement pas poser de problèmes de performances. Cependant, les requêtes SQL du forum ne sont pas optimisées : l’accès au premier message d’un forum vide génère 100 requêtes SQL, avec un temps de chargement minimal de 100 ms. Avec une base de données cloud bas de gamme, 200 ms sont normales. Ajoutez à cela les autres éléments à charger, et le temps d’attente approche la seconde.

nodebb

Celui-ci est développé avec NoSQL+NodeJS. Il est performant et peu gourmand en CPU. De plus, il utilise des connexions WebSocket persistantes, ce qui garantit des temps de réponse très rapides. La consommation mémoire démarre à 1 Go mais augmente lentement. Ses plugins et API sont complets, c’est pourquoi j’ai choisi cette solution.

apache / answer

Cette option est également très bonne, similaire à Zhihu ou StackOverflow. Cependant, après avoir cherché, je n’ai pas trouvé de moyen de désactiver les fonctionnalités de “question” et “réponse acceptée”. Si cela était possible, cela deviendrait un forum centré sur les articles (messages principaux longs), idéal pour des forums axés sur des guides/astuces, sans nécessiter trop de fonctionnalités d’interaction.

flaskbb / flaskbb

Un forum en Python, aux performances très correctes, mais qui n’est plus mis à jour depuis longtemps.

rafalp / Misago

À première vue, un forum pour la culture otaku. Également en Python, l’auteur a commencé le développement il n’y a que quelques années, mais il est très actif. J’ai constaté qu’il utilise la bibliothèque Python SocialAuth, qui permet d’intégrer facilement des méthodes de connexion via QQ, Weixin, Google, etc., ainsi que l’intégration avec son propre site.

Par ailleurs, il existe deux forums développés par des Chinois qui semblent prometteurs : l’un est Casbin, une copie conforme de v2ex, et les autres sont bbs-go et symphony, qui ressemblent aux blogs de CSDN. Je ne les ai cependant pas testés.

Migration de Discuz vers NodeBB

Si vous possédez votre propre site, vous pouvez utiliser l’un de ces deux plugins officiels pour la migration des passeports utilisateurs vers NodeBB : nodebb-plugin-session-sharing ou nodebb-plugin-sso-oauth2-multiple.

Pour l’importation depuis Discuz, il faut écrire son propre code. Vous pouvez demander à une IA de vous écrire un squelette en Python, puis le modifier vous-même.

Si vous ne devez importer que les messages, parcourez la table posts de Discuz. Chaque ligne correspond à un message, et first=1 indique un message de sujet (topic).

Pour les sujets, utilisez l’API NodeBB api/v3/topics/. Pour les réponses, utilisez api/v3/topics/{tid}. Pour les utilisateurs, vous pouvez utiliser l’API de création d’utilisateurs. Comme j’utilise session-sharing, j’utilise l’interface api/session-sharing/user et la requête api/session-sharing/lookup?id={passport_id} pour rechercher un utilisateur.

La vitesse de traitement de l’API est d’environ 5 requêtes par seconde. Préparez-vous à une migration lente.

Exemple d’appel :

async def create_topic(title, body, timestamp, category, tags, uid):
    # Créer un sujet POST
    data = {
        "cid": category,  # Numéro de la catégorie
        "title": title,
        "content": body,
        "timestamp": int(timestamp),  # Temps en millisecondes
        "tags": tags,
        "_uid": uid   # Auteur du message
    }
    # Clé secrète administrateur de l'API
    headers = {"Authorization": f"Bearer 1239383-3323-2323-2323-asd123123123"}
    # Appel
    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:
                # Si l'erreur est du type "Veuillez ajouter du contenu, il doit contenir au moins 1 caractère", c'est que le contenu n'est pas échappé.
                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']

Notez que la publication via l’API suit la même logique que la publication par un utilisateur, et est donc soumise à toutes les limitations de caractères du forum. De même, le paramètre timestamp est souvent ignoré, le message étant publié avec l’heure actuelle. La solution est de modifier l’horodatage à la ligne 16 du fichier src/api/helpers.js. Commentez simplement la ligne data.timestamp = Date.now();. N’oubliez pas de la remettre après la migration, sinon les utilisateurs pourront aussi modifier les dates.

Après cette modification, l’API de réponse api/v3/topics/{tid} acceptera également le paramètre timestamp pour spécifier l’heure.

Dernière modification
hugo-builder
hugo-builder · · AI Translated 2... · b96cfe3
Autres contributeurs
...