Merge pull request #227990 from Mic92/mediawiki-webserver

nixos/mediawiki: make apache2 optional

Changed files
+113 -32
nixos
modules
services
web-apps
tests
+91 -30
nixos/modules/services/web-apps/mediawiki.nix
···
cfg = config.services.mediawiki;
fpm = config.services.phpfpm.pools.mediawiki;
user = "mediawiki";
-
group = config.services.httpd.group;
+
group = if cfg.webserver == "apache" then "apache" else "mediawiki";
+
cacheDir = "/var/cache/mediawiki";
stateDir = "/var/lib/mediawiki";
···
$wgScriptPath = "";
## The protocol and server name to use in fully-qualified URLs
-
$wgServer = "${if cfg.virtualHost.addSSL || cfg.virtualHost.forceSSL || cfg.virtualHost.onlySSL then "https" else "http"}://${cfg.virtualHost.hostName}";
+
$wgServer = "${cfg.url}";
## The URL path to static resources (images, scripts, etc.)
$wgResourceBasePath = $wgScriptPath;
···
$wgEnableEmail = true;
$wgEnableUserEmail = true; # UPO
-
$wgEmergencyContact = "${if cfg.virtualHost.adminAddr != null then cfg.virtualHost.adminAddr else config.services.httpd.adminAddr}";
-
$wgPasswordSender = $wgEmergencyContact;
+
$wgPasswordSender = "${cfg.passwordSender}";
$wgEnotifUserTalk = false; # UPO
$wgEnotifWatchlist = false; # UPO
···
description = lib.mdDoc "Which MediaWiki package to use.";
};
+
finalPackage = mkOption {
+
type = types.package;
+
readOnly = true;
+
default = pkg;
+
defaultText = literalExpression "pkg";
+
description = lib.mdDoc ''
+
The final package used by the module. This is the package that will have extensions and skins installed.
+
'';
+
};
+
name = mkOption {
type = types.str;
default = "MediaWiki";
···
description = lib.mdDoc "Name of the wiki.";
};
+
url = mkOption {
+
type = types.str;
+
default = if cfg.webserver == "apache" then
+
"${if cfg.httpd.virtualHost.addSSL || cfg.httpd.virtualHost.forceSSL || cfg.httpd.virtualHost.onlySSL then "https" else "http"}://${cfg.httpd.virtualHost.hostName}"
+
else
+
"http://localhost";
+
defaultText = literalExpression ''
+
if cfg.webserver == "apache" then
+
"''${if cfg.httpd.virtualHost.addSSL || cfg.httpd.virtualHost.forceSSL || cfg.httpd.virtualHost.onlySSL then "https" else "http"}://''${cfg.httpd.virtualHost.hostName}"
+
else
+
"http://localhost";
+
'';
+
example = "https://wiki.example.org";
+
description = lib.mdDoc "URL of the wiki.";
+
};
+
uploadsDir = mkOption {
type = types.nullOr types.path;
default = "${stateDir}/uploads";
···
example = "/run/keys/mediawiki-password";
};
+
passwordSender = mkOption {
+
type = types.str;
+
default =
+
if cfg.webserver == "apache" then
+
if cfg.httpd.virtualHost.adminAddr != null then
+
cfg.httpd.virtualHost.adminAddr
+
else
+
config.services.httpd.adminAddr else "root@localhost";
+
defaultText = literalExpression ''
+
if cfg.webserver == "apache" then
+
if cfg.httpd.virtualHost.adminAddr != null then
+
cfg.httpd.virtualHost.adminAddr
+
else
+
config.services.httpd.adminAddr else "root@localhost"
+
'';
+
description = lib.mdDoc "Contact address for password reset.";
+
};
+
skins = mkOption {
default = {};
type = types.attrsOf types.path;
···
'';
};
+
webserver = mkOption {
+
type = types.enum [ "apache" "none" ];
+
default = "apache";
+
description = lib.mdDoc "Webserver to use.";
+
};
+
database = {
type = mkOption {
type = types.enum [ "mysql" "postgres" "sqlite" "mssql" "oracle" ];
···
};
};
-
virtualHost = mkOption {
+
httpd.virtualHost = mkOption {
type = types.submodule (import ../web-servers/apache-httpd/vhost-options.nix);
example = literalExpression ''
{
···
};
};
+
imports = [
+
(lib.mkRenamedOptionModule [ "services" "mediawiki" "virtualHost" ] [ "services" "mediawiki" "httpd" "virtualHost" ])
+
];
+
# implementation
config = mkIf cfg.enable {
···
services.phpfpm.pools.mediawiki = {
inherit user group;
phpEnv.MEDIAWIKI_CONFIG = "${mediawikiConfig}";
-
settings = {
+
settings = (if (cfg.webserver == "apache") then {
"listen.owner" = config.services.httpd.user;
"listen.group" = config.services.httpd.group;
-
} // cfg.poolConfig;
+
} else {
+
"listen.owner" = user;
+
"listen.group" = group;
+
}) // cfg.poolConfig;
};
-
services.httpd = {
+
services.httpd = lib.mkIf (cfg.webserver == "apache") {
enable = true;
extraModules = [ "proxy_fcgi" ];
-
virtualHosts.${cfg.virtualHost.hostName} = mkMerge [ cfg.virtualHost {
-
documentRoot = mkForce "${pkg}/share/mediawiki";
-
extraConfig = ''
-
<Directory "${pkg}/share/mediawiki">
-
<FilesMatch "\.php$">
-
<If "-f %{REQUEST_FILENAME}">
-
SetHandler "proxy:unix:${fpm.socket}|fcgi://localhost/"
-
</If>
-
</FilesMatch>
+
virtualHosts.${cfg.httpd.virtualHost.hostName} = mkMerge [
+
cfg.httpd.virtualHost
+
{
+
documentRoot = mkForce "${pkg}/share/mediawiki";
+
extraConfig = ''
+
<Directory "${pkg}/share/mediawiki">
+
<FilesMatch "\.php$">
+
<If "-f %{REQUEST_FILENAME}">
+
SetHandler "proxy:unix:${fpm.socket}|fcgi://localhost/"
+
</If>
+
</FilesMatch>
-
Require all granted
-
DirectoryIndex index.php
-
AllowOverride All
-
</Directory>
-
'' + optionalString (cfg.uploadsDir != null) ''
-
Alias "/images" "${cfg.uploadsDir}"
-
<Directory "${cfg.uploadsDir}">
-
Require all granted
-
</Directory>
-
'';
-
} ];
+
Require all granted
+
DirectoryIndex index.php
+
AllowOverride All
+
</Directory>
+
'' + optionalString (cfg.uploadsDir != null) ''
+
Alias "/images" "${cfg.uploadsDir}"
+
<Directory "${cfg.uploadsDir}">
+
Require all granted
+
</Directory>
+
'';
+
}
+
];
};
systemd.tmpfiles.rules = [
···
};
};
-
systemd.services.httpd.after = optional (cfg.database.createLocally && cfg.database.type == "mysql") "mysql.service"
-
++ optional (cfg.database.createLocally && cfg.database.type == "postgres") "postgresql.service";
+
systemd.services.httpd.after = optional (cfg.webserver == "apache" && cfg.database.createLocally && cfg.database.type == "mysql") "mysql.service"
+
++ optional (cfg.webserver == "apache" && cfg.database.createLocally && cfg.database.type == "postgres") "postgresql.service";
users.users.${user} = {
group = group;
isSystemUser = true;
};
+
users.groups.${group} = {};
environment.systemPackages = [ mediawikiScripts ];
};
+22 -2
nixos/tests/mediawiki.nix
···
let
shared = {
services.mediawiki.enable = true;
-
services.mediawiki.virtualHost.hostName = "localhost";
-
services.mediawiki.virtualHost.adminAddr = "root@example.com";
+
services.mediawiki.httpd.virtualHost.hostName = "localhost";
+
services.mediawiki.httpd.virtualHost.adminAddr = "root@example.com";
services.mediawiki.passwordFile = pkgs.writeText "password" "correcthorsebatterystaple";
services.mediawiki.extensions = {
Matomo = pkgs.fetchzip {
···
page = machine.succeed("curl -fL http://localhost/")
assert "MediaWiki has been installed" in page
+
'';
+
};
+
+
nohttpd = testLib.makeTest {
+
name = "mediawiki-nohttpd";
+
nodes.machine = {
+
services.mediawiki.webserver = "none";
+
};
+
testScript = { nodes, ... }: ''
+
start_all()
+
machine.wait_for_unit("phpfpm-mediawiki.service")
+
env = (
+
"SCRIPT_NAME=/index.php",
+
"SCRIPT_FILENAME=${nodes.machine.services.mediawiki.finalPackage}/share/mediawiki/index.php",
+
"REMOTE_ADDR=127.0.0.1",
+
'QUERY_STRING=title=Main_Page',
+
"REQUEST_METHOD=GET",
+
);
+
page = machine.succeed(f"{' '.join(env)} ${pkgs.fcgi}/bin/cgi-fcgi -bind -connect ${nodes.machine.services.phpfpm.pools.mediawiki.socket}")
+
assert "MediaWiki has been installed" in page, f"no 'MediaWiki has been installed' in:\n{page}"
'';
};
}