Vorrei chiedere quali opzioni siano disponibili per l’archiviazione pubblica di un forum.
Abbiamo recentemente migrato da phpBB e in precedenza disponevamo di uno script che archiviava i post pubblici in un file di testo. Esistono opzioni simili per Discourse? Abbiamo circa 30 categorie pubbliche che necessitano di archiviazione. Dovrebbe essere incluso il nome utente/nome visualizzato di ogni autore, ma non l’indirizzo email, gli indirizzi IP o altri dati privati. Un dump SQL che permetta di elaborare i dati come fa SEDE di Stack Exchange sarebbe probabilmente l’opzione più utile.
Bene, ho quindi elaborato questa soluzione. Funziona bene secondo me, anche se devo verificare di aver filtrato correttamente tutti i post nascosti. Inoltre, alcune colonne potrebbero non essere effettivamente così utili.
Questo script può essere utilizzato da un cronjob, ma è necessario aggiungere l’utente al gruppo docker. Ho aggiunto un passaggio dopo il dump per copiare il file su un server di archiviazione tramite scp, ma si potrebbe fare praticamente qualsiasi altra cosa con esso.
#!/bin/bash
# Archivia i dati pubblici dal forum
EXEC="docker exec -i -u postgres -w /var/www/discourse app"
# Esegui comandi per costruire le tabelle esportate
$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
# Esegui il dump dei dati
echo Dumping data...
$EXEC pg_dump discourse -t users_export -t categories_export -t topics_export -t posts_export > forum-archive.sql
# Pulizia
$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