Merge pull request #227990 from Mic92/mediawiki-webserver
nixos/mediawiki: make apache2 optional
This commit is contained in:
commit
826418fc35
@ -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 ];
|
||||||
};
|
};
|
||||||
|
@ -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}"
|
||||||
|
'';
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user