J'ai récemment modifié la sauvegarde de mon serveur domestique NixOS, passant d'un simple script quotidien à une exécution horaire. Ce n'est pas aussi élégant que sur l'instance Mastodon que gère mon ami – où nous avons un snapshot ZFS toutes les 20 minutes – mais je suis également satisfait de cette solution. Et je dois dire que NixOS me plaît de plus en plus. Sans l'IA, ce serait bien trop complexe pour que je puisse le comprendre, mais désormais, j'arrive au moins à lire les fichiers Nix terminés. J'avais envisagé de passer le serveur sur une distribution Linux classique, mais tant que cela fonctionne aussi bien...

  1. /etc/nixos : Toute la configuration NixOS (tous les fichiers .nix).

  2. /opt/minecraft : Tous les mondes et données du serveur Minecraft.

  3. /opt/satisfactory : Sauvegardes et configuration du serveur Satisfactory.

  4. /opt/Blog : Le code source et le contenu du blog.

  5. /opt/ui : Les fichiers de l'interface utilisateur (UI) de Mastodon.

  6. /opt/audiobookshelf : Les livres audio et la base de données associée.

Le tout est stocké sur un stockage S3 monté via RClone.

La configuration NixOS


{ config, pkgs, ... }:

{
  # Configuration de BorgBackup
  services.borgbackup.jobs.hourly = {
    # Chemin vers le dépôt dans le montage S3
    repo = "/opt/S3/Backup/NixOSHomeServer_Borg";

    # Aucun mot de passe requis
    encryption.mode = "none";

    # Compression pour encore plus d'économie d'espace
    compression = "auto,zstd";

    # Les chemins à sauvegarder
    paths = [
      "/etc/nixos"
      "/opt/minecraft"
      "/opt/satisfactory"
      "/opt/Blog"
      "/opt/ui"
      "/opt/audiobookshelf"
    ];

    # Exécution horaire
    startAt = "hourly";

    # Initialiser automatiquement le dépôt s'il est manquant
    doInit = true;

    # Règles de rétention (élagage)
    prune.keep = {
      within = "1d"; # Tous les snapshots des dernières 24h
      daily = 7;
      weekly = 4;
      monthly = 12;
    };
  };

  # S'assurer que le montage S3 est prêt avant que Borg ne démarre
  systemd.services.borgbackup-job-hourly = {
    requires = [ "rclone-s3-mount.service" ];
    after = [ "rclone-s3-mount.service" ];
  };
}