at 23.11-beta 2.7 kB view raw
1{ config, lib, pkgs, ... }: 2 3let 4 cfg = config.services.static-web-server; 5 toml = pkgs.formats.toml {}; 6 configFilePath = toml.generate "config.toml" cfg.configuration; 7in { 8 options = { 9 services.static-web-server = { 10 enable = lib.mkEnableOption (lib.mdDoc ''Static Web Server''); 11 listen = lib.mkOption { 12 default = "[::]:8787"; 13 type = lib.types.str; 14 description = lib.mdDoc '' 15 The "ListenStream" used in static-web-server.socket. 16 This is equivalent to SWS's "host" and "port" options. 17 See here for specific syntax: <https://www.freedesktop.org/software/systemd/man/systemd.socket.html#ListenStream=> 18 ''; 19 }; 20 root = lib.mkOption { 21 type = lib.types.path; 22 description = lib.mdDoc '' 23 The location of files for SWS to serve. Equivalent to SWS's "root" config value. 24 NOTE: This folder must exist before starting SWS. 25 ''; 26 }; 27 configuration = lib.mkOption { 28 default = { }; 29 type = toml.type; 30 example = { 31 general = { log-level = "error"; directory-listing = true; }; 32 }; 33 description = lib.mdDoc '' 34 Configuration for Static Web Server. See 35 <https://static-web-server.net/configuration/config-file/>. 36 NOTE: Don't set "host", "port", or "root" here. They will be ignored. 37 Use the top-level "listen" and "root" options instead. 38 ''; 39 }; 40 }; 41 }; 42 43 config = lib.mkIf cfg.enable { 44 environment.systemPackages = [ pkgs.static-web-server ]; 45 systemd.packages = [ pkgs.static-web-server ]; 46 # Have to set wantedBy since systemd.packages ignores the "Install" section 47 systemd.sockets.static-web-server = { 48 wantedBy = [ "sockets.target" ]; 49 # Start with empty string to reset upstream option 50 listenStreams = [ "" cfg.listen ]; 51 }; 52 systemd.services.static-web-server = { 53 wantedBy = [ "multi-user.target" ]; 54 serviceConfig = { 55 # Remove upstream sample environment file; use config.toml exclusively 56 EnvironmentFile = [ "" ]; 57 ExecStart = [ "" "${pkgs.static-web-server}/bin/static-web-server --fd 0 --config-file ${configFilePath} --root ${cfg.root}" ]; 58 # Supplementary groups doesn't work unless we create the group ourselves 59 SupplementaryGroups = [ "" ]; 60 # If the user is serving files from their home dir, override ProtectHome to allow that 61 ProtectHome = if lib.hasPrefix "/home" cfg.root then "tmpfs" else "true"; 62 BindReadOnlyPaths = cfg.root; 63 }; 64 }; 65 }; 66 67 meta.maintainers = with lib.maintainers; [ mac-chaffee ]; 68}