Ottimo! Sono contento che tu abbia risolto. Qual è stato il trucco?
Spero che non avrai bisogno di questo Discourse Migration - Literate Computing
Ottimo! Sono contento che tu abbia risolto. Qual è stato il trucco?
Spero che non avrai bisogno di questo Discourse Migration - Literate Computing
Ho dovuto continuare a eseguire import_phpbb3.sh finché tutte le categorie non sono state importate. Lo script è stato eseguito durante la notte e un’interruzione di rete ha causato un errore da parte mia. Ho riavviato lo script e penso che ora funzioni. Se ci saranno altri problemi, dovrò intervenire e pulire la tabella MySQL.
Ciao a tutti! Il forum è quasi completamente funzionante… sembra fantastico. Sto scrivendo uno script per modificare il tag [/quote]. Il forum è piuttosto vecchio, risale al 2001, e aggiungere semplicemente uno spazio sopra e sotto il tag di chiusura risolve molti problemi. Sono sicuro che c’era un’impostazione che avrei potuto aggiornare nello script di importazione, ma è la mia prima volta che migro, quindi sto imparando man mano.
Domanda: Sto correggendo 10 anni di dati e ho un forum phpBB live in esecuzione. Ci sta volendo un po’ di tempo. Posso usare lo script import_phpbb3.sh per importare gli ultimi X giorni di post dal mio forum? Penso che si tratti solo di un’unione per quanto riguarda lo script. Posso esportare gli ultimi 7 giorni di dati da MySQL… ma non so se funzionerebbe. Pensieri?
Non ho verificato se lo script funziona… l’ho testato su piccole parti, ma non in batch. Il problema che ho avuto è stato uno spazio sopra e sotto il tag di chiusura. Ora andrò a tagliare l’erba e tornerò più tardi per controllare:
batch_size = 1000
total_processed = 0
# Processa i post in tutto il sito in batch
Post.find_in_batches(batch_size: batch_size) do |batch|
updated_posts = []
batch.each do |post|
original_raw = post.raw
# Applica la correzione
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) # Aggiornamento diretto della colonna per saltare i callback
updated_posts << post
total_processed += 1
end
end
# Ri-elabora solo i post aggiornati per minimizzare il carico
updated_posts.each(&:rebake!)
puts "Elaborato un batch di #{batch.size}. Totale elaborato finora: #{total_processed}."
end
puts "Totale #{total_processed} post elaborati in tutto il sito."
Questo ha funzionato sui singoli post:
post = Post.find(344572) # Sostituisci 344572 con l’ID corretto
post.raw = post.raw.gsub(/\n\\n\[\/quote\]\\n\n\n/, “\n\n[/quote]\n\n”)
Modificherei lo script per farlo quando importa i dati. Sono sorpreso che non lo faccia già. Vale la pena dare un’occhiata più da vicino alle cose.
Su diversi script su cui ho lavorato, ho aggiunto un’impostazione ENV IMPORT_AFTER e modificato le query per includere where some_timestamp > import_after_data. Non penso che questo ne abbia un’opzione del genere, ma non ci ho prestato molta attenzione.
Ma attenzione, è probabile che le cose presenti nei dati di 10 anni fa siano diverse da quelle degli ultimi 2 anni, quindi testare solo sui dati recenti è ottimo per il debug di cose che sai essere ovunque, ma vorrai testare anche sull’intero database.
C’è un sacco di roba diversa nel mix. L’importazione è completa al 99%… devo solo tornare indietro e recuperare le ultime settimane di post
Una volta aggiunte le interruzioni di riga e risolto questo \u003cLINK_TEXT text= tutto dovrebbe andare bene ![]()
Ecco cosa ho fatto per ripulire una grossa parte dei miei post dopo l’importazione. Ho chiesto all’IA di fornire una spiegazione a qualcuno che proveniva da PhpBB. Sono rimasto sveglio fino alle 5 del mattino cercando di farlo funzionare ![]()
![]()
![]()
Per eseguire uno script Ruby all’interno del tuo ambiente Discourse che elabora gli argomenti del forum in batch di 1000, e applica trasformazioni specifiche a ciascun post all’interno di tali argomenti, seguirai una sequenza di passaggi per accedere al tuo server, entrare nell’ambiente appropriato ed eseguire lo script. Ecco una guida dettagliata che include lo script stesso:
Utilizzando un client Secure Shell (SSH) come PuTTY per Windows, connettiti al tuo server dove è ospitato il forum Discourse. Avrai bisogno dell’indirizzo IP o del nome di dominio del tuo server, nonché delle tue credenziali (nome utente e password o una chiave SSH).
Una volta effettuato l’accesso al tuo server, naviga nella directory di installazione di Discourse, tipicamente /var/discourse. Quindi, entra nel container Docker che esegue Discourse utilizzando i seguenti comandi:
bash
cd /var/discourse
./launcher enter app
All’interno del container Docker, puoi interagire con la tua applicazione Discourse tramite la console Rails. Questo è un ambiente Ruby on Rails che ti consente di eseguire codice Ruby direttamente contro il tuo database e la logica dell’applicazione di Discourse. Avvia la console con:
bash
rails c
Con la console Rails aperta, sei pronto per eseguire lo script Ruby. Lo script dovrebbe essere preparato in anticipo e copiato negli appunti. In PuTTY, puoi incollare lo script facendo clic con il pulsante destro del mouse o premendo Maiusc + Inserisci.
Ecco lo script completo che utilizzerai:
code
# Recupera un array di tutti gli ID degli argomenti
topic_ids = Topic.pluck(:id)
# Definisci la dimensione del batch
batch_size = 1000
current_batch_start = 0
while current_batch_start < topic_ids.length
# Elabora un batch di 1000 argomenti alla volta
topic_ids[current_batch_start, batch_size].each do |topic_id|
# Recupera l'argomento tramite ID
topic = Topic.find(topic_id)
# Salta se l'argomento è nil
next if topic.nil?
# Inizializza un conteggio dei post trasformati per questo argomento
transformed_count = 0
# Itera su ogni post all'interno dell'argomento
topic.posts.each do |post|
# Flag per tracciare se sono state apportate trasformazioni
transformed = false
# Applica le trasformazioni
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 rielabora il post se sono avvenute trasformazioni
if transformed
post.save!
post.rebake!
transformed_count += 1
end
end
# Emette il risultato per l'argomento corrente
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
# Aggiorna l'indice di partenza per il batch successivo
current_batch_start += batch_size
# Verifica se ci sono altri argomenti da elaborare
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
Ecco come dovrebbe apparire durante l’esecuzione.
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.
Sto riscontrando questo errore (post-migrazione, su un’installazione standard funzionante) quando tento di modificare il nome visualizzato di un utente (non il nome utente) per includere caratteri speciali. Ricevo un popup di errore interno del server quando ci provo e i log mostrano lo stesso errore che aveva @DDo.
In particolare, altri utenti sono in grado di modificare il proprio nome visualizzato per includere lo stesso carattere (™). La differenza rilevante sembra essere che gli utenti che hanno effettuato l’accesso post-migrazione possono avere caratteri UTF-8, ma gli utenti che non hanno effettuato l’accesso possono avere solo ASCII-8BIT.
Presumo anche che questo errore verrebbe risolto rimuovendo discourse-migratepassword, ma non l’ho testato.
È un bug o qualcosa di intrinseco al funzionamento di quel plugin? Se la prima, è meglio creare un problema su Github per segnalarlo?
Sto cercando di (ri)costruire un container di importazione ma fallisce:
FAILED
--------------------
Errno::ENOENT: Nessun file o directory di questo tipo @ rb_sysopen - /etc/service/unicorn/run
Posizione del fallimento: /usr/local/lib/ruby/gems/3.2.0/gems/pups-1.2.1/lib/pups/replace_command.rb:11:in `read'
sostituzione fallita con i parametri {"tag"=>"precompile", "filename"=>"/etc/service/unicorn/run", "from"=>"PRECOMPILE_ON_BOOT=1", "to"=>"PRECOMPILE_ON_BOOT=0"}
bootstrap fallito con codice di uscita 1
** IMPOSSIBILE AVVIARE ** si prega di scorrere verso l'alto e cercare messaggi di errore precedenti, potrebbero essercene più di uno.
./discourse-doctor può aiutare a diagnosticare il problema.
Ho già disabilitato tutti i plugin, ma non è cambiato nulla.
Qualcuno ha qualche idea?
Quindi questa è la prima idea.
Sì, non ho trovato nulla che mi indichi un errore… Darò un’altra occhiata…
hooks:
after_web_config:
- exec:
cd: /etc/service
cmd:
# - rm -R unicorn
- rm -R nginx
- rm -R cron
Ho commentato la riga - rm -R unicorn in templates/import/phpbb3.template.yml e la build è andata a buon fine senza errori.
Cosa è successo qui? phpbb3.template.yml è la versione da Github, di due anni fa. Quindi deve esserci stato un cambiamento da qualche altra parte?!?
Potrebbe essere di prima che passassero da Ubuntu a Debian. È probabile che vengano aggiornati solo quando qualcuno si accorge che non funzionano più.
Non ha molto senso per me che rm sia stato un problema, ma non ci presto molta attenzione se qualcuno non mi paga. E anche in quel caso non ricordo di averci prestato molta attenzione. ![]()
Ho pensato che, se il compilatore si lamenta di una mancanza di /etc/service/unicorn/run e viene rimosso esattamente questo, ho provato a commentare questo comando di rimozione.
Ha funzionato.
Forse qualcuno con più conoscenza su tutto vuole verificare e fare un aggiornamento su Github nello script. Posso anche fare una PR, ma senza alcuna conoscenza su tutto, non voglio.
Ma passare da Ubuntu a Debian cambia molto, è vero.
Innanzitutto, sono un neofita di Docker, quindi c’è una buona possibilità che abbia combinato qualcosa.
Ho un’installazione pulita di Discourse su un DigitalOcean Droplet con Ubuntu 22.04 utilizzando la loro app predefinita. Il forum è stato creato correttamente e funziona nella configurazione standard.
Quando eseguo /var/discourse/launcher rebuild import, ottengo quanto segue alla fine della build:
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 eseguo: /var/discourse/launcher enter import
Ottengo:
86_64 arch detected.
Error response from daemon: No such container: import
È a causa degli errori all’inizio di questo post (e se sì, come posso risolverlo), o cosa sto facendo di sbagliato?
Hai creato import.yml e avviato quel container come (sono abbastanza sicuro) dicono le istruzioni?
Le istruzioni mostrano di copiare app.yml in import.yml e di aggiungere “templates/import/phpbb3.template.yml” a import.yml (cosa che ho fatto). Quindi, ricostruisci import, il che genera l’errore nella mia OP. Non riesco a vedere dove ci siano istruzioni sulla creazione di un bootstrap (?).
Le istruzioni sono piuttosto semplici, motivo per cui sono confuso su cosa stia andando storto.
# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
81a2f335fd01 local_discourse/app “/sbin/boot” 14 ore fa Up 11 ore 0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp app
Mi dispiace. Rebuild esegue un bootstrap. Se terminato, il container di import era in esecuzione.
Oh. Mi dispiace molto. Non ho capito cosa stava succedendo prima. Sembra che il template phpbb3 potrebbe essere incompatibile con le recenti modifiche a discourse_docker. Ma questo è tutto ciò che posso dire dal mio telefono.
Penso che se elimini una riga nel template phpbb3 che elimina “/etc/service/unicorn/run”, questo potrebbe far completare la build.
Jay, grazie per la risposta a questo problema. La build ora si completa correttamente.
Problema successivo: quando eseguo: import_phpbb3.sh ottengo:
L'importazione di phpBB3 è in corso...
/usr/local/lib/ruby/3.3.0/psych/parser.rb:62:in `_native_parse': (\u003cunknown\u003e): non ha trovato la chiave attesa durante l'analisi di un blocco di mappatura alla riga 3 colonna 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>'
Suppongo che non gli piaccia qualcosa nel mio file settings.yml. Come faccio a sapere cosa lo sta bloccando?
database:
type: MySQL # attualmente è supportato solo MySQL
host: localhost
port: 3306
username:
password:
schema: phpbb
table_prefix: phpbb_ # Cambia questo, se il tuo forum utilizza un prefisso diverso. Di solito tutti i nomi delle tabelle iniziano con phpbb_
batch_size: 1000 # Non cambiare questo a meno che tu non sappia cosa stai facendo. Il valore predefinito (1000) dovrebbe andare bene.
import:
# Imposta questo se importi più forum phpBB in un unico forum Discourse.
#
# Ad esempio, quando si importano più siti, prefissa tutti gli ID importati
# con 'first' per evitare conflitti. Le successive esecuzioni di importazione devono avere un 'site_name' diverso.
#
# site_name: first
#
site_name: Freedom Owners Forum
# Crea nuove categorie
#
# Ad esempio, per creare una categoria padre e una sottocategoria.
#
# 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
# Mappature delle categorie
#
# * "source_category_id" è l'ID del forum in phpBB3
# * "target_category_id" è un ID del forum da phpBB3 o un "forum_id"
# dall'impostazione "new_categories" (vedi sopra)
# * "discourse_category_id" è un ID di categoria di Discourse
# * "skip" ti permette di ignorare una categoria durante l'importazione
#
# Usa "target_category_id" se vuoi unire le categorie e usa
# "discourse_category_id" se vuoi importare un forum in una categoria esistente
# in 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
# Mappature dei tag
#
# Ad esempio, gli argomenti importati dalla categoria phpBB 1 saranno taggati
# con 'first-category', ecc.
#
# tag_mappings:
# 1:
# - first-category
# 2:
# - second-category
# 3:
# - third-category
#
tag_mappings: {}
# Mappatura del rango a livello di fiducia
#
# Mappa i livelli di rango di phpBB 3.x ai livelli di fiducia
# Gli utenti con rango almeno 3000 avranno TL3, ecc.
#
rank_mapping:
trust_level_1: 200
trust_level_2: 1000
trust_level_3: 3000
# rank_mapping: {}
# ATTENZIONE: Non attivare questa opzione a meno che tu non sappia cosa stai facendo.
# Probabilmente interromperà la conversione da BBCode a Markdown e rallenterà la tua importazione.
use_bbcode_to_md: false
# Questo è il percorso della directory principale della tua attuale installazione phpBB (o una sua copia).
# L'importer si aspetta di trovare le directory /files e /images all'interno della directory base.
# Devi cambiare questo in qualcosa come /var/www/phpbb se non stai usando l'importer basato su Docker.
# Questo è necessario solo se vuoi importare avatar, allegati o smiley personalizzati.
phpbb_base_dir: /shared/import/data
site_prefix:
# questo è necessario per riscrivere i link interni nei post
original: freedomyachts.org # senza http(s)://
new: https://test.freedomyachts.org # con http:// o https://
# Abilita questo, se vuoi reindirizzare i vecchi link del forum alle nuove posizioni.
permalinks:
categories: true # reindirizza /viewforum.php?f=1 a /c/category-name
topics: true # reindirizza /viewtopic.php?f=6&t=43 a /t/topic-name/81
posts: false # reindirizza /viewtopic.php?p=2455#p2455 a /t/topic-name/81/4
# Aggiungi un prefisso a ciascun tipo di link, ad esempio 'forum' per reindirizzare /forum/viewtopic.php?f=6&t=43 a /t/topic-na
me/81
# Lascia vuoto se il tuo forum non è stato installato in una sottodirectory.
prefix:
avatars:
uploaded: true # importa avatar caricati
gallery: true # importa gli avatar predefiniti offerti da phpBB
remote: false # ATTENZIONE: Questo può rallentare considerevolmente la tua importazione. Tenterà di scaricare avatar remoti.
# Quando vero: gli utenti anonimi vengono importati come utenti sospesi. Non possono accedere e non hanno indirizzo email.
# Quando falso: l'utente di sistema verrà utilizzato per tutti gli utenti anonimi.
anonymous_users: true
# Abilita questo, se vuoi importare gli hash delle password per utilizzare il plugin "migratepassword".
# Questo permetterà agli utenti di accedere con la loro password attuale.
# Il plugin è disponibile su: https://github.com/discoursehosting/discourse-migratepassword
passwords: true
# Per impostazione predefinita vengono importate tutte le seguenti cose. Puoi disabilitarle impostandole su false.
bookmarks: true
attachments: true
private_messages: true
polls: true
# Importa i "Mi piace" dall'estensione "Grazie per i post" di phpBB
likes: false
# Quando vero: ogni utente importato avrà il nome utente originale di phpBB come nome
# Quando falso: il nome di ogni utente importato sarà vuoto a meno che il nome utente non sia stato modificato durante l'importazione
username_as_name: false
# Mappa le Emoji agli smiley utilizzati in phpBB. La maggior parte degli smiley predefiniti ha già una mappatura, ma puoi sovrascrivere
# le mappature qui, se non ti piacciono alcune di esse.
# La sintassi della mappatura è: nome_emoji: 'smiley_in_phpbb'
# Oppure mappa più smiley a un'unica Emoji: nome_emoji: ['smiley1', 'smiley2']
emojis:
# qui ci sono due esempi di mappatura...
smiley: [':D', ':-D', ':grin:']
heart: ':love:'
# Mappa i campi del profilo personalizzati da phpBB ai campi utente personalizzati in Discourse (funziona per phpBB 3.1+)
#
# custom_fields:
# - phpbb_field_name: "company_name"
# discourse_field_name: "Company"
# - phpbb_field_name: "facebook"
# discourse_field_name: "Facebook"
custom_fields: []
Mancano il nome utente e la password.