From 93e169538e9bf0af6f1c5488a21ab21a884b7008 Mon Sep 17 00:00:00 2001 From: Timo Wilken Date: Sat, 24 Aug 2024 10:54:35 +0200 Subject: Back up Minecraft data automatically --- regenerate-secrets.sh | 1 + tw/services/games.scm | 42 +++++++++++++++++++++++++++++--- tw/system/files/restic/lud-minecraft.enc | 7 ++++++ 3 files changed, 47 insertions(+), 3 deletions(-) create mode 100644 tw/system/files/restic/lud-minecraft.enc 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 (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----- -- cgit v1.2.3