Loading nixos/modules/services/web-apps/mediawiki.nix +92 −31 Original line number Diff line number Diff line Loading @@ -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"; Loading Loading @@ -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; Loading @@ -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 Loading Loading @@ -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"; Loading @@ -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"; Loading @@ -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; Loading Loading @@ -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" ]; Loading Loading @@ -318,7 +368,7 @@ in }; }; virtualHost = mkOption { httpd.virtualHost = mkOption { type = types.submodule (import ../web-servers/apache-httpd/vhost-options.nix); example = literalExpression '' { Loading Loading @@ -366,6 +416,10 @@ in }; }; imports = [ (lib.mkRenamedOptionModule [ "services" "mediawiki" "virtualHost" ] [ "services" "mediawiki" "httpd" "virtualHost" ]) ]; # implementation config = mkIf cfg.enable { Loading Loading @@ -412,16 +466,21 @@ 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 { virtualHosts.${cfg.httpd.virtualHost.hostName} = mkMerge [ cfg.httpd.virtualHost { documentRoot = mkForce "${pkg}/share/mediawiki"; extraConfig = '' <Directory "${pkg}/share/mediawiki"> Loading @@ -441,7 +500,8 @@ in Require all granted </Directory> ''; } ]; } ]; }; systemd.tmpfiles.rules = [ Loading Loading @@ -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 ]; }; Loading nixos/tests/mediawiki.nix +22 −2 Original line number Diff line number Diff line Loading @@ -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 { Loading Loading @@ -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}" ''; }; } Loading
nixos/modules/services/web-apps/mediawiki.nix +92 −31 Original line number Diff line number Diff line Loading @@ -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"; Loading Loading @@ -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; Loading @@ -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 Loading Loading @@ -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"; Loading @@ -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"; Loading @@ -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; Loading Loading @@ -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" ]; Loading Loading @@ -318,7 +368,7 @@ in }; }; virtualHost = mkOption { httpd.virtualHost = mkOption { type = types.submodule (import ../web-servers/apache-httpd/vhost-options.nix); example = literalExpression '' { Loading Loading @@ -366,6 +416,10 @@ in }; }; imports = [ (lib.mkRenamedOptionModule [ "services" "mediawiki" "virtualHost" ] [ "services" "mediawiki" "httpd" "virtualHost" ]) ]; # implementation config = mkIf cfg.enable { Loading Loading @@ -412,16 +466,21 @@ 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 { virtualHosts.${cfg.httpd.virtualHost.hostName} = mkMerge [ cfg.httpd.virtualHost { documentRoot = mkForce "${pkg}/share/mediawiki"; extraConfig = '' <Directory "${pkg}/share/mediawiki"> Loading @@ -441,7 +500,8 @@ in Require all granted </Directory> ''; } ]; } ]; }; systemd.tmpfiles.rules = [ Loading Loading @@ -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 ]; }; Loading
nixos/tests/mediawiki.nix +22 −2 Original line number Diff line number Diff line Loading @@ -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 { Loading Loading @@ -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}" ''; }; }