{ config , lib , pkgs , ... }: with pkgs; let cfg = config.services.veilid-server; in { options = with lib; { services.veilid-server = { enable = mkEnableOption "Enable velid-server"; user = mkOption { type = with types; oneOf [ str int ]; default = "veilid"; description = "The user veilid-server will run as."; }; group = mkOption { type = with types; oneOf [ str int ]; default = "veilid"; description = "The group veilid-server will run with."; }; dataDir = mkOption { type = types.path; default = "/var/lib/veilid"; description = "Path for veilid-server state directory."; }; package = mkOption { type = types.package; default = pkgs.veilid; }; openFirewall = mkOption { type = types.bool; default = false; description = "enable veilid-server in the firewall"; }; }; }; config = lib.mkIf cfg.enable { users.groups.${cfg.group} = { }; users.users.${cfg.user} = { inherit (cfg) group; description = "veilid-server user"; isSystemUser = true; home = cfg.dataDir; createHome = true; }; networking.firewall = lib.mkIf cfg.openFirewall { allowedTCPPorts = [ 5150 ]; allowedUDPPorts = [ 5150 ]; }; systemd.services.veilid-server = { enable = true; description = "veilid-server"; wantedBy = [ "network-online.target" ]; after = [ "network-online.target" ]; environment = { HOME = cfg.dataDir; }; serviceConfig = { User = cfg.user; Group = cfg.group; RuntimeDirectory = "veilid"; StateDirectory = "veilid"; StateDirectoryMode = "0700"; CacheDirectory = "veilid"; ExecStart = "${cfg.package}/bin/veilid-server"; }; }; }; }