Ein IPS 3.1 Forum zu Discourse migrieren

Hallo Discourse-Community,

ich möchte meine Erfahrungen beim Importieren eines IPB 3.1-Forums in Discourse 2.1 teilen, in der Hoffnung, dass dies für andere nützlich sein wird.

Eine kurze Zusammenfassung über die Community:

  • Thema: Yii PHP Framework (Code-bezogene Diskussionen und Support)
  • Mitglieder: ~26.000
  • Themen: ~64.000
  • Beiträge: ~293.000

Der Import dauerte 27 Stunden und 46 Minuten auf einer Maschine mit 16 GB RAM und 4 CPU-Kernen.

Anforderungen für den Import:

  • Mitglieder behalten, aber alle SPAM-Konten bereinigen (~250.000 Konten, von denen nach der Bereinigung ~26.000 übrig bleiben)
  • SSO von der Website implementieren (Benutzerkonten werden nicht von Discourse verwaltet)
  • Themen, Beiträge und Kategorien mit ihren ursprünglichen URLs behalten, damit Web-Suchergebnisse weiterhin funktionieren und auch andere Links von Plattformen wie Stackoverflow

Dies basiert auf Migrating from Invision Power Board to Discourse - #23 by pfaffman, vielen Dank an @pfaffman für die hervorragende Arbeit am Importer.

Vorbereitung

Daten aus IPB exportieren

mysqldump <databasename> > /tmp/ipb.sql
cd /var/www/yiiframework.com/forum/ && tar czvf uploads.tgz uploads/

Kopieren Sie den SQL-Dump und die Uploads auf den neuen Server und legen Sie sie in /var/discourse/shared/standalone/ ab.
Ich gehe hier von einer einfachen Docker-Installation von Discourse aus.

Welches Skript verwenden?

Es gibt zwei Import-Skripte, ipboard.rb und ipboard3.rb. Das Skript ipboard3.rb sieht sehr roh aus und passt auch nicht zu unserem Tabellenschema, daher habe ich mich für ipboard.rb entschieden.

Die aktuelle Version des ipboard.rb-Import-Skripts verarbeitet Anhänge nicht gut und konvertiert auch keine Code-Tags, was für uns sehr wichtig ist, da wir viel über PHP-Code sprechen. Daher habe ich folgende Änderungen am Skript vorgenommen:

Hochgeladene Anhänge verfügbar machen

Das Import-Skript ersetzt Beitragsanhänge durch URLs zur hochgeladenen Datei.
Wenn Sie Ihre IPB-Instanz an der URL, unter der sie vorher war, online halten möchten, können Sie einfach die URL angeben (UPLOADS ist eine Konfiguration des Import-Skripts, siehe unten) zum Upload-Verzeichnis, und Sie sind fertig:

UPLOADS="https://www.yiiframework.com/forum/uploads"

Da wir jedoch zu Discourse importieren, um das alte Forum vollständig zu entfernen, müssen wir die Uploads woanders hinlegen. Wenn Sie einen nginx-Proxy vor Discourse verwenden, können Sie diesen so konfigurieren, dass er die hochgeladenen Dateien aus einem Verzeichnis auf dem Server bereitstellt. Fügen Sie Folgendes in den server-Teil der nginx-Konfiguration ein:

location /ipb_uploads/ {
    alias /var/www/ipb_uploads/;
}

Und konfigurieren Sie die Anhangs-URL (siehe unten) wie folgt:

UPLOADS="https://forum.yiiframework.com/ipb_uploads"

MySQL im Discourse-Container einrichten

Starten Sie eine Bash-Shell im Discourse-App-Container:

docker exec -it app bash

Installieren Sie im Container MySQL und importieren Sie die Datenbank:

apt-get install mysql-server mysql-client libmysqlclient-dev
service mysql start
echo "create database ipb" | mysql -uroot -p
mysql -uroot -p ipb < /shared/ipb.sql

Als ich den ersten Import zum Testen des Skripts versuchte, lief er über mehrere Tage, um 200.000 Benutzer zu importieren, von denen wir wussten, dass ein großer Teil SPAM-Konten waren. Daher haben wir einige SQL-Abfragen erstellt, um Konten zu löschen, die nie etwas gepostet haben:

