parent
e717876848
commit
455d33f514
@ -0,0 +1,473 @@ |
||||
{ config, pkgs, lib, ... }: |
||||
|
||||
let |
||||
|
||||
inherit (lib) mkDefault mkEnableOption mkForce mkIf mkMerge mkOption; |
||||
inherit (lib) concatStringsSep literalExample mapAttrsToList optional optionals optionalString types; |
||||
|
||||
cfg = config.services.mediawiki; |
||||
fpm = config.services.phpfpm.pools.mediawiki; |
||||
user = "mediawiki"; |
||||
group = config.services.httpd.group; |
||||
cacheDir = "/var/cache/mediawiki"; |
||||
stateDir = "/var/lib/mediawiki"; |
||||
|
||||
pkg = pkgs.stdenv.mkDerivation rec { |
||||
pname = "mediawiki-full"; |
||||
version = src.version; |
||||
src = cfg.package; |
||||
|
||||
installPhase = '' |
||||
mkdir -p $out |
||||
cp -r * $out/ |
||||
|
||||
rm -rf $out/share/mediawiki/skins/* |
||||
rm -rf $out/share/mediawiki/extensions/* |
||||
|
||||
${concatStringsSep "\n" (mapAttrsToList (k: v: '' |
||||
ln -s ${v} $out/share/mediawiki/skins/${k} |
||||
'') cfg.skins)} |
||||
|
||||
${concatStringsSep "\n" (mapAttrsToList (k: v: '' |
||||
ln -s ${v} $out/share/mediawiki/extensions/${k} |
||||
'') cfg.extensions)} |
||||
''; |
||||
}; |
||||
|
||||
mediawikiScripts = pkgs.runCommand "mediawiki-scripts" { |
||||
buildInputs = [ pkgs.makeWrapper ]; |
||||
preferLocalBuild = true; |
||||
} '' |
||||
mkdir -p $out/bin |
||||
for i in changePassword.php createAndPromote.php userOptions.php edit.php nukePage.php update.php; do |
||||
makeWrapper ${pkgs.php}/bin/php $out/bin/mediawiki-$(basename $i .php) \ |
||||
--set MEDIAWIKI_CONFIG ${mediawikiConfig} \ |
||||
--add-flags ${pkg}/share/mediawiki/maintenance/$i |
||||
done |
||||
''; |
||||
|
||||
mediawikiConfig = pkgs.writeText "LocalSettings.php" '' |
||||
<?php |
||||
# Protect against web entry |
||||
if ( !defined( 'MEDIAWIKI' ) ) { |
||||
exit; |
||||
} |
||||
|
||||
$wgSitename = "${cfg.name}"; |
||||
$wgMetaNamespace = false; |
||||
|
||||
## The URL base path to the directory containing the wiki; |
||||
## defaults for all runtime URL paths are based off of this. |
||||
## For more information on customizing the URLs |
||||
## (like /w/index.php/Page_title to /wiki/Page_title) please see: |
||||
## https://www.mediawiki.org/wiki/Manual:Short_URL |
||||
$wgScriptPath = ""; |
||||
|
||||
## The protocol and server name to use in fully-qualified URLs |
||||
$wgServer = "${if cfg.virtualHost.enableSSL then "https" else "http"}://${cfg.virtualHost.hostName}"; |
||||
|
||||
## The URL path to static resources (images, scripts, etc.) |
||||
$wgResourceBasePath = $wgScriptPath; |
||||
|
||||
## The URL path to the logo. Make sure you change this from the default, |
||||
## or else you'll overwrite your logo when you upgrade! |
||||
$wgLogo = "$wgResourceBasePath/resources/assets/wiki.png"; |
||||
|
||||
## UPO means: this is also a user preference option |
||||
|
||||
$wgEnableEmail = true; |
||||
$wgEnableUserEmail = true; # UPO |
||||
|
||||
$wgEmergencyContact = "${if cfg.virtualHost.adminAddr != null then cfg.virtualHost.adminAddr else config.services.httpd.adminAddr}"; |
||||
$wgPasswordSender = $wgEmergencyContact; |
||||
|
||||
$wgEnotifUserTalk = false; # UPO |
||||
$wgEnotifWatchlist = false; # UPO |
||||
$wgEmailAuthentication = true; |
||||
|
||||
## Database settings |
||||
$wgDBtype = "${cfg.database.type}"; |
||||
$wgDBserver = "${cfg.database.host}:${if cfg.database.socket != null then cfg.database.socket else toString cfg.database.port}"; |
||||
$wgDBname = "${cfg.database.name}"; |
||||
$wgDBuser = "${cfg.database.user}"; |
||||
${optionalString (cfg.database.passwordFile != null) "$wgDBpassword = file_get_contents(\"${cfg.database.passwordFile}\");"} |
||||
|
||||
${optionalString (cfg.database.type == "mysql" && cfg.database.tablePrefix != null) '' |
||||
# MySQL specific settings |
||||
$wgDBprefix = "${cfg.database.tablePrefix}"; |
||||
''} |
||||
|
||||
${optionalString (cfg.database.type == "mysql") '' |
||||
# MySQL table options to use during installation or update |
||||
$wgDBTableOptions = "ENGINE=InnoDB, DEFAULT CHARSET=binary"; |
||||
''} |
||||
|
||||
## Shared memory settings |
||||
$wgMainCacheType = CACHE_NONE; |
||||
$wgMemCachedServers = []; |
||||
|
||||
${optionalString (cfg.uploadsDir != null) '' |
||||
$wgEnableUploads = true; |
||||
$wgUploadDirectory = "${cfg.uploadsDir}"; |
||||
''} |
||||
|
||||
$wgUseImageMagick = true; |
||||
$wgImageMagickConvertCommand = "${pkgs.imagemagick}/bin/convert"; |
||||
|
||||
# InstantCommons allows wiki to use images from https://commons.wikimedia.org |
||||
$wgUseInstantCommons = false; |
||||
|
||||
# Periodically send a pingback to https://www.mediawiki.org/ with basic data |
||||
# about this MediaWiki instance. The Wikimedia Foundation shares this data |
||||
# with MediaWiki developers to help guide future development efforts. |
||||
$wgPingback = true; |
||||
|
||||
## If you use ImageMagick (or any other shell command) on a |
||||
## Linux server, this will need to be set to the name of an |
||||
## available UTF-8 locale |
||||
$wgShellLocale = "C.UTF-8"; |
||||
|
||||
## Set $wgCacheDirectory to a writable directory on the web server |
||||
## to make your wiki go slightly faster. The directory should not |
||||
## be publically accessible from the web. |
||||
$wgCacheDirectory = "${cacheDir}"; |
||||
|
||||
# Site language code, should be one of the list in ./languages/data/Names.php |
||||
$wgLanguageCode = "en"; |
||||
|
||||
$wgSecretKey = file_get_contents("${stateDir}/secret.key"); |
||||
|
||||
# Changing this will log out all existing sessions. |
||||
$wgAuthenticationTokenVersion = ""; |
||||
|
||||
## For attaching licensing metadata to pages, and displaying an |
||||
## appropriate copyright notice / icon. GNU Free Documentation |
||||
## License and Creative Commons licenses are supported so far. |
||||
$wgRightsPage = ""; # Set to the title of a wiki page that describes your license/copyright |
||||
$wgRightsUrl = ""; |
||||
$wgRightsText = ""; |
||||
$wgRightsIcon = ""; |
||||
|
||||
# Path to the GNU diff3 utility. Used for conflict resolution. |
||||
$wgDiff = "${pkgs.diffutils}/bin/diff"; |
||||
$wgDiff3 = "${pkgs.diffutils}/bin/diff3"; |
||||
|
||||
# Enabled skins. |
||||
${concatStringsSep "\n" (mapAttrsToList (k: v: "wfLoadSkin('${k}');") cfg.skins)} |
||||
|
||||
# Enabled extensions. |
||||
${concatStringsSep "\n" (mapAttrsToList (k: v: "wfLoadExtension('${k}');") cfg.extensions)} |
||||
|
||||
|
||||
# End of automatically generated settings. |
||||
# Add more configuration options below. |
||||
|
||||
${cfg.extraConfig} |
||||
''; |
||||
|
||||
in |
||||
{ |
||||
# interface |
||||
options = { |
||||
services.mediawiki = { |
||||
|
||||
enable = mkEnableOption "MediaWiki"; |
||||
|
||||
package = mkOption { |
||||
type = types.package; |
||||
default = pkgs.mediawiki; |
||||
description = "Which MediaWiki package to use."; |
||||
}; |
||||
|
||||
name = mkOption { |
||||
default = "MediaWiki"; |
||||
example = "Foobar Wiki"; |
||||
description = "Name of the wiki."; |
||||
}; |
||||
|
||||
uploadsDir = mkOption { |
||||
type = types.nullOr types.path; |
||||
default = "${stateDir}/uploads"; |
||||
description = '' |
||||
This directory is used for uploads of pictures. The directory passed here is automatically |
||||
created and permissions adjusted as required. |
||||
''; |
||||
}; |
||||
|
||||
passwordFile = mkOption { |
||||
type = types.path; |
||||
description = "A file containing the initial password for the admin user."; |
||||
example = "/run/keys/mediawiki-password"; |
||||
}; |
||||
|
||||
skins = mkOption { |
||||
default = {}; |
||||
type = types.attrsOf types.path; |
||||
description = '' |
||||
List of paths whose content is copied to the 'skins' |
||||
subdirectory of the MediaWiki installation. |
||||
''; |
||||
}; |
||||
|
||||
extensions = mkOption { |
||||
default = {}; |
||||
type = types.attrsOf types.path; |
||||
description = '' |
||||
List of paths whose content is copied to the 'extensions' |
||||
subdirectory of the MediaWiki installation. |
||||
''; |
||||
}; |
||||
|
||||
database = { |
||||
type = mkOption { |
||||
type = types.enum [ "mysql" "postgres" "sqlite" "mssql" "oracle" ]; |
||||
default = "mysql"; |
||||
description = "Database engine to use. MySQL/MariaDB is the database of choice by MediaWiki developers."; |
||||
}; |
||||
|
||||
host = mkOption { |
||||
type = types.str; |
||||
default = "localhost"; |
||||
description = "Database host address."; |
||||
}; |
||||
|
||||
port = mkOption { |
||||
type = types.port; |
||||
default = 3306; |
||||
description = "Database host port."; |
||||
}; |
||||
|
||||
name = mkOption { |
||||
type = types.str; |
||||
default = "mediawiki"; |
||||
description = "Database name."; |
||||
}; |
||||
|
||||
user = mkOption { |
||||
type = types.str; |
||||
default = "mediawiki"; |
||||
description = "Database user."; |
||||
}; |
||||
|
||||
passwordFile = mkOption { |
||||
type = types.nullOr types.path; |
||||
default = null; |
||||
example = "/run/keys/mediawiki-dbpassword"; |
||||
description = '' |
||||
A file containing the password corresponding to |
||||
<option>database.user</option>. |
||||
''; |
||||
}; |
||||
|
||||
tablePrefix = mkOption { |
||||
type = types.nullOr types.str; |
||||
default = null; |
||||
description = '' |
||||
If you only have access to a single database and wish to install more than |
||||
one version of MediaWiki, or have other applications that also use the |
||||
database, you can give the table names a unique prefix to stop any naming |
||||
conflicts or confusion. |
||||
See <link xlink:href='https://www.mediawiki.org/wiki/Manual:$wgDBprefix'/>. |
||||
''; |
||||
}; |
||||
|
||||
socket = mkOption { |
||||
type = types.nullOr types.path; |
||||
default = if cfg.database.createLocally then "/run/mysqld/mysqld.sock" else null; |
||||
defaultText = "/run/mysqld/mysqld.sock"; |
||||
description = "Path to the unix socket file to use for authentication."; |
||||
}; |
||||
|
||||
createLocally = mkOption { |
||||
type = types.bool; |
||||
default = cfg.database.type == "mysql"; |
||||
defaultText = "true"; |
||||
description = '' |
||||
Create the database and database user locally. |
||||
This currently only applies if database type "mysql" is selected. |
||||
''; |
||||
}; |
||||
}; |
||||
|
||||
virtualHost = mkOption { |
||||
type = types.submodule ({ |
||||
options = import ../web-servers/apache-httpd/per-server-options.nix { |
||||
inherit lib; |
||||
forMainServer = false; |
||||
}; |
||||
}); |
||||
example = literalExample '' |
||||
{ |
||||
hostName = "mediawiki.example.org"; |
||||
enableSSL = true; |
||||
adminAddr = "webmaster@example.org"; |
||||
sslServerCert = "/var/lib/acme/mediawiki.example.org/full.pem"; |
||||
sslServerKey = "/var/lib/acme/mediawiki.example.org/key.pem"; |
||||
} |
||||
''; |
||||
description = '' |
||||
Apache configuration can be done by adapting <option>services.httpd.virtualHosts</option>. |
||||
See <xref linkend="opt-services.httpd.virtualHosts"/> for further information. |
||||
''; |
||||
}; |
||||
|
||||
poolConfig = mkOption { |
||||
type = types.lines; |
||||
default = '' |
||||
pm = dynamic |
||||
pm.max_children = 32 |
||||
pm.start_servers = 2 |
||||
pm.min_spare_servers = 2 |
||||
pm.max_spare_servers = 4 |
||||
pm.max_requests = 500 |
||||
''; |
||||
description = '' |
||||
Options for MediaWiki's PHP pool. See the documentation on <literal>php-fpm.conf</literal> |
||||
for details on configuration directives. |
||||
''; |
||||
}; |
||||
|
||||
extraConfig = mkOption { |
||||
type = types.lines; |
||||
description = '' |
||||
Any additional text to be appended to MediaWiki's |
||||
LocalSettings.php configuration file. For configuration |
||||
settings, see <link xlink:href="https://www.mediawiki.org/wiki/Manual:Configuration_settings"/>. |
||||
''; |
||||
default = ""; |
||||
example = '' |
||||
$wgEnableEmail = false; |
||||
''; |
||||
}; |
||||
|
||||
}; |
||||
}; |
||||
|
||||
# implementation |
||||
config = mkIf cfg.enable { |
||||
|
||||
assertions = [ |
||||
{ assertion = cfg.database.createLocally -> cfg.database.type == "mysql"; |
||||
message = "services.mediawiki.createLocally is currently only supported for database type 'mysql'"; |
||||
} |
||||
{ assertion = cfg.database.createLocally -> cfg.database.user == user; |
||||
message = "services.mediawiki.database.user must be set to ${user} if services.mediawiki.database.createLocally is set true"; |
||||
} |
||||
{ assertion = cfg.database.createLocally -> cfg.database.socket != null; |
||||
message = "services.mediawiki.database.socket must be set if services.mediawiki.database.createLocally is set to true"; |
||||
} |
||||
{ assertion = cfg.database.createLocally -> cfg.database.passwordFile == null; |
||||
message = "a password cannot be specified if services.mediawiki.database.createLocally is set to true"; |
||||
} |
||||
]; |
||||
|
||||
services.mediawiki.skins = { |
||||
MonoBook = "${cfg.package}/share/mediawiki/skins/MonoBook"; |
||||
Timeless = "${cfg.package}/share/mediawiki/skins/Timeless"; |
||||
Vector = "${cfg.package}/share/mediawiki/skins/Vector"; |
||||
}; |
||||
|
||||
services.mysql = mkIf cfg.database.createLocally { |
||||
enable = true; |
||||
package = mkDefault pkgs.mariadb; |
||||
ensureDatabases = [ cfg.database.name ]; |
||||
ensureUsers = [ |
||||
{ name = cfg.database.user; |
||||
ensurePermissions = { "${cfg.database.name}.*" = "ALL PRIVILEGES"; }; |
||||
} |
||||
]; |
||||
}; |
||||
|
||||
services.phpfpm.pools.mediawiki = { |
||||
listen = "/run/phpfpm/mediawiki.sock"; |
||||
extraConfig = '' |
||||
listen.owner = ${config.services.httpd.user} |
||||
listen.group = ${config.services.httpd.group} |
||||
user = ${user} |
||||
group = ${group} |
||||
|
||||
env[MEDIAWIKI_CONFIG] = ${mediawikiConfig} |
||||
|
||||
${cfg.poolConfig} |
||||
''; |
||||
}; |
||||
|
||||
services.httpd = { |
||||
enable = true; |
||||
adminAddr = mkDefault cfg.virtualHost.adminAddr; |
||||
extraModules = [ "proxy_fcgi" ]; |
||||
virtualHosts = [ (mkMerge [ |
||||
cfg.virtualHost { |
||||
documentRoot = mkForce "${pkg}/share/mediawiki"; |
||||
extraConfig = '' |
||||
<Directory "${pkg}/share/mediawiki"> |
||||
<FilesMatch "\.php$"> |
||||
<If "-f %{REQUEST_FILENAME}"> |
||||
SetHandler "proxy:unix:${fpm.listen}|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> |
||||
''; |
||||
} |
||||
]) ]; |
||||
}; |
||||
|
||||
systemd.tmpfiles.rules = [ |
||||
"d '${stateDir}' 0750 ${user} ${group} - -" |
||||
"d '${cacheDir}' 0750 ${user} ${group} - -" |
||||
] ++ optionals (cfg.uploadsDir != null) [ |
||||
"d '${cfg.uploadsDir}' 0750 ${user} ${group} - -" |
||||
"Z '${cfg.uploadsDir}' 0750 ${user} ${group} - -" |
||||
]; |
||||
|
||||
systemd.services.mediawiki-init = { |
||||
wantedBy = [ "multi-user.target" ]; |
||||
before = [ "phpfpm-mediawiki.service" ]; |
||||
after = optional cfg.database.createLocally "mysql.service"; |
||||
script = '' |
||||
if ! test -e "${stateDir}/secret.key"; then |
||||
tr -dc A-Za-z0-9 </dev/urandom 2>/dev/null | head -c 64 > ${stateDir}/secret.key |
||||
fi |
||||
|
||||
echo "exit( wfGetDB( DB_MASTER )->tableExists( 'user' ) ? 1 : 0 );" | \ |
||||
${pkgs.php}/bin/php ${pkg}/share/mediawiki/maintenance/eval.php --conf ${mediawikiConfig} && \ |
||||
${pkgs.php}/bin/php ${pkg}/share/mediawiki/maintenance/install.php \ |
||||
--confpath /tmp \ |
||||
--scriptpath / \ |
||||
--dbserver ${cfg.database.host}${optionalString (cfg.database.socket != null) ":${cfg.database.socket}"} \ |
||||
--dbport ${toString cfg.database.port} \ |
||||
--dbname ${cfg.database.name} \ |
||||
${optionalString (cfg.database.tablePrefix != null) "--dbprefix ${cfg.database.tablePrefix}"} \ |
||||
--dbuser ${cfg.database.user} \ |
||||
${optionalString (cfg.database.passwordFile != null) "--dbpassfile ${cfg.database.passwordFile}"} \ |
||||
--passfile ${cfg.passwordFile} \ |
||||
${cfg.name} \ |
||||
admin |
||||
|
||||
${pkgs.php}/bin/php ${pkg}/share/mediawiki/maintenance/update.php --conf ${mediawikiConfig} --quick |
||||
''; |
||||
|
||||
serviceConfig = { |
||||
Type = "oneshot"; |
||||
User = user; |
||||
Group = group; |
||||
PrivateTmp = true; |
||||
}; |
||||
}; |
||||
|
||||
systemd.services.httpd.after = optional (cfg.database.createLocally && cfg.database.type == "mysql") "mysql.service"; |
||||
|
||||
users.users.${user}.group = group; |
||||
|
||||
environment.systemPackages = [ mediawikiScripts ]; |
||||
}; |
||||
} |
@ -1,349 +0,0 @@ |
||||
{ config, lib, pkgs, serverInfo, php, ... }: |
||||
|
||||
with lib; |
||||
|
||||
let |
||||
|
||||
httpd = serverInfo.serverConfig.package; |
||||
|
||||
version24 = !versionOlder httpd.version "2.4"; |
||||
|
||||
allGranted = if version24 then '' |
||||
Require all granted |
||||
'' else '' |
||||
Order allow,deny |
||||
Allow from all |
||||
''; |
||||
|
||||
mediawikiConfig = pkgs.writeText "LocalSettings.php" |
||||
'' |
||||
<?php |
||||
# Copied verbatim from the default (generated) LocalSettings.php. |
||||
if( defined( 'MW_INSTALL_PATH' ) ) { |
||||
$IP = MW_INSTALL_PATH; |
||||
} else { |
||||
$IP = dirname( __FILE__ ); |
||||
} |
||||
|
||||
$path = array( $IP, "$IP/includes", "$IP/languages" ); |
||||
set_include_path( implode( PATH_SEPARATOR, $path ) . PATH_SEPARATOR . get_include_path() ); |
||||
|
||||
require_once( "$IP/includes/DefaultSettings.php" ); |
||||
|
||||
if ( $wgCommandLineMode ) { |
||||
if ( isset( $_SERVER ) && array_key_exists( 'REQUEST_METHOD', $_SERVER ) ) { |
||||
die( "This script must be run from the command line\n" ); |
||||
} |
||||
} |
||||
|
||||
$wgScriptPath = "${config.urlPrefix}"; |
||||
|
||||
# We probably need to set $wgSecretKey and $wgCacheEpoch. |
||||
|
||||
# Paths to external programs. |
||||
$wgDiff3 = "${pkgs.diffutils}/bin/diff3"; |
||||
$wgDiff = "${pkgs.diffutils}/bin/diff"; |
||||
$wgImageMagickConvertCommand = "${pkgs.imagemagick.out}/bin/convert"; |
||||
|
||||
#$wgDebugLogFile = "/tmp/mediawiki_debug_log.txt"; |
||||
|
||||
# Database configuration. |
||||
$wgDBtype = "${config.dbType}"; |
||||
$wgDBserver = "${config.dbServer}"; |
||||
$wgDBuser = "${config.dbUser}"; |
||||
$wgDBpassword = "${config.dbPassword}"; |
||||
$wgDBname = "${config.dbName}"; |
||||
|
||||
# E-mail. |
||||
$wgEmergencyContact = "${config.emergencyContact}"; |
||||
$wgPasswordSender = "${config.passwordSender}"; |
||||
|
||||
$wgSitename = "${config.siteName}"; |
||||
|
||||
${optionalString (config.logo != "") '' |
||||
$wgLogo = "${config.logo}"; |
||||
''} |
||||
|
||||
${optionalString (config.articleUrlPrefix != "") '' |
||||
$wgArticlePath = "${config.articleUrlPrefix}/$1"; |
||||
''} |
||||
|
||||
${optionalString config.enableUploads '' |
||||
$wgEnableUploads = true; |
||||
$wgUploadDirectory = "${config.uploadDir}"; |
||||
''} |
||||
|
||||
${optionalString (config.defaultSkin != "") '' |
||||
$wgDefaultSkin = "${config.defaultSkin}"; |
||||
''} |
||||
|
||||
${config.extraConfig} |
||||
?> |
||||
''; |
||||
|
||||
# Unpack Mediawiki and put the config file in its root directory. |
||||
mediawikiRoot = pkgs.stdenv.mkDerivation rec { |
||||
name= "mediawiki-1.31.1"; |
||||
|
||||
src = pkgs.fetchurl { |
||||
url = "https://releases.wikimedia.org/mediawiki/1.31/${name}.tar.gz"; |
||||
sha256 = "13x48clij21cmysjkpnx68vggchrdasqp7b290j87xlfgjhdhnnf"; |
||||
}; |
||||
|
||||
skins = config.skins; |
||||
extensions = config.extensions; |
||||
|
||||
buildPhase = |
||||
'' |
||||
for skin in $skins; do |
||||
cp -prvd $skin/* skins/ |
||||
done |
||||
for extension in $extensions; do |
||||
cp -prvd $extension/* extensions/ |
||||
done |
||||
''; # */ |
||||
|
||||
installPhase = |
||||
'' |
||||
mkdir -p $out |
||||
cp -r * $out |
||||
cp ${mediawikiConfig} $out/LocalSettings.php |
||||
sed -i \ |
||||
-e 's|/bin/bash|${pkgs.bash}/bin/bash|g' \ |
||||
-e 's|/usr/bin/timeout|${pkgs.coreutils}/bin/timeout|g' \ |
||||
$out/includes/shell/limit.sh \ |
||||
$out/includes/GlobalFunctions.php |
||||
''; |
||||
}; |
||||
|
||||
mediawikiScripts = pkgs.runCommand "mediawiki-${config.id}-scripts" { |
||||
buildInputs = [ pkgs.makeWrapper ]; |
||||
preferLocalBuild = true; |
||||
} '' |
||||
mkdir -p $out/bin |
||||
for i in changePassword.php createAndPromote.php userOptions.php edit.php nukePage.php update.php; do |
||||
makeWrapper ${php}/bin/php $out/bin/mediawiki-${config.id}-$(basename $i .php) \ |
||||
--add-flags ${mediawikiRoot}/maintenance/$i |
||||
done |
||||
''; |
||||
|
||||
in |
||||
|
||||
{ |
||||
|
||||
extraConfig = |
||||
'' |
||||
${optionalString config.enableUploads '' |
||||
Alias ${config.urlPrefix}/images ${config.uploadDir} |
||||
|
||||
<Directory ${config.uploadDir}> |
||||
${allGranted} |
||||
Options -Indexes |
||||
</Directory> |
||||
''} |
||||
|
||||
${if config.urlPrefix != "" then "Alias ${config.urlPrefix} ${mediawikiRoot}" else '' |
||||
RewriteEngine On |
||||
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-f |
||||
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} !-d |
||||
${concatMapStringsSep "\n" (u: "RewriteCond %{REQUEST_URI} !^${u.urlPath}") serverInfo.vhostConfig.servedDirs} |
||||
${concatMapStringsSep "\n" (u: "RewriteCond %{REQUEST_URI} !^${u.urlPath}") serverInfo.vhostConfig.servedFiles} |
||||
RewriteRule ${if config.enableUploads |
||||
then "!^/images" |
||||
else "^.*\$" |
||||
} %{DOCUMENT_ROOT}/${if config.articleUrlPrefix == "" |
||||
then "" |
||||
else "${config.articleUrlPrefix}/" |
||||
}index.php [L] |
||||
''} |
||||
|
||||
<Directory ${mediawikiRoot}> |
||||
${allGranted} |
||||
DirectoryIndex index.php |
||||
</Directory> |
||||
|
||||
${optionalString (config.articleUrlPrefix != "") '' |
||||
Alias ${config.articleUrlPrefix} ${mediawikiRoot}/index.php |
||||
''} |
||||
''; |
||||
|
||||
documentRoot = if config.urlPrefix == "" then mediawikiRoot else null; |
||||
|
||||
enablePHP = true; |
||||
|
||||
options = { |
||||
|
||||
id = mkOption { |
||||
default = "main"; |
||||
description = '' |
||||
A unique identifier necessary to keep multiple MediaWiki server |
||||
instances on the same machine apart. This is used to |
||||
disambiguate the administrative scripts, which get names like |
||||
mediawiki-$id-change-password. |
||||
''; |
||||
}; |
||||
|
||||
dbType = mkOption { |
||||
default = "postgres"; |
||||
example = "mysql"; |
||||
description = "Database type."; |
||||
}; |
||||
|
||||
dbName = mkOption { |
||||
default = "mediawiki"; |
||||
description = "Name of the database that holds the MediaWiki data."; |
||||
}; |
||||
|
||||
dbServer = mkOption { |
||||
default = ""; # use a Unix domain socket |
||||
example = "10.0.2.2"; |
||||
description = '' |
||||
The location of the database server. Leave empty to use a |
||||
database server running on the same machine through a Unix |
||||
domain socket. |
||||
''; |
||||
}; |
||||
|
||||
dbUser = mkOption { |
||||
default = "mediawiki"; |
||||
description = "The user name for accessing the database."; |
||||
}; |
||||
|
||||
dbPassword = mkOption { |
||||
default = ""; |
||||
example = "foobar"; |
||||
description = '' |
||||
The password of the database user. Warning: this is stored in |
||||
cleartext in the Nix store! |
||||
''; |
||||
}; |
||||
|
||||
emergencyContact = mkOption { |
||||
default = serverInfo.serverConfig.adminAddr; |
||||
example = "admin@example.com"; |
||||
description = '' |
||||
Emergency contact e-mail address. Defaults to the Apache |
||||
admin address. |
||||
''; |
||||
}; |
||||
|
||||
passwordSender = mkOption { |
||||
default = serverInfo.serverConfig.adminAddr; |
||||
example = "password@example.com"; |
||||
description = '' |
||||
E-mail address from which password confirmations originate. |
||||
Defaults to the Apache admin address. |
||||
''; |
||||
}; |
||||
|
||||
siteName = mkOption { |
||||
default = "MediaWiki"; |
||||
example = "Foobar Wiki"; |
||||
description = "Name of the wiki"; |
||||
}; |
||||
|
||||
logo = mkOption { |
||||
default = ""; |
||||
example = "/images/logo.png"; |
||||
description = "The URL of the site's logo (which should be a 135x135px image)."; |
||||
}; |
||||
|
||||
urlPrefix = mkOption { |
||||
default = "/w"; |
||||
description = '' |
||||
The URL prefix under which the Mediawiki service appears. |
||||
''; |
||||
}; |
||||
|
||||
articleUrlPrefix = mkOption { |
||||
default = "/wiki"; |
||||
example = ""; |
||||
description = '' |
||||
The URL prefix under which article pages appear, |
||||
e.g. http://server/wiki/Page. Leave empty to use the main URL |
||||
prefix, e.g. http://server/w/index.php?title=Page. |
||||
''; |
||||
}; |
||||
|
||||
enableUploads = mkOption { |
||||
default = false; |
||||
description = "Whether to enable file uploads."; |
||||
}; |
||||
|
||||
uploadDir = mkOption { |
||||
default = throw "You must specify `uploadDir'."; |
||||
example = "/data/mediawiki-upload"; |
||||
description = "The directory that stores uploaded files."; |
||||
}; |
||||
|
||||
defaultSkin = mkOption { |
||||
default = ""; |
||||
example = "nostalgia"; |
||||
description = "Set this value to change the default skin used by MediaWiki."; |
||||
}; |
||||
|
||||
skins = mkOption { |
||||
default = []; |
||||
type = types.listOf types.path; |
||||
description = |
||||
'' |
||||
List of paths whose content is copied to the ‘skins’ |
||||
subdirectory of the MediaWiki installation. |
||||
''; |
||||
}; |
||||
|
||||
extensions = mkOption { |
||||
default = []; |
||||
type = types.listOf types.path; |
||||
description = |
||||
'' |
||||
List of paths whose content is copied to the 'extensions' |
||||
subdirectory of the MediaWiki installation. |
||||
''; |
||||
}; |
||||
|
||||
extraConfig = mkOption { |
||||
type = types.lines; |
||||
default = ""; |
||||
example = |
||||
'' |
||||
$wgEnableEmail = false; |
||||
''; |
||||
description = '' |
||||
Any additional text to be appended to MediaWiki's |
||||
configuration file. This is a PHP script. For configuration |
||||
settings, see <link xlink:href='https://www.mediawiki.org/wiki/Manual:Configuration_settings'/>. |
||||
''; |
||||
}; |
||||
|
||||
}; |
||||
|
||||
extraPath = [ mediawikiScripts ]; |
||||
|
||||
# !!! Need to specify that Apache has a dependency on PostgreSQL! |
||||
|
||||
startupScript = pkgs.writeScript "mediawiki_startup.sh" |
||||
# Initialise the database automagically if we're using a Postgres |
||||
# server on localhost. |
||||
(optionalString (config.dbType == "postgres" && config.dbServer == "") '' |
||||
if ! ${pkgs.postgresql}/bin/psql -l | grep -q ' ${config.dbName} ' ; then |
||||
${pkgs.postgresql}/bin/createuser --no-superuser --no-createdb --no-createrole "${config.dbUser}" || true |
||||
${pkgs.postgresql}/bin/createdb "${config.dbName}" -O "${config.dbUser}" |
||||
( echo 'CREATE LANGUAGE plpgsql;' |
||||
cat ${mediawikiRoot}/maintenance/postgres/tables.sql |
||||
echo 'CREATE TEXT SEARCH CONFIGURATION public.default ( COPY = pg_catalog.english );' |
||||
echo COMMIT |
||||
) | ${pkgs.postgresql}/bin/psql -U "${config.dbUser}" "${config.dbName}" |
||||
fi |
||||
${php}/bin/php ${mediawikiRoot}/maintenance/update.php |
||||
''); |
||||
|
||||
robotsEntries = optionalString (config.articleUrlPrefix != "") |
||||
'' |
||||
User-agent: * |
||||
Disallow: ${config.urlPrefix}/ |
||||
Disallow: ${config.articleUrlPrefix}/Special:Search |
||||
Disallow: ${config.articleUrlPrefix}/Special:Random |
||||
''; |
||||
|
||||
} |
@ -0,0 +1,19 @@ |
||||
import ./make-test.nix ({ pkgs, lib, ... }: { |
||||
name = "mediawiki"; |
||||
meta.maintainers = [ lib.maintainers.aanderse ]; |
||||
|
||||
machine = |
||||
{ ... }: |
||||
{ services.mediawiki.enable = true; |
||||
services.mediawiki.virtualHost.hostName = "localhost"; |
||||
services.mediawiki.virtualHost.adminAddr = "root@example.com"; |
||||
services.mediawiki.passwordFile = pkgs.writeText "password" "correcthorsebatterystaple"; |
||||
}; |
||||
|
||||
testScript = '' |
||||
startAll; |
||||
|
||||
$machine->waitForUnit('phpfpm-mediawiki.service'); |
||||
$machine->succeed('curl -L http://localhost/') =~ /MediaWiki has been installed/ or die; |
||||
''; |
||||
}) |
Loading…
Reference in new issue