feat(services): add valheim server module and preset

This commit is contained in:
Noah Masur
2026-10-23 18:21:52 +00:00
parent 744afbb2d8
commit c757493b35
10 changed files with 507 additions and 0 deletions
@@ -0,0 +1,16 @@
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IHNzaC1lZDI1NTE5IE1nSGFPdyA5V29j
dWc3Rmd2T3hHdkNlSE1nejVKdGY0UkUxM2U4eStQWEk5Z2pLOXlVCkExWWhzMzZZ
Yk5uWVY2anc3TTJTNkdVd0pRcmx6bGhkRWtHZlh6Yk93bGMKLT4gc3NoLWVkMjU1
MTkgWXlTVU1RIHhzallQU211VzduSkVHWVMzblRDcnY0L1VLMENoWi9RSkhaL0dS
a1Q2MjAKM1ZHcENURld0Ry9iUjVGRUd3RHA3Q29oQW8vYlN1SW1pNTdVOE5LSDRu
MAotPiBzc2gtZWQyNTUxOSBuanZYNUEgMi9IVU5rWXp3UHVZYWxFWE5mN0lHRlJY
V0dNSWh2YVRya1o5US9nSURSZwpXSHFhdTBOVExxSlhsYlRnWTR4Y1ZURWlCK2pG
OTdQdFNXUHoraWF5bW1VCi0+IHNzaC1lZDI1NTE5IENxSU9VQSBESmZuM25IYjNx
L3BDWmh6ZDFLdDVvMlY2Vzlra0t5WHZMbkUxOTlJMWlnCjZNcmdoZ2o1c1ZkSW02
QTR0WTRDcWFIYkZpRzdJMHJ4aWhJYjVFRU9aUDQKLT4gc3NoLWVkMjU1MTkgejFP
Y1p3IGVZUnZUM2p3R1ROZk92MVNscHRTMytKd3EvZE5JT0orYmE3U1h0SERyV28K
SXNIa0FMTHJ6dE5lVW85Q0N2N2F5QU1EU3crc1diTmM0SXVkQ0xlY3lpYwotLS0g
Y1ZxeE8wSkVpRllTT29QZTQ3L25ReGZ6WEMzSnZvSGJQaUNNV2J4ZzNzYwp3Ll3z
WxwIP3+BEVkWO52W77uZVfS9it6ecqvcFmEQK0PCzrKsTkm5Xlw3mAp42kXeIg==
-----END AGE ENCRYPTED FILE-----
@@ -0,0 +1,90 @@
{
config,
pkgs,
lib,
...
}:
let
inherit (config.nmasur.settings) hostnames;
cfg = config.nmasur.presets.services.valheim;
in
{
options.nmasur.presets.services.valheim = {
enable = lib.mkEnableOption "Valheim dedicated server";
serverName = lib.mkOption {
type = lib.types.str;
default = "Midgard";
description = "Server name in server browser.";
};
worldName = lib.mkOption {
type = lib.types.str;
default = "Midgard";
description = "World save name.";
};
port = lib.mkOption {
type = lib.types.port;
default = 2456;
description = "Server port.";
};
crossplay = lib.mkOption {
type = lib.types.bool;
default = false;
description = "Enable cross-platform play.";
};
openFirewall = lib.mkOption {
type = lib.types.bool;
default = true;
description = "Open UDP ports in firewall.";
};
passwordFile = lib.mkOption {
type = lib.types.path;
default = ./valheim-password.age;
description = "Age-encrypted secret file containing the server password.";
};
};
config = lib.mkIf cfg.enable {
allowUnfreePackages = [
"valheim-server"
"steamworks-sdk-redist"
];
secrets.valheim-password = {
source = cfg.passwordFile;
dest = "${config.secretsDirectory}/valheim-password";
owner = "valheim";
group = "valheim";
permissions = "0400";
};
systemd.services.valheim-password-secret = {
requiredBy = [ "valheim.service" ];
before = [ "valheim.service" ];
};
services.valheim = {
enable = true;
serverName = cfg.serverName;
worldName = cfg.worldName;
port = cfg.port;
crossplay = cfg.crossplay;
openFirewall = cfg.openFirewall;
passwordFile = config.secrets.valheim-password.dest;
};
# Configure Cloudflare DNS (no proxy for UDP game traffic)
nmasur.presets.services.cloudflare.noProxyDomains = [ hostnames.valheim ];
};
}
@@ -61,6 +61,7 @@ in
stalwart.enable = lib.mkDefault true;
thelounge.enable = lib.mkDefault true;
uptime-kuma.enable = lib.mkDefault true;
valheim.enable = lib.mkDefault false;
vaultwarden.enable = lib.mkDefault true;
victoriametrics.enable = lib.mkDefault true;
};