feat(access): map

This commit is contained in:
arcnmx 2024-09-21 22:45:24 -07:00
parent 1a4ab08adc
commit 22f5a3d420
9 changed files with 210 additions and 24 deletions

View file

@ -12,6 +12,7 @@
inherit (lib.meta) getExe; inherit (lib.meta) getExe;
inherit (config.lib.minecraft) mkAllowPlayerType writeWhiteList writeOps; inherit (config.lib.minecraft) mkAllowPlayerType writeWhiteList writeOps;
cfg = config.services.minecraft-java-server; cfg = config.services.minecraft-java-server;
defaultPort = 25565;
in { in {
options.services.minecraft-java-server = with lib.types; { options.services.minecraft-java-server = with lib.types; {
enable = mkEnableOption "minecraft java edition server"; enable = mkEnableOption "minecraft java edition server";
@ -22,7 +23,7 @@ in {
}; };
port = mkOption { port = mkOption {
type = port; type = port;
default = 25565; default = defaultPort;
}; };
jre.package = mkPackageOption pkgs "jre" {}; jre.package = mkPackageOption pkgs "jre" {};
@ -67,7 +68,66 @@ in {
config = let config = let
confService.services.minecraft-java-server = { confService.services.minecraft-java-server = {
# TODO: fill with defaults
serverProperties = mapOptionDefaults { 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") { conf.users = mkIf (cfg.user == "minecraft-bedrock") {
@ -100,6 +160,7 @@ in {
requires = ["minecraft-java-server.socket"]; requires = ["minecraft-java-server.socket"];
after = ["network.target" "minecraft-java-server.socket"]; after = ["network.target" "minecraft-java-server.socket"];
restartIfChanged = false;
restartTriggers = [ restartTriggers = [
cfg.dataDir cfg.dataDir
cfg.jvmOpts cfg.jvmOpts

View file

@ -55,6 +55,18 @@ in {
port = mkAlmostOptionDefault config.ports.default.port; port = mkAlmostOptionDefault config.ports.default.port;
transport = "udp"; 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";
};
}; };
}; };
} }

View file

@ -1,15 +1,20 @@
{ {
config, config,
gensokyo-zone, gensokyo-zone,
access,
lib, lib,
pkgs, pkgs,
... ...
}: let }: let
inherit (lib.modules) mkMerge mkDefault; inherit (lib.modules) mkIf mkMerge mkDefault;
inherit (gensokyo-zone.lib) domain; inherit (gensokyo-zone.lib) domain;
inherit (config.services) nginx; inherit (config.services) nginx;
minecraftSystem = access.systemForService "minecraft";
inherit (minecraftSystem.exports.services) minecraft;
minecraftBackups = "${config.kyuuto.dataDir}/minecraft/simplebackups"; minecraftBackups = "${config.kyuuto.dataDir}/minecraft/simplebackups";
minecraftDownloads = "${config.kyuuto.shareDir}/projects/minecraft/public"; minecraftDownloads = "${config.kyuuto.shareDir}/projects/minecraft/public";
upstreamNameDynmap = "minecraft'dynmap";
upstreamNameBluemap = "minecraft'bluemap";
root = pkgs.linkFarm "genso-minecraft-backups" [ root = pkgs.linkFarm "genso-minecraft-backups" [
{ {
name = "minecraft/downloads"; name = "minecraft/downloads";
@ -20,7 +25,15 @@
path = minecraftBackups; path = minecraftBackups;
} }
{ {
name = "minecraft/wiki/dummy"; name = "minecraft/wiki/empty";
path = "nope";
}
{
name = "minecraft/dmap/empty";
path = "nope";
}
{
name = "minecraft/bmap/empty";
path = "nope"; path = "nope";
} }
]; ];
@ -33,20 +46,65 @@
auth_basic_user_file ${config.sops.secrets.access-web-htpasswd.path}; auth_basic_user_file ${config.sops.secrets.access-web-htpasswd.path};
''; '';
in { in {
services.nginx.virtualHosts.gensokyoZone = { services.nginx = {
locations = { upstreams' = {
"/minecraft" = { ${upstreamNameDynmap} = mkIf minecraft.ports.dynmap.enable {
inherit root extraConfig; servers.service.accessService = {
name = "minecraft";
system = minecraftSystem.name;
port = "dynmap";
};
}; };
"/minecraft/wiki" = { ${upstreamNameBluemap} = mkIf minecraft.ports.bluemap.enable {
return = "302 https://wiki.${domain}/minecraft/"; servers.service.accessService = {
name = "minecraft";
system = minecraftSystem.name;
port = "bluemap";
};
}; };
"/minecraft/backups" = { };
inherit root; virtualHosts.gensokyoZone = {
extraConfig = mkMerge [ locations = {
extraConfig "/minecraft" = {
authPrivate 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
];
};
}; };
}; };
}; };

View file

@ -1,14 +1,22 @@
{ {
pkgs, pkgs,
config, config,
systemConfig,
gensokyo-zone,
lib, lib,
... ...
}: let }: 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; cfg = config.services.minecraft-java-server;
#forge = "neoforge"; #forge = "neoforge";
forge = "forge"; forge = "forge";
mcVersion = "1.20.1";
backupsDir = "${config.kyuuto.dataDir}/minecraft/simplebackups/marka"; backupsDir = "${config.kyuuto.dataDir}/minecraft/simplebackups/marka";
enableDynmap = minecraft.ports.dynmap.enable;
enableBluemap = minecraft.ports.bluemap.enable;
in { in {
services.minecraft-java-server = { services.minecraft-java-server = {
enable = mkDefault true; enable = mkDefault true;
@ -16,10 +24,20 @@ in {
"user_jvm_args.txt" "user_jvm_args.txt"
"/run/minecraft-java/unix_args.txt" "/run/minecraft-java/unix_args.txt"
]; ];
serverProperties = { serverProperties = let
enable-query = true; props = {
"query.port" = cfg.port; 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 = { allowPlayers = {
katrynn = { katrynn = {
uuid = "356d8cf2-246a-4c07-b547-422aea06c0ab"; uuid = "356d8cf2-246a-4c07-b547-422aea06c0ab";
@ -62,6 +80,31 @@ in {
BindPaths = [ BindPaths = [
"${backupsDir}:${cfg.dataDir}/simplebackups" "${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 - -"]; # TODO: tmpfiles.rules = ["d ${backupsDir} 775 ${cfg.user} admin - -"];
@ -71,5 +114,11 @@ in {
allowedTCPPorts = [cfg.port]; allowedTCPPorts = [cfg.port];
allowedUDPPorts = mkIf cfg.serverProperties.enable-query or false [cfg.serverProperties."query.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)
];
};
}; };
} }

View file

@ -5,6 +5,7 @@
"/rpool/shared/nix/var nix/var none bind,create=dir", "/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/bedrock mnt/shared/minecraft/bedrock none bind,optional,create=dir",
"/rpool/shared/minecraft/java mnt/shared/minecraft/java 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", "/mnt/kyuuto-data/minecraft mnt/kyuuto-data/minecraft none bind,optional,create=dir",
"/dev/net/tun dev/net/tun none bind,optional,create=file" "/dev/net/tun dev/net/tun none bind,optional,create=file"
], ],

View file

@ -13,7 +13,11 @@ _: {
minecraft = { minecraft = {
enable = true; enable = true;
id = "marka"; id = "marka";
ports.query.enable = true; ports = {
query.enable = true;
dynmap.enable = true;
bluemap.enable = true;
};
}; };
}; };
}; };

View file

@ -2,8 +2,8 @@
"lxc": { "lxc": {
"lxc.mount.entry": [ "lxc.mount.entry": [
"/rpool/shared/minecraft/java mnt/shared/minecraft/java 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", "/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" "/dev/net/tun dev/net/tun none bind,optional,create=file"
], ],
"lxc.idmap": [ "lxc.idmap": [

View file

@ -160,6 +160,7 @@ chown 100000:100000 /rpool/shared/nix/var
mkcache zigbee2mqtt 100317 100317 0700 mkcache zigbee2mqtt 100317 100317 0700
mkcache taskchampion 100917 100917 0750 mkcache taskchampion 100917 100917 0750
mkcache minecraft 100913 100913 0750
mkcache plex 0 0 0755 mkcache plex 0 0 0755
if [[ ! -d /rpool/caches/plex/Cache ]]; then if [[ ! -d /rpool/caches/plex/Cache ]]; then
mkdir /rpool/caches/plex/Cache mkdir /rpool/caches/plex/Cache

View file

@ -768,8 +768,8 @@ EOT
} }
memory { memory {
dedicated = 8192 dedicated = 16384
swap = 8192 swap = 16384
} }
disk { disk {