Το Ιστολόγιό μου // Ψηφιακό Αρχείο

Σκέψεις, έργα και τεχνικές σημειώσεις

Αρχικά, η εγκατάσταση του blog μου είχε σχεδιαστεί ως ένα αμιγώς IPv6 project μέσω WireGuard, καθώς το όλο σύστημα φιλοξενείται σε έναν οικιακό διακομιστή (παρεμπιπτόντως, μπορείτε να βρείτε δωρεάν διευθύνσεις IPv6 στο route64.org). Για να αυξήσω την προσβασιμότητα, πρόσθεσα τώρα έναν εξωτερικό IPv4 proxy (ευχαριστώ τον @Larvitz).

Ωστόσο, προέκυψαν αμέσως προβλήματα SSL: Καθώς αρχικά τόσο η εγγραφή A όσο και η AAAA περνούσαν μέσα από τον proxy, η επικύρωση του Let's Encrypt στον διακομιστή μου απέτυχε.

Η λύση: Το „IPv6-Hack“

Η λύση ήταν να κατευθύνω την εγγραφή AAAA ρητά απευθείας στην WireGuard IP του διακομιστή μου, αντί να την περάσω και αυτήν μέσω του proxy.

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

Μέσω αυτής της απευθείας εγγραφής AAAA στην WireGuard IP μου, το Let’s Encrypt συνεχίζει να προσεγγίζει τον διακομιστή μου απευθείας μέσω IPv6 (καθώς η εγγραφή AAAA έχει προτεραιότητα από προεπιλογή) και εκδίδει το πιστοποιητικό SSL. Η κίνηση IPv4 προωθείται σε εμένα κρυπτογραφημένη από τον proxy.

Η τελική διαμόρφωση

Για να λειτουργήσει ομαλά η επικοινωνία, έπρεπε να προσαρμόσουμε τους διακομιστές Caddy:

1. Στον διακομιστή μου (NixOS, blog.nix)

Για να φτάνουν σωστά οι πραγματικές IP των επισκεπτών και να μην αντικαθίστανται από την IP του proxy, αυτός πρέπει να επισημανθεί ως αξιόπιστος:

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

2. Στον εξωτερικό proxy (Caddy)

Για να επικοινωνεί ο proxy σωστά με τον διακομιστή μου μέσω HTTPS, πρέπει να στέλνει το hostname (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
    }
}

Το blog είναι πλέον προσβάσιμο μέσω IPv4 και IPv6, με ασφαλή κρυπτογράφηση, και η οικιακή μου IP παραμένει ιδιωτική! 🚀

Το πιο σημαντικό πρώτα: Τα συνηθισμένα αρχεία Markdown παραμένουν η βάση – είμαι απλώς μεγάλος θαυμαστής αυτής της απλής λύσης. Αλλά κάτω από το καπό, έχουν αλλάξει πολλά:

Έκανα μερικές αλλαγές στο setup:

📂 MD-Files: Η δομή του blog παραμένει απλή, βασισμένη στο Markdown.

