{ config, pkgs, registry, ... }: # pikachu — AZW ME Pro server. # Disk layout is in ./disk.nix. # `fileSystems` for the root disk are derived from it. { imports = [ ./hardware-configuration.nix ./disk.nix ]; hardware.cpu.intel.updateMicrocode = true; systemd.network = { enable = true; netdevs = { "40-br-vlan20".netdevConfig = { Name = "br-vlan20"; Kind = "bridge"; }; "40-vlan20" = { netdevConfig = { Name = "vlan20"; Kind = "vlan"; }; vlanConfig.Id = 20; }; }; networks = { "10-uplink" = { matchConfig = { Name = "enp2s0"; MACAddress = "78:55:36:07:af:49"; }; networkConfig.DHCP = "yes"; vlan = [ "vlan20" ]; linkConfig.RequiredForOnline = "routable"; }; "40-vlan20" = { matchConfig.Name = "vlan20"; networkConfig.Bridge = "br-vlan20"; linkConfig.RequiredForOnline = "no"; }; "40-br-vlan20" = { matchConfig.Name = "br-vlan20"; linkConfig.RequiredForOnline = "no"; }; }; }; networking.useDHCP = false; modules.network.vlans.ids = [ 20 ]; boot.zfs.forceImportRoot = false; modules.zfs = { enable = true; hostId = "2346edbd"; pools.pikachu = { }; }; registry.address.pikachu.self = "10.23.10.102"; guests.valheim = { enable = true; vlan = 20; address = "10.23.20.197"; steamPath = "/pikachu/data/steamcmd"; installPath = "/pikachu/data/servers/valheim/main"; statePath = "/pikachu/media/games/servers/valheim/main"; serverName = "butter-chicken"; reverseProxy = { enable = true; route = { domain = "valheim.alexion.dev"; udp.ports = [ config.guests.valheim.port (config.guests.valheim.port + 1) ]; }; }; }; guests.palworld = { enable = true; vlan = 20; address = "10.23.20.250"; steamPath = "/pikachu/data/steamcmd"; installPath = "/pikachu/data/servers/palworld/tracion"; statePath = "/pikachu/media/games/servers/palworld/tracion"; serverName = "Tracion"; autoStart = false; adminPasswordSecret = "services/game-servers/admin/password"; publicIP = config.guests.palworld.address; reverseProxy = { enable = true; route = { domain = "palworld.alexion.dev"; udp.ports = [ config.guests.palworld.port ]; }; }; }; guests.actualbudget = { enable = true; vlan = 20; mac = "BC:24:11:C1:CD:28"; dataPath = "/pikachu/data/actualbudget"; address = "10.23.20.42"; reverseProxy = { enable = true; route = { domain = "budget.alexion.dev"; port = 5006; }; }; }; guests.navidrome = { enable = true; vlan = 20; mac = "BC:24:11:C9:17:83"; dataPath = "/pikachu/data/navidrome"; libraryPath = "/pikachu/media/music"; address = "10.23.20.43"; reverseProxy = { enable = true; route = { domain = "music.alexion.dev"; port = 4533; }; }; }; guests.reverse-proxy = { enable = true; vlan = 20; mac = "02:98:64:5a:07:4f"; address = "10.23.20.109"; }; guests.homepage = { enable = true; vlan = 20; address = "10.23.20.110"; reverseProxy = { enable = true; route = { domain = "home"; http.port = 8082; }; }; }; guests.copyparty = { enable = true; vlan = 20; mac = "02:23:20:39:23:01"; statePath = "/pikachu/data/copyparty"; address = "10.23.20.126"; reverseProxy = { enable = true; route = { domain = "files.alexion.dev"; port = 3923; }; trustedSources = [ "${registry.address.${config.networking.hostName}."reverse-proxy"}/32" ]; }; volumes = { "/" = { hostPath = "/pikachu/data/copyparty/root"; path = "/srv"; access.r = [ "alexion" ]; readOnly = true; }; "/inbox" = { hostPath = "/pikachu/__inbox"; path = "/pikachu/__inbox"; access.A = [ "alexion" ]; flags = [ "d2d" "d2t" "dthumb" ]; }; "/media" = { hostPath = "/pikachu/media"; path = "/pikachu/media"; access.A = [ "alexion" ]; flags = [ "d2d" "d2t" "dthumb" ]; }; "/opds" = { hostPath = "/pikachu/data/opds"; path = "/pikachu/data/opds"; access.r = [ "alexion" ]; readOnly = true; flags = [ "opds" ]; }; }; }; environment.systemPackages = with pkgs; [ pciutils smartmontools usbutils ]; }