mirror of
https://github.com/ryan4yin/nix-config.git
synced 2026-11-13 12:13:46 +01:00
feat(youko): serve restic backups over an append-only REST server
Run restic-rest-server behind caddy (append-only, private repos, htpasswd from agenix) and register youko's host key centrally.
This commit is contained in:
1 parent
12ac5f45aa
commit
1e2cef2550
3 files changed
+38
No files matched your search
@@ -36,10 +36,41 @@ in
|
|||||||
repository = "/data/backups/restic/youko";
|
repository = "/data/backups/restic/youko";
|
||||||
snapshotSource = "/btr_pool/@persistent";
|
snapshotSource = "/btr_pool/@persistent";
|
||||||
requiresMountsFor = "/data/backups";
|
requiresMountsFor = "/data/backups";
|
||||||
|
exclude = [
|
||||||
|
# regenerable, huge, or unsuitable for file-level backup
|
||||||
|
#
|
||||||
|
# the whole podman storage tree: the image layers are re-pullable, and its
|
||||||
|
# storage DB is not consistent when copied from a running podman.
|
||||||
|
# (uptime-kuma uses a named volume under here; its data is not wanted.)
|
||||||
|
"var/lib/containers"
|
||||||
|
"var/lib/microvms"
|
||||||
|
"var/lib/libvirt"
|
||||||
|
"nfs"
|
||||||
|
"var/cache"
|
||||||
|
"var/tmp"
|
||||||
|
"var/log"
|
||||||
|
"*.qcow2"
|
||||||
|
];
|
||||||
};
|
};
|
||||||
|
|
||||||
modules.btrbk.enable = true;
|
modules.btrbk.enable = true;
|
||||||
|
|
||||||
|
# The restic REST server the desktops push their backups to. Append-only, so
|
||||||
|
# a compromised client still cannot delete history; private repos, so each
|
||||||
|
# client only reaches the repository named after its user. Credentials come
|
||||||
|
# from agenix; caddy terminates TLS in front of it.
|
||||||
|
services.restic.server = {
|
||||||
|
enable = true;
|
||||||
|
listenAddress = "127.0.0.1:8000";
|
||||||
|
dataDir = "/data/backups/rest-server";
|
||||||
|
appendOnly = true;
|
||||||
|
privateRepos = true;
|
||||||
|
"htpasswd-file" = config.age.secrets."restic-rest-htpasswd".path;
|
||||||
|
};
|
||||||
|
|
||||||
|
# repositories live on the HDD, which has to be mounted first
|
||||||
|
systemd.services.restic-rest-server.unitConfig.RequiresMountsFor = "/data/backups";
|
||||||
|
|
||||||
boot.kernelParams = [
|
boot.kernelParams = [
|
||||||
# Use transparent huge pages on demand (madvise) instead of a fixed 1G hugetlb
|
# Use transparent huge pages on demand (madvise) instead of a fixed 1G hugetlb
|
||||||
# pool (cannot be overcommitted/shared; it stranded memory and blocked
|
# pool (cannot be overcommitted/shared; it stranded memory and blocked
|
||||||
|
|||||||
@@ -63,6 +63,11 @@ in
|
|||||||
encode zstd gzip
|
encode zstd gzip
|
||||||
reverse_proxy http://localhost:3303
|
reverse_proxy http://localhost:3303
|
||||||
'';
|
'';
|
||||||
|
# the restic REST server the backup clients push to
|
||||||
|
virtualHosts."backup.writefor.fun".extraConfig = ''
|
||||||
|
${hostCommonConfig}
|
||||||
|
reverse_proxy http://localhost:8000
|
||||||
|
'';
|
||||||
virtualHosts."transmission.writefor.fun".extraConfig = ''
|
virtualHosts."transmission.writefor.fun".extraConfig = ''
|
||||||
${hostCommonConfig}
|
${hostCommonConfig}
|
||||||
encode zstd gzip
|
encode zstd gzip
|
||||||
|
|||||||
@@ -187,6 +187,8 @@ rec {
|
|||||||
# Define the root user's host key for remote builders, so that nix can verify all the remote builders
|
# Define the root user's host key for remote builders, so that nix can verify all the remote builders
|
||||||
|
|
||||||
aquamarine.publicKey = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIEOXFhFu9Duzp6ZBE288gDZ6VLrNaeWL4kDrFUh9Neic root@aquamarine";
|
aquamarine.publicKey = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIEOXFhFu9Duzp6ZBE288gDZ6VLrNaeWL4kDrFUh9Neic root@aquamarine";
|
||||||
|
# the restic backup server
|
||||||
|
youko.publicKey = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIEs8b3CmxM+utXZVKvJBssXBupBXvvzjHP40HcY7PSyZ root@youko";
|
||||||
# ruby.publicKey = "";
|
# ruby.publicKey = "";
|
||||||
# kana.publicKey = "";
|
# kana.publicKey = "";
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user