Gostaria de consultar sobre quais opções existem para o arquivamento público de um fórum.
Recentemente migramos do phpBB e anteriormente tínhamos um script que arquivava as postagens públicas em um arquivo de texto. Existem opções assim para o Discourse? Temos cerca de 30 categorias públicas que precisariam ser arquivadas. O nome de usuário/nome de exibição de cada autor precisaria ser incluído, mas não o e-mail, endereços IP ou qualquer outro dado privado. SQL para que os dados pudessem ser processados como o SEDE da Stack Exchange provavelmente seria o mais útil.
Certo, então eu criei isso. Parece funcionar bem para mim, embora precise verificar se estou filtrando corretamente todas as postagens ocultas. E algumas das colunas provavelmente não são realmente tão úteis.
Isso pode ser usado a partir de um cronjob, mas o usuário precisará ser adicionado ao grupo docker. Adicionei uma etapa após o dump para copiar o arquivo via scp para o servidor de arquivamento, mas você poderia fazer praticamente qualquer outra coisa com ele também.
#!/bin/bash
# Arquivar dados públicos do fórum
EXEC="docker exec -i -u postgres -w /var/www/discourse app"
# Executar comandos para construir as tabelas exportadas
$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
# Exportar dados
echo Exportando dados...
$EXEC pg_dump discourse -t users_export -t categories_export -t topics_export -t posts_export > forum-archive.sql
# Limpeza
$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