diff --git a/nixos/modules/rename.nix b/nixos/modules/rename.nix
index e3691843e170..7b094fc14203 100644
--- a/nixos/modules/rename.nix
+++ b/nixos/modules/rename.nix
@@ -200,6 +200,12 @@ with lib;
(mkRenamedOptionModule [ "fonts" "fontconfig" "ultimate" "forceAutohint" ] [ "fonts" "fontconfig" "forceAutohint" ])
(mkRenamedOptionModule [ "fonts" "fontconfig" "ultimate" "renderMonoTTFAsBitmap" ] [ "fonts" "fontconfig" "renderMonoTTFAsBitmap" ])
+ # postgresqlBackup
+ (mkRemovedOptionModule [ "services" "postgresqlBackup" "period" ] ''
+ A systemd timer is now used instead of cron.
+ The starting time can be configured via services.postgresqlBackup.startAt.
+ '')
+
# Profile splitting
(mkRenamedOptionModule [ "virtualization" "growPartition" ] [ "boot" "growPartition" ])
diff --git a/nixos/modules/services/backup/postgresql-backup.nix b/nixos/modules/services/backup/postgresql-backup.nix
index 4a5ebebc682e..2ec78ce6f2cf 100644
--- a/nixos/modules/services/backup/postgresql-backup.nix
+++ b/nixos/modules/services/backup/postgresql-backup.nix
@@ -3,18 +3,41 @@
with lib;
let
- inherit (pkgs) gzip;
- location = config.services.postgresqlBackup.location;
+ cfg = config.services.postgresqlBackup;
- postgresqlBackupCron = db:
- ''
- ${config.services.postgresqlBackup.period} root ${config.services.postgresql.package}/bin/pg_dump ${db} | ${gzip}/bin/gzip -c > ${location}/${db}.gz
- '';
+ postgresqlBackupService = db :
+ {
+ enable = true;
-in
+ description = "Backup of database ${db}";
-{
+ requires = [ "postgresql.service" ];
+
+ preStart = ''
+ mkdir -m 0700 -p ${cfg.location}
+ chown postgres ${cfg.location}
+ '';
+
+ script = ''
+ if [ -e ${cfg.location}/${db}.sql.gz ]; then
+ ${pkgs.coreutils}/bin/mv ${cfg.location}/${db}.sql.gz ${cfg.location}/${db}.prev.sql.gz
+ fi
+
+ ${config.services.postgresql.package}/bin/pg_dump ${cfg.pgdumpOptions} ${db} | \
+ ${pkgs.gzip}/bin/gzip -c > ${cfg.location}/${db}.sql.gz
+ '';
+
+ serviceConfig = {
+ Type = "oneshot";
+ PermissionsStartOnly = "true";
+ User = "postgres";
+ };
+
+ startAt = cfg.startAt;
+ };
+
+in {
options = {
@@ -27,10 +50,10 @@ in
'';
};
- period = mkOption {
- default = "15 01 * * *";
+ startAt = mkOption {
+ default = "*-*-* 01:15:00";
description = ''
- This option defines (in the format used by cron) when the
+ This option defines (see systemd.time for format) when the
databases should be dumped.
The default is to update at 01:15 (at night) every day.
'';
@@ -49,18 +72,23 @@ in
Location to put the gzipped PostgreSQL database dumps.
'';
};
+
+ pgdumpOptions = mkOption {
+ type = types.string;
+ default = "-Cbo";
+ description = ''
+ Command line options for pg_dump.
+ '';
+ };
};
};
config = mkIf config.services.postgresqlBackup.enable {
- services.cron.systemCronJobs = map postgresqlBackupCron config.services.postgresqlBackup.databases;
- system.activationScripts.postgresqlBackup = stringAfter [ "stdio" "users" ]
- ''
- mkdir -m 0700 -p ${config.services.postgresqlBackup.location}
- chown root ${config.services.postgresqlBackup.location}
- '';
+ systemd.services = listToAttrs (map (db : {
+ name = "postgresqlBackup-${db}";
+ value = postgresqlBackupService db; } ) cfg.databases);
};
}
diff --git a/nixos/tests/postgresql.nix b/nixos/tests/postgresql.nix
index 0ce37b55bb7b..2381939552e2 100644
--- a/nixos/tests/postgresql.nix
+++ b/nixos/tests/postgresql.nix
@@ -26,6 +26,9 @@ let
{
services.postgresql.package=postgresql-package;
services.postgresql.enable = true;
+
+ services.postgresqlBackup.enable = true;
+ services.postgresqlBackup.databases = [ "postgres" ];
};
testScript = ''
@@ -46,6 +49,10 @@ let
$machine->succeed(check_count("SELECT * FROM sth;", 5));
$machine->fail(check_count("SELECT * FROM sth;", 4));
$machine->succeed(check_count("SELECT xpath(\'/test/text()\', doc) FROM xmltest;", 1));
+
+ # Check backup service
+ $machine->succeed("systemctl start postgresqlBackup-postgres.service");
+ $machine->succeed("zcat /var/backup/postgresql/postgres.sql.gz | grep 'ok'");
$machine->shutdown;
'';