وبلاگ من // آرشیو دیجیتال

افکار، پروژه‌ها و یادداشت‌های فنی

نمایش پست‌ها با برچسب: #md-blog نمایش همه ×

در ابتدا، تنظیمات وبلاگ من به عنوان یک پروژه صرفاً IPv6 از طریق WireGuard برنامه‌ریزی شده بود، زیرا کل سیستم روی یک سرور خانگی اجرا می‌شود (ضمناً می‌توانید آدرس‌های IPv6 رایگان را از route64.org دریافت کنید). برای افزایش دسترسی‌پذیری، اکنون یک پروکسی IPv4 خارجی اضافه کرده‌ام (با تشکر از @Larvitz).

با این حال، بلافاصله مشکلات SSL به وجود آمد: از آنجایی که در ابتدا هر دو رکورد A و AAAA از طریق پروکسی عبور می‌کردند، اعتبارسنجی Let's Encrypt روی سرور من با شکست مواجه شد.

راه حل: «هک IPv6»

راه حل این بود که رکورد AAAA را به طور صریح مستقیماً به IP وایرگارد (WireGuard) سرورم هدایت کنم، به جای اینکه آن را هم از طریق پروکسی بفرستم.

  • دامنه: blog.burningboard.org
  • رکورد A (پروکسی): 194.28.98.217
  • رکورد AAAA (سرور): 2a11:6c7:f05:a8::2 (WireGuard)

از طریق این رکورد مستقیم AAAA به IP وایرگارد من، Let’s Encrypt همچنان مستقیماً از طریق IPv6 به سرور من دسترسی پیدا می‌کند (زیرا رکورد AAAA به طور پیش‌فرض اولویت دارد) و گواهی SSL را صادر می‌کند. ترافیک IPv4 توسط پروکسی به صورت رمزگذاری شده به من منتقل می‌شود.

پیکربندی نهایی

برای اینکه ارتباط بدون مشکل برقرار شود، مجبور شدیم سرورهای Caddy را تنظیم کنیم:

۱. روی سرور من (NixOS، blog.nix)

برای اینکه IPهای واقعی بازدیدکنندگان به درستی دریافت شوند و توسط IP پروکسی جایگزین نشوند، باید پروکسی به عنوان قابل اعتماد (trusted) علامت‌گذاری شود:

services.caddy.globalConfig = ''
  servers {
      trusted_proxies static 2a06:9801:1c:1000::10
  }
'';

۲. روی پروکسی خارجی (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 ساده باقی می‌ماند.

🌍 جهانی‌تر از همیشه: وبلاگ من اکنون از ترجمه به ۴۳ زبان پشتیبانی می‌کند. بله، حتی زبان کلینگون! 🖖 (Qapla'!)

برنامه این بود که یک ترجمه کاملاً خودکار و آنی بر اساس تشخیص زبان مرورگر داشته باشیم. اسپویلر: فقط تا حدودی جواب داد. مشخص است که: هوش مصنوعی خیره‌کننده است، اما هنوز دقیقاً به آن نقطه‌ای که ما می‌خواهیم نرسیده است.

راهکار: اکنون من هر پست را از قبل به تمام زبان‌های تعیین‌شده ترجمه می‌کنم که برای موتورهای جستجو (SEO) نیز بسیار بهتر است. اگر تشخیص خودکار عمل نکرد، می‌توانید از طریق آیکون کره زمین، زبان مورد نظر خود را به صورت دستی انتخاب کنید که سپس به سادگی از طریق کوکی ذخیره می‌شود.

ترجمه‌ها اکنون با Gemini 3 Flash انجام می‌شوند که نتایج فوق‌العاده خوبی ارائه می‌دهد. البته باید حواستان به هوش مصنوعی باشد: در اولین اجرای دسته‌جمعی، تگ‌ها هم به اشتباه ترجمه شدند که قطعاً طبق برنامه نبود.

کد همچنان در دسترس است (اگر علاقه‌مند بودید، کافیست به من پیام بدهید) 👍 اما توجه داشته باشید که سیستم اکنون به یک کلید اختصاصی Gemini API 🔑 نیاز دارد.

من به سرعت وبلاگم را از WriteFreely به یک سیستم توسعه‌یافته توسط خودم تغییر دادم: MD-Blog (که MD طبیعتاً مخفف Markdown است). محرک این کار، یک به‌روزرسانی ناموفق در سیستم قدیمی بود – اما در نهایت، این اتفاق انگیزه کاملی شد تا همه چیز را به طور ریشه‌ای ساده کنم و کنترل کامل روی طراحی را به دست آورم.

هسته اصلی این سیستم، فایل‌های ساده Markdown در پوشه data/ هستند که در زمان اجرا به HTML مدرن تبدیل می‌شوند. نتیجه کار بسیار سریع است، نیازی به پایگاه داده ندارد و به لطف سیستم طراحی اختصاصی (شامل حالت تیره یا Dark Mode)، اکنون دقیقاً همان‌طور است که تصور می‌کردم. حتی یک دکمه اشتراک‌گذاری Mastodon مدرن نیز اکنون مستقیماً در آن تعبیه شده است.

اگر به کدها یا این راه‌اندازی ساده و سبک علاقه دارید، خوشحال می‌شوم از طریق Mastodon با من در تماس باشید!