Je souhaiterais me renseigner sur les options disponibles pour l’archivage public d’un forum.
Nous avons récemment migré depuis phpBB et nous disposions auparavant d’un script qui archivait les messages publics dans un fichier texte. Existe-t-il des options similaires pour Discourse ? Nous avons environ 30 catégories publiques à archiver. Le nom d’utilisateur ou le nom affiché de chaque auteur doit être inclus, mais pas l’adresse e-mail, les adresses IP ni aucune autre donnée privée. Un fichier SQL permettant de traiter les données comme le fait SEDE de Stack Exchange serait probablement le plus utile.
Bon, voici ce que j’ai trouvé. Cela semble bien fonctionner de mon côté, bien que je doive vérifier que je filtre correctement tous les messages masqués. Certaines colonnes ne sont probablement pas aussi utiles que prévu.
Ce script peut être utilisé depuis un cron, mais l’utilisateur devra être ajouté au groupe docker. J’ai ajouté une étape après le vidage pour transférer le fichier vers le serveur d’archives via scp, mais vous pourriez tout aussi bien faire autre chose avec.
#!/bin/bash
# Archiver les données publiques du forum
EXEC="docker exec -i -u postgres -w /var/www/discourse app"
# Exécuter les commandes pour construire les tables exportées
$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
# Vidage des données
echo Vidage des données...
$EXEC pg_dump discourse -t users_export -t categories_export -t topics_export -t posts_export > forum-archive.sql
# Nettoyage
$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