Blogul meu // Arhivă digitală

Gânduri, proiecte și note tehnice

Afișează postările cu eticheta: #nixos Afișează tot ×

Tocmai am schimbat sistemul de backup al serverului meu de acasă NixOS, trecând de la un simplu script zilnic la unul orar. Nu este chiar atât de elegant ca pe instanța Mastodon pe care o administrează prietenul meu – acolo avem un snapshot ZFS la fiecare 20 de minute – dar sunt mulțumit și de această soluție. Și trebuie să spun că NixOS îmi place din ce în ce mai mult. Fără AI ar fi însă mult prea complicat pentru a-l putea înțelege, dar acum pot cel puțin să citesc fișierele Nix gata făcute. M-am gândit la un moment dat să trec serverul pe un Linux obișnuit, dar atâta timp cât funcționează atât de bine...

  1. /etc/nixos: Întreaga configurație NixOS (toate fișierele .nix).

  2. /opt/minecraft: Toate lumile și datele serverului de Minecraft.

  3. /opt/satisfactory: Salvările și configurația serverului de Satisfactory.

  4. /opt/Blog: Codul sursă și conținutul blogului.

  5. /opt/ui: Fișierele UI pentru Mastodon.

  6. /opt/audiobookshelf: Cărțile audio și baza de date aferentă.

Totul ajunge pe un spațiu de stocare S3 montat prin RClone.

Configurația NixOS


{ config, pkgs, ... }:

{
  # Configurație BorgBackup
  services.borgbackup.jobs.hourly = {
    # Calea către repository în mount-ul S3
    repo = "/opt/S3/Backup/NixOSHomeServer_Borg";

    # Nu este necesară nicio parolă
    encryption.mode = "none";

    # Compresie pentru o economie și mai mare de spațiu
    compression = "auto,zstd";

    # Căile care trebuie salvate
    paths = [
      "/etc/nixos"
      "/opt/minecraft"
      "/opt/satisfactory"
      "/opt/Blog"
      "/opt/ui"
      "/opt/audiobookshelf"
    ];

    # Execuție orară
    startAt = "hourly";

    # Inițializare automată a repository-ului dacă acesta lipsește
    doInit = true;

    # Reguli de retenție (Pruning)
    prune.keep = {
      within = "1d"; # Toate snapshot-urile din ultimele 24h
      daily = 7;
      weekly = 4;
      monthly = 12;
    };
  };

  # Asigurarea că mount-ul S3 este gata înainte de pornirea Borg
  systemd.services.borgbackup-job-hourly = {
    requires = [ "rclone-s3-mount.service" ];
    after = [ "rclone-s3-mount.service" ];
  };
}

Mi-am instalat propriul blog — în principal pentru a cunoaște mai bine #NixOS. Surprinzător, totul a decurs destul de simplu.

WriteFreely se potrivește de minune pentru asta: minimalist, rapid de configurat și fără balast inutil. Perfect pentru a începe pur și simplu și pentru a învăța ceva pe parcurs. Configurația este plăcut de clară. Câteva opțiuni setate, directorul pregătit, un reverse proxy în față — gata.

Iată cum arată configurația mea actuală de NixOS pentru acest lucru:

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

  # Fix pentru generarea cheilor ActivityPub: Federația necesită openssl
  systemd.services.writefreely.path = [ pkgs.openssl ];

  # Crearea automată a directorului de date cu permisiunile corecte
  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}
    }
  '';
}

Asta a fost, în esență. NixOS face cu adevărat simplă configurarea curată a unor astfel de servicii și menținerea lor reproductibilă.