anchor.diff:      '';
     };
   
  -  siteOpts = {lib, name, ...}:
  -  {
  -  options = {
  -    enable = mkEnableOption "DokuWiki web application.";
  -
  -    package = mkOption {
  -      type = types.package;
  -      default = pkgs.dokuwiki;
  -      description = "Which dokuwiki package to use.";
  +  siteOpts = {lib, name, ...}: {
  +    options = {
  +      enable = mkEnableOption "DokuWiki web application.";
  +
  +      package = mkOption {
  +        type = types.package;
  +        default = pkgs.dokuwiki;
  +        description = "Which dokuwiki package to use.";
  +      };
  +
  +      hostName = mkOption {
  +        type = types.str;
  +        default = "localhost";
  +        description = "FQDN for the instance.";
  +      };
  +
  +      stateDir = mkOption {
  +        type = types.path;
  +        default = "/var/lib/dokuwiki/${name}/data";
  +        description = "Location of the dokuwiki state directory.";
  +      };
  +
  +      acl = mkOption {
  +        type = types.nullOr types.lines;
  +        default = null;
  +        example = "*               @ALL               8";
  +        description = ''
  +          Access Control Lists: see <link xlink:href="https://www.dokuwiki.org/acl"/>
  +          Mutually exclusive with services.dokuwiki.aclFile
  +          Set this to a value other than null to take precedence over aclFile option.
  +        '';
  +      };
  +
  +      aclFile = mkOption {
  +        type = types.nullOr types.path;
  +        default = null;
  +        description = ''
  +          Location of the dokuwiki acl rules. Mutually exclusive with services.dokuwiki.acl
  +          Mutually exclusive with services.dokuwiki.acl which is preferred.
  +          Consult documentation <link xlink:href="https://www.dokuwiki.org/acl"/> for further instructions.
  +          Example: <link xlink:href="https://github.com/splitbrain/dokuwiki/blob/master/conf/acl.auth.php.dist"/>
  +        '';
  +      };
  +
  +      aclUse = mkOption {
  +        type = types.bool;
  +        default = true;
  +        description = ''
  +          Necessary for users to log in into the system.
  +          Also limits anonymous users. When disabled,
  +          everyone is able to create and edit content.
  +        '';
  +      };
  +
  +      pluginsConfig = mkOption {
  +        type = types.lines;
  +        default = ''
  +          $plugins['authad'] = 0;
  +          $plugins['authldap'] = 0;
  +          $plugins['authmysql'] = 0;
  +          $plugins['authpgsql'] = 0;
  +        '';
  +        description = ''
  +          List of the dokuwiki (un)loaded plugins.
  +        '';
  +      };
  +
  +      superUser = mkOption {
  +        type = types.nullOr types.str;
  +        default = "@admin";
  +        description = ''
  +          You can set either a username, a list of usernames (“admin1,admin2”),
  +          or the name of a group by prepending an @ char to the groupname
  +          Consult documentation <link xlink:href="https://www.dokuwiki.org/config:superuser"/> for further instructions.
  +        '';
  +      };
  +
  +      usersFile = mkOption {
  +        type = types.nullOr types.path;
  +        default = null;
  +        description = ''
  +          Location of the dokuwiki users file. List of users. Format:
  +          login:passwordhash:Real Name:email:groups,comma,separated
  +          Create passwordHash easily by using:$ mkpasswd -5 password `pwgen 8 1`
  +          Example: <link xlink:href="https://github.com/splitbrain/dokuwiki/blob/master/conf/users.auth.php.dist"/>
  +          '';
  +      };
  +
  +      extraConfig = mkOption {
  +        type = types.nullOr types.lines;
  +        default = null;
  +        example = ''
  +          $conf['title'] = 'My Wiki';
  +          $conf['userewrite'] = 1;
  +        '';
  +        description = ''
  +          DokuWiki configuration. Refer to
  +          <link xlink:href="https://www.dokuwiki.org/config"/>
  +          for details on supported values.
  +        '';
  +      };
  +
  +      poolConfig = mkOption {
  +        type = with types; attrsOf (oneOf [ str int bool ]);
  +        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 the dokuwiki PHP pool. See the documentation on <literal>php-fpm.conf</literal>
  +          for details on configuration directives.
  +        '';
  +      };
  +
  +      nginx = mkOption {
  +        type = types.submodule (
  +          recursiveUpdate
  +            (import ../web-servers/nginx/vhost-options.nix { inherit config lib; })
  +            {
  +              # Enable encryption by default,
  +              options.forceSSL.default = true;
  +              options.enableACME.default = true;
  +            }
  +        );
  +        default = {forceSSL = true; enableACME = true;};
  +        example = {
  +          serverAliases = [
  +            "wiki.\${config.networking.domain}"
  +          ];
  +          enableACME = false;
  +        };
  +        description = ''
  +          With this option, you can customize the nginx virtualHost which already has sensible defaults for DokuWiki.
  +        '';
  +      };
       };
  -
  -    hostName = mkOption {
  -      type = types.str;
  -      default = "localhost";
  -      description = "FQDN for the instance.";
  -    };
  -
  -    stateDir = mkOption {
  -      type = types.path;
  -      default = "/var/lib/dokuwiki/${name}/data";
  -      description = "Location of the dokuwiki state directory.";
  -    };
  -
  -    acl = mkOption {
  -      type = types.nullOr types.lines;
  -      default = null;
  -      example = "*               @ALL               8";
  -      description = ''
  -        Access Control Lists: see <link xlink:href="https://www.dokuwiki.org/acl"/>
  -        Mutually exclusive with services.dokuwiki.aclFile
  -        Set this to a value other than null to take precedence over aclFile option.
  -      '';
  -    };
  -
  -    aclFile = mkOption {
  -      type = types.nullOr types.path;
  -      default = null;
  -      description = ''
  -        Location of the dokuwiki acl rules. Mutually exclusive with services.dokuwiki.acl
  -        Mutually exclusive with services.dokuwiki.acl which is preferred.
  -        Consult documentation <link xlink:href="https://www.dokuwiki.org/acl"/> for further instructions.
  -        Example: <link xlink:href="https://github.com/splitbrain/dokuwiki/blob/master/conf/acl.auth.php.dist"/>
  -      '';
  -    };
  -
  -    aclUse = mkOption {
  -      type = types.bool;
  -      default = true;
  -      description = ''
  -        Necessary for users to log in into the system.
  -        Also limits anonymous users. When disabled,
  -        everyone is able to create and edit content.
  -      '';
  -    };
  -
  -    pluginsConfig = mkOption {
  -      type = types.lines;
  -      default = ''
  -        $plugins['authad'] = 0;
  -        $plugins['authldap'] = 0;
  -        $plugins['authmysql'] = 0;
  -        $plugins['authpgsql'] = 0;
  -      '';
  -      description = ''
  -        List of the dokuwiki (un)loaded plugins.
  -      '';
  -    };
  -
  -    superUser = mkOption {
  -      type = types.nullOr types.str;
  -      default = "@admin";
  -      description = ''
  -        You can set either a username, a list of usernames (“admin1,admin2”), 
  -        or the name of a group by prepending an @ char to the groupname
  -        Consult documentation <link xlink:href="https://www.dokuwiki.org/config:superuser"/> for further instructions.
  -      '';
  -    };
  -
  -    usersFile = mkOption {
  -      type = types.nullOr types.path;
  -      default = null;
  -      description = ''
  -        Location of the dokuwiki users file. List of users. Format:
  -        login:passwordhash:Real Name:email:groups,comma,separated 
  -        Create passwordHash easily by using:$ mkpasswd -5 password `pwgen 8 1`
  -        Example: <link xlink:href="https://github.com/splitbrain/dokuwiki/blob/master/conf/users.auth.php.dist"/>
  -        '';
  -    };
  -
  -    extraConfig = mkOption {
  -      type = types.nullOr types.lines;
  -      default = null;
  -      example = ''
  -        $conf['title'] = 'My Wiki';
  -        $conf['userewrite'] = 1;
  -      '';
  -      description = ''
  -        DokuWiki configuration. Refer to
  -        <link xlink:href="https://www.dokuwiki.org/config"/>
  -        for details on supported values.
  -      '';
  -    };
  -
  -    poolConfig = mkOption {
  -      type = with types; attrsOf (oneOf [ str int bool ]);
  -      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 the dokuwiki PHP pool. See the documentation on <literal>php-fpm.conf</literal>
  -        for details on configuration directives.
  -      '';
  -    };
  -
  -    nginx = mkOption {
  -      type = types.submodule (
  -        recursiveUpdate
  -          (import ../web-servers/nginx/vhost-options.nix { inherit config lib; })
  -          {
  -            # Enable encryption by default,
  -            options.forceSSL.default = true;
  -            options.enableACME.default = true;
  -          }
  -      );
  -      default = {forceSSL = true; enableACME = true;};
  -      example = {
  -        serverAliases = [
  -          "wiki.\${config.networking.domain}"
  -        ];
  -        enableACME = false;
  -      };
  -      description = ''
  -        With this option, you can customize the nginx virtualHost which already has sensible defaults for DokuWiki.
  -      '';
  -    };
  -  };
     };
   in
   {
  
positive.code: 
      services.nginx = {
        enable = true;
        
         virtualHosts = mapAttrs (hostName: cfg:  mkMerge [ cfg.nginx {
            root = mkForce "${pkg hostName cfg}/share/dokuwiki/";
            extraConfig = "fastcgi_param HTTPS on;";
  
            locations."~ /(conf/|bin/|inc/|install.php)" = {
              extraConfig = "deny all;";
            };
  
            locations."~ ^/data/" = {
              root = "${cfg.stateDir}";
              extraConfig = "internal;";
            };
  
            locations."~ ^/lib.*\.(js|css|gif|png|ico|jpg|jpeg)$" = {
              extraConfig = "expires 365d;";
            };
  
            locations."/" = {
              priority = 1;
              index = "doku.php";
              extraConfig = ''try_files $uri $uri/ @dokuwiki;'';
            };
  
            locations."@dokuwiki" = {
              extraConfig = ''
                # rewrites "doku.php/" out of the URLs if you set the userwrite setting to .htaccess in dokuwiki config page
                rewrite ^/_media/(.*) /lib/exe/fetch.php?media=$1 last;
                rewrite ^/_detail/(.*) /lib/exe/detail.php?media=$1 last;
                rewrite ^/_export/([^/]+)/(.*) /doku.php?do=export_$1&id=$2 last;
                rewrite ^/(.*) /doku.php?id=$1&$args last;
              '';
            };
  
            locations."~ \.php$" = {
              extraConfig = ''
                try_files $uri $uri/ /doku.php;
                include ${pkgs.nginx}/conf/fastcgi_params;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                fastcgi_param REDIRECT_STATUS 200;
                fastcgi_pass unix:${config.services.phpfpm.pools."dokuwiki-${hostName}".socket};
                fastcgi_param HTTPS on;
              '';
            };
          }]) eachSite;
        };
  
      systemd.tmpfiles.rules = flatten (mapAttrsToList (hostName: cfg: [
        "d ${stateDir cfg}/attic 0750 ${user} ${group} - -"
  
negative.code:       "d ${stateDir cfg}/pages 0750 ${user} ${group} - -"
        "d ${stateDir cfg}/tmp 0750 ${user} ${group} - -"
      ]) eachSite);
    };
  }
  