nixos/preload: init
[NixPkgs.git] / nixos / modules / services / web-servers / static-web-server.nix
blob07187f00feccb6d9b4751f9860369e4570ba7b1e
1 { config, lib, pkgs, ... }:
3 let
4   cfg = config.services.static-web-server;
5   toml = pkgs.formats.toml {};
6   configFilePath = toml.generate "config.toml" cfg.configuration;
7 in {
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   };
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   };
67   meta.maintainers = with lib.maintainers; [ mac-chaffee ];