Ich möchte mich nach den Möglichkeiten zur öffentlichen Archivierung eines Forums erkundigen.
Wir haben kürzlich von phpBB migriert und verfügten zuvor über ein Skript, das die öffentlichen Beiträge in eine Textdatei archiviert hat. Gibt es vergleichbare Optionen für Discourse? Wir haben etwa 30 öffentliche Kategorien, die archiviert werden müssten. Der Benutzername/anzeigename jedes Autors müsste enthalten sein, jedoch nicht die E-Mail-Adresse, IP-Adressen oder andere private Daten. SQL wäre wahrscheinlich am nützlichsten, damit die Daten ähnlich wie bei Stack Exchange SEDE verarbeitet werden können.
In Ordnung, ich habe dies ausgearbeitet. Es scheint gut zu funktionieren, obwohl ich noch einmal überprüfen muss, ob ich alle versteckten Beiträge korrekt ausschließe. Zudem sind einige der Spalten wahrscheinlich nicht wirklich so nützlich.
Dies kann über einen Cron-Job ausgeführt werden, wobei der Benutzer jedoch der Gruppe docker hinzugefügt werden muss. Ich habe nach dem Dump einen Schritt hinzugefügt, um die Datei per scp auf den Archivserver zu übertragen, aber Sie könnten damit praktisch alles andere machen.
#!/bin/bash
# Öffentliche Daten des Forums archivieren
EXEC="docker exec -i -u postgres -w /var/www/discourse app"
# Befehle zum Erstellen der exportierten Tabellen ausführen
$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
# Daten dumpen
echo Daten werden gedumpt...
$EXEC pg_dump discourse -t users_export -t categories_export -t topics_export -t posts_export > forum-archive.sql
# Bereinigung
$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