2017-09-27 16:30:49 +00:00
|
|
|
{ config, lib, pkgs, ... }:
|
|
|
|
|
|
|
|
with lib;
|
|
|
|
|
|
|
|
let
|
|
|
|
cfg = config.services.traefik;
|
2017-10-04 10:47:34 +00:00
|
|
|
configFile =
|
|
|
|
if cfg.configFile == null then
|
|
|
|
pkgs.runCommand "config.toml" {
|
|
|
|
buildInputs = [ pkgs.remarshal ];
|
|
|
|
} ''
|
|
|
|
remarshal -if json -of toml \
|
|
|
|
< ${pkgs.writeText "config.json" (builtins.toJSON cfg.configOptions)} \
|
|
|
|
> $out
|
|
|
|
''
|
|
|
|
else cfg.configFile;
|
2017-09-27 16:30:49 +00:00
|
|
|
|
|
|
|
in {
|
|
|
|
options.services.traefik = {
|
|
|
|
enable = mkEnableOption "Traefik web server";
|
|
|
|
|
|
|
|
configFile = mkOption {
|
|
|
|
default = null;
|
|
|
|
example = /path/to/config.toml;
|
|
|
|
type = types.nullOr types.path;
|
2017-10-04 10:47:34 +00:00
|
|
|
description = ''
|
|
|
|
Path to verbatim traefik.toml to use.
|
|
|
|
(Using that option has precedence over <literal>configOptions</literal>)
|
|
|
|
'';
|
2017-09-27 16:30:49 +00:00
|
|
|
};
|
2017-10-04 10:47:34 +00:00
|
|
|
|
2017-09-27 16:30:49 +00:00
|
|
|
configOptions = mkOption {
|
|
|
|
description = ''
|
|
|
|
Config for Traefik.
|
|
|
|
'';
|
|
|
|
type = types.attrs;
|
2017-10-04 10:47:34 +00:00
|
|
|
default = {
|
|
|
|
defaultEntryPoints = ["http"];
|
|
|
|
entryPoints.http.address = ":80";
|
|
|
|
};
|
2017-09-27 16:30:49 +00:00
|
|
|
example = {
|
|
|
|
defaultEntrypoints = [ "http" ];
|
2017-10-04 10:47:34 +00:00
|
|
|
web.address = ":8080";
|
|
|
|
entryPoints.http.address = ":80";
|
|
|
|
|
2017-09-27 16:30:49 +00:00
|
|
|
file = {};
|
|
|
|
frontends = {
|
|
|
|
frontend1 = {
|
|
|
|
backend = "backend1";
|
2017-10-04 10:47:34 +00:00
|
|
|
routes.test_1.rule = "Host:localhost";
|
2017-09-27 16:30:49 +00:00
|
|
|
};
|
|
|
|
};
|
2017-10-04 10:47:34 +00:00
|
|
|
backends.backend1 = {
|
|
|
|
servers.server1.url = "http://localhost:8000";
|
2017-09-27 16:30:49 +00:00
|
|
|
};
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
dataDir = mkOption {
|
|
|
|
default = "/var/lib/traefik";
|
|
|
|
type = types.path;
|
|
|
|
description = ''
|
|
|
|
Location for any persistent data traefik creates, ie. acme
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
|
|
|
|
package = mkOption {
|
|
|
|
default = pkgs.traefik;
|
|
|
|
defaultText = "pkgs.traefik";
|
|
|
|
type = types.package;
|
|
|
|
description = "Traefik package to use.";
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
config = mkIf cfg.enable {
|
|
|
|
systemd.services.traefik = {
|
|
|
|
description = "Traefik web server";
|
|
|
|
after = [ "network-online.target" ];
|
|
|
|
wantedBy = [ "multi-user.target" ];
|
|
|
|
serviceConfig = {
|
2017-10-04 10:47:34 +00:00
|
|
|
PermissionsStartOnly = true;
|
2017-09-27 16:30:49 +00:00
|
|
|
ExecStart = ''${cfg.package.bin}/bin/traefik --configfile=${configFile}'';
|
2017-10-04 10:47:34 +00:00
|
|
|
ExecStartPre = [
|
|
|
|
''${pkgs.coreutils}/bin/mkdir -p "${cfg.dataDir}"''
|
|
|
|
''${pkgs.coreutils}/bin/install -d -m700 --owner traefik --group traefik "${cfg.dataDir}"''
|
|
|
|
];
|
2017-09-27 16:30:49 +00:00
|
|
|
Type = "simple";
|
|
|
|
User = "traefik";
|
|
|
|
Group = "traefik";
|
|
|
|
Restart = "on-failure";
|
|
|
|
StartLimitInterval = 86400;
|
|
|
|
StartLimitBurst = 5;
|
|
|
|
AmbientCapabilities = "cap_net_bind_service";
|
|
|
|
CapabilityBoundingSet = "cap_net_bind_service";
|
|
|
|
NoNewPrivileges = true;
|
|
|
|
LimitNPROC = 64;
|
|
|
|
LimitNOFILE = 1048576;
|
|
|
|
PrivateTmp = true;
|
|
|
|
PrivateDevices = true;
|
|
|
|
ProtectHome = true;
|
|
|
|
ProtectSystem = "full";
|
|
|
|
ReadWriteDirectories = cfg.dataDir;
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
users.extraUsers.traefik = {
|
|
|
|
group = "traefik";
|
|
|
|
home = cfg.dataDir;
|
|
|
|
createHome = true;
|
|
|
|
};
|
|
|
|
|
|
|
|
users.extraGroups.traefik = {};
|
|
|
|
};
|
|
|
|
}
|