mirror of
https://github.com/gensokyo-zone/infrastructure.git
synced 2026-02-09 12:29:19 -08:00
feat(access): map
This commit is contained in:
parent
1a4ab08adc
commit
22f5a3d420
9 changed files with 210 additions and 24 deletions
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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";
|
||||||
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
];
|
||||||
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
];
|
||||||
|
};
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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"
|
||||||
],
|
],
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -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": [
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -768,8 +768,8 @@ EOT
|
||||||
}
|
}
|
||||||
|
|
||||||
memory {
|
memory {
|
||||||
dedicated = 8192
|
dedicated = 16384
|
||||||
swap = 8192
|
swap = 16384
|
||||||
}
|
}
|
||||||
|
|
||||||
disk {
|
disk {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue