میرا بلاگ // ڈیجیٹل آرکائیو

خیالات، منصوبے اور تکنیکی نوٹس

اصل میں میرا بلاگ سیٹ اپ وائر گارڈ (WireGuard) کے ذریعے خالص IPv6 پروجیکٹ کے طور پر ڈیزائن کیا گیا تھا، کیونکہ یہ سب ایک ہوم سرور پر چل رہا ہے (ویسے، آپ route64.org سے مفت IPv6 ایڈریس حاصل کر سکتے ہیں)۔ رسائی کو بہتر بنانے کے لیے، میں نے اب ایک بیرونی IPv4 پراکسی شامل کی ہے (شکریہ @Larvitz

تاہم، اس دوران فوری طور پر SSL کے مسائل پیدا ہوئے: چونکہ اصل میں A اور AAAA دونوں ریکارڈز پراکسی کے ذریعے چل رہے تھے، اس لیے میرے سرور پر Let's Encrypt کی تصدیق (validation) ناکام ہو گئی۔

حل: "IPv6 ہیک"

اس کا حل یہ تھا کہ AAAA ریکارڈ کو پراکسی کے ذریعے گزارنے کے بجائے براہ راست اپنے سرور کے وائر گارڈ آئی پی (WireGuard IP) پر سیٹ کیا جائے۔

  • ڈومین: blog.burningboard.org
  • A-Record (پراکسی): 194.28.98.217
  • AAAA-Record (سرور): 2a11:6c7:f05:a8::2 (وائر گارڈ)

میری وائر گارڈ آئی پی پر اس براہ راست AAAA ریکارڈ کے ذریعے، Let’s Encrypt اب بھی IPv6 کے ذریعے براہ راست میرے سرور تک پہنچ جاتا ہے (کیونکہ AAAA ریکارڈ کو ڈیفالٹ کے طور پر ترجیح دی جاتی ہے) اور SSL سرٹیفکیٹ جاری کر دیتا ہے۔ IPv4 ٹریفک پراکسی کے ذریعے انکرپٹ ہو کر مجھ تک پہنچتی ہے۔

حتمی کنفیگریشن

اس بات کو یقینی بنانے کے لیے کہ مواصلت بغیر کسی رکاوٹ کے ہو، ہمیں کیڈی (Caddy) سرورز میں ترمیم کرنی پڑی:

1. میرے سرور پر (NixOS, blog.nix)

تاکہ آنے والے صارفین کے اصل آئی پی ایڈریس درست طریقے سے موصول ہوں اور پراکسی کے آئی پی سے تبدیل نہ ہوں، اسے قابلِ اعتماد (trusted) قرار دینا ضروری ہے:

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 دونوں پر دستیاب ہے، محفوظ طریقے سے انکرپٹڈ ہے اور میرا ہوم آئی پی اب بھی پرائیویٹ ہے! 🚀

سب سے اہم بات: معمول کی Markdown فائلیں ہی بنیاد رہیں گی – میں اس سادہ حل کا بہت بڑا مداح ہوں۔ لیکن پسِ پردہ بہت کچھ بدل گیا ہے:

میں نے سیٹ اپ میں کچھ تبدیلیاں کی ہیں:

📂 MD-Files: بلاگ کا ڈھانچہ سادہ طور پر مارک ڈاؤن کی بنیاد پر ہی رہے گا۔

🌍 پہلے سے کہیں زیادہ عالمی: میرا بلاگ اب 43 زبانوں میں ترجمے کو سپورٹ کرتا ہے۔ جی ہاں، کلنگون (Klingon) سمیت! 🖖 (Qapla'!)

منصوبہ براؤزر کی زبان کی شناخت کی بنیاد پر مکمل طور پر خودکار ریئل ٹائم ترجمہ کرنے کا تھا۔ اسپوائلر: یہ صرف جزوی طور پر کام کر سکا۔ یہ بات واضح ہے: اے آئی متاثر کن ہے، لیکن ابھی وہاں تک نہیں پہنچی جہاں ہم اسے دیکھنا چاہتے ہیں۔

حل: اب میں ہر پوسٹ کا پہلے سے ہی تمام مقررہ زبانوں میں ترجمہ کر دیتا ہوں، جو سرچ انجن (SEO) کے لیے بھی بہت بہتر ہے۔ اگر خودکار شناخت کام نہ کرے، تو آپ گلوب آئیکن کے ذریعے اپنی پسندیدہ زبان دستی طور پر منتخب کر سکتے ہیں، جو کوکی (Cookie) کے ذریعے آسانی سے محفوظ ہو جائے گی۔

اب ترجمے Gemini 3 Flash کے ذریعے کیے جا رہے ہیں، جو حیرت انگیز طور پر اچھے نتائج فراہم کر رہا ہے۔ تاہم، اے آئی کی نگرانی کرنا ضروری ہے: پہلے بلک راؤنڈ میں غلطی سے ٹیگز کا بھی ترجمہ کر دیا گیا تھا، جو ظاہر ہے کہ منصوبہ بندی کا حصہ نہیں تھا۔

کوڈ اب بھی دستیاب ہے (اگر آپ دلچسپی رکھتے ہیں تو مجھے میسج کریں) 👍 لیکن یاد رکھیں کہ اب سسٹم کو اپنی Gemini API Key 🔑 کی ضرورت ہوگی۔

میں نے اچانک اپنے بلاگ کو WriteFreely سے اپنی تیار کردہ ایپلیکیشن پر منتقل کر دیا ہے: MD-Blog (ظاہر ہے کہ MD کا مطلب Markdown ہے)۔ اس کی وجہ پرانے سسٹم کی ایک ناکام اپ ڈیٹ تھی – لیکن آخر کار یہ سب کچھ بنیادی طور پر سادہ بنانے اور ڈیزائن پر مکمل کنٹرول حاصل کرنے کے لیے ایک بہترین موقع ثابت ہوا۔

اس کا مرکزی حصہ data/ فولڈر میں موجود سادہ مارک ڈاؤن فائلیں ہیں، جو رن ٹائم (runtime) کے دوران جدید HTML میں تبدیل ہو جاتی ہیں۔ اس کا نتیجہ بجلی کی طرح تیز ہے، یہ کسی ڈیٹا بیس کے بغیر کام کرتا ہے اور اپنے ڈیزائن سسٹم (بشمول ڈارک موڈ) کی بدولت اب بالکل ویسا ہی نظر آتا ہے جیسا میں نے سوچا تھا۔ یہاں تک کہ اب ایک جدید Mastodon-Share-Button بھی اس میں شامل ہے۔

اگر آپ کوڈ یا اس سادہ سیٹ اپ میں دلچسپی رکھتے ہیں، تو بلا جھجھک Mastodon پر مجھ سے رابطہ کریں!

دراصل #Winboat کے پیچھے آئیڈیا تو بہترین ہے، لیکن فی الحال اس کا نفاذ کچھ غیر مستحکم معلوم ہوتا ہے۔ اس سال کے آغاز میں انسٹالیشن کے بعد سے سسٹم چل تو رہا تھا، لیکن آج سافٹ ویئر نے مکمل طور پر کام کرنا بند کر دیا۔

امیج نے اچانک میموری (RAM) کی کمی کا پیغام دیا۔ میں نے دستی طور پر اس مسئلے کو حل کرنے کی کوشش کی، لیکن بدقسمتی سے اس سے سسٹم مکمل طور پر ناکارہ ہو گیا۔ خرابی کی تلاش میں مزید وقت ضائع کرنے کے بجائے، میں براہ راست Dockurr Windows-Image پر منتقل ہو گیا – ویسے بھی یہ Winboat کی تکنیکی بنیاد ہے۔

Fehlermeldung

1. تیاری

چونکہ میں Podman استعمال کرتا ہوں، اس لیے میں نے سب سے پہلے اپنے ہوسٹ سسٹم پر ضروری ڈائریکٹریز بنائیں۔ اس طرح، اگر کنٹینر کو دوبارہ بنانا پڑے تو ڈیٹا کی سالمیت برقرار رہتی ہے:

mkdir -p $HOME/Windows/System
mkdir -p $HOME/Windows/Shared

2. اسٹارٹ کمانڈ

اہم نوٹ: متغیرات (variables) -e USERNAME اور -e PASSWORD میں پلیس ہولڈرز کو اپنی ذاتی لاگ ان معلومات سے تبدیل کریں۔

podman run -d \
  --name windows \
  -p 8006:8006 \
  --device=/dev/kvm \
  --cap-add NET_ADMIN \
  -e RAM_SIZE="8G" \
  -e USERNAME="Carsten" \
  -e PASSWORD="1234" \
  -e LANGUAGE="German" \
  -v $HOME/Windows/System:/storage:Z \
  -v $HOME/Windows/Shared:/shared:Z \
  --stop-timeout 120 \
  dockurr/windows

جیسے ہی کنٹینر فعال ہو جائے، آپ اپنے براؤزر کے ذریعے براہ راست ونڈوز انسٹنس تک رسائی حاصل کر سکتے ہیں:

http://127.0.0.1:8006

Laufender Container

3. خلاصہ

مجھے مذکورہ بالا کمانڈ صرف ایک بار چلانی پڑی۔ روزمرہ کے استعمال میں، اب ونڈوز کے ماحول کو ان شارٹ کمانڈز کے ذریعے آسانی سے کنٹرول کیا جا سکتا ہے:

  • اسٹارٹ کرنا: podman start windows
  • روکنا: podman stop windows (یا براہ راست ونڈوز کے اندر سے شٹ ڈاؤن کریں)
  • اسٹیٹس چیک کرنا: podman ps -a

مزید لنکس:

میں نے اپنا ایک بلاگ انسٹال کیا ہے — خاص طور پر #NixOS کو بہتر طور پر سمجھنے کے لیے۔ حیرت انگیز طور پر، یہ سب کافی آسان تھا۔

اس کے لیے WriteFreely بہت موزوں ہے: سادہ، جلد سیٹ اپ ہونے والا اور بغیر کسی اضافی بوجھ کے۔ یہ کام شروع کرنے اور ساتھ ساتھ کچھ سیکھنے کے لیے بہترین ہے۔ اس کی کنفیگریشن کافی واضح ہے۔ بس چند آپشنز سیٹ کیے، ڈائریکٹری تیار کی، ریورس پراکسی لگائی — اور بس، کام ہو گیا۔

اس کے لیے میری موجودہ NixOS کنفیگریشن کچھ اس طرح ہے:

{ config, pkgs, ... }:

{
  services.writefreely = {
    enable = true;
    host = "blog.burningboard.org"; 
    settings = {
      server = {
        port = 8080;
        min_log_level = "debug";
      };
      app = {
        host = "https://blog.burningboard.org";
        single_user = true;
        landing = "/read";
        wf_modesty = true;
        federation = true;
        public_stats = true;
        theme = "write";
      };
    };
    stateDir = "/opt/writefreely";
  };

  # ActivityPub کی کلید بنانے کے لیے فکس: فیڈریشن کے لیے openssl درکار ہے
  systemd.services.writefreely.path = [ pkgs.openssl ];

  # درست اجازتوں کے ساتھ ڈیٹا ڈائریکٹری کی خودکار تخلیق
  systemd.tmpfiles.rules = [
    "d /opt/writefreely 0700 writefreely writefreely -"
  ];

  services.caddy.virtualHosts."blog.burningboard.org".extraConfig = ''
    reverse_proxy 127.0.0.1:8080 {
      header_up Host {host}
      header_up X-Real-IP {remote_host}
      header_up X-Forwarded-For {remote_host}
      header_up X-Forwarded-Proto {scheme}
    }
  '';
}

بس بنیادی طور پر یہی تھا۔ NixOS ایسی سروسز کو صاف ستھرے طریقے سے کنفیگر کرنے اور انہیں دوبارہ قابلِ استعمال (reproducible) رکھنے کو واقعی آسان بنا دیتا ہے۔