summary refs log tree commit diff
path: root/nixos/modules/services/web-servers/mighttpd2.nix
blob: f9b1a8b6cccef4c77bd6cb236038e8faf881224e (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
{ config, lib, pkgs, ... }:

with lib;

let
  cfg = config.services.mighttpd2;
  configFile = pkgs.writeText "mighty-config" cfg.config;
  routingFile = pkgs.writeText "mighty-routing" cfg.routing;
in {
  options.services.mighttpd2 = {
    enable = mkEnableOption "Mighttpd2 web server";

    config = mkOption {
      default = "";
      example = ''
        # Example configuration for Mighttpd 2
        Port: 80
        # IP address or "*"
        Host: *
        Debug_Mode: Yes # Yes or No
        # If available, "nobody" is much more secure for User:.
        User: root
        # If available, "nobody" is much more secure for Group:.
        Group: root
        Pid_File: /run/mighty.pid
        Logging: Yes # Yes or No
        Log_File: /var/log/mighty # The directory must be writable by User:
        Log_File_Size: 16777216 # bytes
        Log_Backup_Number: 10
        Index_File: index.html
        Index_Cgi: index.cgi
        Status_File_Dir: /usr/local/share/mighty/status
        Connection_Timeout: 30 # seconds
        Fd_Cache_Duration: 10 # seconds
        # Server_Name: Mighttpd/3.x.y
        Tls_Port: 443
        Tls_Cert_File: cert.pem # should change this with an absolute path
        # should change this with comma-separated absolute paths
        Tls_Chain_Files: chain.pem
        # Currently, Tls_Key_File must not be encrypted.
        Tls_Key_File: privkey.pem # should change this with an absolute path
        Service: 0 # 0 is HTTP only, 1 is HTTPS only, 2 is both
      '';
      type = types.lines;
      description = ''
        Verbatim config file to use
        (see http://www.mew.org/~kazu/proj/mighttpd/en/config.html)
      '';
    };

    routing = mkOption {
      default = "";
      example = ''
        # Example routing for Mighttpd 2

        # Domain lists
        [localhost www.example.com]

        # Entries are looked up in the specified order
        # All paths must end with "/"

        # A path to CGI scripts should be specified with "=>"
        /~alice/cgi-bin/ => /home/alice/public_html/cgi-bin/

        # A path to static files should be specified with "->"
        /~alice/         -> /home/alice/public_html/
        /cgi-bin/        => /export/cgi-bin/

        # Reverse proxy rules should be specified with ">>"
        # /path >> host:port/path2
        # Either "host" or ":port" can be committed, but not both.
        /app/cal/        >> example.net/calendar/
        # Yesod app in the same server
        /app/wiki/       >> 127.0.0.1:3000/

        /                -> /export/www/
      '';
      type = types.lines;
      description = ''
        Verbatim routing file to use
        (see http://www.mew.org/~kazu/proj/mighttpd/en/config.html)
      '';
    };

    cores = mkOption {
      default = null;
      type = types.nullOr types.int;
      description = ''
        How many cores to use.
        If null it will be determined automatically
      '';
    };

  };

  config = mkIf cfg.enable {
    assertions =
      [ { assertion = cfg.routing != "";
          message = "You need at least one rule in mighttpd2.routing";
        }
      ];
    systemd.services.mighttpd2 = {
      description = "Mighttpd2 web server";
      after = [ "network-online.target" ];
      wantedBy = [ "multi-user.target" ];
      serviceConfig = {
        ExecStart = ''
          ${pkgs.haskellPackages.mighttpd2}/bin/mighty \
            ${configFile} \
            ${routingFile} \
            +RTS -N${optionalString (cfg.cores != null) "${cfg.cores}"}
        '';
        Type = "simple";
        User = "mighttpd2";
        Group = "mighttpd2";
        Restart = "on-failure";
        AmbientCapabilities = "cap_net_bind_service";
        CapabilityBoundingSet = "cap_net_bind_service";
      };
    };

    users.users.mighttpd2 = {
      group = "mighttpd2";
      uid = config.ids.uids.mighttpd2;
      isSystemUser = true;
    };

    users.groups.mighttpd2.gid = config.ids.gids.mighttpd2;
  };

  meta.maintainers = with lib.maintainers; [ fgaz ];
}