aboutsummaryrefslogtreecommitdiff
path: root/tw/services
diff options
context:
space:
mode:
authorTimo Wilken2024-05-28 18:58:04 +0200
committerTimo Wilken2024-05-28 20:22:51 +0200
commit367b0e7c1788ffdbbb5f6df29a55fd1bc7d21463 (patch)
treea78351b67d35dcc266d3dc87884cc65f383f2f3f /tw/services
parent284ed1729c15c2466968c40e7aa30b8405d9f36f (diff)
Set up Minecraft server
Diffstat (limited to 'tw/services')
-rw-r--r--tw/services/games.scm60
1 files changed, 60 insertions, 0 deletions
diff --git a/tw/services/games.scm b/tw/services/games.scm
new file mode 100644
index 00000000..7b7d8a4b
--- /dev/null
+++ b/tw/services/games.scm
@@ -0,0 +1,60 @@
+(define-module (tw services games)
+ #:use-module ((gnu packages admin) #:select (shadow))
+ #:use-module (gnu services)
+ #:use-module (gnu services configuration)
+ #:use-module (gnu services shepherd)
+ #:use-module (gnu system shadow)
+ #:use-module (guix gexp)
+ #:use-module (guix records)
+ #:use-module (tw packages games)
+ #: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.")
+ (port (integer 25565) "The port to bind the main server to.")
+ (user-name (string "minecraft") "UNIX username to create for the server.")
+ (group-name (string "minecraft") "UNIX group to create for the server."))
+
+(define (minecraft-server-shepherd config)
+ (match-record config <minecraft-server-configuration> (data-location port user-name group-name)
+ (list (shepherd-service
+ (provision '(minecraft-server))
+ (requirement '(networking))
+ (documentation "Run a Minecraft server.")
+ (start #~(make-forkexec-constructor
+ (list #$(file-append minecraft-server "/bin/minecraft-server")
+ "--nogui" "--port" #$(number->string port))
+ #:user #$user-name #:group #$group-name
+ #:directory #$data-location))
+ (stop #~(make-kill-destructor))))))
+
+(define (minecraft-server-activation config)
+ (match-record config <minecraft-server-configuration> (data-location)
+ #~(with-output-to-file (string-append #$data-location "/eula.txt")
+ (lambda () (display "eula=true") (newline)))))
+
+(define (minecraft-server-accounts config)
+ (match-record config <minecraft-server-configuration> (data-location user-name group-name)
+ (list (user-account
+ (name user-name)
+ (group group-name)
+ (comment "Minecraft server user")
+ (system? #t)
+ (home-directory data-location)
+ (shell (file-append shadow "/sbin/nologin")))
+ (user-group
+ (name group-name)
+ (system? #t)))))
+
+(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)))
+ (default-value (minecraft-server-configuration))
+ (description "Run a Minecraft server.")))