From 511d0c53093362e77eba647edca3a1d70f003847 Mon Sep 17 00:00:00 2001 From: ltadeu6 Date: Thu, 28 May 2026 19:47:19 -0300 Subject: [PATCH] Add local game save backups --- AGENTS.md | 21 +++++++++++++++++++++ home/ltadeu6.nix | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+) diff --git a/AGENTS.md b/AGENTS.md index 00e7efb..68ee130 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -341,6 +341,7 @@ Pacotes de sessao e desktop usados diretamente pelos configs: - `slurp` - `wl-clipboard` - `networkmanager` +- `ludusavi` - `hyprpicker` - `papirus-icon-theme` - `mpv` @@ -574,6 +575,26 @@ Estado atual: - aponta o provider Ollama para `http://127.0.0.1:11434` - usa modelo `ollama/gemma4:e4b` +### Backups locais de saves de jogos + +Fonte principal: + +- `home/ltadeu6.nix` + +Estado atual: + +- O Home Manager instala `ludusavi`. +- O timer de usuario `game-save-ludusavi-backup.timer` roda de hora em hora. +- O servico `game-save-ludusavi-backup.service` executa Ludusavi em modo CLI. +- Os backups locais ficam em `~/Backups/game-saves/ludusavi`. +- O formato usado e `simple`, com retencao de 14 backups completos e 14 diferenciais por jogo. + +Cuidados: + +- Este fluxo e apenas local; nao ha Restic, OCI ou outro destino remoto para saves de jogos no estado atual. +- Se adicionar backup remoto depois, mantenha segredos fora do repo e prefira um repo separado dos backups do VPS. +- Nao faca backup bruto de `~/.local/share/Steam/steamapps`; prefira Ludusavi e excecoes pontuais para jogos nao detectados. + ## Secrets e variaveis de ambiente ### Segredos versionados hoje diff --git a/home/ltadeu6.nix b/home/ltadeu6.nix index c0a472e..9ff8cfe 100644 --- a/home/ltadeu6.nix +++ b/home/ltadeu6.nix @@ -1,6 +1,22 @@ { config, pkgs, lib, ... }: let + gameSaveBackupRoot = "${config.home.homeDirectory}/Backups/game-saves"; + gameSaveLudusaviPath = "${gameSaveBackupRoot}/ludusavi"; + gameSaveLudusaviBackup = pkgs.writeShellScript "game-save-ludusavi-backup" '' + set -eu + + ${pkgs.coreutils}/bin/mkdir -p ${lib.escapeShellArg gameSaveLudusaviPath} + + exec ${pkgs.ludusavi}/bin/ludusavi \ + --try-manifest-update \ + backup \ + --path ${lib.escapeShellArg gameSaveLudusaviPath} \ + --format simple \ + --full-limit 14 \ + --differential-limit 14 \ + --force + ''; opencodeWithLibstdcxx = pkgs.symlinkJoin { name = "opencode"; paths = [ pkgs.unstable.opencode ]; @@ -247,6 +263,7 @@ in man hyprpicker networkmanager + ludusavi prismlauncher gimp inkscape @@ -375,6 +392,24 @@ in ".config/wofi/menu.css".source = ../configs/wofi/menu.css; }; + systemd.user.services.game-save-ludusavi-backup = { + Unit.Description = "Back up game saves with Ludusavi"; + Service = { + Type = "oneshot"; + ExecStart = "${gameSaveLudusaviBackup}"; + }; + }; + + systemd.user.timers.game-save-ludusavi-backup = { + Unit.Description = "Run Ludusavi game-save backup"; + Timer = { + OnCalendar = "hourly"; + Persistent = true; + RandomizedDelaySec = "10min"; + }; + Install.WantedBy = [ "timers.target" ]; + }; + home.activation.ociCredentials = lib.hm.dag.entryAfter [ "writeBoundary" ] '' set -euo pipefail key_file="/run/agenix/oci_key"