aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xregenerate-secrets.sh1
-rw-r--r--tw/services/games.scm42
-rw-r--r--tw/system/files/restic/lud-minecraft.enc7
3 files changed, 47 insertions, 3 deletions
diff --git a/regenerate-secrets.sh b/regenerate-secrets.sh
index 210b03ae..fbb79883 100755
--- a/regenerate-secrets.sh
+++ b/regenerate-secrets.sh
@@ -36,6 +36,7 @@ done
store_restic lud lud-paperless
store_restic lud lud-nextcloud
+store_restic lud lud-minecraft
store_restic lud lud-git
store lud www/nextcloud/database tw/system/files/nextcloud-database-password.enc
diff --git a/tw/services/games.scm b/tw/services/games.scm
index 7b7d8a4b..d239b248 100644
--- a/tw/services/games.scm
+++ b/tw/services/games.scm
@@ -7,11 +7,11 @@
#:use-module (guix gexp)
#:use-module (guix records)
#:use-module (tw packages games)
+ #:use-module (tw services restic)
+ #:use-module (tw services secrets)
#:export (minecraft-server-service-type
minecraft-server-configuration))
-;; TODO: backups of Minecraft data
-
(define-configuration/no-serialization minecraft-server-configuration
(data-location (string "/var/lib/minecraft-server") "Path on disk where
server data will be stored.")
@@ -50,11 +50,47 @@ server data will be stored.")
(name group-name)
(system? #t)))))
+(define minecraft-backup-repository
+ (restic-local-repository
+ (path "/var/backups/minecraft")))
+
+(define minecraft-backup-password-file
+ "/etc/restic/lud-minecraft")
+
+(define minecraft-backup-password
+ (restic-password-source
+ (type 'file)
+ (name minecraft-backup-password-file)))
+
+(define (minecraft-backup-secrets config)
+ (list (secret
+ (encrypted-file (local-file "../system/files/restic/lud-minecraft.enc"))
+ (destination minecraft-backup-password-file))))
+
+(define (minecraft-restic-backups config)
+ (match-record config <minecraft-server-configuration> (data-location)
+ (list (restic-scheduled-backup
+ (schedule #~"30 3 * * *")
+ (paths (list data-location))
+ (repo minecraft-backup-repository)
+ (password minecraft-backup-password)))))
+
+(define (minecraft-backup-cleanups config)
+ (list (restic-scheduled-cleanup
+ (schedule #~"30 4 * * *")
+ (repo minecraft-backup-repository)
+ (password minecraft-backup-password)
+ (keep-daily 30)
+ (keep-monthly -1))))
+
(define minecraft-server-service-type
(service-type
(name 'minecraft-server)
(extensions (list (service-extension shepherd-root-service-type minecraft-server-shepherd)
(service-extension activation-service-type minecraft-server-activation)
- (service-extension account-service-type minecraft-server-accounts)))
+ (service-extension account-service-type minecraft-server-accounts)
+ (service-extension secrets-service-type minecraft-backup-secrets)
+ (service-extension restic-backup-service-type minecraft-restic-backups)
+ (service-extension restic-cleanup-service-type minecraft-backup-cleanups)))
(default-value (minecraft-server-configuration))
(description "Run a Minecraft server.")))
diff --git a/tw/system/files/restic/lud-minecraft.enc b/tw/system/files/restic/lud-minecraft.enc
new file mode 100644
index 00000000..fd6bee6c
--- /dev/null
+++ b/tw/system/files/restic/lud-minecraft.enc
@@ -0,0 +1,7 @@
+-----BEGIN AGE ENCRYPTED FILE-----
+YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHNzaC1lZDI1NTE5IHBESlBiZyAxRFNP
+dFFWLzBnTWhiTmxiR3gzN0JyYjBBUkVvUG91Y0FuSk9Cbnp3VEJRCjIyVlZid2tk
+WTdDUEhEc3hXeWQ3RFVnWjhIRmt1US9CSm5vdGx6TEkwSzAKLS0tIDJJODdnVHV6
+MkI3L1VnNXlXbE9GeXVYU3dwcnA1YWZXcW1Yc1YrNDVabjQKgzkmfvwMtH2Zm+us
+PwPb/d/cXwRayD/DRTPsgVoTeQ2HBAKe7/b8xc94frjkSQJQww==
+-----END AGE ENCRYPTED FILE-----