From ed758199980ee3bb0aa77b0f7db16d7add39d35b Mon Sep 17 00:00:00 2001 From: Andrew Benbow Date: Thu, 31 Jul 2025 16:03:56 -0400 Subject: [PATCH] nixos/drupal: extend config interface, add config sync dir --- nixos/modules/services/web-apps/drupal.nix | 73 +++++++++++++++++++--- 1 file changed, 66 insertions(+), 7 deletions(-) diff --git a/nixos/modules/services/web-apps/drupal.nix b/nixos/modules/services/web-apps/drupal.nix index 2a51e3672278..f214d2c1789b 100644 --- a/nixos/modules/services/web-apps/drupal.nix +++ b/nixos/modules/services/web-apps/drupal.nix @@ -58,6 +58,35 @@ let ''; }); + drupalSettings = + hostName: cfg: + pkgs.writeTextFile { + name = "settings.nixos-${hostName}.php"; + text = '' + /config/sync"; + description = "The location of the Drupal config sync directory."; + }; + + extraConfig = mkOption { + type = types.lines; + default = ""; + description = '' + Extra configuration values that you want to insert into settings.php. + All configuration must be written as PHP script. + ''; + example = '' + $config['user.settings']['anonymous'] = 'Visitor'; + $settings['entity_update_backup'] = TRUE; + ''; + }; + stateDir = mkOption { type = types.path; default = "/var/lib/drupal/${name}"; @@ -308,6 +357,7 @@ in "d '${cfg.themesDir}' 0750 ${user} ${webserver.group} - -" "Z '${cfg.themesDir}' 0750 ${user} ${webserver.group} - -" "d '${cfg.privateFilesDir}' 0750 ${user} ${webserver.group} - -" + "d '${cfg.configSyncDir}' 0750 ${user} ${webserver.group} - -" ]) eachSite ); @@ -330,6 +380,8 @@ in serviceConfig = { Type = "oneshot"; User = "root"; + RemainAfterExit = true; + ExecStart = writeShellScript "drupal-state-init-${hostName}" '' set -e @@ -345,22 +397,29 @@ in fi settings_file="${cfg.stateDir}/sites/default/settings.php" - defaultSettings="${cfg.package}/share/php/drupal/sites/default/default.settings.php" + default_settings="${cfg.package}/share/php/drupal/sites/default/default.settings.php" - if [ ! -f "$settings" ]; then + if [ ! -f "$settings_file" ]; then echo "Preparing settings.php for ${hostName}..." - cp "$defaultSettings" "$settings_file" + cp "$default_settings" "$settings_file" + cat < ${appendSettings hostName} >> "$settings_file" chmod 644 "$settings_file" - - # Append settings to settings file - printf "\n\n// NixOS Automatically Generated Settings\n" >> $settings_file - printf "\$settings['file_private_path'] = '${cfg.privateFilesDir}';" >> $settings_file fi + # Link the NixOS-managed settings file to the state directory. + ln -sf ${drupalSettings hostName cfg} ${cfg.stateDir}/sites/default/settings.nixos-${hostName}.php + # Set or reset file permissions so that the web user and webserver owns them. chown -R ${user}:${webserver.group} ${cfg.stateDir} ''; }; + + # Rerun this service if certain settings were updated + reloadTriggers = [ + cfg.extraConfig + cfg.privateFilesDir + cfg.configSyncDir + ]; }) ) eachSite)