aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTimo Wilken2024-05-28 18:58:04 +0200
committerTimo Wilken2024-05-28 20:22:51 +0200
commit367b0e7c1788ffdbbb5f6df29a55fd1bc7d21463 (patch)
treea78351b67d35dcc266d3dc87884cc65f383f2f3f
parent284ed1729c15c2466968c40e7aa30b8405d9f36f (diff)
Set up Minecraft server
-rw-r--r--tw/packages/games.scm44
-rw-r--r--tw/services/games.scm60
-rw-r--r--tw/system.scm2
-rw-r--r--tw/system/lud.scm3
4 files changed, 108 insertions, 1 deletions
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 <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.")))
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