Set up papermc with systemd
This commit is contained in:
parent
25b7595e8f
commit
5f52428a64
2 changed files with 104 additions and 0 deletions
|
@ -34,6 +34,7 @@ in
|
||||||
../modules/personal/u2f.nix
|
../modules/personal/u2f.nix
|
||||||
./peertube-runner.nix
|
./peertube-runner.nix
|
||||||
./deluge.nix
|
./deluge.nix
|
||||||
|
./minecraft.nix
|
||||||
openrazer
|
openrazer
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|
103
nki-home/minecraft.nix
Normal file
103
nki-home/minecraft.nix
Normal file
|
@ -0,0 +1,103 @@
|
||||||
|
{
|
||||||
|
pkgs,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
let
|
||||||
|
dataDir = "/mnt/steam/mc/";
|
||||||
|
javaOpts = "-Xms4096M -Xmx4096M -XX:+AlwaysPreTouch -XX:+DisableExplicitGC -XX:+ParallelRefProcEnabled -XX:+PerfDisableSharedMem -XX:+UnlockExperimentalVMOptions -XX:+UseG1GC -XX:G1HeapRegionSize=8M -XX:G1HeapWastePercent=5 -XX:G1MaxNewSizePercent=40 -XX:G1MixedGCCountTarget=4 -XX:G1MixedGCLiveThresholdPercent=90 -XX:G1NewSizePercent=30 -XX:G1RSetUpdatingPauseTimePercent=5 -XX:G1ReservePercent=20 -XX:InitiatingHeapOccupancyPercent=15 -XX:MaxGCPauseMillis=200 -XX:MaxTenuringThreshold=1 -XX:SurvivorRatio=32 -Dusing.aikars.flags=https://mcflags.emc.gs -Daikars.new.flags=true";
|
||||||
|
name = "paper-mc";
|
||||||
|
socketName = "${name}.stdin";
|
||||||
|
socket = "/run/${socketName}";
|
||||||
|
|
||||||
|
console = pkgs.writeScriptBin "papermc-console" ''
|
||||||
|
#!${lib.getExe pkgs.python3}
|
||||||
|
# https://github.com/AtomicSponge/paper-systemd/blob/main/minecraft-console.py
|
||||||
|
|
||||||
|
import curses
|
||||||
|
import subprocess
|
||||||
|
import threading
|
||||||
|
|
||||||
|
def run_journalctl(win):
|
||||||
|
process = subprocess.Popen(['journalctl', '-u', '${name}', '--follow'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
||||||
|
while True:
|
||||||
|
line = process.stdout.readline()
|
||||||
|
if not line:
|
||||||
|
break
|
||||||
|
win.addstr(line.decode())
|
||||||
|
win.refresh()
|
||||||
|
|
||||||
|
def input_commands(win):
|
||||||
|
with open('${socket}', 'a') as f:
|
||||||
|
while True:
|
||||||
|
win.clear()
|
||||||
|
win.addstr("Enter command (Ctrl-C to exit): ")
|
||||||
|
curses.echo()
|
||||||
|
win.move(1, 0)
|
||||||
|
command = win.getstr().decode()
|
||||||
|
f.write(command + "\n")
|
||||||
|
f.flush()
|
||||||
|
curses.noecho()
|
||||||
|
win.clear()
|
||||||
|
|
||||||
|
def main(stdscr):
|
||||||
|
try:
|
||||||
|
curses.curs_set(1)
|
||||||
|
stdscr.clear()
|
||||||
|
|
||||||
|
height, width = stdscr.getmaxyx()
|
||||||
|
journal_height = int(height * 0.9)
|
||||||
|
input_height = height - journal_height
|
||||||
|
|
||||||
|
journal_win = stdscr.subwin(journal_height, width, 0, 0)
|
||||||
|
journal_win.scrollok(True)
|
||||||
|
input_win = stdscr.subwin(input_height, width, journal_height, 0)
|
||||||
|
|
||||||
|
thread = threading.Thread(target=run_journalctl, args=(journal_win,))
|
||||||
|
thread.daemon = True
|
||||||
|
thread.start()
|
||||||
|
|
||||||
|
input_commands(input_win)
|
||||||
|
|
||||||
|
except KeyboardInterrupt:
|
||||||
|
stdscr.clear()
|
||||||
|
stdscr.refresh()
|
||||||
|
finally:
|
||||||
|
curses.endwin()
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
curses.wrapper(main)
|
||||||
|
'';
|
||||||
|
in
|
||||||
|
{
|
||||||
|
environment.systemPackages = [ console ];
|
||||||
|
users.users.${name} = {
|
||||||
|
isSystemUser = true;
|
||||||
|
group = name;
|
||||||
|
};
|
||||||
|
users.users.nki.extraGroups = [ name ];
|
||||||
|
users.groups.${name} = {
|
||||||
|
};
|
||||||
|
systemd.sockets.${name} = {
|
||||||
|
partOf = [ "${name}.service" ];
|
||||||
|
socketConfig.ListenFIFO = "%t/${socketName}";
|
||||||
|
};
|
||||||
|
systemd.services.${name} = {
|
||||||
|
description = "Minecraft Server";
|
||||||
|
serviceConfig = {
|
||||||
|
Type = "simple";
|
||||||
|
WorkingDirectory = dataDir;
|
||||||
|
User = name;
|
||||||
|
Restart = "on-failure";
|
||||||
|
Sockets = "${name}.socket";
|
||||||
|
StandardInput = "socket";
|
||||||
|
StandardOutput = "journal";
|
||||||
|
StandardError = "journal";
|
||||||
|
ReadWritePaths = [ dataDir ];
|
||||||
|
};
|
||||||
|
environment.JAVA_OPTS = javaOpts;
|
||||||
|
script = "${lib.getExe pkgs.papermc}";
|
||||||
|
preStop = "echo stop > ${socket}";
|
||||||
|
wantedBy = [ "multi-user.target" ];
|
||||||
|
};
|
||||||
|
}
|
Loading…
Add table
Reference in a new issue