forked from jan-leila/nix-config
		
	
		
			
				
	
	
		
			107 lines
		
	
	
	
		
			3.3 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
			
		
		
	
	
			107 lines
		
	
	
	
		
			3.3 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
| {
 | |
|   config,
 | |
|   lib,
 | |
|   ...
 | |
| }: {
 | |
|   options = {
 | |
|     host.network_storage.nfs = {
 | |
|       enable = lib.mkEnableOption "is this server going to export network storage as nfs shares";
 | |
|       port = lib.mkOption {
 | |
|         type = lib.types.int;
 | |
|         default = 2049;
 | |
|         description = "port that nfs will run on";
 | |
|       };
 | |
|       directories = lib.mkOption {
 | |
|         type = lib.types.listOf (
 | |
|           lib.types.enum (
 | |
|             builtins.map (
 | |
|               directory: directory.folder
 | |
|             )
 | |
|             config.host.network_storage.directories
 | |
|           )
 | |
|         );
 | |
|         description = "list of exported directories to be exported via nfs";
 | |
|       };
 | |
|     };
 | |
|   };
 | |
|   config = lib.mkMerge [
 | |
|     {
 | |
|       assertions = [
 | |
|         {
 | |
|           assertion = !(config.host.network_storage.nfs.enable && !config.host.network_storage.enable);
 | |
|           message = "nfs cant be enabled with network storage disabled";
 | |
|         }
 | |
|       ];
 | |
|     }
 | |
|     (
 | |
|       lib.mkIf (config.host.network_storage.nfs.enable && config.host.network_storage.enable) {
 | |
|         services.nfs = {
 | |
|           settings = {
 | |
|             nfsd = {
 | |
|               threads = 32;
 | |
|               port = config.host.network_storage.nfs.port;
 | |
|             };
 | |
|           };
 | |
|           server = {
 | |
|             enable = true;
 | |
| 
 | |
|             lockdPort = 4001;
 | |
|             mountdPort = 4002;
 | |
|             statdPort = 4000;
 | |
| 
 | |
|             exports = lib.strings.concatLines (
 | |
|               [
 | |
|                 "${config.host.network_storage.export_directory} 100.64.0.0/10(rw,fsid=0,no_subtree_check)"
 | |
|               ]
 | |
|               ++ (
 | |
|                 lib.lists.imap0 (
 | |
|                   i: directory: let
 | |
|                     createOptions = fsid: "(rw,fsid=${toString fsid},nohide,insecure,no_subtree_check)";
 | |
|                     addresses = [
 | |
|                       # loopback
 | |
|                       "127.0.0.1"
 | |
|                       "::1"
 | |
|                       # tailscale
 | |
|                       "100.64.0.0/10"
 | |
|                       "fd7a:115c:a1e0::/48"
 | |
|                     ];
 | |
|                     options = lib.strings.concatStrings (
 | |
|                       lib.strings.intersperse " " (
 | |
|                         lib.lists.imap0 (index: address: "${address}${createOptions (1 + (i * (builtins.length addresses)) + index)}") addresses
 | |
|                       )
 | |
|                     );
 | |
|                   in "${directory._directory} ${options}"
 | |
|                 )
 | |
|                 (
 | |
|                   builtins.filter (
 | |
|                     directory: lib.lists.any (target: target == directory.folder) config.host.network_storage.nfs.directories
 | |
|                   )
 | |
|                   config.host.network_storage.directories
 | |
|                 )
 | |
|               )
 | |
|             );
 | |
|           };
 | |
|         };
 | |
|         networking.firewall = let
 | |
|           ports = [
 | |
|             111
 | |
|             config.host.network_storage.nfs.port
 | |
|             config.services.nfs.server.lockdPort
 | |
|             config.services.nfs.server.mountdPort
 | |
|             config.services.nfs.server.statdPort
 | |
|             20048
 | |
|           ];
 | |
|         in {
 | |
|           # Allow NFS on Tailscale interface
 | |
|           interfaces.${config.services.tailscale.interfaceName} = {
 | |
|             allowedTCPPorts = ports;
 | |
|             allowedUDPPorts = ports;
 | |
|           };
 | |
|           # Allow NFS on local network (assuming default interface)
 | |
|           allowedTCPPorts = ports;
 | |
|           allowedUDPPorts = ports;
 | |
|         };
 | |
|       }
 | |
|     )
 | |
|   ];
 | |
| }
 |