diff --git a/nixos/modules/services/web-apps/mediawiki.nix b/nixos/modules/services/web-apps/mediawiki.nix
index 357c2d4a1283..b912d4e87f18 100644
--- a/nixos/modules/services/web-apps/mediawiki.nix
+++ b/nixos/modules/services/web-apps/mediawiki.nix
@@ -8,7 +8,8 @@ let
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";
@@ -73,7 +74,7 @@ let
$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;
@@ -87,8 +88,7 @@ let
$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
@@ -190,6 +190,16 @@ in
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";
@@ -197,6 +207,22 @@ in
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";
@@ -212,6 +238,24 @@ in
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;
@@ -241,6 +285,12 @@ in
'';
};
+ 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" ];
@@ -318,7 +368,7 @@ in
};
};
- virtualHost = mkOption {
+ httpd.virtualHost = mkOption {
type = types.submodule (import ../web-servers/apache-httpd/vhost-options.nix);
example = literalExpression ''
{
@@ -366,6 +416,10 @@ in
};
};
+ imports = [
+ (lib.mkRenamedOptionModule [ "services" "mediawiki" "virtualHost" ] [ "services" "mediawiki" "httpd" "virtualHost" ])
+ ];
+
# implementation
config = mkIf cfg.enable {
@@ -412,36 +466,42 @@ in
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 = ''
-
-
-
- SetHandler "proxy:unix:${fpm.socket}|fcgi://localhost/"
-
-
+ virtualHosts.${cfg.httpd.virtualHost.hostName} = mkMerge [
+ cfg.httpd.virtualHost
+ {
+ documentRoot = mkForce "${pkg}/share/mediawiki";
+ extraConfig = ''
+
+
+
+ SetHandler "proxy:unix:${fpm.socket}|fcgi://localhost/"
+
+
- Require all granted
- DirectoryIndex index.php
- AllowOverride All
-
- '' + optionalString (cfg.uploadsDir != null) ''
- Alias "/images" "${cfg.uploadsDir}"
-
- Require all granted
-
- '';
- } ];
+ Require all granted
+ DirectoryIndex index.php
+ AllowOverride All
+
+ '' + optionalString (cfg.uploadsDir != null) ''
+ Alias "/images" "${cfg.uploadsDir}"
+
+ Require all granted
+
+ '';
+ }
+ ];
};
systemd.tmpfiles.rules = [
@@ -489,13 +549,14 @@ in
};
};
- 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 ];
};
diff --git a/nixos/tests/mediawiki.nix b/nixos/tests/mediawiki.nix
index 1ae82d65b3cb..52122755ad94 100644
--- a/nixos/tests/mediawiki.nix
+++ b/nixos/tests/mediawiki.nix
@@ -7,8 +7,8 @@
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 {
@@ -54,4 +54,24 @@ in
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}"
+ '';
+ };
}