nixos-config/profiles/servers/minecraft.nix

181 lines
5.5 KiB
Nix

{ config, pkgs, lib, inputs, ... }:
let
jdk21 = pkgs.temurin-bin;
jdk17 = pkgs.temurin-bin-17;
jvmOpts = lib.concatStringsSep " " [
"-XX:+UnlockExperimentalVMOptions"
"-XX:+UseZGC"
"-XX:+ZGenerational"
"-XX:-ZUncommit"
"-XX:-ZProactive"
"-XX:+AlwaysPreTouch"
"-XX:+UseTransparentHugePages"
];
rsyncSSHKeys = config.users.users.${config.mainuser}.openssh.authorizedKeys.keys;
defaults = {
allow-flight = true;
difficulty = 2;
# 5 minutes tick timeout, for heavy packs
max-tick-time = 5 * 60 * 1000;
online-mode = false;
spawn-protection = 0;
};
instances = config.services.modded-minecraft-servers.instances;
in
{
imports = [
inputs.mms.module
inputs.ataraxiasjel-nur.nixosModules.rustic
];
services.modded-minecraft-servers = {
eula = true;
instances = {
statech = {
enable = false;
inherit rsyncSSHKeys jvmOpts;
jvmMaxAllocation = "6144m";
jvmInitialAllocation = "6144m";
jvmPackage = jdk17;
serverConfig = defaults // {
server-port = 25567;
rcon-port = 25577;
motd = "StaTech";
max-world-size = 50000;
level-seed = "-4411466874705470064";
};
};
all-of-create = {
enable = false;
inherit rsyncSSHKeys jvmOpts;
jvmMaxAllocation = "4096m";
jvmInitialAllocation = "4096m";
jvmPackage = jdk21;
serverConfig = defaults // {
server-port = 25566;
rcon-port = 25576;
motd = "All of Create";
max-world-size = 50000;
level-seed = "-6893059259197159072";
};
};
create = {
enable = true;
inherit rsyncSSHKeys jvmOpts;
jvmMaxAllocation = "4096m";
jvmInitialAllocation = "4096m";
jvmPackage = jdk21;
serverConfig = defaults // {
server-port = 25565;
rcon-port = 25575;
motd = "AtaraxiaSjel's Create";
max-world-size = 50000;
# 520 120 375
level-seed = "-9219784036026610404";
};
};
};
};
persist.state.directories = map (x: "/var/lib/mc-${x}") (lib.attrNames instances);
# Rustic backup for all servers, including disabled ones
sops.secrets.rustic-workstation-pass.sopsFile = inputs.self.secretsDir + /rustic.yaml;
sops.secrets.rustic-minecraft-s3-env.sopsFile = inputs.self.secretsDir + /rustic.yaml;
services.rustic.backups = rec {
workstation-minecraft-backup = {
backup = true;
prune = false;
initialize = false;
# environmentFile = config.sops.secrets.rustic-minecraft-s3-env.path;
pruneOpts = [ "--repack-cacheable-only=false" ];
timerConfig = {
OnCalendar = "*:0/15";
};
backupPrepareCommand = ''
start_backup=false
${lib.strings.concatLines (
map (x: "systemctl is-active --quiet mc-${x}.service && start_backup=true") (
lib.attrNames instances
)
)}
if [ "$start_backup" = false ]; then
echo "No Minecraft servers are running. Skip backup."
exit 1
fi
${lib.strings.concatLines (
map (x: ''
if systemctl is-active --quiet mc-${x}.service; then
export MCRCON_PORT=${toString instances.${x}.serverConfig.rcon-port}
export MCRCON_PASS=${instances.${x}.serverConfig.rcon-password}
${pkgs.mcrcon}/bin/mcrcon "say Rustic backup is started!" save-off "save-all"
fi
'') (lib.attrNames instances)
)}
sleep 3
'';
backupCleanupCommand = ''
${lib.strings.concatLines (
map (x: ''
if systemctl is-active --quiet mc-${x}.service; then
export MCRCON_PORT=${toString instances.${x}.serverConfig.rcon-port}
export MCRCON_PASS=${instances.${x}.serverConfig.rcon-password}
${pkgs.mcrcon}/bin/mcrcon "say Rustic backup is done!" save-on
fi
'') (lib.attrNames instances)
)}
'';
settings = let
label = "workstation-minecraft";
in {
repository = {
# repository = "opendal:s3";
repository = "/persist/backup/minecraft-servers";
password-file = config.sops.secrets.rustic-workstation-pass.path;
no-cache = true;
# options = {
# root = label;
# bucket = "rustic-backups";
# region = "us-east-1";
# endpoint = "https://s3.ataraxiadev.com";
# };
};
backup = {
host = config.device;
label = label;
ignore-devid = true;
group-by = "label";
skip-identical-parent = true;
globs = [ "!/var/lib/**/backups" "!/var/lib/**/.cache" "!/var/lib/**/logs" ];
exclude-if-present = [ ".nobackup" "CACHEDIR.TAG" ];
snapshots = [{
sources = map (x: "/var/lib/mc-${x}") (lib.attrNames instances);
}];
};
forget = {
filter-labels = [ label ];
group-by = "label";
prune = true;
keep-hourly = 6;
keep-daily = 2;
keep-weekly = 1;
keep-monthly = 0;
};
};
};
workstation-minecraft-prune = workstation-minecraft-backup // {
backup = false;
prune = true;
createWrapper = false;
backupPrepareCommand = null;
backupCleanupCommand = null;
timerConfig = {
OnCalendar = "hourly";
Persistent = true;
};
};
};
}