في الأصل، كان إعداد مدونتي مخططاً له كمشروع IPv6 خالص عبر WireGuard، حيث يتم تشغيل النظام بالكامل على خادم منزلي (بالمناسبة، يمكنك الحصول على عناوين IPv6 مجانية من route64.org). ولزيادة إمكانية الوصول، قمت الآن بإضافة بروكسي IPv4 خارجي (شكراً لـ @Larvitz).
ومع ذلك، ظهرت مشاكل في SSL على الفور: نظرًا لأن كلا السجلين A و AAAA كانا يمران عبر البروكسي في البداية، فقد فشل التحقق من Let's Encrypt على خادمي.
الحل: «خدعة IPv6»
كان الحل هو توجيه سجل AAAA صراحةً وبشكل مباشر إلى عنوان IP الخاص بـ WireGuard على خادمي، بدلاً من تمريره عبر البروكسي أيضاً.
- النطاق (Domain):
blog.burningboard.org
- سجل A (البروكسي):
194.28.98.217
- سجل AAAA (الخادم):
2a11:6c7:f05:a8::2 (WireGuard)
من خلال سجل AAAA المباشر هذا إلى عنوان IP الخاص بـ WireGuard، لا يزال بإمكان Let’s Encrypt الوصول إلى خادمي مباشرة عبر IPv6 (بما أن سجل AAAA يحظى بالأولوية افتراضياً) وإصدار شهادة SSL. أما حركة مرور IPv4 فيتم تمريرها إليّ مشفرة من قبل البروكسي.
الإعداد النهائي
لضمان سير الاتصال بسلاسة، كان علينا تعديل خوادم Caddy:
1. على خادمي (NixOS، blog.nix)
لكي تصل عناوين IP الحقيقية للزوار بشكل صحيح ولا يتم استبدالها بعنوان IP الخاص بالبروكسي، يجب تحديد البروكسي كجهة موثوقة:
services.caddy.globalConfig = ''
servers {
trusted_proxies static 2a06:9801:1c:1000::10
}
'';
2. على البروكسي الخارجي (Caddy)
لكي يتواصل البروكسي مع خادمي بشكل صحيح عبر HTTPS، يجب عليه إرسال اسم المضيف (SNI):
reverse_proxy [https://[2a11:6c7:f05:a8::2]:443](https://[2a11:6c7:f05:a8::2]:443) {
header_up Host {host}
transport http {
tls_server_name blog.burningboard.org
}
}
المدونة الآن متاحة عبر IPv4 و IPv6، ومشفرة بشكل آمن، ومع ذلك يظل عنوان IP المنزلي الخاص بي خاصاً! 🚀
الأهم أولاً: تظل ملفات Markdown المعتادة هي الأساس – فأنا ببساطة من كبار المعجبين بهذا الحل غير المعقد. ولكن تحت الغطاء، حدث الكثير:
لقد قمت ببعض التعديلات على الإعدادات:
📂 ملفات MD: تظل بنية المدونة بسيطة وتعتمد على Markdown.
🌍 عالمية أكثر من أي وقت مضى: تدعم مدونتي الآن الترجمة إلى 43 لغة. نعم، بما في ذلك لغة الكلينجون! 🖖 (Qapla'!)

كان المخطط له هو توفير ترجمة فورية مؤتمتة بالكامل بناءً على التعرف على لغة المتصفح. تنبيه (Spoiler): لقد نجح الأمر جزئياً فقط. نلاحظ أن: الذكاء الاصطناعي مثير للإعجاب، لكنه لم يصل تماماً بعد إلى المستوى الذي نتمناه.
الحل: أقوم الآن ببساطة بترجمة كل مقال مسبقاً إلى جميع اللغات المحددة، وهو أمر أفضل بكثير لمحركات البحث (SEO). في حال لم يعمل التعرف التلقائي، يمكنك تحديد لغتك المفضلة يدوياً عبر أيقونة الكرة الأرضية، والتي سيتم حفظها بعد ذلك بكل سهولة عبر ملفات تعريف الارتباط (Cookie).
تتم الترجمات الآن باستخدام Gemini 3 Flash، والذي يقدم نتائج جيدة بشكل مذهل. ومع ذلك، يجب مراقبة الذكاء الاصطناعي بدقة: في أول عملية ترجمة جماعية، تمت ترجمة الوسوم (Tags) عن طريق الخطأ أيضاً، وهو ما لم يكن مخططاً له بالطبع.
الكود لا يزال متاحاً (فقط أرسل لي رسالة إذا كنت مهتماً) 👍 لكن يرجى ملاحظة أن النظام يتطلب الآن مفتاح API خاص بـ Gemini 🔑.
قمت فجأة بتحويل مدونتي من WriteFreely إلى تطوير خاص بي: MD-Blog (يرمز MD بالطبع إلى Markdown). كان السبب هو فشل تحديث النظام القديم - ولكن في النهاية كان ذلك الحافز المثالي لتبسيط كل شيء بشكل جذري واكتساب التحكم الكامل في التصميم.
يعتمد جوهر النظام على ملفات Markdown بسيطة في مجلد data/ يتم تحويلها إلى HTML حديث أثناء التشغيل. النتيجة سريعة للغاية، وتعمل بدون قاعدة بيانات، وبفضل نظام التصميم الخاص بي (بما في ذلك الوضع الداكن)، تبدو الآن تماماً كما تخيلتها. حتى أن هناك زر مشاركة Mastodon حديث مدمج الآن بشكل مباشر.
إذا كنتم مهتمين بالكود أو بالإعداد البسيط، فلا تترددوا في التواصل معي عبر Mastodon!