Restic: Difference between revisions
m Added note for creating htpasswd file Tags: Mobile edit Mobile web edit Advanced mobile edit Visual edit |
m formatted code, added example sops Tags: Mobile edit Mobile web edit Advanced mobile edit Visual edit |
||
| Line 21: | Line 21: | ||
Restic Rest Server is one of the options for a remote repository<ref>https://restic.readthedocs.io/en/latest/030_preparing_a_new_repo.html#rest-server</ref>. It can be installed by enabling the <code>services.restic.server.enable</code> option. By default the server requires either providing it with <code>htpasswd</code> file or running it without authentication. If provided, the username and password pairs <code>htpassd</code> file will be used to authenticate the restic clients connecting to the server. To run the server without authentication, you can pass the flag using the <code>extraFlags</code> option like this: <code>services.restic.server.extraFlags = [ "--no-auth" ];</code> | Restic Rest Server is one of the options for a remote repository<ref>https://restic.readthedocs.io/en/latest/030_preparing_a_new_repo.html#rest-server</ref>. It can be installed by enabling the <code>services.restic.server.enable</code> option. By default the server requires either providing it with <code>htpasswd</code> file or running it without authentication. If provided, the username and password pairs <code>htpassd</code> file will be used to authenticate the restic clients connecting to the server. To run the server without authentication, you can pass the flag using the <code>extraFlags</code> option like this: <code>services.restic.server.extraFlags = [ "--no-auth" ];</code> | ||
==== Using a htpasswd file ==== | |||
==== | |||
A htpasswd file must be created using the <code>apacheHttpd</code> package. Assuming that you do not already have this package, you may run the following to generate the file using nix shell. Note that the file will be hidden due to the "." at the start of the file. | A htpasswd file must be created using the <code>apacheHttpd</code> package. Assuming that you do not already have this package, you may run the following to generate the file using nix shell. Note that the file will be hidden due to the "." at the start of the file. | ||
| Line 29: | Line 27: | ||
<syntaxhighlight lang="console"> | <syntaxhighlight lang="console"> | ||
$ nix shell nixpkgs#apacheHttpd -c htpasswd -B -c .htpasswd YOUR_USERNAME | $ nix shell nixpkgs#apacheHttpd -c htpasswd -B -c .htpasswd YOUR_USERNAME | ||
</syntaxhighlight> | |||
To declaratively use the <code>htpasswd</code> file you will need to use a [[Comparison of secret managing schemes|secret management method]]. The following example uses [https://github.com/Mic92/sops-nix sops-nix]. | |||
{{File|3={config,inputs,...}: | |||
{ | |||
imports = | |||
[ | |||
inputs.sops-nix.nixosModules.sops | |||
]; | |||
sops = { | |||
age.keyFile = "/home/YOUR_USER/.config/sops/age/keys.txt"; | |||
defaultSopsFile = ./secrets.yaml; | |||
secrets."restic_server/password" = { | |||
owner = "restic"; | |||
group = "restic"; | |||
mode = "0400"; | |||
}; | |||
}; | |||
services.restic.server = { | |||
enable = true; | |||
htpasswd-file = config.sops.secrets."restic_server/password".path; | |||
}; | |||
}|name=configuration.nix|lang=nix}} | |||
== Security Wrapper == | == Security Wrapper == | ||
If you want to back up your system [https://restic.readthedocs.io/en/latest/080_examples.html#backing-up-your-system-without-running-restic-as-root without running restic as root], you can create a user and security wrapper to give restic the capability to read anything on the filesystem as if it were running as root. The following will create the wrapper at <code>/run/wrappers/bin/restic</code> | If you want to back up your system [https://restic.readthedocs.io/en/latest/080_examples.html#backing-up-your-system-without-running-restic-as-root without running restic as root], you can create a user and security wrapper to give restic the capability to read anything on the filesystem as if it were running as root. The following will create the wrapper at <code>/run/wrappers/bin/restic</code>: | ||
{{File|3={ | |||
users = { | |||
users.restic = { | |||
group = "restic"; | |||
isSystemUser = true; | |||
}; | |||
groups.restic = {}; | |||
}; | |||
security.wrappers.restic = { | |||
source = lib.getExe pkgs.restic; | |||
owner = "restic"; | |||
group = "restic"; | group = "restic"; | ||
permissions = "500"; # or u=rx,g=,o= | |||
capabilities = "cap_dac_read_search+ep"; | |||
}; | }; | ||
}|name=configuration.nix|lang=nix}} | |||
} | |||
Note that you will have to set your Restic configuration to use the wrapper using the [https://search.nixos.org/options?channel=unstable&show=services.restic.backups.%3Cname%3E.package&from=0&size=50&sort=relevance&type=packages&query=services.restic.backups services.restic.backups.<name>.package] option, for example <ref>https://github.com/NixOS/nixpkgs/issues/341999#issuecomment-2558504576</ref>: | |||
{{File|3={ | |||
services.restic.backups.foo = { | |||
# ... | |||
user = "restic"; | |||
package = pkgs.writeShellScriptBin "restic" '' | |||
exec /run/wrappers/bin/restic "$@" | |||
''; | |||
}; | |||
}|name=configuration.nix|lang=nix}} | |||
[[Category:Applications]] | [[Category:Applications]] | ||
[[Category:Backup]] | [[Category:Backup]] | ||
Revision as of 21:19, 24 March 2026
Restic is a fast and secure backup program. NixOS packages both restic client (program used to make backups) and restic-rest-server (one of the backends to store the backups remotely, "repositories" in restic parlance).
Installing
If you want to manually create restic backups, add restic to environment.systemPackages like so:
environment.systemPackages = with pkgs; [
restic
];
Configuring
Restic
NixOS provides options to create a systemd timer and a service that will create the backups. See services.restic.backups options and "Backing up" in the restic documentation.
Note that NixOS includes an option to automatically create the repository by specifying services.restic.backups.<name>.initialize = true;, as well as a wrapper to run restic in the same environment as the systemd jobs in services.restic.backups.<name>.createWrapper
Restic Rest Server
Restic Rest Server is one of the options for a remote repository[1]. It can be installed by enabling the services.restic.server.enable option. By default the server requires either providing it with htpasswd file or running it without authentication. If provided, the username and password pairs htpassd file will be used to authenticate the restic clients connecting to the server. To run the server without authentication, you can pass the flag using the extraFlags option like this: services.restic.server.extraFlags = [ "--no-auth" ];
Using a htpasswd file
A htpasswd file must be created using the apacheHttpd package. Assuming that you do not already have this package, you may run the following to generate the file using nix shell. Note that the file will be hidden due to the "." at the start of the file.
$ nix shell nixpkgs#apacheHttpd -c htpasswd -B -c .htpasswd YOUR_USERNAME
To declaratively use the htpasswd file you will need to use a secret management method. The following example uses sops-nix.
{config,inputs,...}:
{
imports =
[
inputs.sops-nix.nixosModules.sops
];
sops = {
age.keyFile = "/home/YOUR_USER/.config/sops/age/keys.txt";
defaultSopsFile = ./secrets.yaml;
secrets."restic_server/password" = {
owner = "restic";
group = "restic";
mode = "0400";
};
};
services.restic.server = {
enable = true;
htpasswd-file = config.sops.secrets."restic_server/password".path;
};
}
Security Wrapper
If you want to back up your system without running restic as root, you can create a user and security wrapper to give restic the capability to read anything on the filesystem as if it were running as root. The following will create the wrapper at /run/wrappers/bin/restic:
{
users = {
users.restic = {
group = "restic";
isSystemUser = true;
};
groups.restic = {};
};
security.wrappers.restic = {
source = lib.getExe pkgs.restic;
owner = "restic";
group = "restic";
permissions = "500"; # or u=rx,g=,o=
capabilities = "cap_dac_read_search+ep";
};
}
Note that you will have to set your Restic configuration to use the wrapper using the services.restic.backups.<name>.package option, for example [2]:
{
services.restic.backups.foo = {
# ...
user = "restic";
package = pkgs.writeShellScriptBin "restic" ''
exec /run/wrappers/bin/restic "$@"
'';
};
}