104 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
			
		
		
	
	
			104 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
| { config, pkgs, lib, ... }:
 | |
| 
 | |
| let
 | |
|   inherit (lib) mkDefault mkEnableOption mkForce mkIf mkOption mkPackageOption generators types;
 | |
| 
 | |
|   cfg = config.services.snappymail;
 | |
|   maxUploadSize = "256M";
 | |
| in {
 | |
|   options.services.snappymail = {
 | |
|     enable = mkEnableOption "Snappymail";
 | |
| 
 | |
|     package = mkPackageOption pkgs "snappymail" { };
 | |
| 
 | |
|     dataDir = mkOption {
 | |
|       type = types.str;
 | |
|       default = "/var/lib/snappymail";
 | |
|       description = "State directory for snappymail";
 | |
|     };
 | |
| 
 | |
|     hostname = mkOption {
 | |
|       type = types.nullOr types.str;
 | |
|       default = null;
 | |
|       example = "mail.example.com";
 | |
|       description = "Enable nginx with this hostname, null disables nginx";
 | |
|     };
 | |
| 
 | |
|     user = mkOption {
 | |
|       type = types.str;
 | |
|       default = "snappymail";
 | |
|       description = "System user under which snappymail runs";
 | |
|     };
 | |
| 
 | |
|     group = mkOption {
 | |
|       type = types.str;
 | |
|       default = "snappymail";
 | |
|       description = "System group under which snappymail runs";
 | |
|     };
 | |
|   };
 | |
| 
 | |
|   config = mkIf cfg.enable {
 | |
|     users.users = mkIf (cfg.user == "snappymail") {
 | |
|       snappymail = {
 | |
|         description = "Snappymail service";
 | |
|         group = cfg.group;
 | |
|         home = cfg.dataDir;
 | |
|         isSystemUser = true;
 | |
|       };
 | |
|     };
 | |
| 
 | |
|     users.groups = mkIf (cfg.group == "snappymail") {
 | |
|       snappymail = {};
 | |
|     };
 | |
| 
 | |
|     services.phpfpm.pools.snappymail = {
 | |
|       user = cfg.user;
 | |
|       group = cfg.group;
 | |
|       phpOptions = generators.toKeyValue {} {
 | |
|         upload_max_filesize = maxUploadSize;
 | |
|         post_max_size = maxUploadSize;
 | |
|         memory_limit = maxUploadSize;
 | |
|       };
 | |
| 
 | |
|       settings = {
 | |
|         "listen.owner" = config.services.nginx.user;
 | |
|         "listen.group" = config.services.nginx.group;
 | |
|         "pm" = "ondemand";
 | |
|         "pm.max_children" = 32;
 | |
|         "pm.process_idle_timeout" = "10s";
 | |
|         "pm.max_requests" = 500;
 | |
|       };
 | |
|     };
 | |
| 
 | |
|     services.nginx = mkIf (cfg.hostname != null) {
 | |
|       virtualHosts."${cfg.hostname}" = {
 | |
|         locations."/".extraConfig = ''
 | |
|           index index.php;
 | |
|           autoindex on;
 | |
|           autoindex_exact_size off;
 | |
|           autoindex_localtime on;
 | |
|         '';
 | |
|         locations."^~ /data".extraConfig = ''
 | |
|           deny all;
 | |
|         '';
 | |
|         locations."~ \\.php$".extraConfig = ''
 | |
|           include ${config.services.nginx.package}/conf/fastcgi_params;
 | |
| 
 | |
|           fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
 | |
|           fastcgi_pass unix:${config.services.phpfpm.pools.snappymail.socket};
 | |
|         '';
 | |
|         extraConfig = ''
 | |
|           client_max_body_size ${maxUploadSize};
 | |
|         '';
 | |
| 
 | |
|         root = if (cfg.package == pkgs.snappymail) then
 | |
|           pkgs.snappymail.override {
 | |
|             dataPath = cfg.dataDir;
 | |
|           }
 | |
|         else cfg.package;
 | |
|       };
 | |
|     };
 | |
|   };
 | |
| }
 | |
| 
 |