1{ config, lib, pkgs, ... }:
2
3with lib;
4
5let
6
7 inherit (pkgs) mysql gzip;
8
9 cfg = config.services.mysqlBackup ;
10 location = cfg.location ;
11 mysqlBackupCron = db : ''
12 ${cfg.period} ${cfg.user} ${mysql}/bin/mysqldump ${if cfg.singleTransaction then "--single-transaction" else ""} ${db} | ${gzip}/bin/gzip -c > ${location}/${db}.gz
13 '';
14
15in
16
17{
18 options = {
19
20 services.mysqlBackup = {
21
22 enable = mkOption {
23 default = false;
24 description = ''
25 Whether to enable MySQL backups.
26 '';
27 };
28
29 period = mkOption {
30 default = "15 01 * * *";
31 description = ''
32 This option defines (in the format used by cron) when the
33 databases should be dumped.
34 The default is to update at 01:15 (at night) every day.
35 '';
36 };
37
38 user = mkOption {
39 default = "mysql";
40 description = ''
41 User to be used to perform backup.
42 '';
43 };
44
45 databases = mkOption {
46 default = [];
47 description = ''
48 List of database names to dump.
49 '';
50 };
51
52 location = mkOption {
53 default = "/var/backup/mysql";
54 description = ''
55 Location to put the gzipped MySQL database dumps.
56 '';
57 };
58
59 singleTransaction = mkOption {
60 default = false;
61 description = ''
62 Whether to create database dump in a single transaction
63 '';
64 };
65 };
66
67 };
68
69 config = mkIf config.services.mysqlBackup.enable {
70
71 services.cron.systemCronJobs = map mysqlBackupCron config.services.mysqlBackup.databases;
72
73 system.activationScripts.mysqlBackup = stringAfter [ "stdio" "users" ]
74 ''
75 mkdir -m 0700 -p ${config.services.mysqlBackup.location}
76 chown ${config.services.mysqlBackup.user} ${config.services.mysqlBackup.location}
77 '';
78
79 };
80
81}