diff --git a/modules/nixos/minecraft/java.nix b/modules/nixos/minecraft/java.nix index ec0be0bb..33e6186a 100644 --- a/modules/nixos/minecraft/java.nix +++ b/modules/nixos/minecraft/java.nix @@ -12,6 +12,7 @@ inherit (lib.meta) getExe; inherit (config.lib.minecraft) mkAllowPlayerType writeWhiteList writeOps; cfg = config.services.minecraft-java-server; + defaultPort = 25565; in { options.services.minecraft-java-server = with lib.types; { enable = mkEnableOption "minecraft java edition server"; @@ -22,7 +23,7 @@ in { }; port = mkOption { type = port; - default = 25565; + default = defaultPort; }; jre.package = mkPackageOption pkgs "jre" {}; @@ -67,7 +68,66 @@ in { config = let confService.services.minecraft-java-server = { + # TODO: fill with defaults serverProperties = mapOptionDefaults { + enable-jmx-monitoring = false; + "rcon.port" = 25575; + level-seed = ""; + gamemode = "survival"; + enable-command-block = false; + enable-query = false; + generator-settings = {}; + enforce-secure-profile = true; + level-name = "world"; + motd = "A Minecraft Server"; + #"query.port" = defaultPort; + "query.port" = cfg.serverProperties.server-port or defaultPort; + pvp = true; + generate-structures = true; + max-chained-neighbor-updates = 1000000; + difficulty = "easy"; + network-compression-threshold = 256; + max-tick-time = 60000; + require-resource-pack = false; + use-native-transport = true; + max-players = 20; + online-mode = true; + enable-status = true; + allow-flight = false; + initial-disabled-packs = ""; + broadcast-rcon-to-ops = true; + view-distance = 10; + server-ip = ""; + resource-pack-prompt = ""; + allow-nether = true; + server-port = defaultPort; + enable-rcon = false; + sync-chunk-writes = true; + op-permission-level = 4; + prevent-proxy-connections = false; + hide-online-players = false; + resource-pack = ""; + entity-broadcast-range-percentage = 100; + simulation-distance = 10; + "rcon.password" = ""; + player-idle-timeout = 0; + force-gamemode = false; + rate-limit = 0; + hardcore = false; + white-list = false; + broadcast-console-to-ops = true; + spawn-npcs = true; + spawn-animals = true; + log-ips = true; + function-permission-level = 2; + initial-enabled-packs = "vanilla"; + level-type = "minecraft\\:normal"; + text-filtering-config = ""; + spawn-monsters = true; + enforce-whitelist = false; + spawn-protection = 16; + resource-pack-sha1 = ""; + max-world-size = 29999984; }; }; conf.users = mkIf (cfg.user == "minecraft-bedrock") { @@ -100,6 +160,7 @@ in { requires = ["minecraft-java-server.socket"]; after = ["network.target" "minecraft-java-server.socket"]; + restartIfChanged = false; restartTriggers = [ cfg.dataDir cfg.jvmOpts diff --git a/modules/system/exports/minecraft-java.nix b/modules/system/exports/minecraft-java.nix index a69fb900..8a02cc14 100644 --- a/modules/system/exports/minecraft-java.nix +++ b/modules/system/exports/minecraft-java.nix @@ -55,6 +55,18 @@ in { port = mkAlmostOptionDefault config.ports.default.port; transport = "udp"; }; + dynmap = { + enable = mkAlmostOptionDefault false; + port = mkAlmostOptionDefault 8123; + protocol = "http"; + listen = mkAlmostOptionDefault "int"; + }; + bluemap = { + enable = mkAlmostOptionDefault false; + port = mkAlmostOptionDefault 8100; + protocol = "http"; + listen = mkAlmostOptionDefault "int"; + }; }; }; } diff --git a/nixos/access/gensokyo/minecraft.nix b/nixos/access/gensokyo/minecraft.nix index 20e491b1..8ce136c8 100644 --- a/nixos/access/gensokyo/minecraft.nix +++ b/nixos/access/gensokyo/minecraft.nix @@ -1,15 +1,20 @@ { config, gensokyo-zone, + access, lib, pkgs, ... }: let - inherit (lib.modules) mkMerge mkDefault; + inherit (lib.modules) mkIf mkMerge mkDefault; inherit (gensokyo-zone.lib) domain; inherit (config.services) nginx; + minecraftSystem = access.systemForService "minecraft"; + inherit (minecraftSystem.exports.services) minecraft; minecraftBackups = "${config.kyuuto.dataDir}/minecraft/simplebackups"; minecraftDownloads = "${config.kyuuto.shareDir}/projects/minecraft/public"; + upstreamNameDynmap = "minecraft'dynmap"; + upstreamNameBluemap = "minecraft'bluemap"; root = pkgs.linkFarm "genso-minecraft-backups" [ { name = "minecraft/downloads"; @@ -20,7 +25,15 @@ path = minecraftBackups; } { - name = "minecraft/wiki/dummy"; + name = "minecraft/wiki/empty"; + path = "nope"; + } + { + name = "minecraft/dmap/empty"; + path = "nope"; + } + { + name = "minecraft/bmap/empty"; path = "nope"; } ]; @@ -33,20 +46,65 @@ auth_basic_user_file ${config.sops.secrets.access-web-htpasswd.path}; ''; in { - services.nginx.virtualHosts.gensokyoZone = { - locations = { - "/minecraft" = { - inherit root extraConfig; + services.nginx = { + upstreams' = { + ${upstreamNameDynmap} = mkIf minecraft.ports.dynmap.enable { + servers.service.accessService = { + name = "minecraft"; + system = minecraftSystem.name; + port = "dynmap"; + }; }; - "/minecraft/wiki" = { - return = "302 https://wiki.${domain}/minecraft/"; + ${upstreamNameBluemap} = mkIf minecraft.ports.bluemap.enable { + servers.service.accessService = { + name = "minecraft"; + system = minecraftSystem.name; + port = "bluemap"; + }; }; - "/minecraft/backups" = { - inherit root; - extraConfig = mkMerge [ - extraConfig - authPrivate - ]; + }; + virtualHosts.gensokyoZone = { + locations = { + "/minecraft" = { + inherit root extraConfig; + }; + "/minecraft/wiki" = { + return = "302 https://wiki.${domain}/minecraft/"; + }; + "/minecraft/map" = {xvars, ...}: let + defaultMap = if minecraft.ports.bluemap.enable then "bmap" else "dmap"; + in { + return = "302 ${xvars.get.scheme}://${xvars.get.host}/minecraft/${defaultMap}/"; + }; + "/minecraft/dmap/" = mkIf minecraft.ports.dynmap.enable { + proxy = { + enable = true; + upstream = mkDefault upstreamNameDynmap; + path = "/"; + }; + extraConfig = mkMerge [ + "gzip off;" + authPrivate + ]; + }; + "/minecraft/bmap/" = mkIf minecraft.ports.bluemap.enable { + proxy = { + enable = true; + upstream = mkDefault upstreamNameBluemap; + path = "/"; + }; + extraConfig = mkMerge [ + "gzip off;" + authPrivate + ]; + }; + "/minecraft/backups" = { + inherit root; + extraConfig = mkMerge [ + extraConfig + authPrivate + ]; + }; }; }; }; diff --git a/nixos/minecraft/java.nix b/nixos/minecraft/java.nix index d46c5a87..84166dd0 100644 --- a/nixos/minecraft/java.nix +++ b/nixos/minecraft/java.nix @@ -1,14 +1,22 @@ { pkgs, config, + systemConfig, + gensokyo-zone, lib, ... }: let - inherit (lib.modules) mkIf mkDefault; + 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; @@ -16,10 +24,20 @@ in { "user_jvm_args.txt" "/run/minecraft-java/unix_args.txt" ]; - serverProperties = { - enable-query = true; - "query.port" = cfg.port; - }; + 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"; @@ -62,6 +80,31 @@ in { 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.*" + ]; }; }; # TODO: tmpfiles.rules = ["d ${backupsDir} 775 ${cfg.user} admin - -"]; @@ -71,5 +114,11 @@ in { 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) + ]; + }; }; } diff --git a/systems/aya/lxc.json b/systems/aya/lxc.json index b3c11cd8..7e8c388d 100644 --- a/systems/aya/lxc.json +++ b/systems/aya/lxc.json @@ -5,6 +5,7 @@ "/rpool/shared/nix/var nix/var none bind,create=dir", "/rpool/shared/minecraft/bedrock mnt/shared/minecraft/bedrock none bind,optional,create=dir", "/rpool/shared/minecraft/java mnt/shared/minecraft/java none bind,optional,create=dir", + "/rpool/caches/minecraft mnt/caches/minecraft none bind,optional,create=dir", "/mnt/kyuuto-data/minecraft mnt/kyuuto-data/minecraft none bind,optional,create=dir", "/dev/net/tun dev/net/tun none bind,optional,create=file" ], diff --git a/systems/minecraft/default.nix b/systems/minecraft/default.nix index 39930f3d..a9aded32 100644 --- a/systems/minecraft/default.nix +++ b/systems/minecraft/default.nix @@ -13,7 +13,11 @@ _: { minecraft = { enable = true; id = "marka"; - ports.query.enable = true; + ports = { + query.enable = true; + dynmap.enable = true; + bluemap.enable = true; + }; }; }; }; diff --git a/systems/minecraft/lxc.json b/systems/minecraft/lxc.json index 26c874aa..86f81fa5 100644 --- a/systems/minecraft/lxc.json +++ b/systems/minecraft/lxc.json @@ -2,8 +2,8 @@ "lxc": { "lxc.mount.entry": [ "/rpool/shared/minecraft/java mnt/shared/minecraft/java none bind,optional,create=dir", + "/rpool/caches/minecraft mnt/caches/minecraft none bind,optional,create=dir", "/mnt/kyuuto-data/minecraft mnt/kyuuto-data/minecraft none bind,optional,create=dir", - "/mnt/kyuuto-minecraft mnt/kyuuto-minecraft none bind,optional,create=dir", "/dev/net/tun dev/net/tun none bind,optional,create=file" ], "lxc.idmap": [ diff --git a/systems/reisen/setup.sh b/systems/reisen/setup.sh index cb701c91..d900b51f 100644 --- a/systems/reisen/setup.sh +++ b/systems/reisen/setup.sh @@ -160,6 +160,7 @@ chown 100000:100000 /rpool/shared/nix/var mkcache zigbee2mqtt 100317 100317 0700 mkcache taskchampion 100917 100917 0750 +mkcache minecraft 100913 100913 0750 mkcache plex 0 0 0755 if [[ ! -d /rpool/caches/plex/Cache ]]; then mkdir /rpool/caches/plex/Cache diff --git a/tf/proxmox_vms.tf b/tf/proxmox_vms.tf index 67bbfc3e..38079ad6 100644 --- a/tf/proxmox_vms.tf +++ b/tf/proxmox_vms.tf @@ -768,8 +768,8 @@ EOT } memory { - dedicated = 8192 - swap = 8192 + dedicated = 16384 + swap = 16384 } disk {