1{ config, lib, pkgs, ...}:
2let
3 cfg = config.services.varnish;
4
5in
6with lib;
7{
8 options = {
9 services.varnish = {
10 enable = mkOption {
11 default = false;
12 description = "
13 Enable the Varnish Server.
14 ";
15 };
16
17 http_address = mkOption {
18 default = "*:6081";
19 description = "
20 HTTP listen address and port.
21 ";
22 };
23
24 config = mkOption {
25 description = "
26 Verbatim default.vcl configuration.
27 ";
28 };
29
30 stateDir = mkOption {
31 default = "/var/spool/varnish/${config.networking.hostName}";
32 description = "
33 Directory holding all state for Varnish to run.
34 ";
35 };
36 };
37
38 };
39
40 config = mkIf cfg.enable {
41
42 systemd.services.varnish = {
43 description = "Varnish";
44 wantedBy = [ "multi-user.target" ];
45 preStart = ''
46 mkdir -p ${cfg.stateDir}
47 chown -R varnish:varnish ${cfg.stateDir}
48 '';
49 postStop = ''
50 rm -rf ${cfg.stateDir}
51 '';
52 path = [ pkgs.gcc ];
53 serviceConfig.ExecStart = "${pkgs.varnish}/sbin/varnishd -a ${cfg.http_address} -f ${pkgs.writeText "default.vcl" cfg.config} -n ${cfg.stateDir} -u varnish";
54 serviceConfig.Type = "forking";
55 };
56
57 environment.systemPackages = [ pkgs.varnish ];
58
59 users.extraUsers.varnish = {
60 group = "varnish";
61 uid = config.ids.uids.varnish;
62 };
63
64 users.extraGroups.varnish.gid = config.ids.uids.varnish;
65 };
66}