نقل منتدى phpBB3 إلى Discourse

عظيم! يسعدني أنك قمت بحل المشكلة. ما هي الحيلة؟

نأمل ألا تحتاج إلى هذا Discourse Migration - Literate Computing

اضطررت إلى الاستمرار في تشغيل import_phpbb3.sh حتى تم استيراد جميع الفئات. تم تشغيل البرنامج النصي طوال الليل، وتسبب انقطاع في الشبكة في حدوث خطأ من جهتي. أعدت تشغيل البرنامج النصي، وأعتقد أنه يعمل الآن. إذا كانت هناك مشاكل أخرى، فسأضطر إلى الدخول وتنظيف جدول MySQL.

إعجاب واحد (1)

أهلاً بالجميع! المنتدى يعمل بشكل شبه كامل… ويبدو رائعاً. أكتب نصاً برمجياً لتعديل وسم [/quote]. اللوحة قديمة إلى حد ما، وتعود إلى عام 2001، ومجرد إضافة مسافة فوق وتحت الوسم الختامي يصلح الكثير. أنا متأكد من أن هناك إعداداً كان بإمكاني تحديثه في نص الاستيراد، لكنها المرة الأولى التي أقوم فيها بالترحيل، لذا أتعلم أثناء التنقل.

سؤال: أقوم بإصلاح 10 سنوات من البيانات، ولدي لوحة phpBB حية قيد التشغيل. يستغرق الأمر بعض الوقت. هل يمكنني استخدام نص import_phpbb3.sh لاستيراد آخر X أيام من المشاركات من منتدىي؟ أعتقد أنه مجرد دمج فيما يتعلق بالنص. يمكنني تصدير آخر 7 أيام من البيانات من MySQL… لكنني لا أعرف ما إذا كان ذلك سينجح. أفكار؟

لم أتحقق مما إذا كان النص يعمل… اختبرته على أجزاء صغيرة، ولكن ليس على دفعات. المشكلة التي واجهتني كانت مسافة فوق وتحت الوسم الختامي. الآن سأذهب لأقص العشب وأعود للتحقق لاحقاً:

batch_size = 1000
total_processed = 0

# Process posts across the entire site in batches
Post.find_in_batches(batch_size: batch_size) do |batch|
  updated_posts = []

  batch.each do |post|
    original_raw = post.raw
    # Apply the correction
    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)  # Direct column update to skip callbacks
      updated_posts << post
      total_processed += 1
    end
  end

  # Rebake only the updated posts to minimize load
  updated_posts.each(&:rebake!)

  puts "Processed a batch of #{batch.size}. Total processed so far: #{total_processed}."
end

puts "Total #{total_processed} posts processed across the entire site."
إعجاب واحد (1)

نجح هذا على المنشورات الفردية:

post = Post.find(344572) # استبدل 344572 بالمعرف الصحيح

post.raw = post.raw.gsub(/\n\\n\[\/quote\]\\n\n\n/, “\n\n[/quote]\n\n”)

سأقوم بتعديل البرنامج النصي للقيام بذلك عند استيراد البيانات. أنا متفاجئ من أنه لا يفعل ذلك بالفعل. الأمر يستحق إلقاء نظرة فاحصة على الأشياء.

في العديد من البرامج النصية التي عملت عليها، أضفت إعداد بيئة IMPORT_AFTER وقمت بتعديل الاستعلامات لتشمل where some_timestamp > import_after_data. لا أعتقد أن هذا يحتوي على مثل هذا الخيار، لكنني لم أهتم بعناية.

ولكن احذر من أنه من المحتمل أن تكون الأشياء الموجودة في البيانات من 10 سنوات مضت مختلفة عن آخر سنتين، لذا فإن الاختبار على البيانات الحديثة فقط رائع لتصحيح الأخطاء التي تعرف أنها موجودة في كل مكان، وستحتاج أيضًا إلى الاختبار على قاعدة البيانات بأكملها.

إعجاب واحد (1)

هناك مجموعة متنوعة من الأشياء في المزيج. الاستيراد مكتمل بنسبة 99٪ تقريبًا… أحتاج فقط إلى العودة واستيعاب منشورات الأسبوع الماضي :slightly_smiling_face: بمجرد إضافة فواصل الأسطر وإصلاح هذا <LINK_TEXT text= سيكون كل شيء على ما يرام :slight_smile:

إعجاب واحد (1)

إليك ما فعلته لتنظيف جزء كبير من مشاركاتي بعد الاستيراد. طلبت من الذكاء الاصطناعي تقديم شرح لشخص قادم من PhpBB. كنت مستيقظًا حتى الساعة 5 صباحًا أحاول جعل هذا يعمل :rofl::rofl::rofl:

لتشغيل برنامج نصي بلغة Ruby داخل بيئة Discourse الخاصة بك لمعالجة مواضيع المنتدى على دفعات بحجم 1000، وتطبيق تحويلات محددة على كل مشاركة داخل تلك المواضيع، ستتبع سلسلة من الخطوات للوصول إلى خادمك، والدخول إلى البيئة المناسبة، وتنفيذ البرنامج النصي. إليك دليل مفصل يتضمن البرنامج النصي نفسه:

