Compare commits
	
		
			3 Commits
		
	
	
		
			sleipner-a
			...
			backup-dat
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 4521d404ae | |||
| 
						
						
							
						
						f498b82b07
	
				 | 
					
					
						|||
| 
						
						
							
						
						9034a71927
	
				 | 
					
					
						
@@ -1,4 +1,7 @@
 | 
			
		||||
{ pkgs, lib, config, values, ... }:
 | 
			
		||||
let
 | 
			
		||||
  backupDir = "/var/lib/mysql/backups";
 | 
			
		||||
in
 | 
			
		||||
{
 | 
			
		||||
  sops.secrets."mysql/password" = {
 | 
			
		||||
    owner = "mysql";
 | 
			
		||||
@@ -36,11 +39,6 @@
 | 
			
		||||
    }];
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  services.mysqlBackup = {
 | 
			
		||||
    enable = true;
 | 
			
		||||
    location = "/var/lib/mysql/backups";
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  networking.firewall.allowedTCPPorts = [ 3306 ];
 | 
			
		||||
 | 
			
		||||
  systemd.services.mysql.serviceConfig = {
 | 
			
		||||
@@ -50,4 +48,58 @@
 | 
			
		||||
      values.ipv6-space
 | 
			
		||||
    ];
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  # NOTE: instead of having the upstream nixpkgs postgres backup unit trigger
 | 
			
		||||
  #       another unit, it was easier to just make one ourselves
 | 
			
		||||
  systemd.services."backup-mysql" = {
 | 
			
		||||
    description = "Backup MySQL data";
 | 
			
		||||
    requires = [ "mysql.service" ];
 | 
			
		||||
 | 
			
		||||
    path = [
 | 
			
		||||
      pkgs.coreutils
 | 
			
		||||
      pkgs.rsync
 | 
			
		||||
      pkgs.gzip
 | 
			
		||||
      config.services.mysql.package
 | 
			
		||||
    ];
 | 
			
		||||
 | 
			
		||||
    script = let
 | 
			
		||||
      rotations = 10;
 | 
			
		||||
      # rsyncTarget = "root@isvegg.pvv.ntnu.no:/mnt/backup1/bicep/mysql";
 | 
			
		||||
      rsyncTarget = "/data/backup/mysql";
 | 
			
		||||
    in ''
 | 
			
		||||
      set -eo pipefail
 | 
			
		||||
 | 
			
		||||
      mysqldump --all-databases | 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}" '${rsyncTarget}'
 | 
			
		||||
    '';
 | 
			
		||||
 | 
			
		||||
    serviceConfig = {
 | 
			
		||||
      Type = "oneshot";
 | 
			
		||||
      User = "mysql";
 | 
			
		||||
      Group = "mysql";
 | 
			
		||||
      UMask = "0077";
 | 
			
		||||
 | 
			
		||||
      Nice = 19;
 | 
			
		||||
      IOSchedulingClass = "best-effort";
 | 
			
		||||
      IOSchedulingPriority = 7;
 | 
			
		||||
 | 
			
		||||
      ReadWritePaths = [
 | 
			
		||||
        backupDir
 | 
			
		||||
        "/data/backup/mysql" # NOTE: should not be part of this option once rsyncTarget is remote
 | 
			
		||||
      ];
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    startAt = "*-*-* 02:15:00";
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  systemd.tmpfiles.settings."10-mysql-backup".${backupDir}.d = {
 | 
			
		||||
    user = "mysql";
 | 
			
		||||
    group = "mysql";
 | 
			
		||||
    mode = "700";
 | 
			
		||||
  };
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,7 @@
 | 
			
		||||
{ config, pkgs, ... }:
 | 
			
		||||
{ config, pkgs, lib, ... }:
 | 
			
		||||
let
 | 
			
		||||
  backupDir = "/var/lib/postgresql/backups";
 | 
			
		||||
in
 | 
			
		||||
{
 | 
			
		||||
  services.postgresql = {
 | 
			
		||||
    enable = true;
 | 
			
		||||
@@ -90,9 +93,57 @@
 | 
			
		||||
  networking.firewall.allowedTCPPorts = [ 5432 ];
 | 
			
		||||
  networking.firewall.allowedUDPPorts = [ 5432 ];
 | 
			
		||||
 | 
			
		||||
  services.postgresqlBackup = {
 | 
			
		||||
    enable = true;
 | 
			
		||||
    location = "/var/lib/postgres/backups";
 | 
			
		||||
    backupAll = true;
 | 
			
		||||
  # NOTE: instead of having the upstream nixpkgs postgres backup unit trigger
 | 
			
		||||
  #       another unit, it was easier to just make one ourselves
 | 
			
		||||
  systemd.services."backup-postgresql" = {
 | 
			
		||||
    description = "Backup PostgreSQL data";
 | 
			
		||||
    requires = [ "postgresql.service" ];
 | 
			
		||||
 | 
			
		||||
    path = [
 | 
			
		||||
      pkgs.coreutils
 | 
			
		||||
      pkgs.rsync
 | 
			
		||||
      pkgs.gzip
 | 
			
		||||
      config.services.postgresql.package
 | 
			
		||||
    ];
 | 
			
		||||
 | 
			
		||||
    script = let
 | 
			
		||||
      rotations = 10;
 | 
			
		||||
      # rsyncTarget = "root@isvegg.pvv.ntnu.no:/mnt/backup1/bicep/postgresql";
 | 
			
		||||
      rsyncTarget = "/data/backup/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}" '${rsyncTarget}'
 | 
			
		||||
    '';
 | 
			
		||||
 | 
			
		||||
    serviceConfig = {
 | 
			
		||||
      Type = "oneshot";
 | 
			
		||||
      User = "postgres";
 | 
			
		||||
      Group = "postgres";
 | 
			
		||||
      UMask = "0077";
 | 
			
		||||
 | 
			
		||||
      Nice = 19;
 | 
			
		||||
      IOSchedulingClass = "best-effort";
 | 
			
		||||
      IOSchedulingPriority = 7;
 | 
			
		||||
 | 
			
		||||
      ReadWritePaths = [
 | 
			
		||||
        backupDir
 | 
			
		||||
        "/data/backup/postgresql" # NOTE: should not be part of this option once rsyncTarget is remote
 | 
			
		||||
      ];
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    startAt = "*-*-* 01:15:00";
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  systemd.tmpfiles.settings."10-postgresql-backup".${backupDir}.d = {
 | 
			
		||||
    user = "postgres";
 | 
			
		||||
    group = "postgres";
 | 
			
		||||
    mode = "700";
 | 
			
		||||
  };
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user