我想咨询一下关于论坛公开归档的选项。
我们最近从 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