nixos/foswiki: basic working service definition

Activation is as simple as:
services.httpd = {
enable = true;
adminAddr = "nobody@example.com";
extraSubservices = [ {
serviceType = "foswiki";
} ];
};

+78
+78
nixos/modules/services/web-servers/apache-httpd/foswiki.nix
··· 1 + { config, pkgs, lib, serverInfo, ... }: 2 + let 3 + inherit (pkgs) foswiki; 4 + inherit (serverInfo.serverConfig) user group; 5 + inherit (config) vardir; 6 + in 7 + { 8 + options.vardir = lib.mkOption { 9 + type = lib.types.path; 10 + default = "/var/www/foswiki"; 11 + description = "The directory where variable foswiki data will be stored and served from."; 12 + }; 13 + 14 + # TODO: this will probably need to be better customizable 15 + extraConfig = 16 + let httpd-conf = pkgs.runCommand "foswiki-httpd.conf" 17 + { preferLocalBuild = true; } 18 + '' 19 + substitute '${foswiki}/foswiki_httpd_conf.txt' "$out" \ 20 + --replace /var/www/foswiki/ "${vardir}/" 21 + ''; 22 + in 23 + '' 24 + RewriteEngine on 25 + RewriteRule /foswiki/(.*) ${vardir}/$1 26 + 27 + <Directory "${vardir}"> 28 + Require all granted 29 + </Directory> 30 + 31 + Include ${httpd-conf} 32 + <Directory "${vardir}/pub"> 33 + Options FollowSymlinks 34 + </Directory> 35 + ''; 36 + 37 + /** This handles initial setup and updates. 38 + It will probably need some tweaking, maybe per-site. */ 39 + startupScript = pkgs.writeScript "foswiki_startup.sh" ( 40 + let storeLink = "${vardir}/package"; in 41 + '' 42 + [ -e '${storeLink}' ] || needs_setup=1 43 + mkdir -p '${vardir}' 44 + cd '${vardir}' 45 + ln -sf -T '${foswiki}' '${storeLink}' 46 + 47 + if [ -n "$needs_setup" ]; then # do initial setup 48 + mkdir -p bin lib 49 + # setup most of data/ as copies only 50 + cp -r '${foswiki}'/data '${vardir}/' 51 + rm -r '${vardir}'/data/{System,mime.types} 52 + ln -sr -t '${vardir}/data/' '${storeLink}'/data/{System,mime.types} 53 + 54 + ln -sr '${storeLink}/locale' . 55 + 56 + mkdir pub 57 + ln -sr '${storeLink}/pub/System' pub/ 58 + 59 + mkdir templates 60 + ln -sr '${storeLink}'/templates/* templates/ 61 + 62 + ln -sr '${storeLink}/tools' . 63 + 64 + mkdir -p '${vardir}'/working/{logs,tmp} 65 + ln -sr '${storeLink}/working/README' working/ # used to check dir validity 66 + 67 + chown -R '${user}:${group}' . 68 + chmod +w -R . 69 + fi 70 + 71 + # bin/* and lib/* shall always be overwritten, in case files are added 72 + ln -srf '${storeLink}'/bin/* '${vardir}/bin/' 73 + ln -srf '${storeLink}'/lib/* '${vardir}/lib/' 74 + '' 75 + /* Symlinking bin/ one-by-one ensures that ${vardir}/lib/LocalSite.cfg 76 + is used instead of ${foswiki}/... */ 77 + ); 78 + }