forked from jan-leila/nix-config
		
	feat: created env config for panoramax
This commit is contained in:
		
							parent
							
								
									52801b4bb7
								
							
						
					
					
						commit
						84b204f8b1
					
				
					 1 changed files with 177 additions and 14 deletions
				
			
		|  | @ -4,8 +4,28 @@ | ||||||
|   pkgs, |   pkgs, | ||||||
|   osConfig, |   osConfig, | ||||||
|   ... |   ... | ||||||
| }: let | }: | ||||||
|   cfg = config.services.panoramax; | with lib; let | ||||||
|  |   envContent = '' | ||||||
|  |     # Panoramax Configuration | ||||||
|  |     FLASK_APP=geovisio | ||||||
|  |     ${optionalString (config.services.panoramax.database.url != null) "DB_URL=${config.services.panoramax.database.url}"} | ||||||
|  |     ${optionalString (config.services.panoramax.database.url == null && config.services.panoramax.database.port != null) "DB_PORT=${toString config.services.panoramax.database.port}"} | ||||||
|  |     ${optionalString (config.services.panoramax.database.url == null && config.services.panoramax.database.host != null) "DB_HOST=${config.services.panoramax.database.host}"} | ||||||
|  |     ${optionalString (config.services.panoramax.database.url == null && config.services.panoramax.database.username != null) "DB_USERNAME=${config.services.panoramax.database.username}"} | ||||||
|  |     ${optionalString (config.services.panoramax.database.url == null && config.services.panoramax.database.password != null) "DB_PASSWORD=${config.services.panoramax.database.password}"} | ||||||
|  |     ${optionalString (config.services.panoramax.database.url == null && config.services.panoramax.database.name != null) "DB_NAME=${config.services.panoramax.database.name}"} | ||||||
|  |     ${optionalString (config.services.panoramax.storage.fsUrl != null) "FS_URL=${config.services.panoramax.storage.fsUrl}"} | ||||||
|  |     ${optionalString (config.services.panoramax.infrastructure.nbProxies != null) "INFRA_NB_PROXIES=${toString config.services.panoramax.infrastructure.nbProxies}"} | ||||||
|  |     ${optionalString (config.services.panoramax.flask.secretKey != null) "FLASK_SECRET_KEY=${config.services.panoramax.flask.secretKey}"} | ||||||
|  |     ${optionalString (config.services.panoramax.flask.sessionCookieDomain != null) "FLASK_SESSION_COOKIE_DOMAIN=${config.services.panoramax.flask.sessionCookieDomain}"} | ||||||
|  |     ${optionalString (config.services.panoramax.api.pictures.licenseSpdxId != null) "API_PICTURES_LICENSE_SPDX_ID=${config.services.panoramax.api.pictures.licenseSpdxId}"} | ||||||
|  |     ${optionalString (config.services.panoramax.api.pictures.licenseUrl != null) "API_PICTURES_LICENSE_URL=${config.services.panoramax.api.pictures.licenseUrl}"} | ||||||
|  |     ${optionalString (config.services.panoramax.port != null) "PORT=${toString config.services.panoramax.port}"} | ||||||
|  |     ${concatStringsSep "\n" (mapAttrsToList (name: value: "${name}=${value}") config.services.panoramax.extraEnvironment)} | ||||||
|  |   ''; | ||||||
|  | 
 | ||||||