Beachten Sie, dass wir SSO verwenden werden, sodass gelöschte Benutzer beim Einloggen neu erstellt werden.
Wenn Sie kein SSO verwenden, können Ihre Kriterien für das Löschen von Benutzern anders sein.
Sie können Ihre Daten auch ohne Bereinigung importieren.

mysql -uroot -p
# dann die Bereinigungsabfragen anwenden

Als Nächstes müssen wir Abhängigkeiten für das Import-Skript installieren:

cd /var/www/discourse
echo "gem 'mysql2'" >>Gemfile
echo "gem 'reverse_markdown'" >>Gemfile
bundle install --no-deployment

Um den Datenbankzugriff auf die Discourse-Postgres-Datenbank zu ermöglichen, ersetzen Sie peer durch trust in /etc/postgresql/10/main/pg_hba.conf. Beachten Sie, dass 10 für die Postgres-Version steht. Wenn die Datei in Ihrer Einrichtung nicht existiert, ersetzen Sie 10 durch die Version von Postgres, die Sie aktuell verwenden.
Starten Sie Postgres neu, um die Änderungen zu laden: service postgresql restart

Importieren

Vorbereiten von Avataren und hochgeladenen Dateien:

mkdir /shared/imports
mv /shared/uploads.tgz /shared/imports
cd /shared/imports && tar xzvf uploads.tgz

Führen Sie das Import-Skript aus:

cd /var/www/discourse
DB_HOST="localhost" DB_NAME="yiisite" DB_USER="root" DB_PW="root" TABLE_PREFIX="ipb_" IMPORT_AFTER="1970-01-01" UPLOADS="https://www.forum.yiiframework.com/ipb_uploads" AVATARS_DIR="/shared/imports/uploads/" USERDIR="user" bundle exec ruby script/import_scripts/ipboard.rb | tee import.log

Stellen Sie sicher, dass die UPLOADS-URL wie oben besprochen angepasst wird, da Uploads in den Beiträgen als Links zur ursprünglichen hochgeladenen Datei enthalten sein werden.

Bereinigung

Wenn alles gut gelaufen ist, bereinigen Sie mit service mysql stop, apt-get purge mysql-server, rm -rf /var/lib/mysql

Einrichtung der URL-Weiterleitung

Um bestehende URLs zum Forum intakt zu halten, erstellt das Import-Skript Permalinks für jedes Thema, die die URL der Themen und Kategorien in IPB widerspiegeln.
Diese Permalinks decken jedoch keine Links zu bestimmten Beiträgen in einem Thema oder verschiedene Seiten ab.
Damit diese URLs ordnungsgemäß funktionieren, müssen Sie einige URL-Umschreibungsregeln konfigurieren. Es gibt 3 Optionen:

  • Verwenden der Einstellung permalink normalizations in Discourse, um unnötige Teile aus den URLs zu entfernen
  • Umschreibungsregeln in nginx, wenn Sie einen nginx-Proxy vor Discourse haben
  • Wenn das alte Forum an einer anderen URL/Host als Discourse war, können Sie ein benutzerdefiniertes Skript zur Umschreibung der URLs verwenden (das habe ich getan)

Hier ist der PHP-Code, den wir für die URL-Weiterleitung verwenden:

Verwandte Ressourcen

18 „Gefällt mir“

Hallo,

es tut mir leid, dass ich diesen alten Thread wieder aufwärme, aber ich plane ebenfalls, von IPB (v3.4) zu Discourse zu migrieren und befolge diese howto. Daher habe ich beschlossen, direkt in diesem Thread zu antworten, anstatt einen neuen zu erstellen.

Das mysql-Paket ist nicht mehr in der Distribution enthalten, also habe ich mich an diese Anleitung gehalten:

wget http://repo.mysql.com/mysql-apt-config_0.8.13-1_all.deb
sudo dpkg -i mysql-apt-config_0.8.13-1_all.deb
sudo apt update
sudo apt install mysql-server mysql-client libmysqlclient-deb
service mysql start

Daraufhin erhalte ich jedoch den folgenden Fehler:
mysql: unrecognized service

Habt ihr eine Idee, wie ich MySQL starten kann?

Vielen Dank

Gab es Fehler, als Sie die Befehle ausgeführt haben, die es hätten installieren sollen? Ich empfehle eine Google-Suche.

