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

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

Εμφάνιση αναρτήσεων με ετικέτα: #nixos Εμφάνιση όλων ×

Άλλαξα πλέον το backup του NixOS homeserver μου και από ένα απλό καθημερινό script το μετέτρεψα σε ωριαίο. Όχι τόσο κομψό όσο στην instance του Mastodon που διαχειρίζεται ο φίλος μου – εκεί έχουμε ένα ZFS snapshot κάθε 20 λεπτά – αλλά είμαι ικανοποιημένος και με αυτή τη λύση. Και πρέπει να πω ότι το NixOS μου αρέσει όλο και περισσότερο. Χωρίς την Τεχνητή Νοημοσύνη (AI), βέβαια, θα ήταν πολύ περίπλοκο για να το καταλάβω, αλλά πλέον μπορώ τουλάχιστον να διαβάζω τα έτοιμα αρχεία Nix. Είχα σκεφτεί κάποια στιγμή να γυρίσω τον server σε μια κανονική διανομή Linux, αλλά όσο αυτό λειτουργεί τόσο καλά...

  1. /etc/nixos: Ολόκληρη η παραμετροποίηση του NixOS (όλα τα αρχεία .nix).

  2. /opt/minecraft: Όλοι οι κόσμοι και τα δεδομένα του Minecraft server.

  3. /opt/satisfactory: Τα save games και η παραμετροποίηση του Satisfactory server.

  4. /opt/Blog: Ο πηγαίος κώδικας και το περιεχόμενο του blog.

  5. /opt/ui: Τα αρχεία του Mastodon-UI.

  6. /opt/audiobookshelf: Τα ηχητικά βιβλία και η σχετική βάση δεδομένων.

Όλα αυτά καταλήγουν σε έναν S3 αποθηκευτικό χώρο που έχει προσαρτηθεί (mounted) μέσω RClone.

Η παραμετροποίηση του NixOS


{ config, pkgs, ... }:

{
  # Παραμετροποίηση BorgBackup
  services.borgbackup.jobs.hourly = {
    # Διαδρομή προς το αποθετήριο (repository) στο S3-mount
    repo = "/opt/S3/Backup/NixOSHomeServer_Borg";

    # Δεν απαιτείται κωδικός πρόσβασης
    encryption.mode = "none";

    # Συμπίεση για ακόμα μεγαλύτερη εξοικονόμηση χώρου
    compression = "auto,zstd";

    # Οι διαδρομές προς δημιουργία αντιγράφων ασφαλείας
    paths = [
      "/etc/nixos"
      "/opt/minecraft"
      "/opt/satisfactory"
      "/opt/Blog"
      "/opt/ui"
      "/opt/audiobookshelf"
    ];

    # Ωριαία εκτέλεση
    startAt = "hourly";

    # Αυτόματη αρχικοποίηση του αποθετηρίου, εάν λείπει
    doInit = true;

    # Κανόνες διατήρησης (Pruning)
    prune.keep = {
      within = "1d"; # Όλα τα snapshots των τελευταίων 24 ωρών
      daily = 7;
      weekly = 4;
      monthly = 12;
    };
  };

  # Διασφάλιση ότι το S3-mount είναι έτοιμο πριν ξεκινήσει το Borg
  systemd.services.borgbackup-job-hourly = {
    requires = [ "rclone-s3-mount.service" ];
    after = [ "rclone-s3-mount.service" ];
  };
}

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