माझा ब्लॉग // डिजिटल संग्रहण

विचार, प्रकल्प आणि तांत्रिक नोट्स

मुळात माझे ब्लॉग सेटअप केवळ WireGuard द्वारे IPv6-प्रकल्प म्हणून नियोजित होते, कारण हे सर्व एका होम सर्व्हरवर चालवले जाते (तसे, तुम्हाला route64.org वर विनामूल्य IPv6 पत्ते मिळू शकतात). उपलब्धता वाढवण्यासाठी, मी आता एक बाह्य IPv4 प्रॉक्सी जोडला आहे (@Larvitz चे आभार).

मात्र, यामध्ये लगेच SSL समस्या उद्भवल्या: सुरुवातीला A आणि AAAA दोन्ही रेकॉर्ड प्रॉक्सीद्वारे जात असल्याने, माझ्या सर्व्हरवर Let's Encrypt व्हॅलिडेशन अयशस्वी झाले.

उपाय: "IPv6-हॅक"

उपाय असा होता की, AAAA-एंट्री प्रॉक्सीद्वारे पाठवण्याऐवजी ती थेट माझ्या सर्व्हरच्या WireGuard-IP वर निर्देशित करणे.

  • Domain: blog.burningboard.org
  • A-Record (Proxy): 194.28.98.217
  • AAAA-Record (Server): 2a11:6c7:f05:a8::2 (WireGuard)

माझ्या WireGuard-IP वरील या थेट AAAA-एंट्रीमुळे, Let’s Encrypt अजूनही IPv6 द्वारे थेट माझ्या सर्व्हरपर्यंत पोहोचते (कारण AAAA-रेकॉर्डला डीफॉल्टनुसार प्राधान्य दिले जाते) आणि SSL प्रमाणपत्र जारी करते. IPv4 ट्रॅफिक प्रॉक्सीद्वारे एनक्रिप्टेड स्वरूपात माझ्याकडे पाठवला जातो.

अंतिम कॉन्फिगरेशन

संवाद सुरळीतपणे व्हावा यासाठी आम्हाला Caddy सर्व्हरमध्ये बदल करावे लागले:

1. माझ्या सर्व्हरवर (NixOS, blog.nix)

