フォーラムの公開アーカイブ化にどのようなオプションがあるかについてお尋ねします。
以前は phpBB を使用しており、公開投稿をテキストファイルにアーカイブ化するスクリプトを持っていました。Discourse にもそのようなオプションはありますか?アーカイブ化する必要がある公開カテゴリは約 30 あります。各投稿者のユーザー名や表示名は含める必要がありますが、メールアドレス、IP アドレス、その他の個人データは含めません。データが Stack Exchange の SEDE のように処理できるように、SQL 形式が最も有用でしょう。
さて、これを作成しました。私にはうまく動作しているように思えますが、隠し投稿をすべて正しく除外できているか再確認する必要があります。また、いくつかの列は実際にはそれほど有用ではないかもしれません。
これは cronjob から使用できますが、ユーザーを docker グループに追加する必要があります。ダンプの後にファイルをアーカイブサーバーに scp で転送するステップを追加しましたが、他にもさまざまな用途に活用できます。
#!/bin/bash
# フォーラムから公開データをアーカイブ
EXEC="docker exec -i -u postgres -w /var/www/discourse app"
# 出力テーブルを構築するコマンドを実行
$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
# データをダンプ
echo データをダンプ中...
$EXEC pg_dump discourse -t users_export -t categories_export -t topics_export -t posts_export > forum-archive.sql
# クリーンアップ
$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