Opciones de foros modernos y migración de Discuz a NodeBB
Después de que Discuz dejó de actualizarse, se necesitan alternativas de foro. He probado varios, así que hablaré brevemente de mis impresiones y métodos de migración.
A continuación, en orden de ranking en GitHub:
discourse
Este es el foro número uno, pero está basado en RoR. El rendimiento de RoR no es precisamente bueno y el uso de memoria también es alto, así que lo descarté directamente.
Pongo un ejemplo: nuestro anterior sistema de inicio de sesión estaba hecho con RoR. Cuando los rastreadores web (crawlers) rastreaban nuestro foro Discuz, cada publicación tenía un enlace de inicio de sesión con un parámetro from diferente. Algunos rastreadores poco inteligentes los rastreaban todos. Esa página solo renderizaba el cuadro de inicio de sesión, pero logró colapsar nuestro sistema de inicio de sesión RoR. Mientras tanto, el foro Discuz que también estaba siendo rastreado no mostró la más mínima fluctuación. Si estás acostumbrado a la velocidad y economía de Discuz, prepárate y evalúa si podrás soportarlo.
flarum
Su interfaz es muy buena. Está basado en PHP+MySQL, por lo que en teoría no debería tener problemas de rendimiento. Sin embargo, las consultas SQL del foro no están bien optimizadas. Al acceder a las publicaciones iniciales en un foro vacío, se realizan 100 consultas SQL. El tiempo de apertura comienza en 100 ms. Si usas una base de datos en la nube de baja especificación, 200 ms es normal. A esta velocidad, sumada a la carga de otros contenidos, el tiempo de espera puede acercarse a 1 segundo.
nodebb
Está hecho con NoSQL+Node.js, tiene un rendimiento fuerte y un uso de CPU muy bajo. Además, utiliza conexiones persistentes (long-lived) de WebSocket, por lo que la velocidad de respuesta es muy rápida. El uso de memoria comienza en 1 GB, pero crece lentamente. Tiene complementos y API completos, por eso elegí este.
apache / answer
Este también es muy bueno, similar a Zhihu/StackOverflow. Pero busqué por todas partes y no encontré una manera de desactivar funciones como “hacer una pregunta” o “aceptar una respuesta”. Si se pudieran desactivar, sería un foro centrado en artículos (publicaciones principales largas), adecuado para foros de tipo guía que no necesiten muchas funciones de interacción.
flaskbb / flaskbb
Foro en Python, con muy buen rendimiento, pero no se actualiza desde hace mucho tiempo.
rafalp / Misago
A simple vista es un foro de anime (二次元). También está en Python. El autor comenzó a desarrollarlo hace no muchos años, pero es muy diligente. Vi que usa la librería SocialAuth de Python, que puede integrar métodos de inicio de sesión como QQ, Weixin, Google, etc., e integrarlo en tu propio sitio web también es fácil.
Además, hay dos foros de desarrolladores chinos que parecen buenos: uno es Casbin, que imita mucho a v2ex, y bbs-go y symphony que parecen blogs similares a CSDN, pero no los he probado.
Migración de Discuz a NodeBB
Si tienes tu propio sitio web, para la migración del sistema de autenticación (passport) de NodeBB, puedes usar estos dos complementos oficiales: nodebb-plugin-session-sharing o nodebb-plugin-sso-oauth2-multiple.
En cuanto a la importación desde Discuz, tendrás que escribir el código tú mismo. Puedes pedirle a una IA que te escriba un marco en Python y luego modificarlo tú mismo.
Si solo necesitas importar publicaciones, itera sobre la tabla posts de Discuz; cada fila es una publicación. first=1 indica que es el tema principal (post inicial).
Para los temas principales, llama a la API de NodeBB api/v3/topics/. Para las respuestas, llama a la interfaz api/v3/topics/{tid}. Para los usuarios, puedes usar la interfaz de creación de usuarios. Como yo uso session-sharing, uso la interfaz api/session-sharing/user. Para buscar un usuario es api/session-sharing/lookup?id={passport_id}.
La velocidad de procesamiento de la API es de 5 solicitudes por segundo, así que prepárate para una migración lenta.
Ejemplo de llamada:
async def create_topic(title, body, timestamp, category, tags, uid):
# Crear tema POST
data = {
"cid": category, # Número de categoría/sección
"title": title,
"content": body,
"timestamp": int(timestamp), # Tiempo en milisegundos
"tags": tags,
"_uid": uid # ID del usuario que publica
}
# Clave de administrador de la API
headers = {"Authorization": f"Bearer 1239383-3323-2323-2323-asd123123123"}
# Llamada
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 el error es algo como "Por favor, añade contenido a la publicación, no puede tener menos de 1 carácter", es que el 'content' no se ha escapado (escape).
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']Nota: Publicar a través de la API y publicar como usuario sigue la misma lógica, por lo que está sujeto a todas las restricciones de longitud de caracteres del foro. Del mismo modo, el parámetro timestamp también se ignora debido a esto, y la publicación se publicará con la hora actual de todos modos. La solución es modificar la línea 16 del archivo src/api/helpers.js, comentando directamente la línea data.timestamp = Date.now();. Después de la migración, recuerda revertir el cambio, de lo contrario los usuarios también podrían modificar la hora.
Después de este cambio, la interfaz API para respuestas api/v3/topics/{tid} también admitirá pasar un timestamp para especificar la hora.
248520b