Außerdem möchten Sie vielleicht das ipb-Skript verwenden, das Teil von Discourse ist, anstatt des im OP genannten.

Gibt es ein Update für dieses Skript, da es nicht mit IPB 4x funktioniert und auch nicht mit Discourse selbst kompatibel ist, da sich die Tabellenstruktur geändert hat und das Skript unverändert geblieben ist?

1 „Gefällt mir“

Ich führe gerade einen ipboard-Import durch. Ich musste einige Tabellen und Zeilen aus einigen der Abfragen entfernen. Es scheint, dass sie viele verschiedene Tabellenkonfigurationen haben.

Es ist auch schwierig, die rohen ipb-Beiträge in Markdown zu übertragen.

Wenn Sie ein Budget haben, können Sie mich kontaktieren. Ich kann Ihnen möglicherweise den Code geben, den ich für den aktuellen Import habe, aber er muss wahrscheinlich für Ihre spezielle Einrichtung angepasst werden.

2 „Gefällt mir“

to help you, IPB 4x tables is as follow:

mysql> SHOW TABLES;
+-------------------------------------------+
| Tables_in_ipboard                         |
+-------------------------------------------+
| ipb_bbcode_mediatag                       |
| ipb_ccs_folders                           |
| ipb_cms_blocks                            |
| ipb_cms_containers                        |
| ipb_cms_custom_database_1                 |
| ipb_cms_custom_database_2                 |
| ipb_cms_database_categories               |
| ipb_cms_database_comments                 |
| ipb_cms_database_fields                   |
| ipb_cms_database_fields_reciprocal_map    |
| ipb_cms_database_fields_thumbnails        |
| ipb_cms_database_reviews                  |
| ipb_cms_database_revisions                |
| ipb_cms_databases                         |
| ipb_cms_folders                           |
| ipb_cms_media                             |
| ipb_cms_media_folders                     |
| ipb_cms_page_database_map                 |
| ipb_cms_page_widget_areas                 |
| ipb_cms_pages                             |
| ipb_cms_template_conflicts                |
| ipb_cms_templates                         |
| ipb_cms_url_store                         |
| ipb_core_achievements_log                 |
| ipb_core_achievements_log_milestones      |
| ipb_core_achievements_rules               |
| ipb_core_acp_notifcations_dismissals      |
| ipb_core_acp_notifications                |
| ipb_core_acp_notifications_preferences    |
| ipb_core_acp_search_index                 |
| ipb_core_acp_tab_order                    |
| ipb_core_acronyms                         |
| ipb_core_admin_login_logs                 |
| ipb_core_admin_logs                       |
| ipb_core_admin_permission_rows            |
| ipb_core_advertisements                   |
| ipb_core_alerts                           |
| ipb_core_alerts_seen                      |
| ipb_core_announcements                    |
| ipb_core_anonymous_posts                  |
| ipb_core_api_keys                         |
| ipb_core_api_logs                         |
| ipb_core_api_webhook_fires                |
| ipb_core_api_webhooks                     |
| ipb_core_applications                     |
| ipb_core_approval_queue                   |
| ipb_core_archive_log                      |
| ipb_core_archive_restore                  |
| ipb_core_attachments                      |
| ipb_core_attachments_map                  |
| ipb_core_automatic_moderation_pending     |
| ipb_core_automatic_moderation_rules       |
| ipb_core_automatic_moderation_types       |
| ipb_core_badges                           |
| ipb_core_banfilters                       |
| ipb_core_bulk_mail                        |
| ipb_core_cache                            |
| ipb_core_club_pages                       |
| ipb_core_clubs                            |
| ipb_core_clubs_fields                     |
| ipb_core_clubs_fieldvalues                |
| ipb_core_clubs_memberships                |
| ipb_core_clubs_node_map                   |
| ipb_core_contact_verify                   |
| ipb_core_content_featured                 |
| ipb_core_content_meta                     |
| ipb_core_deletion_log                     |
| ipb_core_dev                              |
| ipb_core_edit_history                     |
| ipb_core_editor_stored_replies            |
| ipb_core_email_templates                  |
| ipb_core_emoticons                        |
| ipb_core_error_logs                       |
| ipb_core_file_logs                        |
| ipb_core_file_storage                     |
| ipb_core_files                            |
| ipb_core_files_temp                       |
| ipb_core_follow                           |
| ipb_core_follow_count_cache               |
| ipb_core_geoip_cache                      |
| ipb_core_googleauth_used_codes            |
| ipb_core_group_promotions                 |
| ipb_core_groups                           |
| ipb_core_hooks                            |
| ipb_core_hooks_files                      |
| ipb_core_ignored_users                    |
| ipb_core_incoming_emails                  |
| ipb_core_inline_messages                  |
| ipb_core_ips_bulletins                    |
| ipb_core_item_markers                     |
| ipb_core_item_member_map                  |
| ipb_core_item_redirect                    |
| ipb_core_item_statistics_cache            |
| ipb_core_javascript                       |
| ipb_core_leaders                          |
| ipb_core_leaders_groups                   |
| ipb_core_like_cache                       |
| ipb_core_log                              |
| ipb_core_login_failures                   |
| ipb_core_login_handlers                   |
| ipb_core_login_links                      |
| ipb_core_login_methods                    |
| ipb_core_mail_error_logs                  |
| ipb_core_member_badges                    |
| ipb_core_member_history                   |
| ipb_core_member_privacy_actions           |
| ipb_core_member_ranks                     |
| ipb_core_member_recognize                 |
| ipb_core_member_status_replies            |
| ipb_core_member_status_updates            |
| ipb_core_members                          |
| ipb_core_members_feature_seen             |
| ipb_core_members_known_devices            |
| ipb_core_members_known_ip_addresses       |
| ipb_core_members_logins                   |
| ipb_core_members_warn_actions             |
| ipb_core_members_warn_logs                |
| ipb_core_members_warn_reasons             |
| ipb_core_menu                             |
| ipb_core_message_posts                    |
| ipb_core_message_topic_user_map           |
| ipb_core_message_topics                   |
| ipb_core_moderator_logs                   |
| ipb_core_moderators                       |
| ipb_core_modules                          |
| ipb_core_notification_defaults            |
| ipb_core_notification_preferences         |
| ipb_core_notifications                    |
| ipb_core_notifications_pwa_keys           |
| ipb_core_notifications_pwa_queue          |
| ipb_core_oauth_authorize_prompts          |
| ipb_core_oauth_clients                    |
| ipb_core_oauth_server_access_tokens       |
| ipb_core_oauth_server_authorization_codes |
| ipb_core_output_cache                     |
| ipb_core_permission_index                 |
| ipb_core_pfields_content                  |
| ipb_core_pfields_data                     |
| ipb_core_pfields_groups                   |
| ipb_core_plugins                          |
| ipb_core_points_log                       |
| ipb_core_polls                            |
| ipb_core_post_before_registering          |
| ipb_core_profanity_filters                |
| ipb_core_profile_completion               |
| ipb_core_profile_steps                    |
| ipb_core_question_and_answer              |
| ipb_core_queue                            |
| ipb_core_ratings                          |
| ipb_core_rc_author_notification_text      |
| ipb_core_rc_comments                      |
| ipb_core_rc_index                         |
| ipb_core_rc_reports                       |
| ipb_core_reactions                        |
| ipb_core_referral_banners                 |
| ipb_core_referrals                        |
| ipb_core_reputation_index                 |
| ipb_core_reputation_leaderboard_history   |
| ipb_core_reputation_levels                |
| ipb_core_rss_export                       |
| ipb_core_rss_import                       |
| ipb_core_rss_imported                     |
| ipb_core_s3_deletions                     |
| ipb_core_saved_charts                     |
| ipb_core_search_index                     |
| ipb_core_search_index_item_map            |
| ipb_core_search_index_tags                |
| ipb_core_security_answers                 |
| ipb_core_security_questions               |
| ipb_core_seo_meta                         |
| ipb_core_sessions                         |
| ipb_core_share_links                      |
| ipb_core_sitemap                          |
| ipb_core_social_promote                   |
| ipb_core_social_promote_content           |
| ipb_core_social_promote_sharers           |
| ipb_core_soft_delete_log                  |
| ipb_core_solved_index                     |
| ipb_core_spam_service_log                 |
| ipb_core_spam_whitelist                   |
| ipb_core_statistics                       |
| ipb_core_store                            |
| ipb_core_stream_subscriptions             |
| ipb_core_streams                          |
| ipb_core_sys_conf_settings                |
| ipb_core_sys_cp_sessions                  |
| ipb_core_sys_lang                         |
| ipb_core_sys_lang_words                   |
| ipb_core_sys_login                        |
| ipb_core_sys_settings_titles              |
| ipb_core_sys_social_group_members         |
| ipb_core_sys_social_groups                |
| ipb_core_tags                             |
| ipb_core_tags_cache                       |
| ipb_core_tags_perms                       |
| ipb_core_tasks                            |
| ipb_core_tasks_log                        |
| ipb_core_theme_conflict                   |
| ipb_core_theme_content_history            |
| ipb_core_theme_css                        |
| ipb_core_theme_resources                  |
| ipb_core_theme_settings_fields            |
| ipb_core_theme_settings_values            |
| ipb_core_theme_templates                  |
| ipb_core_themes                           |
| ipb_core_upgrade_history                  |
| ipb_core_validating                       |
| ipb_core_view_updates                     |
| ipb_core_voters                           |
| ipb_core_widget_areas                     |
| ipb_core_widget_trash                     |
| ipb_core_widgets                          |
| ipb_custom_bbcode                         |
| ipb_forums_answer_ratings                 |
| ipb_forums_archive_posts                  |
| ipb_forums_archive_rules                  |
| ipb_forums_forums                         |
| ipb_forums_posts                          |
| ipb_forums_question_ratings               |
| ipb_forums_topic_mmod                     |
| ipb_forums_topics                         |
| ipb_forums_view_method                    |
| ipb_nexus_alternate_contacts              |
| ipb_nexus_billing_agreements              |
| ipb_nexus_cart_uploads                    |
| ipb_nexus_coupons                         |
| ipb_nexus_customer_addresses              |
| ipb_nexus_customer_cards                  |
| ipb_nexus_customer_fields                 |
| ipb_nexus_customer_spend                  |
| ipb_nexus_customers                       |
| ipb_nexus_donate_goals                    |
| ipb_nexus_donate_logs                     |
| ipb_nexus_eom                             |
| ipb_nexus_fraud_rules                     |
| ipb_nexus_invoice_tracker                 |
| ipb_nexus_invoices                        |
| ipb_nexus_licensekeys                     |
| ipb_nexus_member_subscription_packages    |
| ipb_nexus_member_subscriptions            |
| ipb_nexus_notes                           |
| ipb_nexus_package_base_prices             |
| ipb_nexus_package_fields                  |
| ipb_nexus_package_filters                 |
| ipb_nexus_package_filters_map             |
| ipb_nexus_package_filters_values          |
| ipb_nexus_package_groups                  |
| ipb_nexus_package_images                  |
| ipb_nexus_packages                        |
| ipb_nexus_packages_ads                    |
| ipb_nexus_packages_products               |
| ipb_nexus_paymethods                      |
| ipb_nexus_payouts                         |
| ipb_nexus_product_options                 |
| ipb_nexus_purchases                       |
| ipb_nexus_referral_rules                  |
| ipb_nexus_reviews                         |
| ipb_nexus_ship_orders                     |
| ipb_nexus_shipping                        |
| ipb_nexus_support_default_content         |
| ipb_nexus_support_departments             |
| ipb_nexus_support_fields                  |
| ipb_nexus_support_notify                  |
| ipb_nexus_support_ratings                 |
| ipb_nexus_support_replies                 |
| ipb_nexus_support_request_log             |
| ipb_nexus_support_requests                |
| ipb_nexus_support_severities              |
| ipb_nexus_support_staff_dpt_order         |
| ipb_nexus_support_staff_preferences       |
| ipb_nexus_support_statuses                |
| ipb_nexus_support_stock_actions           |
| ipb_nexus_support_streams                 |
| ipb_nexus_support_tracker                 |
| ipb_nexus_support_views                   |
| ipb_nexus_tax                             |
| ipb_nexus_transactions                    |
| ipb_rc_reports_index                      |
| x_utf_ipb_convert_session                 |
| x_utf_ipb_convert_session_tables          |
+-------------------------------------------+