ترحيل Discourse من DigitalOcean droplet إلى آخر بدون انقطاع

نحن ننتقل إلى خادم DigitalOcean جديد وحاولنا استخدام صورة من السوق. عند تشغيل سكريبت الإعداد، يفشل في مرحلة مبكرة لأن اسم النطاق الخاص بنا لا يزال يشير إلى الخادم الحالي في بيئة الإنتاج.

أحتاج إلى تشغيل هذه التثبيت الجديد حتى أتمكن من استعادة نسخة احتياطية منه، ثم تحديث سجلات DNS بعد ذلك.

الخطأ هو:

Checking your domain name . . .
WARNING: Port 443 of computer does not appear to be accessible using hostname:  x
WARNING: Connection to x (port 80) also fails.

This suggests that x resolves to some IP address that does not reach this 
machine where you are installing discourse.

The first thing to do is confirm that x resolves to the IP address of this server.
You usually do this at the same place you purchased the domain.

If you are sure that the IP address resolves correctly, it could be a firewall issue.
A web search for "open ports YOUR CLOUD SERVICE" might help.

اسم النطاق يستجيب بالفعل على المنطقتين 80 و 443، لذا يبدو أن رسالة الخطأ هذه غير صحيحة هي الأخرى.

مرحبًا مات،

نحن (فريق Discourse) لا ندير صورة سوق DO، لذا أخشى أننا سنكون محدودي المساعدة في حل تلك المشكلة تحديدًا.

لكنك تدير هذا، أليس كذلك؟

حتى تعليمات التثبيت اليدوي تتضمن هذه الخطوة.

بالتأكيد لا يمكن أن أكون الشخص الأول الذي يفعل ذلك. كيف يقوم الناس بذلك؟

نعم، نقوم بإدارة ذلك. لم أفحص الكود، بل افترضت أن الفحص يأتي من صورة السوق.

./discourse-setup مُصمَّم كطريقة بسيطة لإعداد Discourse، مما يتجنب الحاجة إلى تحرير ملف نصي يدويًا عند تشغيل موقع Discourse جديد. حالتك ليست “نمطية” مثل تلك التي يتعامل معها سكريبت الإعداد.

في حالتك، أفضل خيار على الأرجح هو نسخ ملف containers/app.yml من خادمك الحالي إلى الخادم الجديد. كبديل، يمكنك تحرير الملف يدويًا بنفسك كما هو مقترح في السطور 75/76:

أين يمكنني العثور على ملف app.yml الافتراضي؟ أريد البدء بتثبيت افتراضي جديد.

أيضًا، كيف يمكنني تشغيل الخادم وتشغيله بدون سكريبت الإعداد؟ لا يزال الوصول إلى عنوان IP غير مستجيب لأنني لا أستطيع تشغيل سكريبت الإعداد.

يمكن العثور على الملف الافتراضي في samples/standalone.yml. أيضًا على GitHub.

بافتراض أنك تتبع دليل التثبيت الرسمي، بعد تنفيذ الأوامر في قسم “تثبيت Discourse”، ستحتاج إلى القيام بما يلي:

انسخ ملف YAML الافتراضي من مجلد samples إلى مجلد containers:

cp samples/standalone.yml containers/app.yml

قم بتعديل الملف يدويًا:

nano containers/app.yml

قم بتجهيز النظام وتشغيل Discourse:

./launcher rebuild app

شكرًا لك، هذا يقربني من الحل.

لكن الآن لا يمكنني استيراد النسخة الاحتياطية لأنني لا أستطيع تفعيل حساب المسؤول المؤقت:

(6) تم رفض تحميل السكربت ‘’ لأنه ينتهك التوجيه التالي لسياسة أمان المحتوى: “script-src ”. لاحظ أن ‘script-src-elem’ لم يتم تعيينه صراحةً، لذا تم استخدام ‘script-src’ كبديل.

هل توجد طريقة مباشرة لاستعادة النسخة الاحتياطية أو تعطيل سياسة أمان المحتوى حتى ذلك الحين؟

