diff --git a/hosts/hopper/profiles/lab/minecraft.nix b/hosts/hopper/profiles/lab/minecraft.nix index e431256..200c09d 100644 --- a/hosts/hopper/profiles/lab/minecraft.nix +++ b/hosts/hopper/profiles/lab/minecraft.nix @@ -2,41 +2,223 @@ inputs, pkgs, ... -}: { +}: let + # neoforgeVersion = "21.1.219"; + # vanillaServer = pkgs.fetchurl { + # url = "https://piston-data.mojang.com/v1/objects/59353fb40c36d304f2035d51e7d6e6baa98dc05c/server.jar"; + # name = "minecraft_server.1.21.1.jar"; + # hash = "sha256-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX="; # Replace with actual hash: run `nix-prefetch-url 'https://piston-data.mojang.com/v1/objects/59353fb40c36d304f2035d51e7d6e6baa98dc05c/server.jar' --name 'minecraft_server.1.21.1.jar'` + # }; + # neoforgeInstaller = pkgs.fetchurl { + # url = "https://maven.neoforged.net/releases/net/neoforged/neoforge/${neoforgeVersion}/neoforge-${neoforgeVersion}-installer.jar"; + # hash = "sha256-FA3w+hf9Q4hIBR7Po9CRCBUVrRK/40+hJkBQN7oB3kQ="; # Replace with actual hash: run `nix-prefetch-url 'https://maven.neoforged.net/releases/net/neoforged/neoforge/21.1.219/neoforge-21.1.219-installer.jar'` + # }; + # modpackZip = pkgs.fetchurl { + # url = "https://git.xunuwu.xyz/xun/nixos-config/releases/download/create-ultimate-bundle-thing/Create%20Ultimate%20Selection%202%20MC%201.21.1-5.2.0.zip"; + # name = "Create Ultimate Selection 2 MC 1.21.1-5.2.0.zip"; + # hash = "sha256-+ykE2GE5lWQVLfcKyleKmQ+GXC+yN54yIgh7mPxxj4g="; # Replace with actual hash: run `nix-prefetch-url --name 'Create Ultimate Selection 2 MC 1.21.1-5.2.0.zip' 'https://www.curseforge.com/minecraft/modpacks/create-ultimate-selection-2/download/7634594/file'` and paste the output here + # }; + modpackZip = pkgs.fetchurl { + url = "https://git.xunuwu.xyz/xun/nixos-config/releases/download/create-ultimate-thing-full/Create%20Ultimate%20Selection%202%20Serverpack%20MC%201.21.1-5.3.0.zip"; + name = "Create Ultimate Selection 2 MC 1.21.1-5.3.0.zip"; + # hash = ""; # Replace with actual hash: run `nix-prefetch-url --name 'Create Ultimate Selection 2 MC 1.21.1-5.2.0.zip' 'https://www.curseforge.com/minecraft/modpacks/create-ultimate-selection-2/download/7634594/file'` and paste the output here + hash = "sha256-xDChlZWivNNjYnmSCUIyrxfvqXAHrbvql7jyEDvVXvA="; + }; + # baseModpack = inputs.nix-minecraft.legacyPackages.${pkgs.stdenv.hostPlatform.system}.fetchPackwizModpack { + # src = ./create-ultimate-selection-2; + # packHash = "sha256-0i4RWfJLWayYkefzeePbQY48nr/TdbX/sUVFfppkKvM="; # Leave empty initially; update with the correct value after the first failed build (see instructions below) + # }; + # modpack = baseModpack.overrideAttrs (old: { + # buildPhase = + # '' + # cp ${modpackZip} "Create Ultimate Selection 2 MC 1.21.1-5.2.0.zip" + # '' + # + old.buildPhase; + # }); + neoforge = inputs.nix-minecraft.legacyPackages.${pkgs.stdenv.hostPlatform.system}.neoforgeServers.neoforge-1_21_1; + serverPackage = pkgs.stdenv.mkDerivation { + name = "minecraft-createpack-server"; + nativeBuildInputs = [pkgs.unzip]; + dontUnpack = true; + installPhase = '' + # mkdir -p $out + # cp -r ${neoforge}/* $out + # unzip ${modpackZip} -d temp + # cp -r temp/overrides/* $out/ + # rm -rf temp + + mkdir -p $out + # 1. Base NeoForge from nix-minecraft + cp -r ${neoforge}/* $out/ + + # 2. Overlay the full official server pack (this brings ALL mods + libraries) + unzip ${modpackZip} -d temp + cp -r temp/* $out/ 2>/dev/null || true + rm -rf temp + ''; + }; + # serverPackage = pkgs.stdenv.mkDerivation { + # name = "minecraft-createpack-server"; + # src = modpackZip; + # # nativeBuildInputs = [pkgs.unzip pkgs.jdk21 pkgs.breakpointHook]; + # nativeBuildInputs = [pkgs.unzip pkgs.jdk21]; + # dontPatch = true; + # buildPhase = '' + # mkdir server + # # unzip ${modpackZip} + # cp -r overrides/* server/ + # ''; + # # buildPhase = '' + # # mkdir server + # # cd server + # # java -jar ${neoforgeInstaller} --installServer + # # cd .. + # # unzip ${modpackZip} + # # cp -r overrides/* server/ + # # ''; + # installPhase = '' + # mkdir -p $out + # cp -r server/* $out + # ''; + # }; +in { + users.users.minecraft-createpack = { + isSystemUser = true; + group = "minecraft-createpack"; + }; + users.groups.minecraft-createpack = {}; + + networking.firewall.allowedTCPPorts = [25565]; + + systemd.tmpfiles.rules = [ + "d /srv/minecraft 0755 root root - -" + "d /srv/minecraft/createpack 0770 minecraft-createpack minecraft-createpack - -" + "Z /srv/minecraft/createpack - minecraft-createpack minecraft-createpack - -" + ]; + systemd.services.minecraft-createpack = { + description = "Minecraft Create Ultimate Selection 2 Server"; + wantedBy = ["multi-user.target"]; + after = ["network.target"]; + serviceConfig = { + User = "minecraft-createpack"; + Group = "minecraft-createpack"; + WorkingDirectory = "/srv/minecraft/createpack"; + Restart = "always"; + RestartSec = "5s"; + # ExecStart = "${pkgs.jdk21}/bin/java -Xms1024M -Xmx6144M -jar ${serverPackage}/neoforge-1.21.1-21.1.219.jar nogui"; + ExecStart = '' + ${pkgs.jdk21}/bin/java \ + @user_jvm_args.txt \ + @libraries/net/neoforged/neoforge/21.1.219/unix_args.txt \ + nogui + ''; + # ExecStart = "${pkgs.bash}/bin/bash ${serverPackage}/run.sh nogui"; + }; + # preStart = '' + # set -euo pipefail + # + # echo "=== minecraft-createpack preStart running as $(whoami) in $(pwd) ===" + # + # # Preserve world across restarts + # if [ -d world ]; then + # mv world ../world-tmp || true + # fi + # + # # Clean slate + copy fresh files from the derivation + # rm -rf ./* .[!.]* ..?* || true + # cp -r ${serverPackage}/* . + # + # # Restore world + # if [ -d ../world-tmp ]; then + # mv ../world-tmp world + # fi + # + # chmod -R u+rwX . + # chown -R minecraft-createpack:minecraft-createpack . + # + # echo "eula=true" > eula.txt + # + # cat > server.properties < user_jvm_args.txt </dev/null || true + fi + done + + # Gentle sync — only updates static server files, never touches your world + ${pkgs.rsync}/bin/rsync -a --delete \ + --exclude='world' --exclude='logs' --exclude='crash-reports' \ + --exclude='backups' --exclude='screenshots' \ + --exclude='user_jvm_args.txt' --exclude='server.properties' --exclude='eula.txt' \ + ${serverPackage}/ ./ + + # Restore user data + for dir in world logs crash-reports backups screenshots; do + if [ -d "../$dir-tmp" ]; then + mv "../$dir-tmp" "$dir" + fi + done + + chown -R minecraft-createpack:minecraft-createpack . + chmod -R u+rwX . + + echo "eula=true" > eula.txt + + cat > server.properties <<'EOF' + motd=createpack!! + max-players=5 + difficulty=normal + allow-flight=true + view-distance=16 + EOF + + cat > user_jvm_args.txt <<'EOF' + -Xms1024M + -Xmx6144M + EOF + + echo "=== preStart finished ===" + ''; + }; + services.minecraft-servers = { - enable = true; + enable = false; eula = true; openFirewall = true; - servers.createpack = let - modpackZip = pkgs.fetchurl { - url = "https://git.xunuwu.xyz/xun/nixos-config/releases/download/create-ultimate-bundle-thing/Create%20Ultimate%20Selection%202%20MC%201.21.1-5.2.0.zip"; - name = "Create Ultimate Selection 2 MC 1.21.1-5.2.0.zip"; - hash = "sha256-+ykE2GE5lWQVLfcKyleKmQ+GXC+yN54yIgh7mPxxj4g="; # Replace with actual hash: run `nix-prefetch-url --name 'Create Ultimate Selection 2 MC 1.21.1-5.2.0.zip' 'https://www.curseforge.com/minecraft/modpacks/create-ultimate-selection-2/download/7634594/file'` and paste the output here - }; - baseModpack = inputs.nix-minecraft.legacyPackages.${pkgs.stdenv.hostPlatform.system}.fetchPackwizModpack { - src = ./create-ultimate-selection-2; - packHash = "sha256-0i4RWfJLWayYkefzeePbQY48nr/TdbX/sUVFfppkKvM="; # Leave empty initially; update with the correct value after the first failed build (see instructions below) - }; - modpack = baseModpack.overrideAttrs (old: { - buildPhase = - '' - cp ${modpackZip} "Create Ultimate Selection 2 MC 1.21.1-5.2.0.zip" - '' - + old.buildPhase; - }); - in { - enable = true; - package = inputs.nix-minecraft.legacyPackages.${pkgs.stdenv.hostPlatform.system}.neoforgeServers.neoforge-1_21_1; - serverProperties = { - motd = "createpack!!"; - max-players = 5; - difficulty = "normal"; - allow-flight = true; - view-distance = 16; - }; - jvmOpts = "-Xms1024M -Xmx6144M"; - symlinks.mods = "${modpack}/mods"; - }; + managementSystem.systemd-socket.enable = true; + # servers.createpack = { + # enable = true; + # package = inputs.nix-minecraft.legacyPackages.${pkgs.stdenv.hostPlatform.system}.neoforgeServers.neoforge-1_21_1; + # serverProperties = { + # motd = "createpack!!"; + # max-players = 5; + # difficulty = "normal"; + # allow-flight = true; + # view-distance = 16; + # }; + # jvmOpts = "-Xms1024M -Xmx6144M"; + # symlinks.mods = "${modpack}/mods"; + # }; servers.owo = { enable = false; package = inputs.nix-minecraft.legacyPackages.${pkgs.stdenv.hostPlatform.system}.fabricServers.fabric-1_21_5;