WIP: backup postgresql

This commit is contained in:
Oystein Kristoffer Tveit 2024-08-20 21:38:38 +02:00
parent c12a47cee0
commit 6efebc5cb7
Signed by: oysteikt
GPG Key ID: 9F2F7D8250F35146
1 changed files with 47 additions and 5 deletions

View File

@ -1,6 +1,7 @@
{ config, pkgs, ... }: { config, pkgs, lib, ... }:
let let
sslCert = config.security.acme.certs."postgres.pvv.ntnu.no"; sslCert = config.security.acme.certs."postgres.pvv.ntnu.no";
backupDir = "/var/lib/postgresql/backups";
in in
{ {
services.postgresql = { services.postgresql = {
@ -89,9 +90,50 @@ in
networking.firewall.allowedTCPPorts = [ 5432 ]; networking.firewall.allowedTCPPorts = [ 5432 ];
networking.firewall.allowedUDPPorts = [ 5432 ]; networking.firewall.allowedUDPPorts = [ 5432 ];
services.postgresqlBackup = { # NOTE: instead of having the upstream nixpkgs postgres backup unit trigger
enable = true; # another unit, it was easier to just make one ourselves
location = "/var/lib/postgres/backups"; systemd.services."backup-postgresql" = {
backupAll = true; description = "Backup PostgreSQL data";
requires = [ "postgresql.service" ];
path = [
pkgs.coreutils
pkgs.rsync
pkgs.gzip
config.services.postgresql.package
];
script = let
rotations = 10;
sshTarget1 = "root@isvegg.pvv.ntnu.no:/mnt/backup1/bicep/postgresql";
sshTarget2 = "root@isvegg.pvv.ntnu.no:/mnt/backup2/bicep/postgresql";
in ''
set -eo pipefail
pg_dumpall -U postgres | gzip -c -9 --rsyncable > "${backupDir}/$(date --iso-8601)-dump.sql.gz"
while [ $(ls -1 "${backupDir}" | wc -l) -gt ${toString rotations} ]; do
rm $(find "${backupDir}" -type f -printf '%T+ %p\n' | sort | head -n 1 | cut -d' ' -f2)
done
rsync -avz --delete "${backupDir}" '${sshTarget1}'
rsync -avz --delete "${backupDir}" '${sshTarget2}'
'';
serviceConfig = {
Type = "oneshot";
User = "postgres";
Group = "postgres";
UMask = "0077";
ReadWritePaths = [ backupDir ];
};
startAt = "*-*-* 01:15:00";
};
systemd.tmpfiles.settings."10-postgresql-backup".${backupDir}.d = {
user = "postgres";
group = "postgres";
mode = "700";
}; };
} }