Mój blog // Cyfrowe archiwum

Myśli, projekty i notatki techniczne

Pokaż wpisy z tagiem: #nixos Pokaż wszystko ×

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" ];
  };
}

Zainstalowałem własny blog — przede wszystkim po to, aby lepiej poznać #NixOS. O dziwo, wszystko poszło całkiem sprawnie.

WriteFreely świetnie się do tego nadaje: jest minimalistyczne, szybkie w konfiguracji i pozbawione zbędnych dodatków. Idealne, aby po prostu zacząć i przy okazji czegoś się nauczyć. Konfiguracja jest przyjemnie przejrzysta. Kilka ustawionych opcji, przygotowany katalog, Reverse Proxy przed tym — i gotowe.

Tak wygląda moja aktualna konfiguracja NixOS dla tego projektu:

{ 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";
  };

  # Poprawka dla generowania kluczy ActivityPub: federacja wymaga openssl
  systemd.services.writefreely.path = [ pkgs.openssl ];

  # Automatyczne tworzenie katalogu danych z poprawnymi uprawnieniami
  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}
    }
  '';
}

To w zasadzie wszystko. NixOS sprawia, że czysta konfiguracja takich usług i utrzymanie ich w sposób reprodukowalny jest naprawdę proste.