{ config, pkgs, lib, ... }: let minecraft-server-args = [ "-Xms2G" "-Xmx2G" "-Dsun.rmi.dgc.server.gcInterval=2157583646" "-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" ]; ops = pkgs.writeText "ops.json" (builtins.toJSON [{ uuid = "140d177a-966f-41b8-a4c0-e305babd291b"; name = "TLATER"; level = 4; bypassesPlayerLimit = true; }]); whitelist = pkgs.writeText "whitelist.json" (builtins.toJSON [ { uuid = "59cd1648-14a4-4bcf-8f5a-2e1bde678f2c"; name = "romino25"; } { uuid = "0ab6e3d1-544a-47e7-8538-2e6c248e49a4"; name = "lasi25"; } { uuid = "01c9e737-fc9d-4d55-b8c2-610ca80eb4be"; name = "Nampeyo25"; } { uuid = "140d177a-966f-41b8-a4c0-e305babd291b"; name = "tlater"; } ]); eula = pkgs.writeText "eula.txt" "eula=true"; in { nixpkgs.config.allowUnfreePredicate = pkg: builtins.elem (lib.getName pkg) [ "forge-server" ]; users = { extraUsers.minecraft = { uid = config.ids.uids.minecraft; group = config.users.extraGroups.minecraft.name; isSystemUser = true; description = "Minecraft server user"; }; extraGroups.minecraft = { gid = config.ids.gids.minecraft; }; }; virtualisation.oci-containers.containers.minecraft-voor-kia = let properties = ./configs/minecraft/voor-kia/server.properties; icon = ./configs/minecraft/voor-kia/server-icon.png; in { image = "tlaternet/minecraft-voor-kia"; imageFile = pkgs.dockerTools.buildImage { name = "tlaternet/minecraft-voor-kia"; tag = "latest"; contents = [ (pkgs.local.forge-server.override { jre_headless = pkgs.jdk11_headless; mods = pkgs.local.voor-kia; modConfig = ./configs/minecraft/voor-kia/config; defaultconfigs = ./configs/minecraft/voor-kia/defaultconfigs; }) ]; config = let uid = toString config.users.extraUsers.minecraft.uid; gid = toString config.users.extraGroups.minecraft.gid; in { Cmd = [ "forge-server" ] ++ minecraft-server-args; WorkingDir = "/var/lib/minecraft"; Volumes = { "/var/lib/minecraft" = { }; # Required because some things will try to write to /tmp, # which doesn't exist if it's not defined as a volume. "/tmp" = { }; }; ExposedPorts = { "25565" = { }; }; User = "${uid}:${gid}"; }; }; extraOptions = [ "--cpus=1.0" ]; autoStart = false; ports = [ "25565:25565" ]; volumes = [ "minecraft:/var/lib/minecraft" "${eula}:/var/lib/minecraft/eula.txt:ro" "${icon}:/var/lib/minecraft/server-icon.png:ro" "${ops}:/var/lib/minecraft/ops.json:ro" "${properties}:/var/lib/minecraft/server.properties:ro" "${whitelist}:/var/lib/minecraft/whitelist.json:ro" ]; }; systemd.timers.podman-minecraft-voor-kia-off = { description = "Turns off the minecraft server every day at 4 am"; wantedBy = [ "podman-minecraft-voor-kia.service" ]; timerConfig = { Unit = "podman-minecraft-voor-kia-starter@stop.service"; OnCalendar = "04:00:00"; }; }; systemd.timers.podman-minecraft-voor-kia-on = { description = "Turns on the minecraft server every day at 2 pm"; wantedBy = [ "podman-minecraft-voor-kia.service" ]; timerConfig = { Unit = "podman-minecraft-voor-kia-starter@start.service"; OnCalendar = "14:00:00"; }; }; systemd.services."podman-minecraft-voor-kia-starter@" = { description = "Unit to stop/start the minecraft server"; serviceConfig = { ExecStart = "${pkgs.systemd}/bin/systemctl %i podman-minecraft-voor-kia.service"; Type = "oneshot"; }; }; }