Zmieniłem właśnie sposób tworzenia kopii zapasowych mojego serwera domowego NixOS – zamiast prostego, codziennego skryptu, teraz backup odbywa się co godzinę. Nie jest to może tak eleganckie rozwiązanie, jak na instancji Mastodona, którą zarządza mój znajomy – tam snapshoty ZFS są robione co 20 minut – ale z obecnego rozwiązania również jestem zadowolony. I muszę przyznać, że NixOS podoba mi się coraz bardziej. Bez wsparcia AI byłoby to jednak zbyt skomplikowane, bym mógł to ogarnąć, ale teraz przynajmniej potrafię czytać gotowe pliki Nix. Zastanawiałem się kiedyś nad przejściem na zwykłego Linuksa, ale dopóki to tak dobrze działa...

  1. /etc/nixos: Cała konfiguracja NixOS (wszystkie pliki .nix).

  2. /opt/minecraft: Wszystkie światy i dane serwera Minecraft.

  3. /opt/satisfactory: Stany gry i konfiguracja serwera Satisfactory.

  4. /opt/Blog: Kod źródłowy i treść bloga.

  5. /opt/ui: Pliki interfejsu Mastodon.

  6. /opt/audiobookshelf: Audiobooki i powiązana z nimi baza danych.

Wszystko trafia do pamięci masowej S3, zamontowanej za pomocą RClone.

Konfiguracja NixOS


{ config, pkgs, ... }:

{
  # Konfiguracja BorgBackup
  services.borgbackup.jobs.hourly = {
    # Ścieżka do repozytorium w punkcie montowania S3
    repo = "/opt/S3/Backup/NixOSHomeServer_Borg";

    # Hasło nie jest wymagane
    encryption.mode = "none";

    # Kompresja dla jeszcze większej oszczędności miejsca
    compression = "auto,zstd";

    # Ścieżki do uwzględnienia w kopii zapasowej
    paths = [
      "/etc/nixos"
      "/opt/minecraft"
      "/opt/satisfactory"
      "/opt/Blog"
      "/opt/ui"
      "/opt/audiobookshelf"
    ];

    # Wykonywanie co godzinę
    startAt = "hourly";

    # Automatyczna inicjalizacja repozytorium, jeśli go brakuje
    doInit = true;

    # Zasady przechowywania (Pruning)
    prune.keep = {
      within = "1d"; # Wszystkie snapshoty z ostatnich 24h
      daily = 7;
      weekly = 4;
      monthly = 12;
    };
  };

  # Upewnienie się, że punkt montowania S3 jest gotowy przed uruchomieniem Borga
  systemd.services.borgbackup-job-hourly = {
    requires = [ "rclone-s3-mount.service" ];
    after = [ "rclone-s3-mount.service" ];
  };
}