{ config, lib, pkgs, ... }: with lib; let cfg = config.hacc.websites; in { options.hacc.websites = { enable = mkOption { type = types.bool; default = false; }; directory = mkOption { type = types.path; description = "all subdirectories of the given path are expected to contain a (static) website"; }; ignore = mkOption { type = types.listOf types.str; default = []; description = "subdirectories that shouldn't be published"; }; }; config = mkIf cfg.enable { services.nginx = { enable = true; virtualHosts = let subdirs = let dirAttrs = filterAttrs (n: v: v == "directory" || lists.elem n cfg.ignore) (builtins.readDir cfg.directory); in mapAttrsToList (n: v: n) dirAttrs; mkWebsite = subdir: { name = subdir; # the nginx virtualhost config (for all sites) goes in here value = { enableACME = true; forceSSL = true; # naive string interpolation is safe here since nix will always immediately # resolve relative paths to absolute paths; it's not lazy about that. locations."/".root = (pkgs.callPackage "${cfg.directory}/${subdir}" {}).outPath; }; }; in listToAttrs (map mkWebsite subdirs); }; }; }