Automate restic restore command creation

This commit is contained in:
SebastianStork 2025-06-07 15:12:21 +02:00
parent 731f0ec615
commit e6989963c7
6 changed files with 70 additions and 95 deletions

View file

@ -1,9 +1,4 @@
{ { config, lib, ... }:
config,
pkgs,
lib,
...
}:
let let
user = config.users.users.actual.name; user = config.users.users.actual.name;
in in
@ -16,18 +11,5 @@ in
dependentService = "actual.service"; dependentService = "actual.service";
extraConfig.paths = [ config.services.actual.settings.dataDir ]; extraConfig.paths = [ config.services.actual.settings.dataDir ];
}; };
environment.systemPackages = [
(pkgs.writeShellApplication {
name = "actual-restore";
text = ''
sudo --user=${user} bash -c "
systemctl stop actual.service
restic-actual restore latest --target /
systemctl start actual.service
"
'';
})
];
}; };
} }

View file

@ -1,9 +1,4 @@
{ { config, lib, ... }:
config,
pkgs,
lib,
...
}:
let let
user = config.users.users.forgejo.name; user = config.users.users.forgejo.name;
in in
@ -16,18 +11,5 @@ in
dependentService = "forgejo.service"; dependentService = "forgejo.service";
extraConfig.paths = [ config.services.forgejo.stateDir ]; extraConfig.paths = [ config.services.forgejo.stateDir ];
}; };
environment.systemPackages = [
(pkgs.writeShellApplication {
name = "forgejo-restore";
text = ''
sudo --user=${user} bash -c "
systemctl stop forgejo.service
restic-forgejo restore latest --target /
systemctl start forgejo.service
"
'';
})
];
}; };
} }

View file

@ -1,9 +1,4 @@
{ { config, lib, ... }:
config,
pkgs,
lib,
...
}:
let let
user = config.users.users.hedgedoc.name; user = config.users.users.hedgedoc.name;
in in
@ -19,18 +14,5 @@ in
db.storage db.storage
]; ];
}; };
environment.systemPackages = [
(pkgs.writeShellApplication {
name = "hedgedoc-restore";
text = ''
sudo --user=${user} bash -c "
systemctl stop hedgedoc.service
restic-hedgedoc restore latest --target /
systemctl start hedgedoc.service
"
'';
})
];
}; };
} }

View file

@ -1,9 +1,4 @@
{ { config, lib, ... }:
config,
pkgs,
lib,
...
}:
let let
cfg = config.custom.services.nextcloud; cfg = config.custom.services.nextcloud;
@ -28,20 +23,14 @@ in
"${dataDir}/db.dump" "${dataDir}/db.dump"
]; ];
}; };
};
environment.systemPackages = [ restoreCommand = {
(pkgs.writeShellApplication { preRestore = "${lib.getExe' config.services.nextcloud.occ "nextcloud-occ"} maintenance:mode --on";
name = "nextcloud-restore"; postRestore = ''
text = '' pg_restore --clean --if-exists --dbname nextcloud ${dataDir}/db.dump
sudo --user=${user} bash -c " ${lib.getExe' config.services.nextcloud.occ "nextcloud-occ"} maintenance:mode --off
${lib.getExe' config.services.nextcloud.occ "nextcloud-occ"} maintenance:mode --on
restic-nextcloud restore latest --target /
pg_restore --clean --if-exists --dbname nextcloud ${dataDir}/db.dump
${lib.getExe' config.services.nextcloud.occ "nextcloud-occ"} maintenance:mode --off
"
''; '';
}) };
]; };
}; };
} }

View file

@ -0,0 +1,58 @@
{
config,
pkgs,
lib,
...
}:
let
backupsWithRestoreCommand =
config.custom.services.resticBackups
|> lib.filterAttrs (_: value: value.enable)
|> lib.filterAttrs (_: value: value.restoreCommand.enable);
in
{
options.custom.services.resticBackups = lib.mkOption {
type = lib.types.attrsOf (
lib.types.submodule {
options.restoreCommand = {
enable = lib.mkEnableOption "" // {
default = true;
};
preRestore = lib.mkOption {
type = lib.types.str;
default = "";
};
postRestore = lib.mkOption {
type = lib.types.str;
default = "";
};
};
}
);
};
config = {
environment.systemPackages =
backupsWithRestoreCommand
|> lib.mapAttrsToList (
name: value:
pkgs.writeShellApplication {
name = "restic-restore-${name}";
text =
let
inherit (value) dependentService;
hasDependentService = dependentService != null;
in
''
${lib.optionalString hasDependentService "sudo systemctl stop ${dependentService}"}
sudo --user=${value.user} bash -c "
${value.restoreCommand.preRestore}
restic-nextcloud restore latest --target /
${value.restoreCommand.postRestore}
"
${lib.optionalString hasDependentService "sudo systemctl start ${dependentService}"}
'';
}
);
};
}

View file

@ -1,9 +1,4 @@
{ { config, lib, ... }:
config,
pkgs,
lib,
...
}:
let let
cfg = config.custom.services.syncthing; cfg = config.custom.services.syncthing;
@ -25,18 +20,5 @@ in
dependentService = "syncthing.service"; dependentService = "syncthing.service";
extraConfig.paths = [ config.services.syncthing.dataDir ]; extraConfig.paths = [ config.services.syncthing.dataDir ];
}; };
environment.systemPackages = [
(pkgs.writeShellApplication {
name = "syncthing-restore";
text = ''
sudo --user=${user} bash -c "
systemctl stop syncthing.service
restic-syncthing restore latest --target /
systemctl start syncthing.service
"
'';
})
];
}; };
} }