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 (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

View file

@ -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";
};
};
};
}

View file

@ -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,7 +46,24 @@
auth_basic_user_file ${config.sops.secrets.access-web-htpasswd.path};
'';
in {
services.nginx.virtualHosts.gensokyoZone = {
services.nginx = {
upstreams' = {
${upstreamNameDynmap} = mkIf minecraft.ports.dynmap.enable {
servers.service.accessService = {
name = "minecraft";
system = minecraftSystem.name;
port = "dynmap";
};
};
${upstreamNameBluemap} = mkIf minecraft.ports.bluemap.enable {
servers.service.accessService = {
name = "minecraft";
system = minecraftSystem.name;
port = "bluemap";
};
};
};
virtualHosts.gensokyoZone = {
locations = {
"/minecraft" = {
inherit root extraConfig;
@ -41,6 +71,33 @@ in {
"/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 [
@ -50,6 +107,7 @@ in {
};
};
};
};
systemd.services.nginx.serviceConfig.BindReadOnlyPaths = [
minecraftBackups
minecraftDownloads

View file

@ -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 = {
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)
];
};
};
}

View file

@ -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"
],

View file

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

View file

@ -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": [

View file

@ -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

View file

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