{ pkgs, site_config, service_configs, lib, config, inputs, ... }: { imports = [ (lib.serviceMountWithZpool "minecraft-server-${service_configs.minecraft.server_name}" service_configs.zpool_ssds [ "${service_configs.minecraft.parent_dir}/${service_configs.minecraft.server_name}" ] ) inputs.nix-minecraft.nixosModules.minecraft-servers (lib.serviceFilePerms "minecraft-server-${service_configs.minecraft.server_name}" [ "Z ${service_configs.minecraft.parent_dir}/${service_configs.minecraft.server_name} 700 ${config.services.minecraft-servers.user} ${config.services.minecraft-servers.group}" "Z ${service_configs.minecraft.parent_dir}/${service_configs.minecraft.server_name}/squaremap/web 750 ${config.services.minecraft-servers.user} ${config.services.minecraft-servers.group}" # Allow caddy (in minecraft group) to traverse to squaremap/web for map.gardling.com "z ${service_configs.minecraft.parent_dir}/${service_configs.minecraft.server_name} 710 ${config.services.minecraft-servers.user} ${config.services.minecraft-servers.group}" "z ${service_configs.minecraft.parent_dir}/${service_configs.minecraft.server_name}/squaremap 710 ${config.services.minecraft-servers.user} ${config.services.minecraft-servers.group}" ]) ./minecraft-deploy-guard.nix ]; boot.kernel.sysctl = { # Disable autogroup for better scheduling of game server threads "kernel.sched_autogroup_enabled" = 0; }; services.minecraft-servers = { enable = true; eula = true; dataDir = service_configs.minecraft.parent_dir; openFirewall = true; servers.${service_configs.minecraft.server_name} = { enable = true; package = pkgs.fabricServers.fabric-26_1_2.override { jre_headless = pkgs.openjdk25_headless; }; jvmOpts = lib.concatStringsSep " " [ # Memory "-Xmx${builtins.toString service_configs.minecraft.memory.heap_size_m}M" "-Xms${builtins.toString service_configs.minecraft.memory.heap_size_m}M" # GC "-XX:+UseZGC" "-XX:+ZGenerational" # added in new minecraft version "-XX:+UseCompactObjectHeaders" "-XX:+UseStringDeduplication" # Base JVM optimizations (brucethemoose/Minecraft-Performance-Flags-Benchmarks) "-XX:+UnlockExperimentalVMOptions" "-XX:+UnlockDiagnosticVMOptions" "-XX:+AlwaysActAsServerClassMachine" "-XX:+AlwaysPreTouch" "-XX:+DisableExplicitGC" "-XX:+UseNUMA" "-XX:+PerfDisableSharedMem" "-XX:+UseFastUnorderedTimeStamps" "-XX:+UseCriticalJavaThreadPriority" "-XX:ThreadPriorityPolicy=1" "-XX:AllocatePrefetchStyle=3" "-XX:-DontCompileHugeMethods" "-XX:MaxNodeLimit=240000" "-XX:NodeLimitFudgeFactor=8000" "-XX:ReservedCodeCacheSize=400M" "-XX:NonNMethodCodeHeapSize=12M" "-XX:ProfiledCodeHeapSize=194M" "-XX:NonProfiledCodeHeapSize=194M" "-XX:NmethodSweepActivity=1" "-XX:+UseVectorCmov" # Large pages (requires vm.nr_hugepages sysctl) "-XX:+UseLargePages" "-XX:LargePageSizeInBytes=${builtins.toString service_configs.minecraft.memory.large_page_size_m}M" ]; serverProperties = { server-port = service_configs.ports.public.minecraft.port; enforce-whitelist = true; gamemode = "survival"; white-list = true; difficulty = "easy"; motd = "A Minecraft Server"; view-distance = 10; simulation-distance = 6; sync-chunk-writes = false; spawn-protection = 0; }; whitelist = import ../secrets/server/minecraft-whitelist.nix; symlinks = { "mods" = pkgs.linkFarmFromDrvs "mods" ( with pkgs; builtins.attrValues { FabricApi = fetchurl { url = "https://cdn.modrinth.com/data/P7dR8mSH/versions/fm7UYECV/fabric-api-0.145.4%2B26.1.2.jar"; sha512 = "ffd5ef62a745f76cd2e5481252cb7bc67006c809b4f436827d05ea22c01d19279e94a3b24df3d57e127af1cd08440b5de6a92a4ea8f39b2dcbbe1681275564c3"; }; # No 26.1.2 version available # FerriteCore = fetchurl { # url = "https://cdn.modrinth.com/data/uXXizFIs/versions/d5ddUdiB/ferritecore-9.0.0-fabric.jar"; # sha512 = "d81fa97e11784c19d42f89c2f433831d007603dd7193cee45fa177e4a6a9c52b384b198586e04a0f7f63cd996fed713322578bde9a8db57e1188854ae5cbe584"; # }; Lithium = fetchurl { url = "https://cdn.modrinth.com/data/gvQqBUqZ/versions/v2xoRvRP/lithium-fabric-0.24.1%2Bmc26.1.2.jar"; sha512 = "8711bc8c6f39be4c8511becb7a68e573ced56777bd691639f2fc62299b35bb4ccd2efe4a39bd9c308084b523be86a5f5c4bf921ab85f7a22bf075d8ea2359621"; }; NoChatReports = fetchurl { url = "https://cdn.modrinth.com/data/qQyHxfxd/versions/2yrLNE3S/NoChatReports-FABRIC-26.1-v2.19.0.jar"; sha512 = "94d58a1a4cde4e3b1750bdf724e65c5f4ff3436c2532f36a465d497d26bf59f5ac996cddbff8ecdfed770c319aa2f2dcc9c7b2d19a35651c2a7735c5b2124dad"; }; squaremap = fetchurl { url = "https://cdn.modrinth.com/data/PFb7ZqK6/versions/UBN6MFvH/squaremap-fabric-mc26.1.2-1.3.13.jar"; sha512 = "97bc130184b5d0ddc4ff98a15acef6203459d982e0e2afbd49a2976d546c55a86ef22b841378b51dd782be9b2cfbe4cfa197717f2b7f6800fd8b4ff4df6e564f"; }; scalablelux = fetchurl { url = "https://cdn.modrinth.com/data/Ps1zyz6x/versions/gYbHVCz8/ScalableLux-0.2.0%2Bfabric.2b63825-all.jar"; sha512 = "48565a4d8a1cbd623f0044086d971f2c0cf1c40e1d0b6636a61d41512f4c1c1ddff35879d9dba24b088a670ee254e2d5842d13a30b6d76df23706fa94ea4a58b"; }; c2me = fetchurl { url = "https://cdn.modrinth.com/data/VSNURh3q/versions/yrNQQ1AQ/c2me-fabric-mc26.1.2-0.3.7%2Balpha.0.65.jar"; sha512 = "6666ebaa3bfa403e386776590fc845b7c306107d37ebc7b1be3b057893fbf9f933abb2314c171d7fe19c177cf8823cb47fdc32040d34a9704f5ab656dd5d93f8"; }; # No 26.1 version available # krypton = fetchurl { # url = "https://cdn.modrinth.com/data/fQEb0iXm/versions/O9LmWYR7/krypton-0.2.10.jar"; # sha512 = "4dcd7228d1890ddfc78c99ff284b45f9cf40aae77ef6359308e26d06fa0d938365255696af4cc12d524c46c4886cdcd19268c165a2bf0a2835202fe857da5cab"; # }; # No 26.1.2 version available # disconnect-packet-fix = fetchurl { # url = "https://cdn.modrinth.com/data/rd9rKuJT/versions/x9gVeaTU/disconnect-packet-fix-fabric-2.1.0.jar"; # sha512 = "bf84d02bdcd737706df123e452dd31ef535580fa4ced6af1e4ceea022fef94e4764775253e970b8caa1292e2fa00eb470557f70b290fafdb444479fa801b07a1"; # }; packet-fixer = fetchurl { url = "https://cdn.modrinth.com/data/c7m1mi73/versions/M8PqPQr4/packetfixer-fabric-3.3.4-26.1.2.jar"; sha512 = "698020edba2a1fd80bb282bfd4832a00d6447b08eaafbc2e16a8f3bf89e187fc9a622c92dfe94ae140dd485fc0220a86890f12158ec08054e473fef8337829bc"; }; # mVUS fork: upstream ModernFix no longer ships Fabric builds modernfix = fetchurl { url = "https://cdn.modrinth.com/data/TjSm1wrD/versions/dqQ7mabN/modernfix-5.26.2-build.1.jar"; sha512 = "fbef93c2dabf7bcd0ccd670226dfc4958f7ebe5d8c2b1158e88a65e6954a40f595efd58401d2a3dbb224660dca5952199cf64df29100e7bd39b1b1941290b57b"; }; debugify = fetchurl { url = "https://cdn.modrinth.com/data/QwxR6Gcd/versions/mfTTfiKn/debugify-26.1.2%2B1.0.jar"; sha512 = "63db82f2163b9f7fc27ebea999ffcd7a961054435b3ed7d8bf32d905b5f60ce81715916b7fd4e9509dd23703d5492059f3ce7e5f176402f8ed4f985a415553f4"; }; } ); }; }; }; systemd.services.minecraft-server-main = { serviceConfig = { Nice = -5; IOSchedulingPriority = 0; LimitMEMLOCK = "infinity"; # Required for large pages }; }; services.caddy.virtualHosts = lib.mkIf (config.services.caddy.enable) { "map.${site_config.domain}".extraConfig = '' root * ${service_configs.minecraft.parent_dir}/${service_configs.minecraft.server_name}/squaremap/web file_server browse ''; }; users.users = lib.mkIf (config.services.caddy.enable) { ${config.services.caddy.user}.extraGroups = [ # for `map.gardling.com` config.services.minecraft-servers.group ]; }; }