add backups for owncast

This commit is contained in:
chaos 2023-10-27 17:44:32 +01:00
parent 4e5bec5588
commit ac2d940df5
No known key found for this signature in database
10 changed files with 104 additions and 5 deletions

View file

@ -7,14 +7,14 @@
config, config,
... ...
}: let }: let
containerName = "stream"; containerName = "owncast";
containerAddresses = import "${hostPath}/data/containerAddresses.nix"; containerAddresses = import "${hostPath}/data/containerAddresses.nix";
hostIP = containerAddresses.host; hostIP = containerAddresses.host;
containerIP = containerAddresses.containers.${containerName}; containerIP = containerAddresses.containers.${containerName};
in { in {
containers.stream = { containers.owncast = {
autoStart = true; autoStart = true;
privateNetwork = true; privateNetwork = true;
hostAddress = hostIP; hostAddress = hostIP;
@ -33,9 +33,11 @@ in {
imports = with tree; imports = with tree;
[ [
presets.nixos.containerBase presets.nixos.containerBase
./secrets.nix
] ]
++ (with hosts.hetzner-arm.containers.stream.profiles; [ ++ (with hosts.hetzner-arm.containers.owncast.profiles; [
owncast owncast
restic
]); ]);
networking.firewall.allowedTCPPorts = [ networking.firewall.allowedTCPPorts = [

View file

@ -0,0 +1,39 @@
{
pkgs,
config,
...
}: let
secrets = config.services.secrets.secrets;
in {
environment.systemPackages = with pkgs; [
restic
(pkgs.writeShellScriptBin "restic-owncast" ''
env \
RESTIC_PASSWORD_FILE=${secrets.restic_password.path} \
$(cat ${secrets.restic_env.path}) \
${pkgs.restic}/bin/restic $@
'')
];
services.restic.backups.owncast = {
user = "root";
paths = [
"/var/lib/owncast"
];
# repository is overrided in environmentFile to contain auth
# make sure to keep up to date when changing repository
repository = "rest:https://storage-restic.owo.monster/Owncast";
passwordFile = "${secrets.restic_password.path}";
environmentFile = "${secrets.restic_env.path}";
pruneOpts = [
"--keep-last 5"
];
timerConfig = {
OnBootSec = "10m";
OnCalendar = "8h";
};
};
}

View file

@ -0,0 +1,37 @@
{pkgs, ...}: {
services.secrets = {
enable = true;
vaultLogin = {
enable = true;
loginUsername = "hetzner-arm-container-owncast";
};
autoSecrets = {
enable = true;
};
requiredVaultPaths = [
"api-keys/data/storage/restic/Owncast"
"private-public-keys/data/restic/Owncast"
];
secrets = {
vault_password = {
manual = true;
};
restic_password = {
fetchScript = ''
simple_get "/private-public-keys/restic/Owncast" .password > "$secretFile"
'';
};
restic_env = {
fetchScript = ''
RESTIC_PASSWORD=$(simple_get "/api-keys/storage/restic/Owncast" .restic)
echo "RESTIC_REPOSITORY=rest:https://restic:$RESTIC_PASSWORD@storage-restic.owo.monster/Owncast" > "$secretFile"
'';
};
};
};
}

View file

@ -17,6 +17,7 @@ in {
restic_mail = restic + 5; restic_mail = restic + 5;
restic_forgejo = restic + 6; restic_forgejo = restic + 6;
restic_caldav = restic + 7; restic_caldav = restic + 7;
restic_owncast = restic + 8;
http_music = http + 0; http_music = http + 0;
http_public = http + 1; http_public = http + 1;

View file

@ -98,6 +98,7 @@ in {
"/Mail/".proxyPass = "http://${containerIP}:${toString ports.restic_mail}"; "/Mail/".proxyPass = "http://${containerIP}:${toString ports.restic_mail}";
"/Forgejo/".proxyPass = "http://${containerIP}:${toString ports.restic_forgejo}"; "/Forgejo/".proxyPass = "http://${containerIP}:${toString ports.restic_forgejo}";
"/CalDAV/".proxyPass = "http://${containerIP}:${toString ports.restic_caldav}"; "/CalDAV/".proxyPass = "http://${containerIP}:${toString ports.restic_caldav}";
"/Owncast/".proxyPass = "http://${containerIP}:${toString ports.restic_owncast}";
}; };
extraConfig = '' extraConfig = ''
client_max_body_size ${clientMaxBodySize}; client_max_body_size ${clientMaxBodySize};

View file

@ -187,6 +187,16 @@ in {
"--baseurl=/Forgejo/" "--baseurl=/Forgejo/"
]; ];
} }
{
id = "restic-owncast";
remote = "StorageBox:Backups/Restic/Owncast";
type = "restic";
extraArgs = [
"--addr=0.0.0.0:${toString ports.restic_owncast}"
"--htpasswd=${secrets.restic_owncast_htpasswd.path}"
"--baseurl=/Owncast/"
];
}
]; ];
}; };
} }

View file

@ -31,6 +31,7 @@
"api-keys/data/storage/restic/Mail" "api-keys/data/storage/restic/Mail"
"api-keys/data/storage/restic/Forgejo" "api-keys/data/storage/restic/Forgejo"
"api-keys/data/storage/restic/CalDAV" "api-keys/data/storage/restic/CalDAV"
"api-keys/data/storage/restic/Owncast"
"api-keys/data/storage/webdav/Main" "api-keys/data/storage/webdav/Main"
"api-keys/data/storage/webdav/Media" "api-keys/data/storage/webdav/Media"
@ -160,6 +161,14 @@
''; '';
}; };
restic_owncast_htpasswd = {
user = "storage";
group = "storage";
fetchScript = ''
simple_get_htpasswd "/api-keys/storage/restic/Owncast" "$secretFile"
'';
};
webdav_main_htpasswd = { webdav_main_htpasswd = {
user = "storage"; user = "storage";
group = "storage"; group = "storage";

View file

@ -9,6 +9,6 @@
postgresql = "10.0.1.7"; postgresql = "10.0.1.7";
piped-fi = "10.0.1.8"; piped-fi = "10.0.1.8";
caldav = "10.0.1.9"; caldav = "10.0.1.9";
stream = "10.0.1.10"; owncast = "10.0.1.10";
}; };
} }

View file

@ -29,7 +29,7 @@ in {
"mail" "mail"
"forgejo" "forgejo"
"caldav" "caldav"
"stream" "owncast"
] (name: ./containers + "/${name}")) ] (name: ./containers + "/${name}"))
++ (with hosts.hetzner-arm.profiles; [ ++ (with hosts.hetzner-arm.profiles; [
staticSites staticSites