Jag har nu ställt om backupen för min NixOS-hemserver och gått från ett enkelt dagligt skript till timvis backup. Inte riktigt lika elegant som på Mastodon-instansen som min vän administrerar – där kör vi en ZFS-snapshot var 20:e minut – men jag är nöjd med den här lösningen också. Och jag måste säga att jag gillar NixOS mer och mer. Utan AI hade det dock varit alldeles för komplicerat för att jag skulle förstå det, men numera kan jag åtminstone läsa de färdiga Nix-filerna. Jag funderade ett tag på att byta till en vanlig Linux-distribution på servern, men så länge det fungerar så här bra...

  1. /etc/nixos: Hela NixOS-konfigurationen (alla .nix-filer).

  2. /opt/minecraft: Alla världar och data för Minecraft-servern.

  3. /opt/satisfactory: Sparfiler och konfiguration för Satisfactory-servern.

  4. /opt/Blog: Bloggens källkod och innehåll.

  5. /opt/ui: Mastodon-UI-filerna.

  6. /opt/audiobookshelf: Ljudböckerna och den tillhörande databasen.

Allt hamnar på en S3-lagring som har monterats via RClone.

NixOS-konfigurationen


{ config, pkgs, ... }:

{
  # BorgBackup-konfiguration
  services.borgbackup.jobs.hourly = {
    # Sökväg till repot i S3-monteringen
    repo = "/opt/S3/Backup/NixOSHomeServer_Borg";

    # Inget lösenord krävs
    encryption.mode = "none";

    # Komprimering för ännu mer platsbesparing
    compression = "auto,zstd";

    # Sökvägar som ska säkerhetskopieras
    paths = [
      "/etc/nixos"
      "/opt/minecraft"
      "/opt/satisfactory"
      "/opt/Blog"
      "/opt/ui"
      "/opt/audiobookshelf"
    ];

    # Körs varje timme
    startAt = "hourly";

    # Initiera repot automatiskt om det saknas
    doInit = true;

    # Gallringsregler (Pruning)
    prune.keep = {
      within = "1d"; # Alla snapshots från de senaste 24 timmarna
      daily = 7;
      weekly = 4;
      monthly = 12;
    };
  };

  # Se till att S3-monteringen är redo innan Borg startar
  systemd.services.borgbackup-job-hourly = {
    requires = [ "rclone-s3-mount.service" ];
    after = [ "rclone-s3-mount.service" ];
  };
}