80 lines
		
	
	
	
		
			2.8 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
			
		
		
	
	
			80 lines
		
	
	
	
		
			2.8 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
| {
 | |
|   config,
 | |
|   lib,
 | |
|   ook,
 | |
|   self,
 | |
|   ...
 | |
| }: let
 | |
|   ookflixLib = import ../lib.nix {inherit self lib config;};
 | |
|   inherit (ookflixLib) mkServiceUser mkServiceSecret mkServiceStateDir mkServiceStateFile;
 | |
|   inherit (lib) mkIf;
 | |
|   inherit (ook.lib.container) mkContainerEnvironment mkContainerLabel mkContainerPort;
 | |
|   inherit (config.ooknet) server;
 | |
|   inherit (config.ooknet.server.ookflix.services) traefik;
 | |
|   inherit (config.ooknet.host) admin;
 | |
| in {
 | |
|   config = mkIf traefik.enable {
 | |
|     users = mkServiceUser traefik.user.name;
 | |
|     systemd.tmpfiles.settings = {
 | |
|       traefikStateDir = mkServiceStateDir "traefik";
 | |
|       traefikAcmeFile = mkServiceStateFile "traefik" "acme.json";
 | |
|     };
 | |
|     age.secrets = mkServiceSecret "cf_creds" "traefik";
 | |
|     virtualisation.oci-containers.containers = {
 | |
|       # vpn container
 | |
|       traefik = mkIf traefik.enable {
 | |
|         autoStart = true;
 | |
|         image = "traefik:3.0";
 | |
|         # should make this an option.
 | |
|         volumes = [
 | |
|           "/run/podman/podman.sock:/var/run/docker.sock:ro"
 | |
|           "${traefik.stateDir}/acme.json:/acme.json"
 | |
|         ];
 | |
|         ports = [
 | |
|           "80:80"
 | |
|           "443:443"
 | |
|           (mkContainerPort traefik.port)
 | |
|         ];
 | |
|         environmentFiles = [config.age.secrets.cf_creds.path];
 | |
|         extraOptions = ["--security-opt=no-new-privileges:true"];
 | |
|         cmd = [
 | |
|           "--log.level=DEBUG"
 | |
|           "--api.insecure=true"
 | |
|           "--api.dashboard=true"
 | |
|           "--providers.docker=true"
 | |
|           "--providers.docker.exposedbydefault=false"
 | |
| 
 | |
|           "--certificatesresolvers.letsencrypt.acme.email=${admin.email}"
 | |
|           "--certificatesresolvers.letsencrypt.acme.storage=/acme.json"
 | |
|           "--certificatesresolvers.letsencrypt.acme.dnschallenge=true"
 | |
|           "--certificatesresolvers.letsencrypt.acme.dnschallenge.provider=cloudflare"
 | |
| 
 | |
|           "--entrypoints.web.address=:80"
 | |
|           "--entrypoints.websecure.address=:443"
 | |
|           "--entrypoints.traefik.address=:${toString traefik.port}"
 | |
| 
 | |
|           "--entrypoints.websecure.forwardedHeaders.trustedIPs=103.21.244.0/22,103.22.200.0/22,103.31.4.0/22" # Cloudflare IPs
 | |
| 
 | |
|           "--entrypoints.web.http.redirections.entrypoint.to=websecure"
 | |
|           "--entrypoints.web.http.redirections.entrypoint.scheme=https"
 | |
| 
 | |
|           "--entrypoints.websecure.http.tls=true"
 | |
|           "--entrypoints.websecure.http.tls.certResolver=letsencrypt"
 | |
|           "--entrypoints.websecure.http.tls.domains[0].main=${server.domain}"
 | |
|           "--entrypoints.websecure.http.tls.domains[0].sans=*.${server.domain}"
 | |
|         ];
 | |
| 
 | |
|         labels = mkContainerLabel {
 | |
|           name = "traefik";
 | |
|           inherit (traefik) domain port;
 | |
|           homepage = {
 | |
|             group = "proxy";
 | |
|             description = "reverse proxy";
 | |
|           };
 | |
|         };
 | |
| 
 | |
|         environment = mkContainerEnvironment traefik.user.id traefik.group.id;
 | |
|       };
 | |
|     };
 | |
|   };
 | |
| }
 |