He cambiado la configuración del backup de mi servidor doméstico NixOS, pasando de un simple script diario a copias de seguridad cada hora. No es tan elegante como en la instancia de Mastodon que administra mi amigo —donde tenemos un snapshot de ZFS cada 20 minutos—, pero estoy satisfecho con esta solución. Y debo decir que NixOS me gusta cada vez más. Sin la IA, sería demasiado complicado para que pudiera entenderlo, pero ahora al menos puedo leer los archivos Nix terminados. Llegué a pensar en cambiar el servidor a un Linux convencional, pero mientras esto funcione tan bien...

  1. /etc/nixos: Toda la configuración de NixOS (todos los archivos .nix).

  2. /opt/minecraft: Todos los mundos y datos del servidor de Minecraft.

  3. /opt/satisfactory: Partidas guardadas y configuración del servidor de Satisfactory.

  4. /opt/Blog: El código fuente y los contenidos del blog.

  5. /opt/ui: Los archivos de la interfaz de usuario (UI) de Mastodon.

  6. /opt/audiobookshelf: Los audiolibros y la base de datos correspondiente.

Todo esto termina en un almacenamiento S3 montado a través de RClone.

La configuración de NixOS


{ config, pkgs, ... }:

{
  # Configuración de BorgBackup
  services.borgbackup.jobs.hourly = {
    # Ruta al repositorio en el montaje S3
    repo = "/opt/S3/Backup/NixOSHomeServer_Borg";

    # No se requiere contraseña
    encryption.mode = "none";

    # Compresión para ahorrar aún más espacio
    compression = "auto,zstd";

    # Las rutas a respaldar
    paths = [
      "/etc/nixos"
      "/opt/minecraft"
      "/opt/satisfactory"
      "/opt/Blog"
      "/opt/ui"
      "/opt/audiobookshelf"
    ];

    # Ejecución cada hora
    startAt = "hourly";

    # Inicializar el repositorio automáticamente si falta
    doInit = true;

    # Reglas de retención (Pruning)
    prune.keep = {
      within = "1d"; # Todos los snapshots de las últimas 24h
      daily = 7;
      weekly = 4;
      monthly = 12;
    };
  };

  # Asegurar que el montaje S3 esté listo antes de que Borg se inicie
  systemd.services.borgbackup-job-hourly = {
    requires = [ "rclone-s3-mount.service" ];
    after = [ "rclone-s3-mount.service" ];
  };
}