nixos/hosts/vm/mediakiwi/mediawiki.nix

371 lines
14 KiB
Nix
Raw Blame History

This file contains invisible Unicode characters!

This file contains invisible Unicode characters that may be processed differently from what appears below. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to reveal hidden characters.

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

{
pkgs,
config,
...
}:
let
phpExtensions = config.services.mediawiki.phpPackage.extensions;
in
{
# Mauvaise config posgresql, on fixe à la mano temporairement
disabledModules = [ "services/web-apps/mediawiki.nix" ];
imports = [ ./mediawiki-patch.nix ];
age.secrets.mediawiki-admin-passwd = {
file = ../../../secrets/mediakiwi/mediawiki-admin-passwd.age;
owner = "mediawiki";
};
age.secrets.mediawiki-ldap = {
file = ../../../secrets/mediakiwi/mediawiki-ldap.age;
owner = "mediawiki";
};
age.secrets.mediawiki-oauth = {
file = ../../../secrets/mediakiwi/mediawiki-oauth.age;
owner = "mediawiki";
};
# Attention: il ne faut pas mettre de retour à la ligne à la fin du mot de passe!
age.secrets.mediawiki-db = {
file = ../../../secrets/mediakiwi/mediawiki-db-pass.age;
owner = "mediawiki";
};
environment.systemPackages = with pkgs; [
imagemagick
# For the PdfHandler extension
ghostscript
poppler-utils
# For the SyntaxHighlighting extension
python3Packages.pygments
];
services.phpfpm.pools.mediawiki.phpOptions = ''
upload_max_filesize = 512M
post_max_size = 512M
max_execution_time = 1000
max_input_time = 2000
default_socket_timeout = 2000
extension = ${phpExtensions.mbstring}/lib/php/extensions/mbstring.so
extension = ${phpExtensions.luasandbox}/lib/php/extensions/luasandbox.so
'';
services.nginx.clientMaxBodySize = "512M";
services.syslogd.enable = true;
# Tâches lourdes à gérer au fond https://www.mediawiki.org/wiki/Manual:Job_queue
systemd.services.mediawiki-jobs =
let
# Hack pour retrouver la conf
conf = config.services.phpfpm.pools.mediawiki.phpEnv.MEDIAWIKI_CONFIG;
php = "${config.services.mediawiki.phpPackage}/bin/php";
maintenanceScript = "${config.services.mediawiki.finalPackage}/share/mediawiki/maintenance/run.php";
runJobs = "MEDIAWIKI_CONFIG='${conf}' ${php} ${maintenanceScript} runJobs --maxtime=3600";
in
{
description = "Tâches lourdes de Mediawiki";
wantedBy = [ "multi-user.target" ];
after = [ "phpfpm-mediawiki.service" ];
path = [ pkgs.mediawiki ];
# Inspiré de https://www.mediawiki.org/wiki/Manual:Job_queue
script = ''
while true; do
${runJobs} --type="enotifNotify"
# --wait pour ne pas boucler pour rien
${runJobs} --wait --maxjobs=20
# Au bout de 20 jobs on attend pour éviter de surcharger le serveur
# avec des tâches de fond
sleep 5
done
'';
serviceConfig = {
Restart = "always";
RestartSec = "60s";
User = "mediawiki";
Nice = 10;
ProtectSystem = "full";
OOMScoreAdjust = 200;
};
};
services.mediawiki = {
enable = true;
name = "Wiki Crans";
nginx.hostName = "mediawiki.crans.org";
webserver = "nginx";
passwordFile = config.age.secrets.mediawiki-admin-passwd.path;
database = {
createLocally = false;
host = "tealc.adm.crans.org";
name = "mediawiki";
user = "mediawiki";
passwordFile = config.age.secrets.mediawiki-db.path;
type = "postgres";
};
extraConfig = ''
# TODO remove log error in test
error_reporting( -1 );
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
# Server settings
$wgFavicon = 'https://www.crans.org/images/favicon.ico';
$wgLogo = 'https://www.crans.org/images/crans.svg';
$wgJobRunRate = 0; # On fait les jobs manuellement dans un systemd.
$wgEnableEditRecovery = true; # Pour pouvoir récuppérer des changements non sauvegardées (1 mois par défaut en local)
# Files and Uploads
$wgMaxUploadSize = 512 * 1024 * 1024;
$wgUseImageMagick = true;
$wgImageMagickConvertCommand = '${pkgs.imagemagick}/bin/convert';
$wgStrictFileExtensions = false; # On autorise toutes les extensions sauf https://www.mediawiki.org/wiki/Manual:$wgProhibitedFileExtensions
$wgFileExtensions[] = 'pdf';
$wgFileExtensions[] = 'svg';
# Limite mémoire, quand on fait de gros importi (9M de xml), le parser
# prends plus que 50M
$wgMemoryLimit = 512 * 1024 * 1024;
# E-mail settings
$wgEnableEmail = true;
$wgSMTP = [
'host' => 'smtp.adm.crans.org',
'IDHost' => 'crans.org',
'localhost' => 'crans.org',
'port' => 25,
'auth' => false,
];
$wgPasswordSender = 'wiki@crans.org'; # Cest un alias de root (pas de réponse)
$wgEmergencyContact = 'contact@crans.org';
$wgNoReplyAddress = 'contact@crans.org'; # On reçoit les réponses aux mails
$wgEnableUserEmail = true; # On active les emails aux utilisateurices mais restreint via les ACLs
$wgAllowHTMLEmail = true;
$wgEnotifUseRealName = true; # On active les noms réels pour plus de lisibilité avec les comptes note
$wgEnotifFromEditor = false; # On ne se fait pas passer par lutilisateurice
$wgEnotifRevealEditorAddress = false; # Pas de champ répondre avec ladresse mail de lutilisateurice
$wgEnotifUserTalk = true;
$wgEnotifMinorEdits = true;
$wgEnotifWatchlist = true;
# Peut-être utilisé pour les Wikistes
$wgUsersNotifiedOnAllChanges = [ 'Ninja_wiki_notifs' ];
# Auth
$wgPluggableAuth_EnableLocalLogin = false;
$LDAPAuthentication2AllowLocalLogin = true;
$LDAPProviderDomainConfigs = "${config.age.secrets.mediawiki-ldap.path}";
$wgOAuthCustomAuthProviders = [
'note' => WSOAuth\AuthenticationProvider\NoteKfetAuth::class
];
$wgPluggableAuth_Config = [
"Compte Crans" => [
'plugin' => 'LDAPAuthentication2',
'data' => [
'domain' => 'crans'
]
],
"Note BDE" => [
'plugin' => 'WSOAuth',
'data' => require('${config.age.secrets.mediawiki-oauth.path}'),
]
];
# Theme
$wgDefaultSkin = 'citizen';
$wgCitizenThemeColor = '#AD1F1F';
$wgCitizenEnableARFonts = true;
$wgCitizenEnableCJKFonts = true;
$wgLanguageCode = 'fr';
$wgLocaltimezone = 'Europe/Paris';
$wgDefaultUserOptions['timecorrection'] = 'ZoneInfo|0|' . $wgLocaltimezone;
# Access Control
$wgGroupPermissions['*']['edit'] = false; # Restrict edition for anonymous user
$wgGroupPermissions['*']['createaccount'] = false; # Restrict the creation of account to sysop only
$wgGroupPermissions['*']['autocreateaccount'] = true; # Création de comptes depuis LDAP et Note mais pas local
$wgGroupPermissions['*']['delete'] = true; # Création de comptes depuis LDAP et Note mais pas local
$wgGroupPermissions['user']['sendemail'] = false;
$wgGroupPermissions['sysop']['sendemail'] = true; # On réserve lenvoie de mail aux admins
$wgCategoryLockdownWhitelist = [
"Spécial:Connexion",
"Spécial:Déconnexion",
"Spécial:Connexion/return",
"Spécial:PluggableAuthLogin",
"Spécial:Recherche",
"MediaWiki:Common.css",
"MediaWiki:Common.js"
];
$wgCategoryGroupLockdown["!user"]["read"] = [ "Page Publique" ]; # Restrict read for non-user (i.e. anonymous) on execpt for Page Publique
$wgFeed = false; # Pas de flux car ils ne sont pas authentifiés :(.
# Extensions
$wgWikiEditorRealtimePreview = true;
$wgCiteBookReferencing = true;
$wgPdfProcessor = '${pkgs.ghostscript}/bin/gs';
$wgPdfPostProcessor = $wgImageMagickConvertCommand;
$wgPdfInfo = '${pkgs.poppler-utils}/bin/pdfinfo';
$wgPdftoText = '${pkgs.poppler-utils}/bin/pdftotext';
$wgScribuntoDefaultEngine = 'luasandbox';
# SyntaxHighlight extension
$wgPygmentizePath = '${pkgs.python3Packages.pygments}/bin/pygmentize';
# Custom Namespaces
define("NS_ARCHIVE", 3000);
define("NS_ARCHIVE_TALK", 3001);
$wgExtraNamespaces = [
NS_ARCHIVE => "Archive",
NS_ARCHIVE_TALK => "Discussion_archive",
];
# Sous pages
$wgNamespacesWithSubpages[NS_MAIN] = true;
$wgNamespacesWithSubpages[NS_ARCHIVE] = true;
$wgNamespacesWithSubpages[NS_CATEGORY] = true;
$wgVisualEditorAvailableNamespaces[NS_ARCHIVE] = true;
# Pour les Popups
$wgContentNamespaces[] = NS_ARCHIVE;
$wgContentNamespaces[] = NS_USER;
# Pour la recherche
$wgNamespacesToBeSearchedDefault[NS_ARCHIVE] = true; # Temporairement pour la migration?
$wgNamespacesToBeSearchedDefault[NS_USER] = true;
'';
skins = {
Citizen = pkgs.fetchFromGitHub {
name = "Citizen";
owner = "StarCitizenTools";
repo = "mediawiki-skins-Citizen";
tag = "v3.19.0";
sha256 = "sha256-iQS0lyvOYH45gI6fMKYV4ERK9JO35J8ktLNrQi6UsH0=";
};
};
extensions = {
# Enables embedded extensions
AbuseFilter = null; # pour faire de la modération
CategoryTree = null; # pour faire des arbres de catégories
Cite = null; # pour faire des références/footnotes
CiteThisPage = null; # pour avoir la citation (à la bibtex) d'une page
CodeEditor = null; # pour éditer des macros/scripts wiki
DiscussionTools = null; # pour des pages de discussion intéractives
Echo = null; # pour le système de notification du wiki
Gadgets = null; # pour avoir un système d'outils activable par les users
ImageMap = null; # pour mettre des widgets sur des images
Linter = null; # requis pour DiscussionTools
Math = null; # pour avoir des maths LaTeX
MultimediaViewer = null; # pour avoir un affichage sympa des images
Nuke = null; # pour purger des pages
PageImages = null; # pour set la bonne image représentant un article
ParserFunctions = null; # pour la logique et les fonctions de base du templating
PdfHandler = null; # pour afficher les pdfs
Poem = null; # pour afficher des blocks de texte respectant l'espacement (poèmes, écrits)
ReplaceText = null; # pour du méga-renommage à travers le wiki
Scribunto = null; # pour faire du scripting et des templates pour le wiki
SyntaxHighlight_GeSHi = null; # pour avoir de la coloration syntaxique
TemplateData = null; # pour faire de la doc sur les templates
TemplateStyles = null; # pour styliser les templates (bundlé pour la prochaine version de mediawiki)
TextExtracts = null; # pour set le bon text représentant un article
Thanks = null; # pour remercier des gens en notif
TitleBlacklist = null; # pour faire de la modération
VisualEditor = null; # pour éditer visuellement les pages
WikiEditor = null; # pour éditer le code wiki des pages
CategoryLockdown = pkgs.applyPatches {
src = pkgs.fetchFromGitHub {
name = "CategoryLockdown";
owner = "wikimedia";
repo = "mediawiki-extensions-CategoryLockdown";
rev = "d29e734c87697590af80f91d0cdbb4275bc3f072";
# Le SHA doit être changé à chaque nouveau commit de traduction.
# Pas de meilleure solution à ma connaissance pour suivre les releases.
sha256 = "sha256-iYRzCzWu3hndPoMIkFZOaYJkbVoAnVv/ZMZTSAcQdKo=";
};
patches = [
# Cette extension soccupe des du contrôle daccès du Wiki
# et a été beaucoup patché. Pensez à vérifier les changements
# et révisez le patch le cas échéant.
"${./category-lockdown.patch}"
];
};
# FullCalendar
FullCalendar = ./FullCalendar;
# Popups
Popups = pkgs.fetchFromGitHub {
name = "Popups";
owner = "wikimedia";
repo = "mediawiki-extensions-Popups";
rev = "82742d6e42750bf5b8000c90fc894b304aa95235";
# Le SHA doit être changé à chaque nouveau commit de traduction.
# Pas de meilleure solution à ma connaissance pour suivre les releases.
sha256 = "sha256-mqiDU7w3B3imMLqoTvwgnyk/vCDWeAiTEX1y4dWmNDk=";
};
# Auth
PluggableAuth = pkgs.fetchFromGitHub {
name = "PluggableAuth";
owner = "wikimedia";
repo = "mediawiki-extensions-PluggableAuth";
rev = "3b9428bd8832aeb8ef8ff1ea61b7a4afca7f0ecb";
# Le SHA doit être changé à chaque nouveau commit de traduction.
# Pas de meilleure solution à ma connaissance pour suivre les releases.
sha256 = "sha256-9PUf7KC0oz4XeN/m/5KbefNpsgRwV2NswMQZl7a/+I0=";
};
LDAPProvider = pkgs.fetchFromGitHub {
name = "LDAPProvider";
owner = "wikimedia";
repo = "mediawiki-extensions-LDAPProvider";
tag = "3.1.0";
# Le SHA doit être changé à chaque nouveau commit de traduction.
# Pas de meilleure solution à ma connaissance pour suivre les releases.
sha256 = "sha256-9/5Uph5C6VPWT7NzrPsYpM9pxZPIQneKZDPFCaYm1e8=";
};
LDAPAuthentication2 = pkgs.fetchFromGitHub {
name = "LDAPAuthentication2";
owner = "wikimedia";
repo = "mediawiki-extensions-LDAPAuthentication2";
tag = "3.1.0";
# Le SHA doit être changé à chaque nouveau commit de traduction.
# Pas de meilleure solution à ma connaissance pour suivre les releases.
sha256 = "sha256-/9VISvpvhaVq/sAHE10INlTju7+PTirFO/6U68WBOgM=";
};
LDAPGroup = pkgs.fetchFromGitHub {
name = "LDAPGroup";
owner = "wikimedia";
repo = "mediawiki-extensions-LDAPGroups";
tag = "3.1.0";
# Le SHA doit être changé à chaque nouveau commit de traduction.
# Pas de meilleure solution à ma connaissance pour suivre les releases.
sha256 = "sha256-aW1nVechxy4CfyT953LfNgeUOXZGeIkV3KwPJJwlyug=";
};
WSOAuth = pkgs.applyPatches {
src = pkgs.fetchFromGitHub {
name = "WSOAuth";
owner = "wikimedia";
repo = "mediawiki-extensions-WSOAuth";
rev = "4b8a12d26196b323be5da93480b6a75fda25b6d0";
# Le SHA doit être changé à chaque nouveau commit de traduction.
# Pas de meilleure solution à ma connaissance pour suivre les releases.
sha256 = "sha256-W2SL14U5nVUcf/aTkWuVk9+vQGd3RCtuR3bAhBMN5iY=";
};
patches = [ "${./WSOAuth.patch}" ];
};
WSONoteKfetAuth = "${./WSONoteKfetAuth}";
};
};
}