commit dff624ec43f1af05a66a581e18b19b637c3e556c parent 4dd6348e462a3080b80323c53cd795b83ed3ec26 Author: Luke Willis <lukejw@monastech.xyz> Date: Tue, 5 May 2026 20:10:51 -0400 services: Add minecraft-service-type Diffstat:
| A | mt/services/games.scm | | | 92 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
1 file changed, 92 insertions(+), 0 deletions(-)
diff --git a/mt/services/games.scm b/mt/services/games.scm @@ -0,0 +1,92 @@ +(define-module (mt services games) + #:use-module (gnu services) + #:use-module (gnu services configuration) + #:use-module (gnu services shepherd) + #:use-module (gnu packages admin) + #:use-module (gnu packages java) + #:use-module (gnu system shadow) + #:use-module (guix gexp) + #:use-module (guix modules) + #:use-module (guix packages) + #:use-module (guix records) + #:use-module (guix download) + #:export (fabric-jar + %default-fabric-jar + minecraft-configuration + minecraft-configuration? + minecraft-service-type)) + +(define-maybe/no-serialization file-like) + +(define* (fabric-jar hash + #:key (minecraft "26.1.2") + (loader "0.19.2") + (launcher "1.1.1")) + (origin + (method url-fetch) + (uri (string-append "https://meta.fabricmc.net/v2/versions/loader/" + minecraft "/" + loader "/" + launcher "/server/jar")) + (file-name (string-append "fabric-server-mc." minecraft + "-loader." loader + "-launcher." launcher + ".jar")) + (sha256 hash))) + +(define %default-fabric-jar + (fabric-jar (base32 "1gax8i1risr0irgcmbwc0jdf78yhahplsqiyhiblrq7hkydx26z9"))) + +(define (port? x) + (and (number? x) + (and (>= 0) (<= x 65535)))) + +(define-configuration/no-serialization minecraft-configuration + (java + (file-like openjdk) + "The java package to run the server with.") + (jar + (file-like %default-fabric-jar) + "The server jar to use.") + (port + (port 25565) + "The port the server should listen to.")) + +(define %minecraft-account + (list (user-account + (name "minecraft") + (group "minecraft") + (system? #t) + (comment "Minecraft server user") + (home-directory "/var/empty") + (shell (file-append shadow "/sbin/nologin"))) + (user-group + (name "minecraft") + (system? #t)))) + +(define (minecraft-shepherd-service config) + "Return the <shepherd-service> object of Minecraft." + (match-record config <minecraft-configuration> + (java jar port) + (list (shepherd-service + (provision '(minecraft)) + (requirement '(user-processes networking)) + (start #~(make-forkexec-constructor + (list #$(file-append java "/bin/java") + "-Xmx8G" ;; TODO: Allow configuring this + "-jar" #$jar + "nogui") + #:user "minecraft" + #:group "minecraft")) + (stop #~(make-kill-destructor)))))) + +(define minecraft-service-type + (service-type + (name 'minecraft) + (extensions + (list (service-extension shepherd-root-service-type + minecraft-shepherd-service) + (service-extension account-service-type + (const %minecraft-account)))) + (default-value (minecraft-configuration)) + (description "Run a Minecraft server.")))