Activation is as simple as:
  services.httpd = {
    enable = true;
    adminAddr = "nobody@example.com";
    extraSubservices = [ {
      serviceType = "foswiki";
    } ];
  };
		
	
			
		
			
				
	
	
		
			79 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
			
		
		
	
	
			79 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
{ config, pkgs, lib, serverInfo, ... }:
 | 
						|
let
 | 
						|
  inherit (pkgs) foswiki;
 | 
						|
  inherit (serverInfo.serverConfig) user group;
 | 
						|
  inherit (config) vardir;
 | 
						|
in
 | 
						|
{
 | 
						|
  options.vardir = lib.mkOption {
 | 
						|
    type = lib.types.path;
 | 
						|
    default = "/var/www/foswiki";
 | 
						|
    description = "The directory where variable foswiki data will be stored and served from.";
 | 
						|
  };
 | 
						|
 | 
						|
  # TODO: this will probably need to be better customizable
 | 
						|
  extraConfig =
 | 
						|
    let httpd-conf = pkgs.runCommand "foswiki-httpd.conf"
 | 
						|
      { preferLocalBuild = true; }
 | 
						|
      ''
 | 
						|
        substitute '${foswiki}/foswiki_httpd_conf.txt' "$out" \
 | 
						|
          --replace /var/www/foswiki/ "${vardir}/"
 | 
						|
      '';
 | 
						|
    in
 | 
						|
      ''
 | 
						|
        RewriteEngine on
 | 
						|
        RewriteRule /foswiki/(.*) ${vardir}/$1
 | 
						|
 | 
						|
        <Directory "${vardir}">
 | 
						|
          Require all granted
 | 
						|
        </Directory>
 | 
						|
 | 
						|
        Include ${httpd-conf}
 | 
						|
        <Directory "${vardir}/pub">
 | 
						|
          Options FollowSymlinks
 | 
						|
        </Directory>
 | 
						|
      '';
 | 
						|
 | 
						|
  /** This handles initial setup and updates.
 | 
						|
      It will probably need some tweaking, maybe per-site.  */
 | 
						|
  startupScript = pkgs.writeScript "foswiki_startup.sh" (
 | 
						|
    let storeLink = "${vardir}/package"; in
 | 
						|
    ''
 | 
						|
      [ -e '${storeLink}' ] || needs_setup=1
 | 
						|
      mkdir -p '${vardir}'
 | 
						|
      cd '${vardir}'
 | 
						|
      ln -sf -T '${foswiki}' '${storeLink}'
 | 
						|
 | 
						|
      if [ -n "$needs_setup" ]; then # do initial setup
 | 
						|
        mkdir -p bin lib
 | 
						|
        # setup most of data/ as copies only
 | 
						|
        cp -r '${foswiki}'/data '${vardir}/'
 | 
						|
        rm -r '${vardir}'/data/{System,mime.types}
 | 
						|
        ln -sr -t '${vardir}/data/' '${storeLink}'/data/{System,mime.types}
 | 
						|
 | 
						|
        ln -sr '${storeLink}/locale' .
 | 
						|
 | 
						|
        mkdir pub
 | 
						|
        ln -sr '${storeLink}/pub/System' pub/
 | 
						|
 | 
						|
        mkdir templates
 | 
						|
        ln -sr '${storeLink}'/templates/* templates/
 | 
						|
 | 
						|
        ln -sr '${storeLink}/tools' .
 | 
						|
 | 
						|
        mkdir -p '${vardir}'/working/{logs,tmp}
 | 
						|
        ln -sr '${storeLink}/working/README' working/ # used to check dir validity
 | 
						|
 | 
						|
        chown -R '${user}:${group}' .
 | 
						|
        chmod +w -R .
 | 
						|
      fi
 | 
						|
 | 
						|
      # bin/* and lib/* shall always be overwritten, in case files are added
 | 
						|
      ln -srf '${storeLink}'/bin/* '${vardir}/bin/'
 | 
						|
      ln -srf '${storeLink}'/lib/* '${vardir}/lib/'
 | 
						|
    ''
 | 
						|
    /* Symlinking bin/ one-by-one ensures that ${vardir}/lib/LocalSite.cfg
 | 
						|
        is used instead of ${foswiki}/... */
 | 
						|
  );
 | 
						|
}
 |