nixos/jirefeau: add `services.jirafeau` module

Signed-off-by: David Wood <david.wood@codeplay.com>
gstqt5
David Wood 2020-02-06 16:00:19 +00:00 committed by Jon
parent 11beaa4251
commit 60a3d9dd6b
4 changed files with 193 additions and 0 deletions

View File

@ -820,6 +820,7 @@
./services/web-apps/icingaweb2/icingaweb2.nix
./services/web-apps/icingaweb2/module-monitoring.nix
./services/web-apps/ihatemoney
./services/web-apps/jirafeau.nix
./services/web-apps/limesurvey.nix
./services/web-apps/mattermost.nix
./services/web-apps/mediawiki.nix

View File

@ -0,0 +1,169 @@
{ 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" ''
<?php
$cfg['admin_password'] = '${cfg.adminPasswordSha256}';
$cfg['web_root'] = 'http://${withTrailingSlash cfg.hostName}';
$cfg['var_root'] = '${withTrailingSlash cfg.dataDir}';
$cfg['maximal_upload_size'] = ${builtins.toString cfg.maxUploadSizeMegabytes};
$cfg['installation_done'] = true;
${cfg.extraConfig}
'';
in
{
options.services.jirafeau = {
adminPasswordSha256 = mkOption {
type = types.str;
default = "";
description = ''
SHA-256 of the desired administration password. Leave blank/unset for no password.
'';
};
dataDir = mkOption {
type = types.path;
default = "/var/lib/jirafeau/data/";
description = "Location of Jirafeau storage directory.";
};
enable = mkEnableOption "Jirafeau file upload application.";
extraConfig = mkOption {
type = types.lines;
default = "";
example = ''
$cfg['style'] = 'courgette';
$cfg['organisation'] = 'ACME';
'';
description = let
documentationLink =
"https://gitlab.com/mojo42/Jirafeau/-/blob/${cfg.package.version}/lib/config.original.php";
in
''
Jirefeau configuration. Refer to <link xlink:href="${documentationLink}"/> 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
<link xlink:href="${nginxCoreDocumentation}#client_body_timeout"/> and
<link xlink:href="${nginxCoreDocumentation}#client_header_timeout"/> for accepted values.
'';
};
nginxConfig = mkOption {
type = types.submodule
(import ../web-servers/nginx/vhost-options.nix { inherit config lib; });
default = {};
example = {
serverAliases = [ "wiki.\${config.networking.domain}" ];
};
description = "Extra configuration for the nginx virtual host of Jirafeau.";
};
package = mkOption {
type = types.package;
default = pkgs.jirafeau;
defaultText = "pkgs.jirafeau";
description = "Jirafeau package to use";
example = "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 = ''
Options for Jirafeau PHP pool. See documentation on <literal>php-fpm.conf</literal> 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} - -"
];
};
}

View File

@ -137,6 +137,7 @@ in
jackett = handleTest ./jackett.nix {};
jellyfin = handleTest ./jellyfin.nix {};
jenkins = handleTest ./jenkins.nix {};
jirafeau = handleTest ./jirafeau.nix {};
kafka = handleTest ./kafka.nix {};
keepalived = handleTest ./keepalived.nix {};
kerberos = handleTest ./kerberos/default.nix {};

22
nixos/tests/jirafeau.nix Normal file
View File

@ -0,0 +1,22 @@
import ./make-test-python.nix ({ lib, ... }:
with lib;
{
name = "jirafeau";
meta.maintainers = with maintainers; [ davidtwco ];
nodes.machine = { pkgs, ... }: {
services.jirafeau = {
enable = true;
};
};
testScript = ''
machine.start()
machine.wait_for_unit("phpfpm-jirafeau.service")
machine.wait_for_unit("nginx.service")
machine.wait_for_open_port(80)
machine.succeed("curl -sSfL http://localhost/ | grep 'Jirafeau'")
'';
})