{ config, lib, pkgs, ... }: with lib; let cfg = config.services.jirafeau; group = config.services.nginx.group; user = config.services.nginx.user; withTrailingSlash = str: if hasSuffix "/" str then str else "${str}/"; localConfig = pkgs.writeText "config.local.php" '' for supported values. ''; }; hostName = mkOption { type = types.str; default = "localhost"; description = lib.mdDoc "URL of instance. Must have trailing slash."; }; maxUploadSizeMegabytes = mkOption { type = types.int; default = 0; description = lib.mdDoc "Maximum upload size of accepted files."; }; maxUploadTimeout = mkOption { type = types.str; default = "30m"; description = let nginxCoreDocumentation = "http://nginx.org/en/docs/http/ngx_http_core_module.html"; in lib.mdDoc '' Timeout for reading client request bodies and headers. Refer to <${nginxCoreDocumentation}#client_body_timeout> and <${nginxCoreDocumentation}#client_header_timeout> for accepted values. ''; }; nginxConfig = mkOption { type = types.submodule (import ../web-servers/nginx/vhost-options.nix { inherit config lib; }); default = {}; example = literalExpression '' { serverAliases = [ "wiki.''${config.networking.domain}" ]; } ''; description = lib.mdDoc "Extra configuration for the nginx virtual host of Jirafeau."; }; package = mkPackageOption pkgs "jirafeau" { }; poolConfig = mkOption { type = with types; attrsOf (oneOf [ str int bool ]); default = { "pm" = "dynamic"; "pm.max_children" = 32; "pm.start_servers" = 2; "pm.min_spare_servers" = 2; "pm.max_spare_servers" = 4; "pm.max_requests" = 500; }; description = lib.mdDoc '' Options for Jirafeau PHP pool. See documentation on `php-fpm.conf` for details on configuration directives. ''; }; }; config = mkIf cfg.enable { services = { nginx = { enable = true; virtualHosts."${cfg.hostName}" = mkMerge [ cfg.nginxConfig { extraConfig = let clientMaxBodySize = if cfg.maxUploadSizeMegabytes == 0 then "0" else "${cfg.maxUploadSizeMegabytes}m"; in '' index index.php; client_max_body_size ${clientMaxBodySize}; client_body_timeout ${cfg.maxUploadTimeout}; client_header_timeout ${cfg.maxUploadTimeout}; ''; locations = { "~ \\.php$".extraConfig = '' include ${config.services.nginx.package}/conf/fastcgi_params; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_index index.php; fastcgi_pass unix:${config.services.phpfpm.pools.jirafeau.socket}; fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; ''; }; root = mkForce "${cfg.package}"; } ]; }; phpfpm.pools.jirafeau = { inherit group user; phpEnv."JIRAFEAU_CONFIG" = "${localConfig}"; settings = { "listen.mode" = "0660"; "listen.owner" = user; "listen.group" = group; } // cfg.poolConfig; }; }; systemd.tmpfiles.rules = [ "d ${cfg.dataDir} 0750 ${user} ${group} - -" "d ${cfg.dataDir}/files/ 0750 ${user} ${group} - -" "d ${cfg.dataDir}/links/ 0750 ${user} ${group} - -" "d ${cfg.dataDir}/async/ 0750 ${user} ${group} - -" ]; }; # uses attributes of the linked package meta.buildDocsInSandbox = false; }