122 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
		
		
			
		
	
	
			122 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
|   | { config, lib, pkgs, ... }: | ||
|  | 
 | ||
|  | with lib; | ||
|  | 
 | ||
|  | let | ||
|  |   cfg = config.services.syncthing.relay; | ||
|  | 
 | ||
|  |   dataDirectory = "/var/lib/syncthing-relay"; | ||
|  | 
 | ||
|  |   relayOptions = | ||
|  |     [ | ||
|  |       "--keys=${dataDirectory}" | ||
|  |       "--listen=${cfg.listenAddress}:${toString cfg.port}" | ||
|  |       "--status-srv=${cfg.statusListenAddress}:${toString cfg.statusPort}" | ||
|  |       "--provided-by=${escapeShellArg cfg.providedBy}" | ||
|  |     ] | ||
|  |     ++ optional (cfg.pools != null) "--pools=${escapeShellArg (concatStringsSep "," cfg.pools)}" | ||
|  |     ++ optional (cfg.globalRateBps != null) "--global-rate=${toString cfg.globalRateBps}" | ||
|  |     ++ optional (cfg.perSessionRateBps != null) "--per-session-rate=${toString cfg.perSessionRateBps}" | ||
|  |     ++ cfg.extraOptions; | ||
|  | in { | ||
|  |   ###### interface | ||
|  | 
 | ||
|  |   options.services.syncthing.relay = { | ||
|  |     enable = mkEnableOption "Syncthing relay service"; | ||
|  | 
 | ||
|  |     listenAddress = mkOption { | ||
|  |       type = types.str; | ||
|  |       default = ""; | ||
|  |       example = "1.2.3.4"; | ||
|  |       description = ''
 | ||
|  |         Address to listen on for relay traffic. | ||
|  |       '';
 | ||
|  |     }; | ||
|  | 
 | ||
|  |     port = mkOption { | ||
|  |       type = types.port; | ||
|  |       default = 22067; | ||
|  |       description = ''
 | ||
|  |         Port to listen on for relay traffic. This port should be added to | ||
|  |         <literal>networking.firewall.allowedTCPPorts</literal>. | ||
|  |       '';
 | ||
|  |     }; | ||
|  | 
 | ||
|  |     statusListenAddress = mkOption { | ||
|  |       type = types.str; | ||
|  |       default = ""; | ||
|  |       example = "1.2.3.4"; | ||
|  |       description = ''
 | ||
|  |         Address to listen on for serving the relay status API. | ||
|  |       '';
 | ||
|  |     }; | ||
|  | 
 | ||
|  |     statusPort = mkOption { | ||
|  |       type = types.port; | ||
|  |       default = 22070; | ||
|  |       description = ''
 | ||
|  |         Port to listen on for serving the relay status API. This port should be | ||
|  |         added to <literal>networking.firewall.allowedTCPPorts</literal>. | ||
|  |       '';
 | ||
|  |     }; | ||
|  | 
 | ||
|  |     pools = mkOption { | ||
|  |       type = types.nullOr (types.listOf types.str); | ||
|  |       default = null; | ||
|  |       description = ''
 | ||
|  |         Relay pools to join. If null, uses the default global pool. | ||
|  |       '';
 | ||
|  |     }; | ||
|  | 
 | ||
|  |     providedBy = mkOption { | ||
|  |       type = types.str; | ||
|  |       default = ""; | ||
|  |       description = ''
 | ||
|  |         Human-readable description of the provider of the relay (you). | ||
|  |       '';
 | ||
|  |     }; | ||
|  | 
 | ||
|  |     globalRateBps = mkOption { | ||
|  |       type = types.nullOr types.ints.positive; | ||
|  |       default = null; | ||
|  |       description = ''
 | ||
|  |         Global bandwidth rate limit in bytes per second. | ||
|  |       '';
 | ||
|  |     }; | ||
|  | 
 | ||
|  |     perSessionRateBps = mkOption { | ||
|  |       type = types.nullOr types.ints.positive; | ||
|  |       default = null; | ||
|  |       description = ''
 | ||
|  |         Per session bandwidth rate limit in bytes per second. | ||
|  |       '';
 | ||
|  |     }; | ||
|  | 
 | ||
|  |     extraOptions = mkOption { | ||
|  |       type = types.listOf types.str; | ||
|  |       default = []; | ||
|  |       description = ''
 | ||
|  |         Extra command line arguments to pass to strelaysrv. | ||
|  |       '';
 | ||
|  |     }; | ||
|  |   }; | ||
|  | 
 | ||
|  |   ###### implementation | ||
|  | 
 | ||
|  |   config = mkIf cfg.enable { | ||
|  |     systemd.services.syncthing-relay = { | ||
|  |       description = "Syncthing relay service"; | ||
|  |       wantedBy = [ "multi-user.target" ]; | ||
|  |       after = [ "network.target" ]; | ||
|  | 
 | ||
|  |       serviceConfig = { | ||
|  |         DynamicUser = true; | ||
|  |         StateDirectory = baseNameOf dataDirectory; | ||
|  | 
 | ||
|  |         Restart = "on-failure"; | ||
|  |         ExecStart = "${pkgs.syncthing-relay}/bin/strelaysrv ${concatStringsSep " " relayOptions}"; | ||
|  |       }; | ||
|  |     }; | ||
|  |   }; | ||
|  | } |