| 
									
										
										
										
											2017-09-27 17:30:49 +01:00
										 |  |  | { config, lib, pkgs, ... }: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | with lib; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | let | 
					
						
							|  |  |  |   cfg = config.services.traefik; | 
					
						
							| 
									
										
										
										
											2017-10-04 11:47:34 +01:00
										 |  |  |   configFile = | 
					
						
							|  |  |  |     if cfg.configFile == null then | 
					
						
							|  |  |  |       pkgs.runCommand "config.toml" { | 
					
						
							|  |  |  |         buildInputs = [ pkgs.remarshal ]; | 
					
						
							| 
									
										
										
										
											2018-11-08 11:59:03 +01:00
										 |  |  |         preferLocalBuild = true; | 
					
						
							| 
									
										
										
										
											2017-10-04 11:47:34 +01:00
										 |  |  |       } ''
 | 
					
						
							|  |  |  |         remarshal -if json -of toml \ | 
					
						
							|  |  |  |           < ${pkgs.writeText "config.json" (builtins.toJSON cfg.configOptions)} \ | 
					
						
							|  |  |  |           > $out | 
					
						
							|  |  |  |       ''
 | 
					
						
							|  |  |  |     else cfg.configFile; | 
					
						
							| 
									
										
										
										
											2017-09-27 17:30:49 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | in { | 
					
						
							|  |  |  |   options.services.traefik = { | 
					
						
							|  |  |  |     enable = mkEnableOption "Traefik web server"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     configFile = mkOption { | 
					
						
							|  |  |  |       default = null; | 
					
						
							| 
									
										
										
										
											2017-10-04 14:51:20 +01:00
										 |  |  |       example = literalExample "/path/to/config.toml"; | 
					
						
							| 
									
										
										
										
											2017-09-27 17:30:49 +01:00
										 |  |  |       type = types.nullOr types.path; | 
					
						
							| 
									
										
										
										
											2017-10-04 11:47:34 +01:00
										 |  |  |       description = ''
 | 
					
						
							|  |  |  |         Path to verbatim traefik.toml to use. | 
					
						
							|  |  |  |         (Using that option has precedence over <literal>configOptions</literal>) | 
					
						
							|  |  |  |       '';
 | 
					
						
							| 
									
										
										
										
											2017-09-27 17:30:49 +01:00
										 |  |  |     }; | 
					
						
							| 
									
										
										
										
											2017-10-04 11:47:34 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-27 17:30:49 +01:00
										 |  |  |     configOptions = mkOption { | 
					
						
							|  |  |  |       description = ''
 | 
					
						
							|  |  |  |         Config for Traefik. | 
					
						
							|  |  |  |       '';
 | 
					
						
							|  |  |  |       type = types.attrs; | 
					
						
							| 
									
										
										
										
											2017-10-04 11:47:34 +01:00
										 |  |  |       default = { | 
					
						
							|  |  |  |         defaultEntryPoints = ["http"]; | 
					
						
							|  |  |  |         entryPoints.http.address = ":80"; | 
					
						
							|  |  |  |       }; | 
					
						
							| 
									
										
										
										
											2017-09-27 17:30:49 +01:00
										 |  |  |       example = { | 
					
						
							|  |  |  |         defaultEntrypoints = [ "http" ]; | 
					
						
							| 
									
										
										
										
											2017-10-04 11:47:34 +01:00
										 |  |  |         web.address = ":8080"; | 
					
						
							|  |  |  |         entryPoints.http.address = ":80"; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-27 17:30:49 +01:00
										 |  |  |         file = {}; | 
					
						
							|  |  |  |         frontends = { | 
					
						
							|  |  |  |           frontend1 = { | 
					
						
							|  |  |  |             backend = "backend1"; | 
					
						
							| 
									
										
										
										
											2017-10-04 11:47:34 +01:00
										 |  |  |             routes.test_1.rule = "Host:localhost"; | 
					
						
							| 
									
										
										
										
											2017-09-27 17:30:49 +01:00
										 |  |  |           }; | 
					
						
							|  |  |  |         }; | 
					
						
							| 
									
										
										
										
											2017-10-04 11:47:34 +01:00
										 |  |  |         backends.backend1 = { | 
					
						
							|  |  |  |           servers.server1.url = "http://localhost:8000"; | 
					
						
							| 
									
										
										
										
											2017-09-27 17:30:49 +01:00
										 |  |  |         }; | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     dataDir = mkOption { | 
					
						
							|  |  |  |       default = "/var/lib/traefik"; | 
					
						
							|  |  |  |       type = types.path; | 
					
						
							|  |  |  |       description = ''
 | 
					
						
							|  |  |  |       Location for any persistent data traefik creates, ie. acme | 
					
						
							|  |  |  |       '';
 | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-09 12:37:29 +03:00
										 |  |  |     group = mkOption { | 
					
						
							|  |  |  |       default = "traefik"; | 
					
						
							| 
									
										
										
										
											2019-08-08 22:48:27 +02:00
										 |  |  |       type = types.str; | 
					
						
							| 
									
										
										
										
											2018-02-09 12:37:29 +03:00
										 |  |  |       example = "docker"; | 
					
						
							|  |  |  |       description = ''
 | 
					
						
							|  |  |  |         Set the group that traefik runs under. | 
					
						
							|  |  |  |         For the docker backend this needs to be set to <literal>docker</literal> instead. | 
					
						
							|  |  |  |       '';
 | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-27 17:30:49 +01:00
										 |  |  |     package = mkOption { | 
					
						
							|  |  |  |       default = pkgs.traefik; | 
					
						
							|  |  |  |       defaultText = "pkgs.traefik"; | 
					
						
							|  |  |  |       type = types.package; | 
					
						
							|  |  |  |       description = "Traefik package to use."; | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   config = mkIf cfg.enable { | 
					
						
							| 
									
										
										
										
											2019-02-24 08:04:49 -05:00
										 |  |  |     systemd.tmpfiles.rules = [ | 
					
						
							|  |  |  |       "d '${cfg.dataDir}' 0700 traefik traefik - -" | 
					
						
							|  |  |  |     ]; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-27 17:30:49 +01:00
										 |  |  |     systemd.services.traefik = { | 
					
						
							|  |  |  |       description = "Traefik web server"; | 
					
						
							|  |  |  |       after = [ "network-online.target" ]; | 
					
						
							|  |  |  |       wantedBy = [ "multi-user.target" ]; | 
					
						
							|  |  |  |       serviceConfig = { | 
					
						
							|  |  |  |         ExecStart = ''${cfg.package.bin}/bin/traefik --configfile=${configFile}''; | 
					
						
							|  |  |  |         Type = "simple"; | 
					
						
							|  |  |  |         User = "traefik"; | 
					
						
							| 
									
										
										
										
											2018-02-09 12:37:29 +03:00
										 |  |  |         Group = cfg.group; | 
					
						
							| 
									
										
										
										
											2017-09-27 17:30:49 +01:00
										 |  |  |         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; | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-30 01:58:35 +02:00
										 |  |  |     users.users.traefik = { | 
					
						
							| 
									
										
										
										
											2017-09-27 17:30:49 +01:00
										 |  |  |       group = "traefik"; | 
					
						
							|  |  |  |       home = cfg.dataDir; | 
					
						
							|  |  |  |       createHome = true; | 
					
						
							| 
									
										
										
										
											2019-10-12 22:25:28 +02:00
										 |  |  |       isSystemUser = true; | 
					
						
							| 
									
										
										
										
											2017-09-27 17:30:49 +01:00
										 |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-30 01:58:35 +02:00
										 |  |  |     users.groups.traefik = {}; | 
					
						
							| 
									
										
										
										
											2017-09-27 17:30:49 +01:00
										 |  |  |   }; | 
					
						
							|  |  |  | } |