Unverified Commit 97f1e5df authored by wrvsrx's avatar wrvsrx
Browse files

nixos/rustdesk-server: suppport enable rustdesk's signal server and relay...

nixos/rustdesk-server: suppport enable rustdesk's signal server and relay server seperately and rename an option

In theory, we can use one server as rustdesk's signal server and another
one as rustdesk's relay server. This PR allows such behavior.

This PR also renames `relayIP` to `relayHosts` since we can specify dns
name or ip as a relay server.
parent bf5e3e7f
Loading
Loading
Loading
Loading
+59 −26
Original line number Diff line number Diff line
@@ -3,6 +3,12 @@ let
  TCPPorts = [21115 21116 21117 21118 21119];
  UDPPorts = [21116];
in {
  imports = [
    (lib.mkRemovedOptionModule [ "services" "rustdesk-server" "relayIP" ] "This option has been replaced by services.rustdesk-server.signal.relayHosts")
    (lib.mkRenamedOptionModule [ "services" "rustdesk-server" "extraRelayArgs" ] [ "services" "rustdesk-server" "relay" "extraArgs" ])
    (lib.mkRenamedOptionModule [ "services" "rustdesk-server" "extraSignalArgs" ] [ "services" "rustdesk-server" "signal" "extraArgs" ])
  ];

  options.services.rustdesk-server = with lib; with types; {
    enable = mkEnableOption "RustDesk, a remote access and remote control software, allowing maintenance of computers and other devices";

@@ -18,14 +24,25 @@ in {
      '';
    };

    relayIP = mkOption {
      type = str;
    signal = {
      enable = mkOption {
        type = bool;
        default = true;
        description = ''
          Whether to enable the RustDesk signal server.
        '';
      };

      relayHosts = mkOption {
        type = listOf str;
        default = [];
        # reference: https://rustdesk.com/docs/en/self-host/rustdesk-server-pro/relay/
        description = ''
        The public facing IP of the RustDesk relay.
          The relay server IP addresses or DNS names of the RustDesk relay.
        '';
      };

    extraSignalArgs = mkOption {
      extraArgs = mkOption {
        type = listOf str;
        default = [];
        example = [ "-k" "_" ];
@@ -34,7 +51,17 @@ in {
        '';
      };

    extraRelayArgs = mkOption {
    };

    relay = {
      enable = mkOption {
        type = bool;
        default = true;
        description = ''
          Whether to enable the RustDesk relay server.
        '';
      };
      extraArgs = mkOption {
        type = listOf str;
        default = [];
        example = [ "-k" "_" ];
@@ -44,6 +71,8 @@ in {
      };
    };

  };

  config = let
    cfg = config.services.rustdesk-server;
    serviceDefaults = {
@@ -96,13 +125,17 @@ in {
      wantedBy = [ "multi-user.target" ];
    };

    systemd.services.rustdesk-signal = lib.mkMerge [ serviceDefaults {
      serviceConfig.ExecStart = "${cfg.package}/bin/hbbs -r ${cfg.relayIP} ${lib.escapeShellArgs cfg.extraSignalArgs}";
    } ];
    systemd.services.rustdesk-signal =
      let
        relayArg = builtins.concatStringsSep ":" cfg.signal.relayHosts;
      in
        lib.mkIf cfg.signal.enable (lib.mkMerge [ serviceDefaults {
          serviceConfig.ExecStart = "${cfg.package}/bin/hbbs --relay-servers ${relayArg} ${lib.escapeShellArgs cfg.signal.extraArgs}";
        } ]);

    systemd.services.rustdesk-relay = lib.mkMerge [ serviceDefaults {
      serviceConfig.ExecStart = "${cfg.package}/bin/hbbr ${lib.escapeShellArgs cfg.extraRelayArgs}";
    } ];
    systemd.services.rustdesk-relay = lib.mkIf cfg.relay.enable (lib.mkMerge [ serviceDefaults {
      serviceConfig.ExecStart = "${cfg.package}/bin/hbbr ${lib.escapeShellArgs cfg.relay.extraArgs}";
    } ]);
  };

  meta.maintainers = with lib.maintainers; [ ppom ];