اتصل بخادمك عبر SSH، ثم:

cd /var/discourse
sudo ./launcher enter app
rails c
SiteSetting.content_security_policy = false
exit
exit

لاحظ أنني أنصح بمحاولة استعادة النسخة الاحتياطية من سطر الأوامر أولاً؛ فهي تحل المشكلة الفعلية التي تواجهها (استعادة النسخة الاحتياطية) بدلاً من العائق الحالي (سياسة أمان المحتوى).

شكرًا على التوجيهات.

أثناء تشغيل عملية الاستعادة، تظهر الرسالة التالية:

ERROR:  could not create unique index "index_incoming_referers_on_path_and_incoming_domain_id"
DETAIL:  Key (path, incoming_domain_id)=(/s/free+proxy+hideip.me, 1009) is duplicated.
EXCEPTION: psql failed: DETAIL:  Key (path, incoming_domain_id)=(/s/free+proxy+hideip.me, 1009) is duplicated.
/var/www/discourse/lib/backup_restore/database_restorer.rb:87:in `restore_dump'
/var/www/discourse/lib/backup_restore/database_restorer.rb:26:in `restore'
/var/www/discourse/lib/backup_restore/restorer.rb:51:in `run'
script/discourse:143:in `restore'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/thor-1.0.1/lib/thor/command.rb:27:in `run'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/thor-1.0.1/lib/thor/invocation.rb:127:in `invoke_command'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/thor-1.0.1/lib/thor.rb:392:in `dispatch'
/var/www/discourse/vendor/bundle/ruby/2.7.0/gems/thor-1.0.1/lib/thor/base.rb:485:in `start'
script/discourse:284:in `<top (required)>'
/usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.3/lib/bundler/cli/exec.rb:63:in `load'
/usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.3/lib/bundler/cli/exec.rb:63:in `kernel_load'
/usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.3/lib/bundler/cli/exec.rb:28:in `run'
/usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.3/lib/bundler/cli.rb:497:in `exec'
/usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.3/lib/bundler/vendor/thor/lib/thor/command.rb:27:in `run'
/usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.3/lib/bundler/vendor/thor/lib/thor/invocation.rb:127:in `invoke_command'
/usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.3/lib/bundler/vendor/thor/lib/thor.rb:392:in `dispatch'
/usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.3/lib/bundler/cli.rb:30:in `dispatch'
/usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.3/lib/bundler/vendor/thor/lib/thor/base.rb:485:in `start'
/usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.3/lib/bundler/cli.rb:24:in `start'
/usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.3/exe/bundle:49:in `block in <top (required)>'
/usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.3/lib/bundler/friendly_errors.rb:130:in `with_friendly_errors'
/usr/local/lib/ruby/gems/2.7.0/gems/bundler-2.2.3/exe/bundle:37:in `<top (required)>'
/usr/local/bin/bundle:23:in `load'
/usr/local/bin/bundle:23:in `<main>'
Trying to rollback...
Rolling back...
Cleaning stuff up...
Dropping functions from the discourse_functions schema...
Removing tmp '/var/www/discourse/tmp/restores/default/2020-12-29-214249' directory...
Unpausing sidekiq...
Marking restore as finished...
Notifying 'system' of the end of the restore...
Finished!
[FAILED]
Restore done.

يبدو أن لديك فهرسًا تالفًا. هل قمت بتشغيل ترقية على النسخة الحالية؟ هناك احتمال أن يساعد ذلك.

هناك موضوع في مكان ما يحتوي على تعليمات لنسخ ملفات قاعدة البيانات الخام (وفواتير Let’s Encrypt) من النسخة القديمة. هذا هو ما سأفعله على الأرجح.

ما هو “rub run”؟

تواجه ترقيات المثيل الحالي أخطاء متكررة (أخطاء مختلفة عن هذه)، ولهذا السبب أنتقل إلى مثيل جديد.

هل تملك رابطًا لهذا؟

نقل النسخ الاحتياطية عبر rsync و cron