Ótimo! Que bom que você resolveu. Qual foi o truque?
Espero que você não precise disso https://www.literatecomputing.com/services-discourse-migration/
Ótimo! Que bom que você resolveu. Qual foi o truque?
Espero que você não precise disso https://www.literatecomputing.com/services-discourse-migration/
Tive que continuar executando o import_phpbb3.sh até que todas as categorias fossem importadas. O script rodou durante a noite, e uma interrupção na rede causou algum erro do meu lado. Reiniciei o script, e acho que ele está funcionando agora. Se houver mais problemas, terei que entrar e limpar a tabela MySQL.
Olá a todos! O fórum está quase totalmente funcionando… parece fantástico. Estou escrevendo um script para modificar a tag [/quote]. O fórum é bem antigo, datando de 2001, e apenas adicionar um espaço acima e abaixo da tag de fechamento resolve muita coisa. Tenho certeza de que havia uma configuração que eu poderia ter atualizado no script de importação, mas é minha primeira vez migrando, então estou aprendendo conforme avanço.
Pergunta: Estou corrigindo 10 anos de dados e tenho um fórum phpBB ativo. Está levando um tempo. Posso usar o script import_phpbb3.sh para importar os últimos X dias de posts do meu fórum? Acho que é apenas uma mesclagem, no que diz respeito ao script. Posso exportar os últimos 7 dias de dados do MySQL… mas não sei se isso funcionaria. Alguma ideia?
Ainda não verifiquei se o script está funcionando… testei em pequenas partes, mas não em lotes. O problema que tive foi um espaço acima e abaixo da tag de fechamento. Agora vou cuidar do gramado e voltar mais tarde para verificar:
batch_size = 1000
total_processed = 0
# Processa posts em todo o site em lotes
Post.find_in_batches(batch_size: batch_size) do |batch|
updated_posts = []
batch.each do |post|
original_raw = post.raw
# Aplica a correção
new_raw = original_raw.gsub(/\n\n\[\/quote\]\n\n\n/, "\n\n[/quote]\n\n")
if original_raw != new_raw
post.update_column(:raw, new_raw) # Atualização direta da coluna para pular callbacks
updated_posts << post
total_processed += 1
end
end
# Reassocia apenas os posts atualizados para minimizar a carga
updated_posts.each(&:rebake!)
puts "Processado um lote de #{batch.size}. Total processado até agora: #{total_processed}."
end
puts "Total de #{total_processed} posts processados em todo o site."
Isso funcionou em posts individuais:
post = Post.find(344572) # Substitua 344572 pelo ID correto
post.raw = post.raw.gsub(/\n\\n\[\/quote\]\\n\n\n/, “\n\n[/quote]\n\n”)
Eu modificaria o script para fazer isso quando ele importar os dados. Surpreende-me que ele ainda não faça isso. Vale a pena dar uma olhada mais atenta nas coisas.
Em vários scripts em que trabalhei, adicionei uma configuração de ambiente IMPORT_AFTER e modifiquei as consultas para incluir where some_timestamp > import_after_data. Não acho que este tenha tal opção, mas não prestei atenção cuidadosa.
Mas cuidado, é provável que as coisas dos dados de 10 anos atrás sejam diferentes das dos últimos 2 anos, então testar apenas com dados recentes é ótimo para depurar coisas que você sabe que estão em todos os lugares, você também vai querer testar em todo o banco de dados.
Há um monte de coisas diferentes na mistura. A importação está cerca de 99% completa… Eu só preciso voltar e absorver as últimas semanas de posts
Assim que as quebras de linha forem adicionadas e isso for corrigido <LINK_TEXT text= tudo deve ficar bom ![]()
Aqui está o que fiz para limpar um grande volume de minhas postagens após a importação. Tive IA para fornecer uma explicação a alguém vindo do PhpBB. Fiquei acordado até as 5 da manhã tentando fazer o dele funcionar ![]()
![]()
![]()
Para executar um script Ruby dentro do seu ambiente Discourse que processa tópicos do fórum em lotes de 1000 e aplica transformações específicas a cada postagem dentro desses tópicos, você seguirá uma sequência de etapas para acessar seu servidor, entrar no ambiente apropriado e executar o script. Aqui está um guia detalhado, incluindo o próprio script:
Usando um cliente Secure Shell (SSH) como o PuTTY para Windows, conecte-se ao seu servidor onde o fórum Discourse está hospedado. Você precisará do endereço IP ou nome de domínio do seu servidor, bem como de suas credenciais (nome de usuário e senha ou uma chave SSH).
Uma vez logado em seu servidor, navegue até o diretório de instalação do Discourse, geralmente /var/discourse. Em seguida, entre no contêiner Docker que executa o Discourse usando os seguintes comandos:
bash
cd /var/discourse
./launcher enter app
Dentro do contêiner Docker, você pode interagir com sua aplicação Discourse através do console Rails. Este é um ambiente Ruby on Rails que permite executar código Ruby diretamente contra seu banco de dados e lógica de aplicação do Discourse. Inicie o console com:
bash
rails c
Com o console Rails aberto, você está pronto para executar o script Ruby. O script deve ser preparado com antecedência e copiado para sua área de transferência. No PuTTY, você pode colar o script clicando com o botão direito do mouse ou pressionando Shift + Insert.
Aqui está o script completo que você estará usando:
code
# Recupera um array de todos os IDs de tópicos
topic_ids = Topic.pluck(:id)
# Define o tamanho do lote
batch_size = 1000
current_batch_start = 0
while current_batch_start < topic_ids.length
# Processa um lote de 1000 tópicos por vez
topic_ids[current_batch_start, batch_size].each do |topic_id|
# Busca o tópico pelo ID
topic = Topic.find(topic_id)
# Pula se o tópico for nulo
next if topic.nil?
# Inicializa uma contagem de posts transformados para este tópico
transformed_count = 0
# Itera sobre cada postagem dentro do tópico
topic.posts.each do |post|
# Sinalizador para rastrear se as transformações foram feitas
transformed = false
# Aplica transformações
transformed |= post.raw.gsub!(/<\\/?r>/, '').present?
transformed |= post.raw.gsub!(/<\\/?s>/, '').present?
transformed |= post.raw.gsub!(/<\\/?e>/, '').present?
transformed |= post.raw.gsub!(/<\\/?QUOTE[^>]*>/, '').present?
transformed |= post.raw.gsub!(/\[quote=““([^”]+)””\]/, '[quote=\"\\1\"]').present?
transformed |= post.raw.gsub!(/\\\\n/, "\\n").present?
transformed |= post.raw.gsub!(/\[quote=([^\\s]+)\\s+post_id=\\d+\\s+time=\\d+\\s+user_id=\\d+\]/, '[quote=\"\\1\"]').present?
transformed |= post.raw.gsub!(/<URL url=\"([^\"]+)\">.*?<LINK_TEXT text=\"[^\"]+\">[^\<]+<\/LINK_TEXT>.*?<\/URL>/, '\\1').present?
transformed |= post.raw.gsub!(/\[\/quote\]/, "\\n[/quote]\\n").present?
transformed |= post.raw.gsub!(/\\A\\n/, '').present?
# Salva e reprocessa a postagem se alguma transformação ocorreu
if transformed
post.save!
post.rebake!
transformed_count += 1
end
end
# Exibe o resultado para o tópico atual
if transformed_count > 0
puts "Transformed #{transformed_count} posts in topic #{topic_id}."
else
puts "No transformations were necessary for topic #{topic_id}."
end
end
# Atualiza o índice inicial para o próximo lote
current_batch_start += batch_size
# Verifica se há mais tópicos para processar
if current_batch_start < topic_ids.length
puts "Completed a batch of #{batch_size} topics. Do you want to continue to the next batch? (yes/no)"
response = gets.strip.downcase
break unless response == 'yes'
end
end
É assim que deve parecer enquanto está em execução.
No transformations were necessary for topic 19556.
No transformations were necessary for topic 35766.
No transformations were necessary for topic 35783.
No transformations were necessary for topic 35778.
No transformations were necessary for topic 35774.
No transformations were necessary for topic 35770.
Transformed 292 posts in topic 20234.
No transformations were necessary for topic 35781.
No transformations were necessary for topic 35779.
Transformed 242 posts in topic 20218.
Transformed 22 posts in topic 19522.
No transformations were necessary for topic 35771.
No transformations were necessary for topic 35767.
Transformed 2 posts in topic 22560.
No transformations were necessary for topic 35797.
No transformations were necessary for topic 35789.
No transformations were necessary for topic 35785.
No transformations were necessary for topic 31889.
Transformed 1 posts in topic 31831.
No transformations were necessary for topic 31792.
No transformations were necessary for topic 35794.
No transformations were necessary for topic 35815.
Estou recebendo este erro (pós-migração, em uma instalação padrão funcionando) ao tentar alterar o nome de exibição de um usuário (não o nome de usuário) para incluir caracteres especiais. Recebo um pop-up de erro interno do servidor quando tento e os logs mostram o mesmo erro que @DDo teve.
Notavelmente, outros usuários podem alterar seus nomes de exibição para incluir o mesmo caractere (™). A diferença relevante parece ser que os usuários que fizeram login pós-migração podem ter caracteres UTF-8, mas os usuários que não fizeram login só podem ter ASCII-8BIT.
Também presumo que este erro seria resolvido removendo discourse-migratepassword, mas não testei.
Isso é um bug ou algo inerente ao funcionamento desse plugin? Se for o primeiro, é melhor criar um problema no Github para relatá-lo?
Estou tentando (re)construir um contêiner de importação, mas ele falha:
FAILED
--------------------
Errno::ENOENT: No such file or directory @ rb_sysopen - /etc/service/unicorn/run
Localização da falha: /usr/local/lib/ruby/gems/3.2.0/gems/pups-1.2.1/lib/pups/replace_command.rb:11:in `read'
replace falhou com os parâmetros {"tag"=>"precompile", "filename"=>"/etc/service/unicorn/run", "from"=>"PRECOMPILE_ON_BOOT=1", "to"=>"PRECOMPILE_ON_BOOT=0"}
bootstrap falhou com código de saída 1
** FALHA AO INICIAR ** por favor, role para cima e procure por mensagens de erro anteriores, pode haver mais de uma.
./discourse-doctor pode ajudar a diagnosticar o problema.
Já desativei todos os plugins, mas sem alteração.
Alguém tem alguma ideia?
Essa é a primeira ideia.
Sim, não encontrei nada que mostrasse/apontasse para um erro… Vou procurar novamente…
hooks:
after_web_config:
- exec:
cd: /etc/service
cmd:
# - rm -R unicorn
- rm -R nginx
- rm -R cron
Comentei a linha - rm -R unicorn em templates/import/phpbb3.template.yml e a compilação foi concluída sem o erro.
O que aconteceu aqui? phpbb3.template.yml é a versão do Github, de dois anos atrás. Então deve haver uma mudança em outro lugar?!?
Isso pode ser de antes de eles mudarem do Ubuntu para o Debian. É provável que sejam atualizados apenas quando alguém perceber que eles não funcionam mais.
Não faz muito sentido para mim que esse rm tenha sido um problema, mas eu não presto muita atenção a eles se ninguém me paga. E mesmo assim, não me lembro de ter prestado muita atenção a esse. ![]()
Eu pensei que, se o construtor reclamasse sobre a falta de /etc/service/unicorn/run e exatamente isso fosse removido, eu tentei comentar esse comando de remoção.
Funcionou.
Talvez alguém com mais conhecimento sobre tudo queira verificar e fazer uma atualização no Github no script. Eu também posso fazer um PR - mas sem nenhum conhecimento sobre tudo, eu não quero.
Mas mudar de Ubuntu para Debian muda muito, é verdade.
Para começar, sou um neófito em Docker, então há uma boa chance de eu ter estragado alguma coisa.
Tenho uma instalação limpa do Discourse em um DigitalOcean Droplet rodando Ubuntu 22.04 usando o aplicativo pré-construído deles. O fórum foi construído sem problemas e roda na configuração padrão.
Quando executo /var/discourse/launcher rebuild import, recebo o seguinte no final da compilação:
Errno::ENOENT: No such file or directory @ rb_sysopen - /etc/service/unicorn/run
Location of failure: /usr/local/lib/ruby/gems/3.3.0/gems/pups-1.2.1/lib/pups/replace_command.rb:11:in `read'
replace failed with the params {"tag"=>"precompile", "filename"=>"/etc/service/unicorn/run", "from"=>"PRECOMPILE_ON_BOOT=1", "to"=>"PRECOMPILE_ON_BOOT=0"}
bootstrap failed with exit code 1
** FAILED TO BOOTSTRAP ** please scroll up and look for earlier error messages, there may be more than one.
./discourse-doctor may help diagnose the problem.
Quando executo: /var/discourse/launcher enter import
Eu recebo:
86_64 arch detected.
Error response from daemon: No such container: import
Isso se deve aos erros no topo deste post (e se sim, como consertar), ou o que estou fazendo de errado?
Você criou o import.yml e inicializou esse contêiner como (tenho quase certeza) as instruções dizem?
As instruções mostram a cópia de app.yml para import.yml e a adição de “templates/import/phpbb3.template.yml” a import.yml (o que eu fiz). Em seguida, você reconstrói a importação, o que gera o erro na minha OP. Falho em ver onde há instruções sobre a criação de um bootstrap (?).
As instruções são bem simples, é por isso que estou confuso sobre o que está dando errado.
# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
81a2f335fd01 local_discourse/app “/sbin/boot” 14 horas atrás Up 11 horas 0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp app
Desculpe. O Rebuild faz um bootstrap. Se concluído, o contêiner de importação estava em execução.
Ah. Sinto muito. Eu não entendi o que estava acontecendo antes. Parece que o template phpbb3 pode ser incompatível com alterações recentes no discourse_docker. Mas é tudo o que posso dizer no meu celular.
Acho que se você excluir uma linha no template phpbb3 que exclui “/etc/service/unicorn/run”, isso pode fazer com que a compilação seja concluída.
Jay, obrigado pela resposta a este problema. A compilação agora é concluída corretamente.
Próximo problema: Quando executo: import_phpbb3.sh, recebo:
A importação do phpBB3 está começando...
/usr/local/lib/ruby/3.3.0/psych/parser.rb:62:in `_native_parse': (\u003cunknown\u003e): não encontrou chave esperada ao analisar um bloco de mapeamento na linha 3 coluna 1 (Psych::SyntaxError)
from /usr/local/lib/ruby/3.3.0/psych/parser.rb:62:in `parse'
from /usr/local/lib/ruby/3.3.0/psych.rb:455:in `parse_stream'
from /usr/local/lib/ruby/3.3.0/psych.rb:399:in `parse'
from /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/bootsnap-1.18.4/lib/bootsnap/compile_cache/yaml.rb:129:in `strict_load'
from /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/bootsnap-1.18.4/lib/bootsnap/compile_cache/yaml.rb:186:in `input_to_storage'
from /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/bootsnap-1.18.4/lib/bootsnap/compile_cache/yaml.rb:232:in `fetch'
from /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/bootsnap-1.18.4/lib/bootsnap/compile_cache/yaml.rb:232:in `load_file'
from /var/www/discourse/script/import_scripts/phpbb3/support/settings.rb:10:in `load'
from script/import_scripts/phpbb3.rb:20:in `<module:PhpBB3>'
from script/import_scripts/phpbb3.rb:16:in `<module:ImportScripts>'
from script/import_scripts/phpbb3.rb:15:in `<main>'
Acho que ele não está gostando de algo no meu arquivo settings.yml. Como posso dizer no que ele está engasgando?
database:
type: MySQL # atualmente apenas MySQL é suportado
host: localhost
port: 3306
username:
password:
schema: phpbb
table_prefix: phpbb_ # Altere isso, se o seu fórum estiver usando um prefixo diferente. Geralmente todos os nomes de tabela começam com phpbb_
batch_size: 1000 # Não altere isso a menos que você saiba o que está fazendo. O padrão (1000) deve funcionar bem.
import:
# Defina isso se você importar vários fóruns phpBB em um único fórum Discourse.
#
# Por exemplo, ao importar vários sites, prefixe todos os IDs importados
# com 'first' para evitar conflitos. Execuções de importação subsequentes devem ter um
# 'site_name' diferente.
#
# site_name: first
#
site_name: Freedom Owners Forum
# Criar novas categorias
#
# Por exemplo, para criar uma categoria pai e uma subcategoria.
#
# new_categories:
# - forum_id: foo
# name: Foo Category
# - forum_id: bar
# name: Bar Category
# parent_id: foo
#
new_categories:
- forum_id: general
name: General
- forum_id: systems
name: Boat Systems
- forum_id: photos
name: Photos
- forum_id: docs
name: Manuals and Documentation
- forum_id: buy
name: Buy/Sell/Trade
- forum_id: site
name: Site Usage
- forum_id: archives
name: Archives
# Mapeamentos de categoria
#
# * "source_category_id" é o ID do fórum no phpBB3
# * "target_category_id" é um ID de fórum do phpBB3 ou um "forum_id"
# da configuração "new_categories" (veja acima)
# * "discourse_category_id" é um ID de categoria do Discourse
# * "skip" permite que você ignore uma categoria durante a importação
#
# Use "target_category_id" se você quiser mesclar categorias e use
# "discourse_category_id" se você quiser importar um fórum para uma categoria existente
# no Discourse.
#
# category_mappings:
# - source_category_id: 1
# target_category_id: foo
# - source_category_id: 2
# discourse_category_id: 42
# - source_category_id: 6
# skip: true
#
category_mappings:
- source_category_id: 8
target_category_id: systems
- source_category_id: 7
target_category_id: systems
- source_category_id: 9
target_category_id: systems
- source_category_id: 10
target_category_id: buy
- source_category_id: 11
target_category_id: general
- source_category_id: 12
target_category_id: general
- source_category_id: 13
target_category_id: general
- source_category_id: 14
target_category_id: general
- source_category_id: 16
target_category_id: docs
- source_category_id: 17
target_category_id: docs
- source_category_id: 18
target_category_id: general
- source_category_id: 19
target_category_id: general
- source_category_id: 20
target_category_id: general
- source_category_id: 21
target_category_id: docs
- source_category_id: 22
target_category_id: general
- source_category_id: 23
target_category_id: site
- source_category_id: 24
target_category_id: general
- source_category_id: 25
target_category_id: site
- source_category_id: 42
target_category_id: systems
- source_category_id: 43
target_category_id: docs
- source_category_id: 44
target_category_id: general
- source_category_id: 45
target_category_id: general
- source_category_id: 46
target_category_id: site
- source_category_id: 48
target_category_id: general
- source_category_id: 56
target_category_id: general
- source_category_id: 58
target_category_id: systems
- source_category_id: 59
skip: true
- source_category_id: 60
target_category_id: archives
- source_category_id: 61
target_category_id: archives
- source_category_id: 62
target_category_id: archives
- source_category_id: 63
target_category_id: archives
- source_category_id: 64
target_category_id: general
- source_category_id: 65
target_category_id: site
# Mapeamentos de tags
#
# Por exemplo, tópicos importados da categoria phpBB 1 serão marcados com
# 'first-category', etc.
#
# tag_mappings:
# 1:
# - first-category
# 2:
# - second-category
# 3:
# - third-category
#
tag_mappings: {}
# Mapeamento de classificação para nível de confiança
#
# Mapeia níveis de classificação do phpBB 3.x para nível de confiança
# Usuários com classificação de pelo menos 3000 terão TL3, etc.
#
rank_mapping:
trust_level_1: 200
trust_level_2: 1000
trust_level_3: 3000
# rank_mapping: {}
# AVISO: Não ative esta opção a menos que você saiba o que está fazendo.
# Provavelmente quebrará a conversão de BBCode para Markdown e diminuirá a velocidade da sua importação.
use_bbcode_to_md: false
# Este é o caminho para o diretório raiz da sua instalação phpBB atual (ou uma cópia dela).
# O importador espera encontrar os diretórios /files e /images dentro do diretório base.
# Você precisa alterar isso para algo como /var/www/phpbb se não estiver usando o importador baseado em Docker.
# Isso só é necessário se você quiser importar avatares, anexos ou smilies personalizados.
phpbb_base_dir: /shared/import/data
site_prefix:
# isso é necessário para reescrever links internos em posts
original: freedomyachts.org # sem http(s)://
new: https://test.freedomyachts.org # com http:// ou https://
# Ative isso, se você quiser redirecionar links antigos do fórum para os novos locais.
permalinks:
categories: true # redireciona /viewforum.php?f=1 para /c/category-name
topics: true # redireciona /viewtopic.php?f=6&t=43 para /t/topic-name/81
posts: false # redireciona /viewtopic.php?p=2455#p2455 para /t/topic-name/81/4
# Anexe um prefixo a cada tipo de link, por exemplo, 'forum' para redirecionar /forum/viewtopic.php?f=6&t=43 para /t/topic-na
me/81
# Deixe em branco se o seu fórum não foi instalado em uma subpasta.
prefix:
avatars:
uploaded: true # importa avatares carregados
gallery: true # importa os avatares predefinidos que o phpBB oferece
remote: false # AVISO: Isso pode diminuir consideravelmente a velocidade da sua importação. Ele tentará baixar avatares remotos.
# Quando verdadeiro: usuários anônimos são importados como usuários suspensos. Eles não podem fazer login e não têm endereço de e-mail.
# Quando falso: o usuário do sistema será usado para todos os usuários anônimos.
anonymous_users: true
# Ative isso, se você quiser importar hashes de senha para usar o plugin "migratepassword".
# Isso permitirá que os usuários façam login com sua senha atual.
# O plugin está disponível em: https://github.com/discoursehosting/discourse-migratepassword
passwords: true
# Por padrão, todas as coisas a seguir são importadas. Você pode desativá-las definindo-as como false.
bookmarks: true
attachments: true
private_messages: true
polls: true
# Importa curtidas da extensão "Thanks for posts" do phpBB
likes: false
# Quando verdadeiro: cada usuário importado terá o nome de usuário original do phpBB como seu nome
# Quando falso: o nome de cada usuário importado ficará em branco, a menos que o nome de usuário tenha sido alterado durante a importação
username_as_name: false
# Mapeia Emojis para smilies usados no phpBB. A maioria dos smilies padrão já tem um mapeamento, mas você pode substituir
# os mapeamentos aqui, se não gostar de alguns deles.
# A sintaxe de mapeamento é: nome_do_emoji: 'smiley_no_phpbb'
# Ou mapeia vários smilies para um único Emoji: nome_do_emoji: ['smiley1', 'smiley2']
emojis:
# aqui estão dois exemplos de mapeamentos...
smiley: [':D', ':-D', ':grin:']
heart: ':love:'
# Mapeia campos de perfil personalizados do phpBB para campos de usuário personalizados no Discourse (funciona para phpBB 3.1+)
#
# custom_fields:
# - phpbb_field_name: "company_name"
# discourse_field_name: "Company"
# - phpbb_field_name: "facebook"
# discourse_field_name: "Facebook"
custom_fields: []
Você está sem o nome de usuário e a senha.