forked from jan-leila/nix-config
		
	created nfs exports
This commit is contained in:
		
							parent
							
								
									5eea6cdb04
								
							
						
					
					
						commit
						835945c925
					
				
					 6 changed files with 176 additions and 3 deletions
				
			
		
							
								
								
									
										90
									
								
								modules/nixos-modules/server/network_storage/default.nix
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										90
									
								
								modules/nixos-modules/server/network_storage/default.nix
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,90 @@ | |||
| { | ||||
|   config, | ||||
|   lib, | ||||
|   ... | ||||
| }: let | ||||
|   export_directory = config.host.network_storage.export_directory; | ||||
| in { | ||||
|   imports = [ | ||||
|     ./nfs.nix | ||||
|   ]; | ||||
| 
 | ||||
|   options = { | ||||
|     host.network_storage = { | ||||
|       enable = lib.mkEnableOption "is this machine going to export network storage"; | ||||
|       export_directory = lib.mkOption { | ||||
|         type = lib.types.path; | ||||
|         description = "what are exports going to be stored in"; | ||||
|         default = "/exports"; | ||||
|       }; | ||||
|       directories = lib.mkOption { | ||||
|         type = lib.types.listOf (lib.types.submodule ({config, ...}: { | ||||
|           options = { | ||||
|             folder = lib.mkOption { | ||||
|               type = lib.types.string; | ||||
|               description = "what is the name of this export directory"; | ||||
|             }; | ||||
|             bind = lib.mkOption { | ||||
|               type = lib.types.nullOr lib.types.path; | ||||
|               description = "is this directory bound to anywhere"; | ||||
|               default = null; | ||||
|             }; | ||||
|             user = lib.mkOption { | ||||
|               type = lib.types.string; | ||||
|               description = "what user owns this directory"; | ||||
|               default = "nouser"; | ||||
|             }; | ||||
|             group = lib.mkOption { | ||||
|               type = lib.types.string; | ||||
|               description = "what group owns this directory"; | ||||
|               default = "nogroup"; | ||||
|             }; | ||||
|             _directory = lib.mkOption { | ||||
|               internal = true; | ||||
|               readOnly = true; | ||||
|               type = lib.types.path; | ||||
|               default = "${export_directory}/${config.folder}"; | ||||
|             }; | ||||
|           }; | ||||
|         })); | ||||
|         description = "list of directory names to export"; | ||||
|       }; | ||||
|     }; | ||||
|   }; | ||||
| 
 | ||||
|   config = lib.mkIf config.host.network_storage.enable (lib.mkMerge [ | ||||
|     { | ||||
|       # create any folders that we need to have for our exports | ||||
|       systemd.tmpfiles.rules = | ||||
|         [ | ||||
|           "d ${config.host.network_storage.export_directory} 2775 root root -" | ||||
|         ] | ||||
|         ++ ( | ||||
|           builtins.map ( | ||||
|             directory: "d ${directory._directory} 2775 ${directory.user} ${directory.group}" | ||||
|           ) | ||||
|           config.host.network_storage.directories | ||||
|         ); | ||||
| 
 | ||||
|       # set up any bind mounts that we need for our exports | ||||
|       fileSystems = builtins.listToAttrs ( | ||||
|         builtins.map (directory: | ||||
|           lib.attrsets.nameValuePair directory._directory { | ||||
|             device = directory.bind; | ||||
|             options = ["bind"]; | ||||
|           }) ( | ||||
|           builtins.filter (directory: directory.bind != null) config.host.network_storage.directories | ||||
|         ) | ||||
|       ); | ||||
|     } | ||||
|     (lib.mkIf config.host.impermanence.enable { | ||||
|       environment.persistence."/persist/system/root" = { | ||||
|         enable = true; | ||||
|         hideMounts = true; | ||||
|         directories = [ | ||||
|           config.host.network_storage.export_directory | ||||
|         ]; | ||||
|       }; | ||||
|     }) | ||||
|   ]); | ||||
| } | ||||
							
								
								
									
										50
									
								
								modules/nixos-modules/server/network_storage/nfs.nix
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								modules/nixos-modules/server/network_storage/nfs.nix
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,50 @@ | |||
| { | ||||
|   config, | ||||
|   lib, | ||||
|   ... | ||||
| }: { | ||||
|   options = { | ||||
|     host.network_storage.nfs = { | ||||
|       enable = lib.mkEnableOption "is this server going to export network storage as nfs shares"; | ||||
|       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.server = { | ||||
|           enable = true; | ||||
|           exports = lib.strings.concatLines ( | ||||
|             builtins.map ( | ||||
|               directory: "${directory._directory} 192.168.1.0/22(rw,sync,no_subtree_check,crossmnt)" | ||||
|             ) | ||||
|             ( | ||||
|               builtins.filter ( | ||||
|                 directory: lib.lists.any (target: target == directory.folder) config.host.network_storage.nfs.directories | ||||
|               ) | ||||
|               config.host.network_storage.directories | ||||
|             ) | ||||
|           ); | ||||
|         }; | ||||
|       } | ||||
|     ) | ||||
|   ]; | ||||
| } | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue