From cbef8398abef50c291c24b2caa774e07475bd19f Mon Sep 17 00:00:00 2001 From: Avery Date: Fri, 18 Jul 2025 18:50:34 +0000 Subject: [PATCH 1/2] feat(minecraft): Add BlueMap --- .../services/_port-definitions.nix | 2 +- .../services/minecraft/default.nix | 164 ++++++++++-------- 2 files changed, 92 insertions(+), 74 deletions(-) diff --git a/hosts/greatyamada/services/_port-definitions.nix b/hosts/greatyamada/services/_port-definitions.nix index d4a310b..26a74dc 100644 --- a/hosts/greatyamada/services/_port-definitions.nix +++ b/hosts/greatyamada/services/_port-definitions.nix @@ -1,7 +1,7 @@ { tcp = { minecraft = 13914; - + minecraft-fabric-prod-bluemap = 8100; }; adguardhome-dns = 53; adguardhome-http = 3001; diff --git a/hosts/greatyamada/services/minecraft/default.nix b/hosts/greatyamada/services/minecraft/default.nix index e3e8998..5bff2b5 100644 --- a/hosts/greatyamada/services/minecraft/default.nix +++ b/hosts/greatyamada/services/minecraft/default.nix @@ -27,85 +27,103 @@ in { environment.systemPackages = with pkgs; [ mcrcon ]; networking.firewall.allowedTCPPorts = with ports.tcp; [ minecraft ]; nixpkgs.overlays = [ inputs.nix-minecraft.overlay ]; - services.minecraft-servers = { - enable = true; - eula = true; - dataDir = "/mnt/ssd-01/minecraft"; - environmentFile = config.sops.templates."minecraft.env".path; - managementSystem = { - tmux.enable = false; - systemd-socket.enable = true; - }; - servers.fabric_prod = { + services = { + minecraft-servers = { enable = true; - package = pkgs.fabricServers.fabric-1_21_6; - enableReload = true; - autoStart = false; - jvmOpts = - "-Xms6G -Xmx6G -XX:+UseG1GC -XX:+ParallelRefProcEnabled -XX:MaxGCPauseMillis=200 -XX:+UnlockExperimentalVMOptions -XX:+DisableExplicitGC -XX:+AlwaysPreTouch -XX:G1NewSizePercent=30 -XX:G1MaxNewSizePercent=40 -XX:G1HeapRegionSize=8M -XX:G1ReservePercent=20 -XX:G1HeapWastePercent=5 -XX:G1MixedGCCountTarget=4 -XX:InitiatingHeapOccupancyPercent=15 -XX:G1MixedGCLiveThresholdPercent=90 -XX:G1RSetUpdatingPauseTimePercent=5 -XX:SurvivorRatio=32 -XX:+PerfDisableSharedMem -XX:MaxTenuringThreshold=1 -Dusing.aikars.flags=https://mcflags.emc.gs -Daikars.new.flags=true"; - serverProperties = { - difficulty = "hard"; - enable-rcon = true; - enable-query = false; - enforce-secure-profile = false; - enforce-whitelist = true; - hide-online-players = true; - max-players = 10; - motd = "${ - packageNameToHumanString - config.services.minecraft-servers.servers.fabric_prod.package.name - } on ${config.networking.hostName}"; - online-mode = true; - pause-when-empty-seconds = 60; - pvp = true; - "rcon.password" = "@MINECRAFT_RCON_PASSWORD@"; - server-port = ports.tcp.minecraft; - simulation-distance = 10; - spawn-protection = 0; - view-distance = 10; - white-list = true; + eula = true; + dataDir = "/mnt/ssd-01/minecraft"; + environmentFile = config.sops.templates."minecraft.env".path; + managementSystem = { + tmux.enable = false; + systemd-socket.enable = true; }; - symlinks = { - "server-icon.png" = serverIcon; - "mods/Fabric-API.jar" = pkgs.fetchurl { - url = - "https://cdn.modrinth.com/data/P7dR8mSH/versions/b2dnY6PN/fabric-api-0.128.0%2B1.21.6.jar"; - sha512 = - "c668402e1a877c2d572d16e31e6d2783be27a80993fa83bf040ea2007994518786bd3140dcea15334f8ee1630836292b8ae4d41444e47cba0ac43d05f1eb1e78"; + servers.fabric_prod = { + enable = true; + package = pkgs.fabricServers.fabric-1_21_6; + enableReload = true; + autoStart = false; + jvmOpts = + "-Xms6G -Xmx6G -XX:+UseG1GC -XX:+ParallelRefProcEnabled -XX:MaxGCPauseMillis=200 -XX:+UnlockExperimentalVMOptions -XX:+DisableExplicitGC -XX:+AlwaysPreTouch -XX:G1NewSizePercent=30 -XX:G1MaxNewSizePercent=40 -XX:G1HeapRegionSize=8M -XX:G1ReservePercent=20 -XX:G1HeapWastePercent=5 -XX:G1MixedGCCountTarget=4 -XX:InitiatingHeapOccupancyPercent=15 -XX:G1MixedGCLiveThresholdPercent=90 -XX:G1RSetUpdatingPauseTimePercent=5 -XX:SurvivorRatio=32 -XX:+PerfDisableSharedMem -XX:MaxTenuringThreshold=1 -Dusing.aikars.flags=https://mcflags.emc.gs -Daikars.new.flags=true"; + serverProperties = { + difficulty = "hard"; + enable-rcon = true; + enable-query = false; + enforce-secure-profile = false; + enforce-whitelist = true; + hide-online-players = true; + max-players = 10; + motd = "${ + packageNameToHumanString + config.services.minecraft-servers.servers.fabric_prod.package.name + } on ${config.networking.hostName}"; + online-mode = true; + pause-when-empty-seconds = 60; + pvp = true; + "rcon.password" = "@MINECRAFT_RCON_PASSWORD@"; + server-port = ports.tcp.minecraft; + simulation-distance = 10; + spawn-protection = 0; + view-distance = 10; + white-list = true; }; - "mods/Ferrite-Core.jar" = pkgs.fetchurl { - url = - "https://cdn.modrinth.com/data/uXXizFIs/versions/CtMpt7Jr/ferritecore-8.0.0-fabric.jar"; - sha512 = - "131b82d1d366f0966435bfcb38c362d604d68ecf30c106d31a6261bfc868ca3a82425bb3faebaa2e5ea17d8eed5c92843810eb2df4790f2f8b1e6c1bdc9b7745"; + symlinks = { + "server-icon.png" = serverIcon; + "mods/Fabric-API.jar" = pkgs.fetchurl { + url = + "https://cdn.modrinth.com/data/P7dR8mSH/versions/b2dnY6PN/fabric-api-0.128.0%2B1.21.6.jar"; + sha512 = + "c668402e1a877c2d572d16e31e6d2783be27a80993fa83bf040ea2007994518786bd3140dcea15334f8ee1630836292b8ae4d41444e47cba0ac43d05f1eb1e78"; + }; + "mods/Ferrite-Core.jar" = pkgs.fetchurl { + url = + "https://cdn.modrinth.com/data/uXXizFIs/versions/CtMpt7Jr/ferritecore-8.0.0-fabric.jar"; + sha512 = + "131b82d1d366f0966435bfcb38c362d604d68ecf30c106d31a6261bfc868ca3a82425bb3faebaa2e5ea17d8eed5c92843810eb2df4790f2f8b1e6c1bdc9b7745"; + }; + "mods/Lithium.jar" = pkgs.fetchurl { + url = + "https://cdn.modrinth.com/data/gvQqBUqZ/versions/XWGBHYcB/lithium-fabric-0.17.0%2Bmc1.21.6.jar"; + sha512 = + "a8d6a8b69ae2b10dd0cf8f8149260d5bdbd2583147462bad03380014edd857852972b967d97df69728333d8836b1e9db8997712ea26365ddb8a05b8c845c6534"; + }; + "mods/Krypton.jar" = pkgs.fetchurl { + url = + "https://cdn.modrinth.com/data/fQEb0iXm/versions/neW85eWt/krypton-0.2.9.jar"; + sha512 = + "2e2304b1b17ecf95783aee92e26e54c9bfad325c7dfcd14deebf9891266eb2933db00ff77885caa083faa96f09c551eb56f93cf73b357789cb31edad4939ffeb"; + }; + "mods/spark.jar" = pkgs.fetchurl { + url = + "https://cdn.modrinth.com/data/l6YH9Als/versions/qW2mPW6y/spark-1.10.139-fabric.jar"; + sha512 = + "cd991acee93c074912f2934b5a9c3967be2f1e9157ca5a7254fd3fce8d280c5aa9a3ab06d3ee19f06c5111181853cf12048d000bf8b9f722c902c080fe258a97"; + }; + "mods/BlueMap.jar" = pkgs.fetchurl { + url = + "https://cdn.modrinth.com/data/swbUV1cr/versions/fB6f4XRA/bluemap-5.9-fabric.jar"; + sha512 = + "a76a2b1019efe35175f8df91f69ec7ec58e26f148ea9bba4f1eb9bb1b16ffa6f395b76c1362f452d33f94f0f1045403da3b04f25bc6d40feadbc58f64d34f1e4"; + }; }; - "mods/Lithium.jar" = pkgs.fetchurl { - url = - "https://cdn.modrinth.com/data/gvQqBUqZ/versions/XWGBHYcB/lithium-fabric-0.17.0%2Bmc1.21.6.jar"; - sha512 = - "a8d6a8b69ae2b10dd0cf8f8149260d5bdbd2583147462bad03380014edd857852972b967d97df69728333d8836b1e9db8997712ea26365ddb8a05b8c845c6534"; - }; - "mods/Krypton.jar" = pkgs.fetchurl { - url = - "https://cdn.modrinth.com/data/fQEb0iXm/versions/neW85eWt/krypton-0.2.9.jar"; - sha512 = - "2e2304b1b17ecf95783aee92e26e54c9bfad325c7dfcd14deebf9891266eb2933db00ff77885caa083faa96f09c551eb56f93cf73b357789cb31edad4939ffeb"; - }; - "mods/spark.jar" = pkgs.fetchurl { - url = - "https://cdn.modrinth.com/data/l6YH9Als/versions/qW2mPW6y/spark-1.10.139-fabric.jar"; - sha512 = - "cd991acee93c074912f2934b5a9c3967be2f1e9157ca5a7254fd3fce8d280c5aa9a3ab06d3ee19f06c5111181853cf12048d000bf8b9f722c902c080fe258a97"; + files = { + "ops.json".value = playersToOps (with players; [ engullejamones ]); + "whitelist.json".value = with players; [ + engullejamones + dankoszz + Santos_H + ]; }; }; - files = { - "ops.json".value = playersToOps (with players; [ engullejamones ]); - "whitelist.json".value = with players; [ - engullejamones - dankoszz - Santos_H - ]; - }; + }; + nginx.virtualHosts."minecraft.rcia.dev" = { + locations."/".return = "307 https://minecraft.rcia.dev/fabric_prod/"; + locations."/fabric_prod".return = + "308 https://minecraft.rcia.dev/fabric_prod/"; + locations."~/fabric_prod/(.*)$".proxyPass = "http://127.0.0.1:${ + toString ports.tcp.minecraft-fabric-prod-bluemap + }/$1"; + forceSSL = true; + useACMEHost = "rcia.dev"; }; }; sops = { From 9720ff348c965cc26e9a89ca43fed3ca90fc1d6c Mon Sep 17 00:00:00 2001 From: Avery Date: Fri, 18 Jul 2025 21:51:11 +0000 Subject: [PATCH 2/2] refactor(minecraft): Use local tiles when server is offline --- .../services/minecraft/default.nix | 36 +++++++++++++++---- 1 file changed, 29 insertions(+), 7 deletions(-) diff --git a/hosts/greatyamada/services/minecraft/default.nix b/hosts/greatyamada/services/minecraft/default.nix index 5bff2b5..6a78a08 100644 --- a/hosts/greatyamada/services/minecraft/default.nix +++ b/hosts/greatyamada/services/minecraft/default.nix @@ -116,12 +116,34 @@ in { }; }; nginx.virtualHosts."minecraft.rcia.dev" = { - locations."/".return = "307 https://minecraft.rcia.dev/fabric_prod/"; - locations."/fabric_prod".return = - "308 https://minecraft.rcia.dev/fabric_prod/"; - locations."~/fabric_prod/(.*)$".proxyPass = "http://127.0.0.1:${ - toString ports.tcp.minecraft-fabric-prod-bluemap - }/$1"; + extraConfig = "gzip_static always;"; + locations = { + "/".return = "307 scheme://$host/fabric_prod/"; + "/fabric_prod".return = "308 $scheme://$host/fabric_prod/"; + "/fabric_prod/" = { + alias = + "${config.services.minecraft-servers.dataDir}/fabric_prod/bluemap/web/"; + extraConfig = "error_page 404 = @no-content;"; + }; + "~* ^/fabric_prod/(maps/[^/\\s]*/live/.*)" = { + proxyPass = "http://127.0.0.1:${ + toString ports.tcp.minecraft-fabric-prod-bluemap + }/$1"; + extraConfig = '' + error_page 502 504 = @server-offline; + ''; + }; + "@no-content" = { + return = "204"; + extraConfig = "internal;"; + }; + "@server-offline" = { + root = + "${config.services.minecraft-servers.dataDir}/fabric_prod/bluemap/web"; + tryFiles = "$uri =410"; + extraConfig = "internal;"; + }; + }; forceSSL = true; useACMEHost = "rcia.dev"; }; @@ -135,5 +157,5 @@ in { owner = "minecraft"; }; }; - users.groups.minecraft.members = [ "avery" ]; + users.groups.minecraft.members = [ "avery" "nginx" ]; }