|  |   envFile = pkgs.writeText "panoramax.env" envContent; | ||||||
| in { | in { | ||||||
|   options.services.panoramax = { |   options.services.panoramax = { | ||||||
|     enable = lib.mkEnableOption "panoramax"; |     enable = lib.mkEnableOption "panoramax"; | ||||||
|  | @ -16,23 +36,166 @@ in { | ||||||
|       description = "The panoramax package to use"; |       description = "The panoramax package to use"; | ||||||
|     }; |     }; | ||||||
| 
 | 
 | ||||||
|     # TODO: create configs |     # TODO: sgblur config | ||||||
|     # TODO: auto config db |     port = mkOption { | ||||||
|     # config = { |       type = types.nullOr types.port; | ||||||
|     #   DB_PORT = lib.mkOption {}; |       default = 5000; | ||||||
|     #   DB_HOST = lib.mkOption {}; |       description = "Port for the Panoramax service"; | ||||||
|     #   DB_USERNAME = lib.mkOption {}; |     }; | ||||||
|     #   DB_PASSWORD = lib.mkOption {}; | 
 | ||||||
|     #   DB_NAME = lib.mkOption {}; |     host = mkOption { | ||||||
|     #   FS_URL = lib.mkOption {}; |       type = types.str; | ||||||
|     # }; |       default = "127.0.0.1"; | ||||||
|  |       description = "Host to bind the Panoramax service to"; | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|  |     urlScheme = mkOption { | ||||||
|  |       type = types.enum ["http" "https"]; | ||||||
|  |       default = "https"; | ||||||
|  |       description = "URL scheme for the application"; | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|  |     database = { | ||||||
|  |       url = mkOption { | ||||||
|  |         type = types.nullOr types.str; | ||||||
|  |         default = null; | ||||||
|  |         description = '' | ||||||
|  |           Complete database URL connection string (e.g., "postgresql://user:password@host:port/dbname"). | ||||||
|  |           If provided, individual database options (host, port, username, password, name) are ignored. | ||||||
|  |         ''; | ||||||
|  |       }; | ||||||
|  | 
 | ||||||
|  |       port = mkOption { | ||||||
|  |         type = types.nullOr types.port; | ||||||
|  |         default = 5432; | ||||||
|  |         description = "Database port (ignored if database.url is set)"; | ||||||
|  |       }; | ||||||
|  | 
 | ||||||
|  |       host = mkOption { | ||||||
|  |         type = types.nullOr types.str; | ||||||
|  |         default = "localhost"; | ||||||
|  |         description = "Database host (ignored if database.url is set)"; | ||||||
|  |       }; | ||||||
|  | 
 | ||||||
|  |       username = mkOption { | ||||||
|  |         type = types.nullOr types.str; | ||||||
|  |         default = "panoramax"; | ||||||
|  |         description = "Database username (ignored if database.url is set)"; | ||||||
|  |       }; | ||||||
|  | 
 | ||||||
|  |       password = mkOption { | ||||||
|  |         type = types.nullOr types.str; | ||||||
|  |         default = null; | ||||||
|  |         description = "Database password (ignored if database.url is set)"; | ||||||
|  |       }; | ||||||
|  | 
 | ||||||
|  |       name = mkOption { | ||||||
|  |         type = types.nullOr types.str; | ||||||
|  |         default = "panoramax"; | ||||||
|  |         description = "Database name (ignored if database.url is set)"; | ||||||
|  |       }; | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|  |     storage = { | ||||||
|  |       fsUrl = mkOption { | ||||||
|  |         type = types.nullOr types.str; | ||||||
|  |         default = "/var/lib/panoramax/storage"; | ||||||
|  |         description = "File system URL for storage"; | ||||||
|  |       }; | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|  |     infrastructure = { | ||||||
|  |       nbProxies = mkOption { | ||||||
|  |         type = types.nullOr types.int; | ||||||
|  |         default = 1; | ||||||
|  |         description = "Number of proxies in front of the application"; | ||||||
|  |       }; | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|  |     flask = { | ||||||
|  |       secretKey = mkOption { | ||||||
|  |         type = types.nullOr types.str; | ||||||
|  |         default = null; | ||||||
|  |         description = "Flask secret key for session security"; | ||||||
|  |       }; | ||||||
|  | 
 | ||||||
|  |       sessionCookieDomain = mkOption { | ||||||
|  |         type = types.nullOr types.str; | ||||||
|  |         default = null; | ||||||
|  |         description = "Flask session cookie domain"; | ||||||
|  |       }; | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|  |     api = { | ||||||
|  |       pictures = { | ||||||
|  |         licenseSpdxId = mkOption { | ||||||
|  |           type = types.nullOr types.str; | ||||||
|  |           default = null; | ||||||
|  |           description = "SPDX license identifier for API pictures"; | ||||||
|  |         }; | ||||||
|  | 
 | ||||||
|  |         licenseUrl = mkOption { | ||||||
|  |           type = types.nullOr types.str; | ||||||
|  |           default = null; | ||||||
|  |           description = "License URL for API pictures"; | ||||||
|  |         }; | ||||||
|  |       }; | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|  |     extraEnvironment = mkOption { | ||||||
|  |       type = types.attrsOf types.str; | ||||||
|  |       default = {}; | ||||||
|  |       description = "Additional environment variables"; | ||||||
|  |       example = { | ||||||
|  |         CUSTOM_SETTING = "value"; | ||||||
|  |         DEBUG = "true"; | ||||||
|  |       }; | ||||||
|  |     }; | ||||||
|   }; |   }; | ||||||
| 
 | 
 | ||||||
|   config = lib.mkIf cfg.enable ( |   config = lib.mkIf config.services.panoramax.enable ( | ||||||
|     lib.mkMerge [ |     lib.mkMerge [ | ||||||
|       { |       { | ||||||
|         # TODO: configure options for the package |         environment.systemPackages = with pkgs; [ | ||||||
|  |           config.services.panoramax.package | ||||||
|  |           python3Packages.waitress | ||||||
|  |         ]; | ||||||
|  | 
 | ||||||
|  |         systemd.services.panoramax = { | ||||||
|  |           description = "Panoramax Service"; | ||||||
|  |           after = ["network.target"]; | ||||||
|  |           wantedBy = ["multi-user.target"]; | ||||||
|  |           serviceConfig = { | ||||||
|  |             ExecStart = "${pkgs.python3Packages.waitress}/bin/waitress-serve --env-file=${envFile} --host=${config.services.panoramax.host} --port=${toString config.services.panoramax.port} --url-scheme=${config.services.panoramax.urlScheme} --call geovisio:create_app"; | ||||||
|  |             Restart = "always"; | ||||||
|  |             User = "panoramax"; | ||||||
|  |             Group = "panoramax"; | ||||||
|  |             WorkingDirectory = "/var/lib/panoramax"; | ||||||
|  |             Environment = "PYTHONPATH=${config.services.panoramax.package}/lib/python3.11/site-packages"; | ||||||
|  |           }; | ||||||
|  |         }; | ||||||
|  | 
 | ||||||
|  |         users.users.panoramax = { | ||||||
|  |           isSystemUser = true; | ||||||
|  |           group = "panoramax"; | ||||||
|  |           home = "/var/lib/panoramax"; | ||||||
|  |           createHome = true; | ||||||
|  |         }; | ||||||
|  | 
 | ||||||
|  |         users.groups.panoramax = {}; | ||||||
|  | 
 | ||||||
|  |         systemd.tmpfiles.rules = [ | ||||||
|  |           "d /var/lib/panoramax 0755 panoramax panoramax -" | ||||||
|  |           "d ${config.services.panoramax.storage.fsUrl} 0755 panoramax panoramax -" | ||||||
|  |         ]; | ||||||
|  | 
 | ||||||
|  |         # TODO: auto config db | ||||||
|       } |       } | ||||||
|  |       ( | ||||||
|  |         lib.mkIf config.host.reverse_proxy.enable { | ||||||
|  |           # TODO: configure reverse proxy here | ||||||
|  |         } | ||||||
|  |       ) | ||||||
|       ( |       ( | ||||||
|         lib.mkIf config.services.fail2ban { |         lib.mkIf config.services.fail2ban { | ||||||
|           # TODO: configure options for fail2ban |           # TODO: configure options for fail2ban | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue