From 367b0e7c1788ffdbbb5f6df29a55fd1bc7d21463 Mon Sep 17 00:00:00 2001 From: Timo Wilken Date: Tue, 28 May 2024 18:58:04 +0200 Subject: Set up Minecraft server --- tw/packages/games.scm | 44 +++++++++++++++++++++++++++++++++++++ tw/services/games.scm | 60 +++++++++++++++++++++++++++++++++++++++++++++++++++ tw/system.scm | 2 +- tw/system/lud.scm | 3 +++ 4 files changed, 108 insertions(+), 1 deletion(-) create mode 100644 tw/services/games.scm diff --git a/tw/packages/games.scm b/tw/packages/games.scm index 28ffbaa3..76520051 100644 --- a/tw/packages/games.scm +++ b/tw/packages/games.scm @@ -19,6 +19,7 @@ #:use-module (gnu packages gtk) #:use-module (gnu packages guile) #:use-module (gnu packages image) + #:use-module (gnu packages java) #:use-module (gnu packages linux) #:use-module (gnu packages lua) #:use-module (gnu packages pkg-config) @@ -606,3 +607,46 @@ Create the route of your dreams in a world where you set the pace, and embark on an ever-expanding railway extravaganza.") (license (nonguix-license:undistributable "file://data/noarch/docs/End User License Agreement.txt")))) + + +;;; Minecraft server + +;; See versions in: +;; https://piston-meta.mojang.com/mc/game/version_manifest.json +;; ...which links to: +;; https://piston-meta.mojang.com/v1/packages/111890b5a8c2fee9b77036f9f377b33df42c718a/1.20.6.json + +(define-public minecraft-server + (package + (name "minecraft-server") + (version "1.20.6") + (source + (origin + (method url-fetch) + (uri "https://piston-data.mojang.com/v1/objects/145ff0858209bcfc164859ba735d4199aafa1eea/server.jar") + (sha256 (base32 "1v6755nch6v8q4jvc8liprw50mpx8wnnaq7cy03fb0m7ih0ivl66")))) + (build-system trivial-build-system) + (arguments + `(#:builder + ,(with-imported-modules + (source-module-closure '((guix build utils))) + #~(begin + (use-modules (guix build utils)) + (for-each (lambda (dir) + (mkdir-p (string-append #$output "/" dir))) + '("bin" "libexec")) + (copy-file #$source (string-append #$output "/libexec/server.jar")) + (call-with-output-file (string-append #$output "/bin/minecraft-server") + (lambda (port) + (format port "#!~a/bin/guile --no-auto-compile~%!#~%" #$guile-3.0) + (write `(apply execl #$(file-append openjdk21 "/bin/java") + "java" "-jar" ,(string-append #$output "/libexec/server.jar") + (cdr (command-line))) + port) + (chmod port #o555))))))) + (inputs (list openjdk21 guile-3.0)) + (home-page "https://www.minecraft.net/") + (synopsis "Server for the well-known block building sandbox game") + (description "Server software for Minecraft.") + (license (nonguix-license:undistributable + "https://www.minecraft.net/en-us/eula")))) 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 (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 (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 (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."))) diff --git a/tw/system.scm b/tw/system.scm index e706d84c..eb5bc914 100644 --- a/tw/system.scm +++ b/tw/system.scm @@ -55,7 +55,7 @@ ("btl.twilken.net" . 23022) ("twilkenlaptop.cern.ch" . 22022))) -(define (tw-openssh-service host-name work-system?) +(define* (tw-openssh-service host-name #:optional (work-system? #f)) "Configure the SSH server for remote login." ;; SSH login, allowing access only for me. To give more public keys ;; access, extend `openssh-service-type'. diff --git a/tw/system/lud.scm b/tw/system/lud.scm index d6d60be6..fc9e85c6 100644 --- a/tw/system/lud.scm +++ b/tw/system/lud.scm @@ -6,6 +6,7 @@ #:use-module (guix gexp) #:use-module (tw packages php) #:use-module (tw services dns) + #:use-module (tw services games) #:use-module (tw services nextcloud) #:use-module (tw services matrix) #:use-module (tw services media) @@ -94,6 +95,8 @@ (data-path "/var/data/paperless") (secret-key-file "/etc/paperless/secret-key"))) + (service minecraft-server-service-type) + ;; Allow anonymous git access via Wireguard, e.g. to this channel's git repo. ;; Repos are only published if they contain a `git-daemon-export-ok' file. (service git-daemon-service-type -- cgit v1.2.3