شكرًا على الملاحظات، أقدر حقًا الوقت الذي خصصته. ليس بقصد أن أبدو متعجرفًا، لكن:
[2/5] جاري إعداد التكوين
✓ المنافذ 80 و443 متاحة للاستخدام
في الواقع، النص يقول في البداية “متاحة للاستخدام”. مع ذلك، لقد نجحت في تشغيل مثيلتي الآن بمساعدة Gemini (معظمها يتعلق باستخدام Docker، طبعًا lol). أود أن أقدم “دليل التشغيل” الخاص بي لأي مستخدمين آخرين لـ Virtualmin، لأن: “تحرير المنفذ 443” ليس الحل هنا. باقي منشوري سيكون هذا الدليل، وإذا كان من الأفضل نشره في مكان آخر، مثل موضوع جديد، فالرجاء إخباري بالأفضل؛ أعتقد أنني لست الوحيد الذي لديه هذا الإعداد، وقد يكون مفيدًا للآخرين. شكرًا مجددًا!
إذا كنت تستخدم خادمًا افتراضيًا خاصًا (VPS) يُدار بواسطة Webmin/Virtualmin، وتستخدم نطاقًا فرعيًا:
دليل التشغيل الحاسم لـ Virtualmin + Discourse *
-
(1) تنظيف البقايا (في حال إعادة المحاولة، كما فعلتُ):
rm -rf /var/discourse/shared/standalone/ssl/*rm -rf /var/discourse/shared/standalone/letsencryptrm -rf /var/discourse/shared/standalone/state -
(2) حذف القوالب:
يجب حذف سطور
templates/web.ssl.template.ymlوtemplates/web.letsencrypt.ssl.template.ymlتمامًا من ملفapp.yml. فمُحلّل التشغيل المخصص سيقوم بتقييمها حتى لو سبقت بعلامة#. -
(3) إعداد البريد الإلكتروني والمتغيرات:
غيّر
DISCOURSE_SKIP_EMAIL_SETUPمن'1'إلى'0'، لأن Discourse لن يتمكن من الاتصال والتحقق من DiscordID؛أضف
DISCOURSE_FORCE_HTTPS: trueلكي يولد الخادم الخلفي عناوين URL آمنة.تذكير ودي: تأكد من تعيين
DISCOURSE_SMTP_USER_NAMEإلى اسم حساب البريد الإلكتروني الخام (مثل'logophilia')، وليس عنوان البريد الإلكتروني الكامل (مثل'logophilia@logophilia.eu')، وأحط بيانات الاعتماد بعلامات اقتباس مفردة (') لتجاوز أخطاء تحليل أحرف YAML المحتملة. -
(4) إعداد كتلة expose:
تأكد من أن كتلة
expose:في ملف app.yml تحتوي على تعيين HTTP؛ فالتعيين443=>8443اختياري/مُكرر، لأن Virtualmin ينهي منطق SSL قبل تمريره:expose: - 8080:80يمكنك الآن البدء بإعادة البناء:
cd /var/discourse ./launcher rebuild app -
(5) إعداد النطاق الفرعي ومسار الوكيل (Proxy):
- أنشئ نطاقك الفرعي في Virtualmin كالمعتاد، وحمّيه بشهادة SSL من Let’s Encrypt (يتم ذلك تلقائيًا، فقط تأكد من عدم حدوث أخطاء لأي سبب غير ذي صلة).
- انتقل إلى مسارات الوكيل (Virtualmin → نطاقك الفرعي → إعدادات الويب → مسارات الوكيل)، أنشئ تعيينًا جديدًا من
/إلىhttp://localhost:8080/، اترك خيار “الخدمة محليًا” غير محدّد، لكن فعل Proxy WebSocket على نعم للسماح بالتحديثات الفورية وتدفقات الإشعارات.
-
(6) تعليمات رأس CSRF:
- في Webmin ➔ خوادم ➔ خادم الويب Apache ➔ [ابحث عن إعدادات نطاقك الفرعي هنا وانقر على إعدادات 443] ➔ تحرير التعليمات، ضع السطور التالية فوق كتلة الوكيل الخاصة بـ Virtualmin الخاصة بـ Let’s Encrypt (عادةً “ProxyPass /.well-known !”) لتسهيل نقل رموز CSRF:
ProxyPreserveHost On RequestHeader set X-Forwarded-Proto "https" RequestHeader set X-Forwarded-For %{REMOTE_ADDR}sProxyPreserveHost On: يخبر Discourse باسم النطاق الفعلي بدلاً من “localhost”.
RequestHeader set X-Forwarded-Proto "https": يخبر Discourse صراحةً أن المستخدم يستخدم اتصالاً آمنًا، مما يتوافق مع إعدادDISCOURSE_FORCE_HTTPS: true.
RequestHeader set X-Forwarded-For: ينقل عنوان IP الفعلي للزائر إلى الحاوية لكي تعمل سجلات الأمان. -
(7) المصافحة النظيفة للحاوية:
أثناء اكتمال عملية إعادة البناء الطويلة (آسف… لكن هذا صحيح بالفعل؛-)، تأكد من مسح أي مخطط حاوية عالق محتمل باستخدام
docker rm -f appحتى يقوم تشغيل./launcher start appبتشغيل مثيل جديد تمامًا مرتبط بالمنفذ8080. تحقق من أن أمرdocker psيظهر شيئًا تحت “المنافذ” مشابهًا لـ:# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d21772a21e36 local_discourse/app "/sbin/boot" 45 minutes ago Up 45 minutes 0.0.0.0:8080->80/tcp, [::]:8080->80/tcp, 0.0.0.0:8443->443/tcp, [::]:8443->443/tcp app(كما ترون، تركتُ تعليمات 443=>8443 في ملف app.yml الخاص بي، وتعمل في كلا الحالتين.)
-
(8) المراقبة والإطلاق:
تابع تدفق التشغيل بـ
docker logs -f appحتى تنتهي عمليات ترحيل قاعدة البيانات ويبدأ العمال في معالجة الطلبات. ببساطة، ستظهر مجموعة من سطور “INFO” بسرعة. -
(9) الإنهاء:
افتح نطاقك الفرعي في متصفح، انقر على تسجيل، واترك النظام يرسل بريدًا إلكترونيًا للتحقق إلى صندوق بريدك.
*) حتى يثبت العكس ![]()