diff --git a/nixos/configurations/metis/default.nix b/nixos/configurations/metis/default.nix index 3d836bd..a6d2a47 100644 --- a/nixos/configurations/metis/default.nix +++ b/nixos/configurations/metis/default.nix @@ -7,6 +7,7 @@ { imports = [ ./wireguard.nix + ./minecraft ]; nixpkgs.hostPlatform = "x86_64-linux"; nix.registry.sys = { diff --git a/nixos/configurations/metis/minecraft/default.nix b/nixos/configurations/metis/minecraft/default.nix new file mode 100644 index 0000000..5f83dd9 --- /dev/null +++ b/nixos/configurations/metis/minecraft/default.nix @@ -0,0 +1,13 @@ +{ pkgs, ... }: +{ + imports = [ + ./msd.nix + ]; + + lib.pkgs = { + authlib-injector = pkgs.fetchurl { + url = "https://github.com/yushijinhun/authlib-injector/releases/download/v1.2.4/authlib-injector-1.2.4.jar"; + hash = "sha256-eVsnbLQIVe0E3H/KvCptFQ3kYAtUKHWmUi5l9rJbyp8="; + }; + }; +} diff --git a/nixos/configurations/metis/minecraft/msd.nix b/nixos/configurations/metis/minecraft/msd.nix new file mode 100644 index 0000000..641990d --- /dev/null +++ b/nixos/configurations/metis/minecraft/msd.nix @@ -0,0 +1,48 @@ +{ config, pkgs, ... }: +let + name = "modernskyblock"; + serviceName = "minecraft-${name}"; + directory = "minecraft/${name}"; + stdin = "/run/${directory}/stdin"; + + # https://github.com/NixOS/nixpkgs/blob/6e62521155cd3b4cdf6b49ecacf63db2a0cacc73/nixos/modules/services/games/minecraft-server.nix#L25C3-L34C1 + stopScript = pkgs.writeShellScript "minecraft-server-stop" '' + echo stop > ${stdin} + + # Wait for the PID of the minecraft server to disappear before + # returning, so systemd doesn't attempt to SIGKILL it. + while kill -0 "$1" 2> /dev/null; do + sleep 1s + done + ''; + +in +{ + systemd.services.${serviceName} = { + after = [ "systemd-networkd-wait-online.service" ]; + description = "Minecraft Server (Modern Skyblock 3: Departed)"; + requires = [ "${serviceName}.socket" ]; + serviceConfig = rec { + Type = "simple"; + DynamicUser = true; + StateDirectory = directory; + WorkingDirectory = "%S/${directory}"; + ExecStart = "${pkgs.jdk8}/bin/java -Xmx32G -Xms32G -javaagent:${config.lib.pkgs.authlib-injector}=https://hitmc.cc/api/yggdrasil -jar forge-1.12.2-14.23.5.2808-universal.jar nogui"; + ExecStop = "${stopScript} $MAINPID"; + Restart = "always"; + StandardInput = "socket"; + StandardOutput = "journal"; + StandardError = "journal"; + }; + }; + + systemd.sockets.${serviceName} = { + description = "Socket for the Minecraft Server (Modern Skyblock 3: Departed)"; + wantedBy = [ "sockets.target" ]; + socketConfig = { + ListenFIFO = stdin; + RemoveOnStop = true; + FlushPending = true; + }; + }; +}