{ pkgs, lib, config, ... }: let app = "hackens_orga"; cfg = config.services.django.${app}; assets = cfg.assets; in { options = { services.django.${app} = { enable = lib.mkEnableOption (lib.mdDoc "Enable django ${app}"); settings = lib.mkOption { type = lib.types.submodule { freeformType = with lib.types; attrsOf anything; options = { HACKENS_ORGA_STATIC_ROOT = lib.mkOption { type = lib.types.path; default = builtins.toString assets.static-assets; }; }; }; }; assets = lib.mkOption { type = lib.types.attrsOf lib.types.anything; description = lib.mdDoc "Assets for django"; }; port = lib.mkOption { type = lib.types.port; default = 51666; }; processes = lib.mkOption { type = lib.types.int; default = 2; }; threads = lib.mkOption { type = lib.types.int; default = 2; }; }; }; config = lib.mkIf cfg.enable { systemd.services."django-${app}" = { description = "${app} django service"; wantedBy = [ "multi-user.target" ]; after = [ "network.target" ]; serviceConfig = { User = "django-${app}"; }; script = '' source ${assets.envFile} ${assets.managePy} migrate ${assets.python}/bin/gunicorn ${app}.wsgi \ --pythonpath ${assets.source}/${app} \ -b 127.0.0.1:${toString cfg.port} \ --workers=${toString cfg.processes} \ --threads=${toString cfg.threads} ''; }; users.users."django-${app}" = { isSystemUser = true; group = "django-${app}"; }; users.groups."django-${app}" = {}; }; }