الخطوة 1: الاتصال الآمن بالخادم الخاص بك

باستخدام عميل Secure Shell (SSH) مثل PuTTY لنظام Windows، اتصل بالخادم الخاص بك حيث تتم استضافة منتدى Discourse. ستحتاج إلى عنوان IP أو اسم النطاق الخاص بخادمك، بالإضافة إلى بيانات الاعتماد الخاصة بك (اسم المستخدم وكلمة المرور أو مفتاح SSH).

الخطوة 2: الوصول إلى حاوية Docker الخاصة بـ Discourse

بمجرد تسجيل الدخول إلى خادمك، انتقل إلى دليل تثبيت Discourse، عادةً /var/discourse. ثم، ادخل إلى حاوية Docker التي تشغل Discourse باستخدام الأوامر التالية:

bash

cd /var/discourse
./launcher enter app

الخطوة 3: فتح وحدة تحكم Rails

داخل حاوية Docker، يمكنك التفاعل مع تطبيق Discourse الخاص بك من خلال وحدة تحكم Rails. هذه بيئة Ruby on Rails تسمح لك بتشغيل كود Ruby مباشرة مقابل قاعدة بيانات Discourse ومنطق التطبيق الخاص بك. ابدأ وحدة التحكم باستخدام:

bash

rails c

الخطوة 4: تنفيذ البرنامج النصي Ruby

مع فتح وحدة تحكم Rails، أنت جاهز لتشغيل البرنامج النصي Ruby. يجب إعداد البرنامج النصي مسبقًا ونسخه إلى الحافظة الخاصة بك. في PuTTY، يمكنك لصق البرنامج النصي بالنقر بزر الماوس الأيمن أو بالضغط على Shift + Insert.

إليك البرنامج النصي الكامل الذي ستستخدمه:

code

# استرداد مصفوفة من جميع معرفات المواضيع
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|
    # جلب الموضوع حسب المعرف
    topic = Topic.find(topic_id)

    # تخطي إذا كان الموضوع فارغًا
    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 #{transformed_count} posts in topic #{topic_id}."
    else
      puts "No transformations were necessary for topic #{topic_id}."
    end
  end

  # تحديث فهرس البداية للدفعة التالية
  current_batch_start += batch_size

  # التحقق مما إذا كانت هناك مواضيع أخرى للمعالجة
  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

فهم البرنامج النصي ومعالجة الدُفعات

  • معالجة الدُفعات: تسمح لك هذه الطريقة بالتعامل مع مجموعات كبيرة من البيانات في أجزاء صغيرة يمكن التحكم فيها. إنها مفيدة بشكل خاص لتقليل الحمل على الخادم وللعمليات التي قد تستغرق وقتًا طويلاً لإكمالها إذا تم القيام بها دفعة واحدة. هنا، يتم تطبيقها لمعالجة مواضيع Discourse على دفعات بحجم 1000.

هذا ما يجب أن يبدو عليه أثناء تشغيله.

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.
  • وظائف البرنامج النصي: يتكرر البرنامج النصي فوق كل معرف موضوع تم استرداده من قاعدة بيانات Discourse الخاصة بك، ويطبق التحويلات المحددة على كل مشاركة داخل تلك المواضيع.
إعجابَين (2)

أواجه هذا الخطأ (بعد الترحيل، على تثبيت قياسي يعمل) عند محاولة تغيير اسم العرض للمستخدم (وليس اسم المستخدم) ليشمل أحرفًا خاصة. أحصل على نافذة منبثقة “خطأ في الخادم الداخلي” عندما أحاول، وتظهر السجلات نفس الخطأ الذي واجهه @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 كان مشكلة بالنسبة لي، لكنني لا أولي اهتمامًا كبيرًا لتلك الأمور إذا لم يكن أحد يدفع لي مقابل ذلك. وحتى في هذه الحالة، لا أتذكر أنني أوليت اهتمامًا كبيرًا لتلك المشكلة. :slight_smile:

اعتقدت أنه إذا اشتكى الباني من فقدان /etc/service/unicorn/run وتمت إزالة هذا بالضبط، فقد حاولت التعليق على أمر الإزالة هذا. :wink: نجح الأمر.

ربما يريد شخص لديه المزيد من المعرفة حول كل شيء التحقق وإجراء تحديث على Github في البرنامج النصي. يمكنني أيضًا تقديم طلب سحب - ولكن دون أي معرفة حول كل شيء، لا أريد ذلك.

لكن التغيير من Ubuntu إلى Debian يغير الكثير، صحيح.

إعجاب واحد (1)

أولاً، أنا مبتدئ في Docker، لذا هناك احتمال كبير أن أكون قد أفسدت شيئًا ما.

لدي تثبيت نظيف لـ Discourse على DigitalOcean Droplet يعمل بنظام Ubuntu 22.04 باستخدام تطبيقه المعد مسبقًا. تم بناء المنتدى بشكل جيد ويعمل في التكوين القياسي.

عندما أقوم بتنفيذ /var/discourse/launcher rebuild import، أحصل على ما يلي في نهاية البناء:

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.

عندما أقوم بتنفيذ: /var/discourse/launcher enter import
أحصل على:

86_64 arch detected.
Error response from daemon: No such container: import

هل هذا بسبب الأخطاء في أعلى هذه المشاركة (وإذا كان الأمر كذلك، فكيف يمكنني إصلاحه)، أم أنني أفعل شيئًا خاطئًا؟

هل قمت بإنشاء ملف import.yml وتشغيل هذا الحاوية كـ (أنا متأكد تمامًا) كما تقول التعليمات؟

توضح التعليمات نسخ app.yml إلى import.yml وإضافة “templates/import/phpbb3.template.yml” إلى import.yml (وهو ما فعلته). ثم، تقوم بإعادة بناء الاستيراد، مما يؤدي إلى ظهور الخطأ في مشاركتي الأصلية. أفشل في رؤية أي تعليمات حول إنشاء bootstrap (؟).\n\nالتعليمات بسيطة للغاية، وهذا هو سبب ارتباكي بشأن ما يحدث بشكل خاطئ.\n\n\n# docker ps -a\nCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES\n81a2f335fd01 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\n

عذرًا. يقوم إعادة البناء بتهيئة أولية. إذا تم الانتهاء، فقد كان حاوية الاستيراد قيد التشغيل.

أوه. أنا آسف جدًا. لم ألحظ ما كان يحدث من قبل. يبدو أن قالب phpbb3 قد يكون غير متوافق مع التغييرات الأخيرة في discourse_docker. ولكن هذا كل ما يمكنني قوله عبر هاتفي.

أعتقد أنه إذا قمت بحذف سطر في قالب phpbb3 يحذف “/etc/service/unicorn/run”، فقد يؤدي ذلك إلى اكتمال البناء.

إعجاب واحد (1)

شكرًا لك يا جاي على الإجابة على هذه المشكلة. يكتمل البناء الآن بشكل صحيح.

المشكلة التالية: عند تنفيذ: import_phpbb3.sh أحصل على:

يبدأ استيراد phpBB3...

/usr/local/lib/ruby/3.3.0/psych/parser.rb:62:in `_native_parse': (غير معروف): لم يتم العثور على المفتاح المتوقع أثناء تحليل كتلة تعيين في السطر 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' لتجنب التعارضات. يجب أن يكون لدى تشغيلات الاستيراد اللاحقة 'site_name' مختلفة.
  #
  # site_name: first
  #
  site_name: Freedom Owners Forum

  # إنشاء فئات جديدة
  #
  # على سبيل المثال، لإنشاء فئة رئيسية وفئة فرعية.
  #
  # 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

  # تعيينات الفئات
  #
  # * "source_category_id" هو معرف المنتدى في phpBB3
  # * "target_category_id" هو إما معرف منتديات من phpBB3 أو "forum_id"
  #   من إعداد "new_categories" (انظر أعلاه)
  # * "discourse_category_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-na
me/81
    # اتركه فارغًا إذا لم يتم تثبيت منتدى الخاص بك في مجلد فرعي.
    prefix:

  avatars:
    uploaded: true  # استيراد الصور الرمزية التي تم تحميلها
    gallery: true   # استيراد الصور الرمزية المعرفة مسبقًا التي يقدمها phpBB
    remote: false   # تحذير: يمكن أن يؤدي هذا إلى إبطاء الاستيراد الخاص بك بشكل كبير. سيحاول تنزيل الصور الرمزية البعيدة.

  # عندما يكون صحيحًا: يتم استيراد المستخدمين المجهولين كمستخدمين معلقين. لا يمكنهم تسجيل الدخول وليس لديهم عنوان بريد إلكتروني.
  # عندما يكون خطأ: سيتم استخدام المستخدم النظام لجميع المستخدمين المجهولين.
  anonymous_users: true

  # قم بتمكين هذا، إذا كنت ترغب في استيراد تجزئات كلمات المرور لاستخدام المكون الإضافي "migratepassword".
  # سيسمح هذا للمستخدمين بتسجيل الدخول باستخدام كلمة المرور الحالية الخاصة بهم.
  # المكون الإضافي متاح على: https://github.com/discoursehosting/discourse-migratepassword
  passwords: true

  # بشكل افتراضي، يتم استيراد جميع الأشياء التالية. يمكنك تعطيلها عن طريق تعيينها إلى false.
  bookmarks: true
  attachments: true
  private_messages: true
  polls: true

  # استيراد الإعجابات من امتداد "Thanks for posts" الخاص بـ phpBB
  likes: false

  # عندما يكون صحيحًا: سيكون لكل مستخدم مستورد اسم المستخدم الأصلي من phpBB كاسمه
  # عندما يكون خطأ: سيكون اسم كل مستخدم مستورد فارغًا ما لم يتم تغيير اسم المستخدم أثناء الاستيراد
  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: []

أنت تفتقد اسم المستخدم وكلمة المرور.