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}";
							 | 
						||
| 
								 | 
							
								      };
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								}
							 |