# Pastebin 3qHQtp20 { config, lib, pkgs, ... }: with builtins; let sites = [ { name = "foo"; dbName = "foo"; dbUser = "foo"; dbPassword = "foobar"; domains = [ "example.com" ]; enableACME = true; authKey = "0000000000000000000000000000000000000000000000000000000000000000"; secureAuthKey = "0000000000000000000000000000000000000000000000000000000000000000"; loggedInKey = "0000000000000000000000000000000000000000000000000000000000000000"; nonceKey = "0000000000000000000000000000000000000000000000000000000000000000"; authSalt = "0000000000000000000000000000000000000000000000000000000000000000"; secureAuthSalt = "0000000000000000000000000000000000000000000000000000000000000000"; loggedInSalt = "0000000000000000000000000000000000000000000000000000000000000000"; nonceSalt = "0000000000000000000000000000000000000000000000000000000000000000"; } ]; wordpressPackage = pkgs.fetchFromGitHub { owner = "WordPress"; repo = "WordPress"; rev = "5.2.2"; sha256 = "1pq7b01y729lng816dn1qgfgzqf6smmrz8xp2q7ll9aqzjyxnhha"; meta = { homepage = https://wordpress.org; description = "WordPress is open source software you can use to create a beautiful website, blog, or app."; license = lib.licenses.gpl2; maintainers = [ lib.maintainers.basvandijk ]; }; }; maxFileUploadSize = "60M"; maxExecutionTime = "300"; php = pkgs.stdenv.mkDerivation { name = "php"; src = pkgs.php; phases = ["postInstall"]; postInstall = '' cp -r $src/ $out ls -la $out chmod +rwx $out/etc sed -i 's|upload_max_filesize = 2M|upload_max_filesize = ${maxFileUploadSize}|' $out/etc/php.ini sed -i 's|post_max_size = 8M|post_max_size = ${maxFileUploadSize}|' $out/etc/php.ini sed -i 's|max_execution_time = 30|max_execution_time = ${maxExecutionTime}|' $out/etc/php.ini ''; }; supportedLanguages = import ./wordpress_translations.nix; selectLanguages = map (lang: pkgs.stdenv.mkDerivation rec { name = "wp_${lang}"; nativeBuildInputs = [ pkgs.unzip ]; src = pkgs.fetchurl { url = supportedLanguages.${lang}.url; sha256 = supportedLanguages.${lang}.sha256; }; unpackPhase = "unzip $src"; installPhase = "mkdir -p $out; cp -R * $out/"; } ); in { systemd.services.phpfpm-wordpress = { restartTriggers = [ wordpressPackage ]; serviceConfig.UMask = "0007"; }; networking.firewall.allowedTCPPorts = [ 22 80 443 ]; networking.firewall.allowedUDPPorts = [ 22 80 443 ]; systemd.services.nginx.preStart = foldl' (s: v: "\n${s}\n${v}") "#!/bin/sh" (map (site: '' mkdir -p /var/lib/${site.name}/{plugins,themes} chown -R ${config.services.nginx.user}:${config.services.nginx.group} /var/lib/${site.name} # we should use systemd dependencies here if [ ! -d ${config.services.mysql.dataDir}/${site.dbName} ]; then echo "Need to create the database '${site.dbName}' and grant permissions to user named '${site.dbUser}'." # Wait until MySQL is up while [ ! -e ${config.services.mysql.pidDir}/mysqld.pid ]; do sleep 1 done ${pkgs.mariadb}/bin/mysql -e 'CREATE DATABASE ${site.dbName};' ${pkgs.mariadb}/bin/mysql -e "GRANT ALL ON ${site.dbName}.* TO ${site.dbUser}@localhost IDENTIFIED BY \"${site.dbPassword}\";" else echo "Good, no need to do anything database related." fi '' ) sites); services = { phpfpm = { phpPackage = php; phpOptions = '' upload_max_filesize ${maxFileUploadSize} post_max_size ${maxFileUploadSize} date.timezone = "CET" ''; poolConfigs = listToAttrs (map (site: { name = site.name; value = '' listen = /run/phpfpm-${site.name}.sock listen.owner = ${config.services.nginx.user} listen.group = root listen.mode = 0600 user = ${config.services.nginx.user} pm = dynamic pm.max_children = 75 pm.start_servers = 10 pm.min_spare_servers = 5 pm.max_spare_servers = 20 pm.max_requests = 500 catch_workers_output = yes ; log worker's stdout, but this has a performance hit [global] log_level = notice ; alert, error, warning, notice, debug error_log = syslog ''; } ) sites); }; mysql = { enable = true; package = pkgs.mariadb; bind = "127.0.0.1"; }; nginx = { enable = true; recommendedGzipSettings = true; recommendedOptimisation = true; recommendedProxySettings = true; recommendedTlsSettings = true; upstreams = listToAttrs (map (site: { name = "php-${site.name}"; value = { servers = { "unix:/run/phpfpm-${site.name}.sock" = {}; }; }; } ) sites); clientMaxBodySize = maxFileUploadSize; commonHttpConfig = '' error_log syslog:server=unix:/dev/log; access_log syslog:server=unix:/dev/log; ''; virtualHosts = foldl' (s: v: s // v) {} (map (site: listToAttrs (map (domain: { name = domain; value = let linkLanguages = lib.concatMapStrings (language: "ln -s ${language}/*.mo ${language}/*.po $out/wp-content/languages/\n" ) (selectLanguages site.languages); wp-config = pkgs.writeText "wp-config.php" ''