infrastructure/nixos/minecraft/java.nix
2024-09-25 14:47:23 -07:00

145 lines
4.8 KiB
Nix

{
pkgs,
config,
systemConfig,
gensokyo-zone,
lib,
...
}: let
inherit (gensokyo-zone.lib) mapDefaults;
inherit (lib.modules) mkIf mkMerge mkDefault;
inherit (lib) versions;
inherit (systemConfig.exports.services) minecraft;
cfg = config.services.minecraft-java-server;
#forge = "neoforge";
forge = "forge";
mcVersion = "1.20.1";
backupsDir = "${config.kyuuto.dataDir}/minecraft/simplebackups/marka";
enableDynmap = minecraft.ports.dynmap.enable;
enableBluemap = minecraft.ports.bluemap.enable;
in {
services.minecraft-java-server = {
enable = mkDefault true;
argsFiles = [
"user_jvm_args.txt"
"/run/minecraft-java/unix_args.txt"
];
serverProperties = let
props = {
enable-query = true;
"query.port" = cfg.port;
pvp = false;
broadcast-console-to-ops = false;
op-permission-level = 2;
};
in mkMerge [
(mapDefaults props)
(mkIf enableDynmap {
max-tick-time = 60000 * 12;
})
];
allowPlayers = {
katrynn = {
uuid = "356d8cf2-246a-4c07-b547-422aea06c0ab";
permissionLevel = 4;
};
arcnmx = {
uuid = "e9244315-848c-424a-b004-ae5305449fee";
permissionLevel = 4;
};
Matricariac = {
uuid = "e6204250-05dc-4f4a-890a-71619170a321";
permissionLevel = 2;
};
Kaosubaloo = {
uuid = "1340bc67-5296-4f6d-9643-29011971f88e";
permissionLevel = 1; # 2?
};
};
};
users = mkIf cfg.enable {
users.${cfg.user}.uid = 913;
groups.${cfg.group} = {
gid = config.users.users.${cfg.user}.uid;
inherit (config.users.groups.admin) members;
};
};
systemd = mkIf cfg.enable {
services.minecraft-java-server = {
# TODO: confinement.enable = true;
gensokyo-zone = {
sharedMounts."minecraft/java/marka-server" = {config, ...}: {
root = config.rootDir + "/minecraft/java";
path = mkDefault cfg.dataDir;
};
cacheMounts = {
"minecraft/dynmap" = mkIf enableDynmap {
path = mkDefault "${cfg.dataDir}/dynmap";
};
"minecraft/bluemap" = mkIf enableBluemap {
path = mkDefault "${cfg.dataDir}/bluemap";
};
};
};
preStart = let
forgeDir = {
neoforge = "neoforged/neoforge";
forge = "minecraftforge/forge";
}.${forge};
in ''
${pkgs.coreutils}/bin/ln -sf $PWD/libraries/net/${forgeDir}/*/unix_args.txt $RUNTIME_DIRECTORY/unix_args.txt
'';
serviceConfig = {
BindPaths = [
"${backupsDir}:${cfg.dataDir}/simplebackups"
];
BindReadOnlyPaths = let
dynmap = assert forge == "forge"; pkgs.fetchurl {
url = "https://cdn.modrinth.com/data/fRQREgAc/versions/RtI5TFAi/Dynmap-3.7-beta-6-${forge}-${versions.majorMinor mcVersion}.jar";
sha256 = "sha256-rrs7ab0OKEwkPBYGm4CDD/I5341P/f4wwU52hyKd/Ls=";
};
dynmap-block-scan = assert forge == "forge"; pkgs.fetchurl {
url = "https://dynmap.us/builds/DynmapBlockScan/DynmapBlockScan-3.6-${forge}-${versions.majorMinor mcVersion}.jar";
sha256 = "sha256-YOuXeE+6kOtFpA42Yhv5sBdjpvZsuHXvx5fnocY5yvM=";
};
bluemap = assert forge == "forge"; pkgs.fetchurl {
url = "https://github.com/BlueMap-Minecraft/BlueMap/releases/download/v5.3/BlueMap-5.3-${forge}-${versions.majorMinor mcVersion}.jar";
sha256 = "sha256-eN4wWUItI7WleFk1KUSTM5EQv9ri4QRKrBuvCgN89qU=";
};
in mkMerge [
(mkIf enableDynmap [
"${dynmap}:${cfg.dataDir}/mods/${dynmap.name}"
"${dynmap-block-scan}:${cfg.dataDir}/mods/${dynmap-block-scan.name}"
])
(mkIf enableBluemap [
"${bluemap}:${cfg.dataDir}/mods/${bluemap.name}"
])
];
LogFilterPatterns = [
"~.*Invalid modellist patch"
"~.*Invalid modellist patch.*"
];
};
};
tmpfiles.rules = let
inherit (config.systemd.services.minecraft-java-server.gensokyo-zone) cacheMounts;
in mkMerge [
#["d ${backupsDir} 775 ${cfg.user} ${cfg.group} - -"]
(mkIf enableDynmap ["d ${cacheMounts."minecraft/dynmap".source} 750 ${cfg.user} ${cfg.group} - -"])
(mkIf enableBluemap ["d ${cacheMounts."minecraft/bluemap".source} 750 ${cfg.user} ${cfg.group} - -"])
];
};
networking.firewall = mkIf cfg.enable {
interfaces.local = {
allowedTCPPorts = [cfg.port];
allowedUDPPorts = mkIf cfg.serverProperties.enable-query or false [cfg.serverProperties."query.port"];
};
interfaces.lan = {
allowedTCPPorts = [
(mkIf enableDynmap minecraft.ports.dynmap.port)
(mkIf enableBluemap minecraft.ports.bluemap.port)
];
};
};
}