1
0
Fork 0

Reconfigure Minecraft server to use nix-minecraft

This commit is contained in:
Avery 2025-06-26 00:10:57 +02:00
parent 8ab0c4b595
commit 35a65d995c
Signed by: Avery
GPG key ID: B684FD451B692E04
5 changed files with 197 additions and 281 deletions

View file

@ -1,78 +1,104 @@
{ config, lib, pkgs, ... }:
let
cfg = config.services.minecraft-server;
bukkitConfigFile = ./bukkit.yml;
spigotConfigFile = ./spigot.yml;
cfgToString = v: if builtins.isBool v then lib.boolToString v else toString v;
eulaFile = builtins.toFile "eula.txt" ''
# eula.txt managed by NixOS configuration
eula=true
'';
opsFile = builtins.toFile "ops.json" (builtins.toJSON [{
name = "aveeeeryy";
uuid = "b65a1bc3-c6a0-4e8c-99b8-3538cfec0cfc";
level = 4;
bypassesPlayerLimit = true;
}]);
serverPropertiesFile = pkgs.writeText "server.properties" (''
# server.properties managed by NixOS configuration
'' + lib.concatStringsSep "\n"
(lib.mapAttrsToList (n: v: "${n}=${cfgToString v}") cfg.serverProperties));
serverIcon = ./server-icon.png;
{ config, pkgs, inputs, ... }:
let serverIcon = ./server-icon.png;
in {
services.minecraft-server = {
enable = false;
package = pkgs.papermc;
declarative = true;
environment.systemPackages = with pkgs; [ mcrcon ];
networking.firewall.allowedTCPPorts = [ 13914 ];
nixpkgs.overlays = [ inputs.nix-minecraft.overlay ];
services.minecraft-servers = {
enable = true;
eula = true;
openFirewall = true;
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 = false;
enforce-secure-profile = false;
enforce-whitelist = true;
hide-online-players = true;
motd = "NixOS server";
online-mode = true;
pvp = true;
server-port = 13914;
spawn-protection = 0;
white-list = true;
# dataDir = "/mnt/ssd-01/minecraft";
# dataDir = "/mnt/Datos/minecraft";
environmentFile = config.sops.templates."minecraft.env".path;
managementSystem = {
tmux.enable = false;
systemd-socket.enable = true;
};
servers.main = {
enable = true;
package = pkgs.paperServers.paper-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 = "NixOS server";
online-mode = true;
pvp = true;
"rcon.password" = "@MINECRAFT_RCON_PASSWORD@";
server-port = 13914;
spawn-protection = 0;
white-list = true;
};
symlinks = {
"server-icon.png" = serverIcon;
"plugins/EssentialsX.jar" = pkgs.fetchurl {
url =
"https://github.com/EssentialsX/Essentials/releases/download/2.21.1/EssentialsX-2.21.1.jar";
hash = "sha256-Fd1/hxPmE6Hd6tp5LbZgqIyL9pAVvBPxqfnjf21Ez1o=";
};
"plugins/EssentialsX-Chat.jar" = pkgs.fetchurl {
url =
"https://github.com/EssentialsX/Essentials/releases/download/2.21.1/EssentialsXChat-2.21.1.jar";
hash = "sha256-M3ThA5j5DI1qTdNw8OvLIprxRCD5q5ya/AfO5jGyU6Y=";
};
"plugins/TabTPS.jar" = pkgs.fetchurl {
url =
"https://cdn.modrinth.com/data/cUhi3iB2/versions/DlhrDe98/tabtps-spigot-1.3.27.jar";
hash = "sha256-pWmcNKB0iAlVK4Ki5/vBOv8npOMyrUdxJ/7TbPXlpcI=";
};
};
files = {
"ops.json".value = [{
name = "engullejamones";
uuid = "b65a1bc3-c6a0-4e8c-99b8-3538cfec0cfc";
level = 4;
bypassesPlayerLimit = true;
}];
"whitelist.json".value = [{
name = "engullejamones";
uuid = "b65a1bc3-c6a0-4e8c-99b8-3538cfec0cfc";
}];
"plugins/TabTPS/display-configs/default.conf" = pkgs.writeTextFile {
name = "tabtps-display-config.conf";
text = ''
action-bar-settings {
allow=false
enable-on-login=false
}
boss-bar-settings {
allow=false
enable-on-login=false
}
permission=""
tab-settings {
allow=true
enable-on-login=true
footer-modules="ping,tps,mspt,cpu,memory"
header-modules=""
separator="<br>"
theme=default
}
'';
};
};
};
dataDir = "/minecraft";
};
# Overriden to have a non-declarative whitelist
systemd.services.minecraft-server.preStart = lib.mkForce ''
ln -sf ${eulaFile} eula.txt
cp -f ${bukkitConfigFile} bukkit.yml
chmod +w bukkit.yml
cp -f ${spigotConfigFile} spigot.yml
chmod +w spigot.yml
cp -f ${opsFile} ops.json
chmod +w ops.json
ln -sf ${serverIcon} server-icon.png
if [ -e .declarative ]; then
# Was declarative before, no need to back up anything
cp -f ${serverPropertiesFile} server.properties
else
# Declarative for the first time, backup stateful files
cp -b --suffix=.stateful ${serverPropertiesFile} server.properties
# server.properties must have write permissions, because every time
# the server starts it first parses the file and then regenerates it..
chmod +w server.properties
echo "Autogenerated file that signifies that this server configuration is managed declaratively by NixOS" \
> .declarative
fi
'';
sops = {
secrets."minecraft_rcon".owner = "minecraft";
templates."minecraft.env" = {
content = ''
MINECRAFT_RCON_PASSWORD=${config.sops.placeholder."minecraft_rcon"}
'';
owner = "minecraft";
};
};
users.groups.minecraft.members = [ "avery" ];
}