Me gustaría consultar sobre las opciones disponibles para el archivo público de un foro.
Recientemente hemos migrado desde phpBB y anteriormente teníamos un script que archivaba las publicaciones públicas en un archivo de texto. ¿Existen opciones similares para Discourse? Tenemos aproximadamente 30 categorías públicas que necesitarían ser archivadas. Se debería incluir el nombre de usuario/nombre de visualización de cada autor, pero no el correo electrónico, las direcciones IP ni ningún otro dato privado. SQL para que los datos puedan ser procesados de manera similar a SEDE de Stack Exchange sería probablemente lo más útil.
Bien, así que llegué a esto. Parece funcionar bien para mí, aunque necesito verificar que estoy filtrando correctamente todas las publicaciones ocultas. Y algunas de las columnas probablemente no son realmente tan útiles.
Esto se puede usar desde un cronjob, pero el usuario necesitará ser añadido al grupo docker. Añadí un paso después del volcado para copiar el archivo al servidor de archivos mediante scp, pero se podría hacer prácticamente cualquier otra cosa con él también.
#!/bin/bash
# Archivar datos públicos del foro
EXEC="docker exec -i -u postgres -w /var/www/discourse app"
# Ejecutar comandos para construir las tablas exportadas
$EXEC psql discourse << EOF
SET client_min_messages TO warning;
DROP TABLE IF EXISTS users_export;
CREATE TABLE users_export AS
SELECT id, username, created_at, name
FROM users
WHERE staged = false;
DROP TABLE IF EXISTS categories_export;
CREATE TABLE categories_export AS
SELECT id, name, slug, parent_category_id
FROM categories
WHERE read_restricted = false;
DROP TABLE IF EXISTS topics_export;
CREATE TABLE topics_export AS
SELECT t.id, t.title, t.last_posted_at, t.created_at, t.updated_at,
t.views, t.posts_count, t.user_id, t.last_post_user_id, t.reply_count,
t.category_id, t.closed, t.slug
FROM topics AS t
INNER JOIN categories_export AS c ON t.category_id = c.id
WHERE t.deleted_at is NULL AND t.archived = false;
DROP TABLE IF EXISTS posts_export;
CREATE TABLE posts_export AS
SELECT p.id, p.user_id, p.topic_id, p.raw, p.created_at, p.updated_at,
p.reply_to_post_number, p.reply_count, p.quote_count, p.like_count
FROM posts AS p
INNER JOIN topics_export AS t ON p.topic_id = t.id
WHERE p.post_type = 1 AND p.deleted_at is NULL AND p.hidden = false;
EOF
# Volcar datos
echo Volcando datos...
$EXEC pg_dump discourse -t users_export -t categories_export -t topics_export -t posts_export > forum-archive.sql
# Limpieza
$EXEC psql discourse << EOF
SET client_min_messages TO warning;
DROP TABLE IF EXISTS users_export;
DROP TABLE IF EXISTS categories_export;
DROP TABLE IF EXISTS topics_export;
DROP TABLE IF EXISTS posts_export;
EOF