Ich habe jetzt mal das Backup meines NixOS Homeservers umgestellt und statt einem einfachen täglichen Script auf stündlich umgestellt. Nicht ganz so elegant wie auf der Mastodon Instanz, die mein Freund verwaltet – hier haben wir alle 20 Minuten einen ZFS Snapshot – aber mit der Lösung bin ich auch zufrieden. Und ich muss sagen NixOS gefällt mir immer besser. Ohne KI wäre es allerdings viel zu kompliziert, als dass ich es verstehen könnte, aber mittlerweile kann ich die fertigen Nix-Dateien zumindest lesen. Hatte mal überlegt den Server auf ein normales Linux umzustellen, aber solange das so gut funktioniert...

  1. /etc/nixos: Die gesamte NixOS-Konfiguration (alle .nix Dateien).

  2. /opt/minecraft: Alle Welten und Daten des Minecraft-Servers.

  3. /opt/satisfactory: Spielstände und Konfiguration des Satisfactory-Servers.

  4. /opt/Blog: Der Quellcode und die Inhalte des Blogs.

  5. /opt/ui: Die Mastodon-UI Dateien.

  6. /opt/audiobookshelf: Die Hörbücher und die zugehörige Datenbank.

Das ganze landet auf einem S3 Storage der via RClone gemoundet wurde.

Die NixOS Konfiguration

{ config, pkgs, ... }:

{
  # BorgBackup Konfiguration
  services.borgbackup.jobs.hourly = {
    # Pfad zum Repository im S3-Mount
    repo = "/opt/S3/Backup/NixOSHomeServer_Borg";

    # Kein Passwort erforderlich
    encryption.mode = "none";

    # Kompression für noch mehr Platzersparnis
    compression = "auto,zstd";

    # Die zu sichernden Pfade
    paths = [
      "/etc/nixos"
      "/opt/minecraft"
      "/opt/satisfactory"
      "/opt/Blog"
      "/opt/ui"
      "/opt/audiobookshelf"
    ];

    # Stündliche Ausführung
    startAt = "hourly";

    # Repository automatisch initialisieren, falls es fehlt
    doInit = true;

    # Aufbewahrungsregeln (Pruning)
    prune.keep = {
      within = "1d"; # Alle Snapshots der letzten 24h
      daily = 7;
      weekly = 4;
      monthly = 12;
    };
  };

  # Sicherstellen, dass der S3-Mount bereit ist, bevor Borg startet
  systemd.services.borgbackup-job-hourly = {
    requires = [ "rclone-s3-mount.service" ];
    after = [ "rclone-s3-mount.service" ];
  };
}