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 y aquí comparto brevemente mis impresiones y métodos de migración.
A continuación, en orden de clasificación en GitHub:
Discourse
Este es el foro número uno, pero está basado en RoR (Ruby on Rails). El rendimiento de RoR es bajo y el uso de memoria es alto, no es adecuado para sitios pequeños, así que lo descarté directamente.
Anteriormente, varios de nuestros sitios en RoR fueron derribados por rastreadores web, realmente no podemos permitírnoslo.
Flarum
Su interfaz es excelente. Basado en PHP+MySQL, en teoría no debería tener problemas de rendimiento, pero las consultas SQL del foro no están bien optimizadas. Acceder a un post inicial en un foro vacío genera 100 consultas SQL, con un tiempo de carga de al menos 100 ms. Con una base de datos en la nube de baja especificación, 200 ms es normal. Esta velocidad, sumada a otros contenidos de carga, puede resultar en casi un segundo de tiempo de espera.
NodeBB
Este está hecho con NoSQL+Node.js, tiene un rendimiento fuerte y un uso de CPU muy bajo. Además, utiliza conexiones persistentes 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 o StackOverflow. Pero busqué y no encontré una manera de eliminar funciones como “preguntar” y “aceptar respuesta”. Si se pudieran eliminar, sería un foro centrado en artículos (posts principales largos), adecuado para foros de guías que no requieren mucha funcionalidad de interacción.
Flaskbb / Flaskbb
Foro en Python, el rendimiento es muy bueno, pero no se ha actualizado en mucho tiempo.
rafalp / Misago
A primera vista, un foro de anime (二次元). También en Python, el autor comenzó a desarrollarlo hace pocos años, pero es muy diligente. Vi que utiliza la biblioteca SocialAuth de Python, que puede integrar métodos de inicio de sesión como QQ, Weixin, Google, etc., e incluso integrar tu propio sitio web es fácil.
Además, hay dos foros de desarrolladores chinos que parecen buenos: uno es Casbin, una imitación de 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 de credenciales de acceso en 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, solo puedes escribir el código tú mismo. Pídele a una IA que te escriba un marco en Python y luego modifícalo tú.
Si solo necesitas importar posts, itera sobre la tabla posts de Discuz, cada fila es un post, first=1 indica que es un post principal (tema).
Para los posts principales, llama a la API de NodeBB api/v3/topics/. Para las respuestas, llama a api/v3/topics/{tid}. Para los usuarios, puedes usar la API de creación de usuarios. Como yo uso session-sharing, uso la interfaz api/session-sharing/user, y para buscar usuarios uso api/session-sharing/lookup?id={passport_id}.
La velocidad de procesamiento de la API es de 5 solicitudes por segundo, 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 autor
}
# 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 "Por favor, añade contenido al post, no puede tener menos de 1 carácter", es que el contenido no está 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 siguen la misma lógica, por lo que están sujetos a todas las restricciones de longitud del foro. Además, por la misma razón, timestamp también se ignora y el post se publica con la hora actual. La solución es modificar la línea 16 del archivo src/api/helpers.js, comentando directamente la línea data.timestamp = Date.now();. Recuerda revertir el cambio después de la migración, de lo contrario los usuarios también podrían modificar la hora.
Después de este cambio, la interfaz API de respuestas api/v3/topics/{tid} también admitirá pasar un timestamp para especificar la hora.
b96cfe3