खरे व्हिजिटर आयपी (IPs) योग्यरित्या मिळावेत आणि प्रॉक्सीच्या आयपीने ओव्हरराईट होऊ नयेत यासाठी, प्रॉक्सीला 'ट्रस्टेड' (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: ब्लॉगची रचना सोपी आणि Markdown-आधारितच राहील.

🌍 आधीपेक्षा अधिक जागतिक: माझा ब्लॉग आता ४३ भाषांमधील भाषांतरांना सपोर्ट करतो. हो, क्लिंगन (Klingon) सह! 🖖 (Qapla'!)

ब्राउझरच्या भाषा ओळखीवर आधारित पूर्णपणे स्वयंचलित रिअल-टाइम भाषांतराचे नियोजन होते. स्पॉयलर: हे फक्त अंशतः यशस्वी झाले. यावरून लक्षात येते की: AI प्रभावी आहे, पण आपल्याला हवंय तिथे अजून पूर्णपणे पोहोचलेलं नाही.

उपाय: मी आता प्रत्येक पोस्ट आधीच सर्व ठरवलेल्या भाषांमध्ये भाषांतरित करतो, जे सर्च इंजिन (SEO) साठी देखील खूप चांगले आहे. जर स्वयंचलित ओळख कधी काम करत नसेल, तर तुम्ही ग्लोब आयकॉनद्वारे तुमची पसंतीची भाषा मॅन्युअली निवडू शकता, जी कुकी (cookie) द्वारे सहजपणे सेव्ह केली जाईल.

भाषांतरे आता Gemini 3 Flash वापरून केली जातात, ज्याचे निकाल आश्चर्यकारकपणे चांगले आहेत. मात्र, AI वर बारीक लक्ष ठेवणे आवश्यक आहे: पहिल्या बल्क रनमध्ये चुकून टॅग्सचेही भाषांतर झाले होते, जे अर्थातच नियोजित नव्हते.

कोड अजूनही उपलब्ध आहे (इच्छुक असल्यास मला मेसेज करा) 👍 पण लक्षात ठेवा की सिस्टमला आता स्वतःची Gemini API Key 🔑 आवश्यक आहे.

मी नुकताच माझा ब्लॉग WriteFreely वरून स्वतः विकसित केलेल्या सिस्टमवर हलवला आहे: MD-Blog (येथे MD चा अर्थ अर्थातच Markdown असा आहे). जुन्या सिस्टमचे एक अपडेट अयशस्वी झाल्यामुळे हा बदल करावा लागला – पण शेवटी, सर्व काही सोपे करण्यासाठी आणि डिझाइनवर पूर्ण नियंत्रण मिळवण्यासाठी ही एक उत्तम संधी ठरली.

याचे मुख्य वैशिष्ट्य म्हणजे data/ फोल्डरमधील साध्या मार्कडाउन फाइल्स, ज्या रनटाइममध्ये आधुनिक HTML मध्ये रूपांतरित केल्या जातात. याचा निकाल अतिशय वेगवान आहे, यासाठी कोणत्याही डेटाबेसची गरज नाही आणि स्वतःच्या डिझाइन सिस्टममुळे (डार्क मोडसह) आता हे अगदी मला हवे होते तसेच दिसत आहे. आता यामध्ये एक आधुनिक Mastodon-Share-Button देखील समाविष्ट आहे.

जर तुम्हाला कोड किंवा या साध्या सेटअपमध्ये रस असेल, तर माझ्याशी Mastodon वर नक्की संपर्क साधा!

मुळात #Winboat मागची कल्पना उत्कृष्ट आहे, परंतु सध्या तिची अंमलबजावणी थोडी अस्थिर वाटते. वर्षाच्या सुरुवातीला इन्स्टॉलेशन केल्यापासून सिस्टम व्यवस्थित चालत होती, पण आज सॉफ्टवेअरने पूर्णपणे काम करणे बंद केले.

इमेजने अचानक अपुऱ्या मेमरीचा (RAM) एरर दिला. मी ही समस्या मॅन्युअली सोडवण्याचा प्रयत्न केला, पण दुर्दैवाने त्यामुळे सिस्टम कायमची निकामी झाली. त्रुटी शोधण्यात (troubleshooting) अधिक वेळ घालवण्याऐवजी, मी थेट Dockurr Windows-Image वर स्विच झालो – हेच मुळात Winboat चा तांत्रिक आधार आहे.

त्रुटी संदेश

१. पूर्वतयारी

मी Podman वापरत असल्याने, मी प्रथम माझ्या होस्ट सिस्टमवर आवश्यक डिरेक्टरीज (directories) तयार केल्या. यामुळे जर कंटेनर पुन्हा तयार करावा लागला, तर डेटा सुरक्षित राहील:

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

२. स्टार्ट कमांड

महत्त्वाची टीप: -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

चालू असलेला कंटेनर

३. सारांश

मला वरील कमांड फक्त एकदाच चालवावी लागली. दैनंदिन वापरामध्ये, आता विंडोज एन्व्हायरमेंट या शॉर्ट कमांड्सद्वारे अगदी सहजपणे नियंत्रित करता येते:

  • सुरू करणे (Start): podman start windows
  • थांबवणे (Stop): podman stop windows (किंवा थेट विंडोजमधून शटडाउन करा)
  • स्थिती तपासणे (Status check): 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";
  };

  # Fix für die ActivityPub-Schlüsselgenerierung: Föderation erfordert openssl
  systemd.services.writefreely.path = [ pkgs.openssl ];

  # Automatisches Erstellen des Datenverzeichnisses mit den korrekten Berechtigungen
  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) ठेवणे खरोखर सोपे करते.