Merge pull request #227990 from Mic92/mediawiki-webserver

nixos/mediawiki: make apache2 optional
This commit is contained in:
Martin Weinelt 2023-05-02 12:39:10 +02:00 committed by GitHub
commit 826418fc35
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 113 additions and 32 deletions

View File

@ -8,7 +8,8 @@ let
cfg = config.services.mediawiki; cfg = config.services.mediawiki;
fpm = config.services.phpfpm.pools.mediawiki; fpm = config.services.phpfpm.pools.mediawiki;
user = "mediawiki"; user = "mediawiki";
group = config.services.httpd.group; group = if cfg.webserver == "apache" then "apache" else "mediawiki";
cacheDir = "/var/cache/mediawiki"; cacheDir = "/var/cache/mediawiki";
stateDir = "/var/lib/mediawiki"; stateDir = "/var/lib/mediawiki";
@ -73,7 +74,7 @@ let
$wgScriptPath = ""; $wgScriptPath = "";
## The protocol and server name to use in fully-qualified URLs ## 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.) ## The URL path to static resources (images, scripts, etc.)
$wgResourceBasePath = $wgScriptPath; $wgResourceBasePath = $wgScriptPath;
@ -87,8 +88,7 @@ let
$wgEnableEmail = true; $wgEnableEmail = true;
$wgEnableUserEmail = true; # UPO $wgEnableUserEmail = true; # UPO
$wgEmergencyContact = "${if cfg.virtualHost.adminAddr != null then cfg.virtualHost.adminAddr else config.services.httpd.adminAddr}"; $wgPasswordSender = "${cfg.passwordSender}";
$wgPasswordSender = $wgEmergencyContact;
$wgEnotifUserTalk = false; # UPO $wgEnotifUserTalk = false; # UPO
$wgEnotifWatchlist = false; # UPO $wgEnotifWatchlist = false; # UPO
@ -190,6 +190,16 @@ in
description = lib.mdDoc "Which MediaWiki package to use."; 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 { name = mkOption {
type = types.str; type = types.str;
default = "MediaWiki"; default = "MediaWiki";
@ -197,6 +207,22 @@ in
description = lib.mdDoc "Name of the wiki."; 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 { uploadsDir = mkOption {
type = types.nullOr types.path; type = types.nullOr types.path;
default = "${stateDir}/uploads"; default = "${stateDir}/uploads";
@ -212,6 +238,24 @@ in
example = "/run/keys/mediawiki-password"; 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 { skins = mkOption {
default = {}; default = {};
type = types.attrsOf types.path; type = types.attrsOf types.path;
@ -241,6 +285,12 @@ in
''; '';
}; };
webserver = mkOption {
type = types.enum [ "apache" "none" ];
default = "apache";
description = lib.mdDoc "Webserver to use.";
};
database = { database = {
type = mkOption { type = mkOption {
type = types.enum [ "mysql" "postgres" "sqlite" "mssql" "oracle" ]; type = types.enum [ "mysql" "postgres" "sqlite" "mssql" "oracle" ];
@ -318,7 +368,7 @@ in
}; };
}; };
virtualHost = mkOption { httpd.virtualHost = mkOption {
type = types.submodule (import ../web-servers/apache-httpd/vhost-options.nix); type = types.submodule (import ../web-servers/apache-httpd/vhost-options.nix);
example = literalExpression '' example = literalExpression ''
{ {
@ -366,6 +416,10 @@ in
}; };
}; };
imports = [
(lib.mkRenamedOptionModule [ "services" "mediawiki" "virtualHost" ] [ "services" "mediawiki" "httpd" "virtualHost" ])
];
# implementation # implementation
config = mkIf cfg.enable { config = mkIf cfg.enable {
@ -412,36 +466,42 @@ in
services.phpfpm.pools.mediawiki = { services.phpfpm.pools.mediawiki = {
inherit user group; inherit user group;
phpEnv.MEDIAWIKI_CONFIG = "${mediawikiConfig}"; phpEnv.MEDIAWIKI_CONFIG = "${mediawikiConfig}";
settings = { settings = (if (cfg.webserver == "apache") then {
"listen.owner" = config.services.httpd.user; "listen.owner" = config.services.httpd.user;
"listen.group" = config.services.httpd.group; "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; enable = true;
extraModules = [ "proxy_fcgi" ]; extraModules = [ "proxy_fcgi" ];
virtualHosts.${cfg.virtualHost.hostName} = mkMerge [ cfg.virtualHost { virtualHosts.${cfg.httpd.virtualHost.hostName} = mkMerge [
documentRoot = mkForce "${pkg}/share/mediawiki"; cfg.httpd.virtualHost
extraConfig = '' {
<Directory "${pkg}/share/mediawiki"> documentRoot = mkForce "${pkg}/share/mediawiki";
<FilesMatch "\.php$"> extraConfig = ''
<If "-f %{REQUEST_FILENAME}"> <Directory "${pkg}/share/mediawiki">
SetHandler "proxy:unix:${fpm.socket}|fcgi://localhost/" <FilesMatch "\.php$">
</If> <If "-f %{REQUEST_FILENAME}">
</FilesMatch> SetHandler "proxy:unix:${fpm.socket}|fcgi://localhost/"
</If>
</FilesMatch>
Require all granted Require all granted
DirectoryIndex index.php DirectoryIndex index.php
AllowOverride All AllowOverride All
</Directory> </Directory>
'' + optionalString (cfg.uploadsDir != null) '' '' + optionalString (cfg.uploadsDir != null) ''
Alias "/images" "${cfg.uploadsDir}" Alias "/images" "${cfg.uploadsDir}"
<Directory "${cfg.uploadsDir}"> <Directory "${cfg.uploadsDir}">
Require all granted Require all granted
</Directory> </Directory>
''; '';
} ]; }
];
}; };
systemd.tmpfiles.rules = [ systemd.tmpfiles.rules = [
@ -489,13 +549,14 @@ in
}; };
}; };
systemd.services.httpd.after = optional (cfg.database.createLocally && cfg.database.type == "mysql") "mysql.service" systemd.services.httpd.after = optional (cfg.webserver == "apache" && cfg.database.createLocally && cfg.database.type == "mysql") "mysql.service"
++ optional (cfg.database.createLocally && cfg.database.type == "postgres") "postgresql.service"; ++ optional (cfg.webserver == "apache" && cfg.database.createLocally && cfg.database.type == "postgres") "postgresql.service";
users.users.${user} = { users.users.${user} = {
group = group; group = group;
isSystemUser = true; isSystemUser = true;
}; };
users.groups.${group} = {};
environment.systemPackages = [ mediawikiScripts ]; environment.systemPackages = [ mediawikiScripts ];
}; };

View File

@ -7,8 +7,8 @@
let let
shared = { shared = {
services.mediawiki.enable = true; services.mediawiki.enable = true;
services.mediawiki.virtualHost.hostName = "localhost"; services.mediawiki.httpd.virtualHost.hostName = "localhost";
services.mediawiki.virtualHost.adminAddr = "root@example.com"; services.mediawiki.httpd.virtualHost.adminAddr = "root@example.com";
services.mediawiki.passwordFile = pkgs.writeText "password" "correcthorsebatterystaple"; services.mediawiki.passwordFile = pkgs.writeText "password" "correcthorsebatterystaple";
services.mediawiki.extensions = { services.mediawiki.extensions = {
Matomo = pkgs.fetchzip { Matomo = pkgs.fetchzip {
@ -54,4 +54,24 @@ in
assert "MediaWiki has been installed" in page 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}"
'';
};
} }