Отлично! Рад, что вы справились. В чём была хитрость?
Надеюсь, вам не понадобится это: Discourse Migration - Literate Computing
Отлично! Рад, что вы справились. В чём была хитрость?
Надеюсь, вам не понадобится это: Discourse Migration - Literate Computing
Мне пришлось многократно запускать скрипт import_phpbb3.sh, пока все категории не были импортированы. Скрипт работал всю ночь, но из-за сбоя в сети возникла ошибка с моей стороны. Я перезапустил скрипт, и, похоже, теперь он работает. Если возникнут ещё проблемы, мне придётся зайти и почистить таблицу MySQL.
Всем привет! Форум в основном работает… выглядит отлично. Я пишу скрипт для модификации тега [/quote]. Доска довольно старая, с 2001 года, и простое добавление пробела над и под закрывающим тегом решает множество проблем. Уверен, что в скрипте импорта можно было бы изменить настройку, но это моя первая миграция, поэтому я учусь в процессе.
Вопрос: Я исправляю данные за 10 лет, и у меня уже работает живая доска phpBB. Это занимает немного времени. Могу ли я использовать скрипт import_phpbb3.sh для импорта последних X дней сообщений с моего форума? Кажется, для скрипта это просто слияние. Я могу экспортировать данные за последние 7 дней из MySQL, но не уверен, сработает ли это. Мнения?
Я ещё не проверил, работает ли скрипт… Я тестировал его на небольших частях, но не в пакетном режиме. Проблема, с которой я столкнулся, — это пробел над и под закрывающим тегом. Теперь я пойду покосить газон, а потом вернусь и проверю позже:
batch_size = 1000
total_processed = 0
# Обрабатываем сообщения по всему сайту пакетами
Post.find_in_batches(batch_size: batch_size) do |batch|
updated_posts = []
batch.each do |post|
original_raw = post.raw
# Применяем исправление
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) # Прямое обновление колонки, чтобы пропустить обратные вызовы
updated_posts << post
total_processed += 1
end
end
# Переформируем только обновлённые сообщения, чтобы минимизировать нагрузку
updated_posts.each(&:rebake!)
puts "Обработан пакет из #{batch.size} элементов. Всего обработано на данный момент: #{total_processed}."
end
puts "Всего обработано #{total_processed} сообщений по всему сайту."
Это работало для отдельных постов:
post = Post.find(344572) # Замените 344572 на правильный ID
post.raw = post.raw.gsub(/\n\n[/quote]\n\n\n/, “\n\n[/quote]\n\n”)
Я бы модифицировал скрипт, чтобы он делал это при импорте данных. Меня удивляет, что такой функции нет по умолчанию. Стоит внимательно разобраться в этом вопросе.
В нескольких скриптах, над которыми я работал, я добавлял настройку окружения IMPORT_AFTER и изменял запросы так, чтобы они включали условие where some_timestamp > import_after_data. Не думаю, что в этом скрипте есть такая опция, но я не уделял этому пристального внимания.
Однако имейте в виду: данные десятилетней давности, скорее всего, отличаются от данных за последние два года. Поэтому тестирование только на свежих данных отлично подходит для отладки проблем, которые встречаются повсеместно, но вам также потребуется протестировать скрипт на всей базе данных.
Всё это смешано в кучу. Импорт завершён на 99%… Мне осталось только вернуться и подтянуть посты за последнюю неделю
Как только будут добавлены переносы строк и это исправлено <LINK_TEXT text= всё будет в порядке ![]()
Вот что я сделал, чтобы очистить большую часть своих сообщений после импорта. Я попросил ИИ объяснить это кому-то, кто переходит с PhpBB. Я сидел до 5 утра, пытаясь заставить это работать ![]()
![]()
![]()
Чтобы запустить Ruby-скрипт в вашей среде Discourse, который обрабатывает темы форума партиями по 1000 и применяет определенные преобразования к каждому сообщению в этих темах, вам нужно выполнить последовательность действий для доступа к серверу, входа в соответствующую среду и запуска скрипта. Ниже приведена подробная инструкция вместе с самим скриптом:
Используя клиент безопасной оболочки (SSH), например PuTTY для Windows, подключитесь к серверу, на котором размещен форум Discourse. Вам понадобятся IP-адрес или доменное имя сервера, а также учетные данные (имя пользователя и пароль или SSH-ключ).
После входа на сервер перейдите в каталог установки Discourse, обычно /var/discourse. Затем войдите в контейнер Docker, в котором работает Discourse, используя следующие команды:
bash
cd /var/discourse
./launcher enter app
Внутри контейнера Docker вы можете взаимодействовать с вашим приложением Discourse через консоль Rails. Это среда Ruby on Rails, которая позволяет запускать код Ruby напрямую против базы данных и логики приложения Discourse. Запустите консоль командой:
bash
rails c
С открытой консолью Rails вы готовы запустить Ruby-скрипт. Скрипт должен быть подготовлен заранее и скопирован в буфер обмена. В PuTTY вы можете вставить скрипт, щелкнув правой кнопкой мыши или нажав Shift + Insert.
Вот полный скрипт, который вы будете использовать:
code
# Получение массива всех ID тем
topic_ids = Topic.pluck(:id)
# Определение размера партии
batch_size = 1000
current_batch_start = 0
while current_batch_start < topic_ids.length
# Обработка партии из 1000 тем за раз
topic_ids[current_batch_start, batch_size].each do |topic_id|
# Получение темы по ID
topic = Topic.find(topic_id)
# Пропуск, если тема равна nil
next if topic.nil?
# Инициализация счетчика преобразованных сообщений для этой темы
transformed_count = 0
# Перебор каждого сообщения в теме
topic.posts.each do |post|
# Флаг для отслеживания, были ли выполнены преобразования
transformed = false
# Применение преобразований
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?
# Сохранение и повторная обработка сообщения, если были выполнены преобразования
if transformed
post.save!
post.rebake!
transformed_count += 1
end
end
# Вывод результата для текущей темы
if transformed_count > 0
puts "Преобразовано #{transformed_count} сообщений в теме #{topic_id}."
else
puts "Для темы #{topic_id} преобразования не потребовались."
end
end
# Обновление начального индекса для следующей партии
current_batch_start += batch_size
# Проверка, есть ли еще темы для обработки
if current_batch_start < topic_ids.length
puts "Завершена партия из #{batch_size} тем. Хотите продолжить к следующей партии? (да/нет)"
response = gets.strip.downcase
break unless response == 'да'
end
end
Вот как это должно выглядеть во время выполнения.
Для темы 19556 преобразования не потребовались.
Для темы 35766 преобразования не потребовались.
Для темы 35783 преобразования не потребовались.
Для темы 35778 преобразования не потребовались.
Для темы 35774 преобразования не потребовались.
Для темы 35770 преобразования не потребовались.
Преобразовано 292 сообщения в теме 20234.
Для темы 35781 преобразования не потребовались.
Для темы 35779 преобразования не потребовались.
Преобразовано 242 сообщения в теме 20218.
Преобразовано 22 сообщения в теме 19522.
Для темы 35771 преобразования не потребовались.
Для темы 35767 преобразования не потребовались.
Преобразовано 2 сообщения в теме 22560.
Для темы 35797 преобразования не потребовались.
Для темы 35789 преобразования не потребовались.
Для темы 35785 преобразования не потребовались.
Для темы 31889 преобразования не потребовались.
Преобразовано 1 сообщение в теме 31831.
Для темы 31792 преобразования не потребовались.
Для темы 35794 преобразования не потребовались.
Для темы 35815 преобразования не потребовались.
Я получаю эту ошибку (после миграции, на работающей стандартной установке) при попытке изменить отображаемое имя пользователя (не имя учётной записи), чтобы включить специальные символы. При попытке появляется всплывающее окно «внутренняя ошибка сервера», а в логах отображается та же ошибка, что и у @DDo.
Заметно, что другие пользователи могут изменять свои отображаемые имена, включая тот же символ (™). Ключевое различие, по-видимому, заключается в том, что пользователи, вошедшие в систему после миграции, могут использовать символы UTF-8, тогда как пользователи, которые ещё не входили в систему, могут использовать только ASCII-8BIT.
Я также предполагаю, что эта ошибка будет устранена после удаления плагина discourse-migratepassword, но пока не проверял это.
Является ли это ошибкой или чем-то неотъемлемым для работы этого плагина? Если это ошибка, лучше ли создать запрос в GitHub для её сообщения?
Хм, пытаюсь (пере)собрать контейнер для импорта, но это не удаётся:
FAILED
--------------------
Errno::ENOENT: No such file or directory @ rb_sysopen - /etc/service/unicorn/run
Location of failure: /usr/local/lib/ruby/gems/3.2.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.
Я уже отключил все плагины, но изменений нет.
У кого-нибудь есть идеи?
Итак, это первая идея.
Да, я ничего не нашел, что показывало бы или указывало на ошибку… Я посмотрю еще раз…
hooks:
after_web_config:
- exec:
cd: /etc/service
cmd:
# - rm -R unicorn
- rm -R nginx
- rm -R cron
Я закомментировал строку - rm -R unicorn в файле templates/import/phpbb3.template.yml, и сборка прошла без ошибок.
Что здесь произошло? phpbb3.template.yml — это версия из GitHub, которой два года. Значит, где-то должно быть изменение?!?
Это может быть связано с тем, что они перешли с Ubuntu на Debian. Такие файлы, скорее всего, обновляются только тогда, когда кто-то замечает, что они перестали работать.
Мне не совсем понятно, почему именно rm вызвал проблему, но я не особо слежу за такими вещами, если мне за это не платят. И даже в этом случае я не помню, чтобы уделял тому конкретному случаю много внимания. ![]()
Я подумал, что если сборщик жалуется на отсутствие /etc/service/unicorn/run, а именно этот путь удаляется, то я попробовал закомментировать команду удаления.
Сработало.
Возможно, кто-то с более глубокими знаниями во всём этом захочет проверить и внести обновление в скрипт на Github. Я тоже мог бы сделать PR, но без знаний во всём этом не хочу.
Но переход с Ubuntu на Debian действительно многое меняет, правда.
Прежде всего, я новичок в Docker, поэтому есть большая вероятность, что я просто что-то напортачил.
У меня чистая установка Discourse на Droplet от DigitalOcean с Ubuntu 22.04, используя их готовое приложение. Форум собрался без проблем и работает в стандартной конфигурации.
Когда я выполняю /var/discourse/launcher rebuild import, в конце сборки я получаю следующее:
Errno::ENOENT: No such file or directory @ rb_sysopen - /etc/service/unicorn/run
Место ошибки: /usr/local/lib/ruby/gems/3.3.0/gems/pups-1.2.1/lib/pups/replace_command.rb:11:in `read'
Замена не удалась с параметрами {"tag"=>"precompile", "filename"=>"/etc/service/unicorn/run", "from"=>"PRECOMPILE_ON_BOOT=1", "to"=>"PRECOMPILE_ON_BOOT=0"}
Загрузка не удалась с кодом выхода 1
** СБОЙ ЗАГРУЗКИ ** Пожалуйста, прокрутите вверх и поищите более ранние сообщения об ошибках, их может быть больше одной.
./discourse-doctor может помочь диагностировать проблему.
Когда я выполняю: /var/discourse/launcher enter import, я получаю:
Обнаружена архитектура 86_64.
Ошибка ответа от демона: Контейнер не найден: import
Это связано с ошибками в начале этого сообщения (и если да, то как их исправить), или я что-то делаю не так?
Вы создали import.yml и настроили этот контейнер так, как (я почти уверен) указано в инструкции?
Инструкция показывает, как скопировать app.yml в import.yml и добавить «templates/import/phpbb3.template.yml» в import.yml (что я и сделал). Затем вы пересобираете import, что вызывает ошибку в моём первом сообщении. Я не вижу, где есть какие-либо инструкции по созданию bootstrap(?).
Инструкция довольно простая, поэтому я не понимаю, что идёт не так.
# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
81a2f335fd01 local_discourse/app "/sbin/boot" 14 hours ago Up 11 hours 0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp app
Извините. Команда Rebuild выполняет начальную настройку (bootstrap). Если процесс завершён, значит контейнер импорта был запущен.
О, извините ещё раз. Я не понял, что происходило ранее. Похоже, что шаблон phpbb3 может быть несовместим с недавними изменениями в discourse_docker. Но больше я ничего не могу сказать с телефона.
Думаю, если вы удалите строку в шаблоне phpbb3, которая удаляет «/etc/service/unicorn/run», это может позволить сборке завершиться.
Джей, спасибо за ответ на этот вопрос. Сборка теперь завершается корректно.
Следующая проблема: при выполнении команды import_phpbb3.sh я получаю:
Начинается импорт phpBB3...
/usr/local/lib/ruby/3.3.0/psych/parser.rb:62:in `_native_parse': (<unknown>): при парсинге блочного отображения на строке 3, столбце 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>'
Я предполагаю, что что-то в моём файле settings.yml вызывает ошибку. Как узнать, на чём именно скрипт «спотыкается»?
database:
type: MySQL # в настоящее время поддерживается только MySQL
host: localhost
port: 3306
username:
password:
schema: phpbb
table_prefix: phpbb_ # Измените это, если ваш форум использует другой префикс. Обычно все имена таблиц начинаются с phpbb_
batch_size: 1000 # Не меняйте это, если не знаете, что делаете. Значение по умолчанию (1000) должно работать нормально.
import:
# Установите это значение, если вы импортируете несколько форумов phpBB в один форум Discourse.
#
# Например, при импорте нескольких сайтов добавьте префикс 'first' ко всем импортируемым ID,
# чтобы избежать конфликтов. Последующие запуски импорта должны иметь другое значение 'site_name'.
#
# site_name: first
#
site_name: Freedom Owners Forum
# Создание новых категорий
#
# Например, для создания родительской категории и подкатегории.
#
# new_categories:
# - forum_id: foo
# name: Категория Foo
# - forum_id: bar
# name: Категория Bar
# parent_id: foo
#
new_categories:
- forum_id: general
name: Общее
- forum_id: systems
name: Системы лодок
- forum_id: photos
name: Фотографии
- forum_id: docs
name: Руководства и документация
- forum_id: buy
name: Купить/Продать/Обменять
- forum_id: site
name: Использование сайта
- forum_id: archives
name: Архивы
# Сопоставление категорий
#
# * "source_category_id" — ID форума в phpBB3
# * "target_category_id" — либо ID форума из phpBB3, либо "forum_id"
# из настройки "new_categories" (см. выше)
# * "discourse_category_id" — ID категории в Discourse
# * "skip" позволяет игнорировать категорию во время импорта
#
# Используйте "target_category_id", если хотите объединить категории, и
# "discourse_category_id", если хотите импортировать форум в существующую
# категорию 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
# Сопоставление тегов
#
# Например, импортированные темы из категории phpBB 1 будут помечены тегом
# 'first-category' и т.д.
#
# tag_mappings:
# 1:
# - first-category
# 2:
# - second-category
# 3:
# - third-category
#
tag_mappings: {}
# Сопоставление рангов и уровней доверия
#
# Сопоставление уровней рангов phpBB 3.x с уровнями доверия
# Пользователи с рангом не менее 3000 получат TL3 и т.д.
#
rank_mapping:
trust_level_1: 200
trust_level_2: 1000
trust_level_3: 3000
# rank_mapping: {}
# ВНИМАНИЕ: Не активируйте эту опцию, если не знаете, что делаете.
# Это, вероятно, сломает конвертацию BBCode в Markdown и замедлит импорт.
use_bbcode_to_md: false
# Это путь к корневой директории вашей текущей установки phpBB (или её копии).
# Импортер ожидает найти директории /files и /images внутри базовой директории.
# Вам нужно изменить это на что-то вроде /var/www/phpbb, если вы не используете импортер на основе Docker.
# Это необходимо только в том случае, если вы хотите импортировать аватары, вложения или пользовательские смайлы.
phpbb_base_dir: /shared/import/data
site_prefix:
# это необходимо для переписывания внутренних ссылок в сообщениях
original: freedomyachts.org # без http(s)://
new: https://test.freedomyachts.org # с http:// или https://
# Включите это, если хотите перенаправлять старые ссылки форума на новые адреса.
permalinks:
categories: true # перенаправляет /viewforum.php?f=1 в /c/category-name
topics: true # перенаправляет /viewtopic.php?f=6&t=43 в /t/topic-name/81
posts: false # перенаправляет /viewtopic.php?p=2455#p2455 в /t/topic-name/81/4
# Добавьте префикс к каждому типу ссылки, например, 'forum', чтобы перенаправить /forum/viewtopic.php?f=6&t=43 в /t/topic-name/81
# Оставьте пустым, если ваш форум был установлен не в подпапке.
prefix:
avatars:
uploaded: true # импортировать загруженные аватары
gallery: true # импортировать предустановленные аватары, предлагаемые phpBB
remote: false # ВНИМАНИЕ: это может значительно замедлить импорт. Будут предприняты попытки загрузить удалённые аватары.
# При значении true: анонимные пользователи импортируются как заблокированные пользователи. Они не могут войти в систему и не имеют адреса электронной почты.
# При значении false: для всех анонимных пользователей будет использоваться системный пользователь.
anonymous_users: true
# Включите это, если хотите импортировать хэши паролей, чтобы использовать плагин "migratepassword".
# Это позволит пользователям войти в систему со своим текущим паролем.
# Плагин доступен по адресу: https://github.com/discoursehosting/discourse-migratepassword
passwords: true
# По умолчанию импортируются все следующие элементы. Вы можете отключить их, установив значение false.
bookmarks: true
attachments: true
private_messages: true
polls: true
# Импортировать лайки из расширения phpBB "Thanks for posts"
likes: false
# При значении true: каждый импортируемый пользователь будет иметь оригинальное имя пользователя из phpBB в качестве своего имени
# При значении false: имя каждого импортируемого пользователя будет пустым, если только имя пользователя не было изменено во время импорта
username_as_name: false
# Сопоставление эмодзи со смайлами, используемыми в phpBB. Большинство стандартных смайлов уже имеют сопоставление, но вы можете переопределить
# их здесь, если вам не нравятся некоторые из них.
# Синтаксис сопоставления: emoji_name: 'smiley_in_phpbb'
# Или сопоставьте несколько смайлов с одним эмодзи: emoji_name: ['smiley1', 'smiley2']
emojis:
# вот два примера сопоставлений...
smiley: [':D', ':-D', ':grin:']
heart: ':love:'
# Сопоставление пользовательских полей профиля из phpBB с пользовательскими полями пользователей в Discourse (работает для phpBB 3.1+)
#
# custom_fields:
# - phpbb_field_name: "company_name"
# discourse_field_name: "Company"
# - phpbb_field_name: "facebook"
# discourse_field_name: "Facebook"
custom_fields: []
Вы не указали имя пользователя и пароль.