{ 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 = "URL of instance. Must have trailing slash.";
};
maxUploadSizeMegabytes = mkOption {
type = types.int;
default = 0;
description = "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
''
Timeout for reading client request bodies and headers. Refer to
and
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 = "Extra configuration for the nginx virtual host of Jirafeau.";
};
package = mkOption {
type = types.package;
default = pkgs.jirafeau;
defaultText = literalExpression "pkgs.jirafeau";
description = "Jirafeau package to use";
};
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 = ''
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 ${pkgs.nginx}/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;
}