···
1
+
{ config, lib, pkgs, ... }:
6
+
cfg = config.services.traefik;
8
+
if cfg.configFile == null then
9
+
pkgs.runCommand "config.toml" {
10
+
buildInputs = [ pkgs.remarshal ];
12
+
remarshal -if json -of toml \
13
+
< ${pkgs.writeText "config.json" (builtins.toJSON cfg.configOptions)} \
16
+
else cfg.configFile;
19
+
options.services.traefik = {
20
+
enable = mkEnableOption "Traefik web server";
22
+
configFile = mkOption {
24
+
example = /path/to/config.toml;
25
+
type = types.nullOr types.path;
27
+
Path to verbatim traefik.toml to use.
28
+
(Using that option has precedence over <literal>configOptions</literal>)
32
+
configOptions = mkOption {
38
+
defaultEntryPoints = ["http"];
39
+
entryPoints.http.address = ":80";
42
+
defaultEntrypoints = [ "http" ];
43
+
web.address = ":8080";
44
+
entryPoints.http.address = ":80";
49
+
backend = "backend1";
50
+
routes.test_1.rule = "Host:localhost";
53
+
backends.backend1 = {
54
+
servers.server1.url = "http://localhost:8000";
59
+
dataDir = mkOption {
60
+
default = "/var/lib/traefik";
63
+
Location for any persistent data traefik creates, ie. acme
67
+
package = mkOption {
68
+
default = pkgs.traefik;
69
+
defaultText = "pkgs.traefik";
70
+
type = types.package;
71
+
description = "Traefik package to use.";
75
+
config = mkIf cfg.enable {
76
+
systemd.services.traefik = {
77
+
description = "Traefik web server";
78
+
after = [ "network-online.target" ];
79
+
wantedBy = [ "multi-user.target" ];
81
+
PermissionsStartOnly = true;
82
+
ExecStart = ''${cfg.package.bin}/bin/traefik --configfile=${configFile}'';
84
+
''${pkgs.coreutils}/bin/mkdir -p "${cfg.dataDir}"''
85
+
''${pkgs.coreutils}/bin/install -d -m700 --owner traefik --group traefik "${cfg.dataDir}"''
90
+
Restart = "on-failure";
91
+
StartLimitInterval = 86400;
92
+
StartLimitBurst = 5;
93
+
AmbientCapabilities = "cap_net_bind_service";
94
+
CapabilityBoundingSet = "cap_net_bind_service";
95
+
NoNewPrivileges = true;
97
+
LimitNOFILE = 1048576;
99
+
PrivateDevices = true;
100
+
ProtectHome = true;
101
+
ProtectSystem = "full";
102
+
ReadWriteDirectories = cfg.dataDir;
106
+
users.extraUsers.traefik = {
108
+
home = cfg.dataDir;
112
+
users.extraGroups.traefik = {};