🌍 Πιο παγκόσμιο από ποτέ: Το blog μου υποστηρίζει πλέον μεταφράσεις σε 43 γλώσσες. Ναι, συμπεριλαμβανομένων των Klingon! 🖖 (Qapla'!)

Το σχέδιο ήταν μια πλήρως αυτοματοποιημένη μετάφραση σε πραγματικό χρόνο με βάση την αναγνώριση γλώσσας του προγράμματος περιήγησης. Spoiler: Λειτούργησε μόνο εν μέρει. Διαπιστώνει κανείς ότι: Η τεχνητή νοημοσύνη είναι εντυπωσιακή, αλλά δεν είναι ακόμα ακριβώς "εκεί" που θα θέλαμε.

Η λύση: Τώρα μεταφράζω απλώς κάθε ανάρτηση εκ των προτέρων σε όλες τις καθορισμένες γλώσσες, κάτι που είναι επίσης πολύ καλύτερο για τις μηχανές αναζήτησης (SEO). Εάν η αυτόματη αναγνώριση δεν λειτουργήσει κάποια στιγμή, μπορείτε να ορίσετε χειροκίνητα τη γλώσσα που προτιμάτε μέσω του εικονιδίου της υδρογείου, η οποία στη συνέχεια αποθηκεύεται πολύ απλά μέσω cookie.

Οι μεταφράσεις πραγματοποιούνται πλέον με το Gemini 3 Flash, το οποίο προσφέρει εκπληκτικά καλά αποτελέσματα. Ωστόσο, θα πρέπει να προσέχει κανείς την τεχνητή νοημοσύνη: Στην πρώτη μαζική εκτέλεση, μεταφράστηκαν κατά λάθος και τα tags, κάτι που φυσικά δεν ήταν προγραμματισμένο.

Ο κώδικας παραμένει διαθέσιμος (απλώς στείλτε μου ένα μήνυμα αν ενδιαφέρεστε) 👍 Λάβετε όμως υπόψη ότι το σύστημα απαιτεί πλέον το δικό του Gemini API Key 🔑.

Αποφάσισα χωρίς δισταγμό να μεταφέρω το ιστολόγιό μου από το WriteFreely σε μια δική μου υλοποίηση: το MD-Blog (το MD φυσικά σημαίνει Markdown). Η αφορμή ήταν μια αποτυχημένη ενημέρωση του παλιού συστήματος – τελικά όμως ήταν το τέλειο έναυσμα για να απλοποιήσω τα πάντα ριζικά και να αποκτήσω τον πλήρη έλεγχο του σχεδιασμού.

Ο πυρήνας είναι απλά αρχεία Markdown στον φάκελο data/, τα οποία μετατρέπονται σε σύγχρονο HTML κατά τον χρόνο εκτέλεσης. Το αποτέλεσμα είναι αστραπιαία γρήγορο, λειτουργεί χωρίς βάση δεδομένων και, χάρη στο δικό μου σύστημα σχεδιασμού (συμπεριλαμβανομένου του Dark Mode), φαίνεται τώρα ακριβώς όπως το φαντάστηκα. Ακόμα και ένα σύγχρονο κουμπί κοινοποίησης Mastodon είναι πλέον ενσωματωμένο.

Αν ενδιαφέρεστε για τον κώδικα ή το λιτό στήσιμο, μη διστάσετε να επικοινωνήσετε μαζί μου μέσω του Mastodon!

Στην πραγματικότητα, η ιδέα πίσω από το #Winboat είναι εξαιρετική, αλλά η υλοποίηση φαίνεται να είναι ακόμα κάπως ασταθής. Από την εγκατάσταση στις αρχές του έτους το σύστημα λειτουργούσε, αλλά σήμερα το λογισμικό σταμάτησε εντελώς να ανταποκρίνεται.

Το image ανέφερε ξαφνικά ανεπαρκή μνήμη RAM. Προσπάθησα να διορθώσω το πρόβλημα χειροκίνητα, κάτι που δυστυχώς κατέστησε το σύστημα οριστικά άχρηστο. Αντί να επενδύσω περισσότερο χρόνο στην αντιμετώπιση προβλημάτων, μετέβηκα απευθείας στο Dockurr Windows image – το οποίο ούτως ή άλλως αποτελεί την τεχνική βάση του Winboat.

Fehlermeldung

1. Προετοιμασία

Καθώς χρησιμοποιώ το Podman, δημιούργησα αρχικά τους απαραίτητους καταλόγους στο host σύστημά μου. Με αυτόν τον τρόπο διασφαλίζεται η ακεραιότητα των δεδομένων σε περίπτωση που ο container χρειαστεί να δημιουργηθεί ξανά:

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

2. Η εντολή εκκίνησης

Σημαντική σημείωση: Αντικαταστήστε στις μεταβλητές -e USERNAME και -e PASSWORD τα placeholders με τα προσωπικά σας στοιχεία πρόσβασης.

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

Μόλις ο container ενεργοποιηθεί, μπορείτε να αποκτήσετε πρόσβαση στο Windows instance απευθείας μέσω του προγράμματος περιήγησής σας:

http://127.0.0.1:8006

Laufender Container

3. Σύνοψη

Χρειάστηκε να εκτελέσω την παραπάνω εντολή μόνο μία φορά. Στην καθημερινή λειτουργία, το περιβάλλον των Windows μπορεί πλέον να ελεγχθεί πολύ άνετα μέσω αυτών των σύντομων εντολών:

  • Εκκίνηση: podman start windows
  • Διακοπή: podman stop windows (ή τερματισμός λειτουργίας απευθείας μέσα από τα Windows)
  • Έλεγχος κατάστασης: podman ps -a

Πρόσθετοι σύνδεσμοι:

Εγκατέστησα το δικό μου blog — κυρίως για να γνωρίσω καλύτερα το #NixOS. Παραδόξως, η όλη διαδικασία ήταν αρκετά απλή.

Το WriteFreely ταιριάζει απόλυτα σε αυτό: μινιμαλιστικό, γρήγορο στην εγκατάσταση και χωρίς περιττά στοιχεία. Ιδανικό για να ξεκινήσει κανείς εύκολα και να μάθει κάτι στην πορεία. Η παραμετροποίηση είναι ευχάριστα ξεκάθαρη. Μερικές επιλογές, προετοιμασία του καταλόγου, ένας reverse proxy μπροστά — και έτοιμο.

Έτσι φαίνεται η τρέχουσα ρύθμιση του 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 κάνει πραγματικά εύκολη την καθαρή παραμετροποίηση τέτοιων υπηρεσιών και τη διατήρησή τους με αναπαραγώγιμο τρόπο.