{ pkgs, service_configs, lib, username, config, ... }: { imports = [ (lib.serviceMountDeps "minecraft-server-${service_configs.minecraft.server_name}" [ "${service_configs.minecraft.parent_dir}/${service_configs.minecraft.server_name}" ]) ]; environment.systemPackages = [ (pkgs.writeScriptBin "mc-console" '' #!/bin/sh ${pkgs.tmux}/bin/tmux -S /run/minecraft/${service_configs.minecraft.server_name}.sock attach '') ]; nixpkgs.config.allowUnfreePredicate = pkg: builtins.elem (lib.getName pkg) [ "minecraft-server" ]; 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-1_21_8; jvmOpts = let heap_size = "10000M"; in "-Xmx${heap_size} -Xms${heap_size} -XX:+UseZGC -XX:+ZGenerational"; serverProperties = { server-port = 25566; 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; max-tick-time = -1; # Recommended with lazymc }; lazymc = { enable = true; config.public.address = "0.0.0.0:25565"; }; whitelist = import ../secrets/minecraft-whitelist.nix; symlinks = { "mods" = pkgs.linkFarmFromDrvs "mods" ( with pkgs; builtins.attrValues { FabricApi = fetchurl { url = "https://cdn.modrinth.com/data/P7dR8mSH/versions/zhzhM2yQ/fabric-api-0.130.0%2B1.21.8.jar"; sha512 = "27399d629d3fb955c8fc1e5e86cacb9b124814bb97ee7fe283336b0e28f5eb9ae31619814ab4aef70c5beea908d2a1ed5a8dd6b8641a53ecd50375d50067f061"; }; FerriteCore = fetchurl { url = "https://cdn.modrinth.com/data/uXXizFIs/versions/CtMpt7Jr/ferritecore-8.0.0-fabric.jar"; sha512 = "131b82d1d366f0966435bfcb38c362d604d68ecf30c106d31a6261bfc868ca3a82425bb3faebaa2e5ea17d8eed5c92843810eb2df4790f2f8b1e6c1bdc9b7745"; }; Lithium = fetchurl { url = "https://cdn.modrinth.com/data/gvQqBUqZ/versions/pDfTqezk/lithium-fabric-0.18.0%2Bmc1.21.8.jar"; sha512 = "6c69950760f48ef88f0c5871e61029b59af03ab5ed9b002b6a470d7adfdf26f0b875dcd360b664e897291002530981c20e0b2890fb889f29ecdaa007f885100f"; }; NoChatReports = fetchurl { url = "https://cdn.modrinth.com/data/qQyHxfxd/versions/LhwpK0O6/NoChatReports-FABRIC-1.21.7-v2.14.0.jar"; sha512 = "6e93c822e606ad12cb650801be1b3f39fcd2fef64a9bb905f357eb01a28451afddb3a6cadb39c112463519df0a07b9ff374d39223e9bf189aee7e7182077a7ae"; }; squaremap = fetchurl { url = "https://cdn.modrinth.com/data/PFb7ZqK6/versions/V9xWIMui/squaremap-fabric-mc1.21.8-1.3.8.jar"; sha512 = "ed32aca04ef0ad6d46549f9309a342624b64857296515037e5531611d43a7f5d4a6b97f6495f76d2ecfdfac9e4f0bf8a66c938c379cdddae59c8a7f2fe0c03f4"; }; scalablelux = fetchurl { url = "https://cdn.modrinth.com/data/Ps1zyz6x/versions/PQLHDg2Q/ScalableLux-0.1.5%2Bfabric.e4acdcb-all.jar"; sha512 = "ec8fabc3bf991fbcbe064c1e97ded3e70f145a87e436056241cbb1e14c57ea9f59ef312f24c205160ccbda43f693e05d652b7f19aa71f730caec3bb5f7f7820a"; }; c2me = fetchurl { url = "https://cdn.modrinth.com/data/VSNURh3q/versions/RzzXyBlx/c2me-fabric-mc1.21.8-0.3.4%2Brc.1.0.jar"; sha512 = "4addc9ccbc66b547c96152c7fafcaccde47eefa62b0e99a31f7b4ee5844ac738f2557909bd74e1f755ff4835ce13e8ff6c556f8ebda276370912f50ebd054e3a"; }; krypton = fetchurl { url = "https://cdn.modrinth.com/data/fQEb0iXm/versions/neW85eWt/krypton-0.2.9.jar"; sha512 = "2e2304b1b17ecf95783aee92e26e54c9bfad325c7dfcd14deebf9891266eb2933db00ff77885caa083faa96f09c551eb56f93cf73b357789cb31edad4939ffeb"; }; spark = fetchurl { url = "https://cdn.modrinth.com/data/l6YH9Als/versions/3KCl7Vx0/spark-1.10.142-fabric.jar"; sha512 = "95b7e4f2416e20abf9d9df41fcbce04f28ebf0aa086374742652789a88642dd6820c8884ab240334555345b49c39f7d0caf23d521cec9516991ef43ba24758af"; }; better-fabric-console = fetchurl { url = "https://cdn.modrinth.com/data/Y8o1j1Sf/versions/FTLKiVb8/better-fabric-console-mc1.21.8-1.2.4.jar"; sha512 = "1542578e195ddedc3a99a7e23dbda9b79ec795077e85e9cfce3ad7d0812f558c7a5c19b3c5cc0f177c443738afac7690d486c499a02dbe59cf22ef17e887a2fc"; }; } ); }; }; }; services.caddy.virtualHosts."map.${service_configs.https.domain}".extraConfig = '' root * ${service_configs.minecraft.parent_dir}/${service_configs.minecraft.server_name}/squaremap/web file_server browse ''; users.users.${config.services.caddy.user}.extraGroups = [ # for `map.gardling.com` "minecraft" ]; systemd.tmpfiles.rules = [ "d ${service_configs.minecraft.parent_dir}/${service_configs.minecraft.server_name} 0750 minecraft minecraft" ]; users.users.${username}.extraGroups = [ "minecraft" ]; }