ookflix: segment modules
This commit is contained in:
		
							parent
							
								
									4edb21607c
								
							
						
					
					
						commit
						bee284691a
					
				
					 21 changed files with 314 additions and 100 deletions
				
			
		|  | @ -1,15 +1,13 @@ | ||||||
| { | { | ||||||
|   imports = [ |   imports = [ | ||||||
|     ./jellyfin.nix |     ./streamers | ||||||
|     ./plex.nix |     ./monitors | ||||||
|     ./jellyseer.nix |     ./networking | ||||||
|     ./tautulli.nix |     ./downloading | ||||||
|     ./sonarr.nix |  | ||||||
|     ./prowlarr.nix |  | ||||||
|     ./gluetun.nix |  | ||||||
|     ./qbittorrent.nix |  | ||||||
|     ./shared.nix |  | ||||||
| 
 | 
 | ||||||
|  |     ./shared.nix | ||||||
|  |     ./podman.nix | ||||||
|     ./options.nix |     ./options.nix | ||||||
|  |     ./homepage.nix | ||||||
|   ]; |   ]; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -0,0 +1,9 @@ | ||||||
|  | { | ||||||
|  |   imports = [ | ||||||
|  |     ./sonarr.nix | ||||||
|  |     ./radarr.nix | ||||||
|  |     ./prowlarr.nix | ||||||
|  |     ./jellyseer.nix | ||||||
|  |     ./qbittorrent.nix | ||||||
|  |   ]; | ||||||
|  | } | ||||||
|  | @ -0,0 +1,38 @@ | ||||||
|  | { | ||||||
|  |   config, | ||||||
|  |   lib, | ||||||
|  |   ook, | ||||||
|  |   self, | ||||||
|  |   ... | ||||||
|  | }: let | ||||||
|  |   ookflixLib = import ../lib.nix {inherit lib config self;}; | ||||||
|  |   inherit (ookflixLib) mkServiceUser mkServiceStateDir; | ||||||
|  |   inherit (lib) mkIf; | ||||||
|  |   inherit (ook.lib.container) mkContainerLabel mkContainerEnvironment mkContainerPort; | ||||||
|  |   inherit (config.ooknet.server.ookflix) groups; | ||||||
|  |   inherit (config.ooknet.server.ookflix.services) jellyseerr; | ||||||
|  | in { | ||||||
|  |   config = mkIf jellyseerr.enable { | ||||||
|  |     # media requesting for jellyfin | ||||||
|  |     users = mkServiceUser jellyseerr.user.name; | ||||||
|  |     systemd.tmpfiles.settings.jellyseerrStateDir = mkServiceStateDir "jellyseerr"; | ||||||
|  |     virtualisation.oci-containers.containers = { | ||||||
|  |       jellyseerr = { | ||||||
|  |         image = "ghcr.io/hotio/jellyseerr"; | ||||||
|  |         autoStart = true; | ||||||
|  |         hostname = "jellyseerr"; | ||||||
|  |         ports = [(mkContainerPort jellyseerr.port)]; | ||||||
|  |         volumes = ["${jellyseerr.stateDir}:/config"]; | ||||||
|  |         labels = mkContainerLabel { | ||||||
|  |           name = "jellyseerr"; | ||||||
|  |           inherit (jellyseerr) domain port; | ||||||
|  |           homepage = { | ||||||
|  |             group = "media"; | ||||||
|  |             description = "media-server requesting"; | ||||||
|  |           }; | ||||||
|  |         }; | ||||||
|  |         environment = mkContainerEnvironment jellyseerr.user.id groups.media.id; | ||||||
|  |       }; | ||||||
|  |     }; | ||||||
|  |   }; | ||||||
|  | } | ||||||
|  | @ -5,7 +5,7 @@ | ||||||
|   self, |   self, | ||||||
|   ... |   ... | ||||||
| }: let | }: let | ||||||
|   ookflixLib = import ./lib.nix {inherit lib config self;}; |   ookflixLib = import ../lib.nix {inherit lib config self;}; | ||||||
|   inherit (ookflixLib) mkServiceUser mkServiceStateDir; |   inherit (ookflixLib) mkServiceUser mkServiceStateDir; | ||||||
|   inherit (lib) mkIf; |   inherit (lib) mkIf; | ||||||
|   inherit (ook.lib.container) mkContainerLabel mkContainerEnvironment mkContainerPort; |   inherit (ook.lib.container) mkContainerLabel mkContainerEnvironment mkContainerPort; | ||||||
|  | @ -14,7 +14,7 @@ | ||||||
| in { | in { | ||||||
|   config = mkIf prowlarr.enable { |   config = mkIf prowlarr.enable { | ||||||
|     users = mkServiceUser prowlarr.user.name; |     users = mkServiceUser prowlarr.user.name; | ||||||
|     systemd.tmpfiles = mkServiceStateDir "prowlarr" prowlarr.stateDir; |     systemd.tmpfiles.settings.prowlarrStateDir = mkServiceStateDir "prowlarr"; | ||||||
|     virtualisation.oci-containers.containers = { |     virtualisation.oci-containers.containers = { | ||||||
|       prowlarr = { |       prowlarr = { | ||||||
|         image = "lscr.io/linuxserver/prowlarr:latest"; |         image = "lscr.io/linuxserver/prowlarr:latest"; | ||||||
|  | @ -5,7 +5,7 @@ | ||||||
|   self, |   self, | ||||||
|   ... |   ... | ||||||
| }: let | }: let | ||||||
|   ookflixLib = import ./lib.nix {inherit lib config self;}; |   ookflixLib = import ../lib.nix {inherit lib config self;}; | ||||||
|   inherit (ookflixLib) mkServiceUser mkServiceStateDir; |   inherit (ookflixLib) mkServiceUser mkServiceStateDir; | ||||||
|   inherit (lib) mkIf; |   inherit (lib) mkIf; | ||||||
|   inherit (ook.lib.container) mkContainerLabel mkContainerEnvironment; |   inherit (ook.lib.container) mkContainerLabel mkContainerEnvironment; | ||||||
|  | @ -14,17 +14,20 @@ | ||||||
| in { | in { | ||||||
|   config = mkIf qbittorrent.enable { |   config = mkIf qbittorrent.enable { | ||||||
|     users = mkServiceUser qbittorrent.user.name; |     users = mkServiceUser qbittorrent.user.name; | ||||||
|     systemd.tmpfiles = mkServiceStateDir "qbittorrent" qbittorrent.stateDir; |     systemd.tmpfiles.settings.qbittorrentStateDir = mkServiceStateDir "qbittorrent"; | ||||||
|     virtualisation.oci-containers.containers = { |     virtualisation.oci-containers.containers = { | ||||||
|       # Torrent client |       # Torrent client | ||||||
|       qbittorrent = { |       qbittorrent = { | ||||||
|  |         hostname = "qbittorrent"; | ||||||
|         image = "ghcr.io/hotio/qbittorrent"; |         image = "ghcr.io/hotio/qbittorrent"; | ||||||
|         dependsOn = ["gluetun"]; |         dependsOn = ["gluetun"]; | ||||||
|         volumes = [ |         volumes = [ | ||||||
|           "${qbittorrent.stateDir}:/config" |           "${qbittorrent.stateDir}:/config" | ||||||
|           "${volumes.torrents.root}:/data/torrents" |           "${volumes.torrents.root}:/data/torrents" | ||||||
|         ]; |         ]; | ||||||
|         extraOptions = ["--network=container:gluetun"]; |         extraOptions = [ | ||||||
|  |           "--network=container:gluetun" | ||||||
|  |         ]; | ||||||
|         labels = mkContainerLabel { |         labels = mkContainerLabel { | ||||||
|           name = "qbittorrent"; |           name = "qbittorrent"; | ||||||
|           inherit (qbittorrent) port domain; |           inherit (qbittorrent) port domain; | ||||||
|  | @ -34,7 +37,7 @@ in { | ||||||
|           }; |           }; | ||||||
|         }; |         }; | ||||||
|         environment = |         environment = | ||||||
|           mkContainerEnvironment qbittorrent.user.id groups.downloads.id |           mkContainerEnvironment qbittorrent.user.id groups.media.id | ||||||
|           // { |           // { | ||||||
|             UMASK = "002"; |             UMASK = "002"; | ||||||
|             WEBUI_PORTS = "${toString qbittorrent.port}/tcp,${toString qbittorrent.port}/udp"; |             WEBUI_PORTS = "${toString qbittorrent.port}/tcp,${toString qbittorrent.port}/udp"; | ||||||
|  | @ -5,22 +5,22 @@ | ||||||
|   self, |   self, | ||||||
|   ... |   ... | ||||||
| }: let | }: let | ||||||
|   ookflixLib = import ./lib.nix {inherit lib config self;}; |   ookflixLib = import ../lib.nix {inherit lib config self;}; | ||||||
|   inherit (ookflixLib) mkServiceUser mkServiceStateDir; |   inherit (ookflixLib) mkServiceUser mkServiceStateDir; | ||||||
|   inherit (lib) mkIf; |   inherit (lib) mkIf; | ||||||
|   inherit (ook.lib.container) mkContainerLabel mkContainerEnvironment; |   inherit (ook.lib.container) mkContainerLabel mkContainerPort mkContainerEnvironment; | ||||||
|   inherit (config.ooknet.server.ookflix) groups volumes; |   inherit (config.ooknet.server.ookflix) groups volumes; | ||||||
|   inherit (config.ooknet.server.ookflix.services) radarr; |   inherit (config.ooknet.server.ookflix.services) radarr; | ||||||
| in { | in { | ||||||
|   config = mkIf radarr.enable { |   config = mkIf radarr.enable { | ||||||
|     users = mkServiceUser radarr.user.name; |     users = mkServiceUser radarr.user.name; | ||||||
|     systemd.tmpfiles = mkServiceStateDir "radarr" radarr.stateDir; |     systemd.tmpfiles.settings.radarrStateDir = mkServiceStateDir "radarr"; | ||||||
|     virtualisation.oci-containers.containers = { |     virtualisation.oci-containers.containers = { | ||||||
|       radarr = { |       radarr = { | ||||||
|         image = "ghcr.io/hotio/qbittorrent"; |         image = "ghcr.io/hotio/radarr"; | ||||||
|         autoStart = true; |         autoStart = true; | ||||||
|         hostname = "radarr"; |         hostname = "radarr"; | ||||||
|         ports = ["${radarr.port}:${radarr.port}"]; |         ports = [(mkContainerPort radarr.port)]; | ||||||
|         volumes = [ |         volumes = [ | ||||||
|           "${radarr.stateDir}:/config" |           "${radarr.stateDir}:/config" | ||||||
|           "${volumes.data.root}:/data" |           "${volumes.data.root}:/data" | ||||||
|  | @ -5,7 +5,7 @@ | ||||||
|   self, |   self, | ||||||
|   ... |   ... | ||||||
| }: let | }: let | ||||||
|   ookflixLib = import ./lib.nix {inherit lib config self;}; |   ookflixLib = import ../lib.nix {inherit lib config self;}; | ||||||
|   inherit (ookflixLib) mkServiceUser mkServiceStateDir; |   inherit (ookflixLib) mkServiceUser mkServiceStateDir; | ||||||
|   inherit (lib) mkIf; |   inherit (lib) mkIf; | ||||||
|   inherit (ook.lib.container) mkContainerLabel mkContainerEnvironment mkContainerPort; |   inherit (ook.lib.container) mkContainerLabel mkContainerEnvironment mkContainerPort; | ||||||
|  | @ -14,7 +14,7 @@ | ||||||
| in { | in { | ||||||
|   config = mkIf sonarr.enable { |   config = mkIf sonarr.enable { | ||||||
|     users = mkServiceUser sonarr.user.name; |     users = mkServiceUser sonarr.user.name; | ||||||
|     systemd.tmpfiles = mkServiceStateDir "sonarr" sonarr.stateDir; |     systemd.tmpfiles.settings.sonarrStateDir = mkServiceStateDir "sonarr"; | ||||||
|     virtualisation.oci-containers.containers = { |     virtualisation.oci-containers.containers = { | ||||||
|       sonarr = { |       sonarr = { | ||||||
|         image = "ghcr.io/hotio/sonarr"; |         image = "ghcr.io/hotio/sonarr"; | ||||||
							
								
								
									
										34
									
								
								modules/nixos/server/services/ookflix/homepage.nix
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								modules/nixos/server/services/ookflix/homepage.nix
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,34 @@ | ||||||
|  | { | ||||||
|  |   config, | ||||||
|  |   lib, | ||||||
|  |   ook, | ||||||
|  |   self, | ||||||
|  |   ... | ||||||
|  | }: let | ||||||
|  |   ookflixLib = import ./lib.nix {inherit lib config self;}; | ||||||
|  |   inherit (ookflixLib) mkServiceUser mkServiceStateDir; | ||||||
|  |   inherit (lib) mkIf; | ||||||
|  |   inherit (ook.lib.container) mkContainerLabel mkContainerEnvironment mkContainerPort; | ||||||
|  |   inherit (config.ooknet.server.ookflix) groups; | ||||||
|  |   inherit (config.ooknet.server.ookflix.services) homepage; | ||||||
|  | in { | ||||||
|  |   config = mkIf homepage.enable { | ||||||
|  |     # media requesting for jellyfin | ||||||
|  |     users = mkServiceUser homepage.user.name; | ||||||
|  |     systemd.tmpfiles.settings.homepageStateDir = mkServiceStateDir "homepage"; | ||||||
|  |     virtualisation.oci-containers.containers = { | ||||||
|  |       homepage = { | ||||||
|  |         image = "ghcr.io/benphelps/homepage:latest"; | ||||||
|  |         autoStart = true; | ||||||
|  |         hostname = "homepage"; | ||||||
|  |         ports = [(mkContainerPort homepage.port)]; | ||||||
|  |         volumes = ["${homepage.stateDir}:/config"]; | ||||||
|  |         labels = mkContainerLabel { | ||||||
|  |           name = "homepage"; | ||||||
|  |           inherit (homepage) domain port; | ||||||
|  |         }; | ||||||
|  |         environment = mkContainerEnvironment homepage.user.id groups.media.id; | ||||||
|  |       }; | ||||||
|  |     }; | ||||||
|  |   }; | ||||||
|  | } | ||||||
|  | @ -1,34 +0,0 @@ | ||||||
| { |  | ||||||
|   config, |  | ||||||
|   lib, |  | ||||||
|   ook, |  | ||||||
|   ... |  | ||||||
| }: let |  | ||||||
|   inherit (lib) mkIf; |  | ||||||
|   inherit (ook.lib.container) mkContainerLabel mkContainerEnvironment mkContainerPort; |  | ||||||
|   inherit (config.ooknet.server.ookflix) groups; |  | ||||||
|   inherit (config.ooknet.server.ookflix.services) jellyseer; |  | ||||||
| in { |  | ||||||
|   config = mkIf jellyseer.enable { |  | ||||||
|     # media requesting for jellyfin |  | ||||||
|     virtualisation.oci-containers.containers = { |  | ||||||
|       jellyseer = { |  | ||||||
|         image = "fallenbagel/jellyseerr:latest"; |  | ||||||
|         autoStart = true; |  | ||||||
|         hostname = "jellyseer"; |  | ||||||
|         ports = [(mkContainerPort jellyseer.port)]; |  | ||||||
|         volumes = ["${jellyseer.stateDir}:/config"]; |  | ||||||
|         extraOptions = ["--network" "host"]; |  | ||||||
|         labels = mkContainerLabel { |  | ||||||
|           name = "jellyseer"; |  | ||||||
|           inherit (jellyseer) domain port; |  | ||||||
|           homepage = { |  | ||||||
|             group = "media"; |  | ||||||
|             description = "media-server requesting"; |  | ||||||
|           }; |  | ||||||
|         }; |  | ||||||
|         environment = mkContainerEnvironment jellyseer.user.id groups.media.id; |  | ||||||
|       }; |  | ||||||
|     }; |  | ||||||
|   }; |  | ||||||
| } |  | ||||||
|  | @ -4,10 +4,11 @@ | ||||||
|   self, |   self, | ||||||
|   ... |   ... | ||||||
| }: let | }: let | ||||||
|   inherit (lib) mkOption mkEnableOption elem assertMsg; |   inherit (lib) getExe nameValuePair mkOption mkEnableOption elem assertMsg; | ||||||
|   inherit (builtins) attrValues; |   inherit (builtins) attrValues; | ||||||
|   inherit (lib.types) int path port str; |   inherit (lib.types) int path port str; | ||||||
|   inherit (config.ooknet) server; |   inherit (config.ooknet) server; | ||||||
|  |   inherit (config.virtualisation) podman; | ||||||
|   cfg = server.ookflix; |   cfg = server.ookflix; | ||||||
|   ookflixEnabled = elem "ookflix" server.services; |   ookflixEnabled = elem "ookflix" server.services; | ||||||
| 
 | 
 | ||||||
|  | @ -116,13 +117,21 @@ | ||||||
|       name = service; |       name = service; | ||||||
|     }; |     }; | ||||||
|   }; |   }; | ||||||
|   mkServiceStateDir = service: dir: { |   mkServiceStateDir = service: { | ||||||
|     settings."${service}StateDir".${dir}."d" = { |     "${cfg.services.${service}.stateDir}"."d" = { | ||||||
|       mode = "0700"; |       mode = "0700"; | ||||||
|       user = cfg.services.${service}.user.name; |       user = cfg.services.${service}.user.name; | ||||||
|       group = cfg.services.${service}.group.name; |       group = cfg.services.${service}.group.name; | ||||||
|     }; |     }; | ||||||
|   }; |   }; | ||||||
|  |   mkServiceStateFile = service: file: { | ||||||
|  |     "${cfg.services.${service}.stateDir}/${file}"."f" = { | ||||||
|  |       mode = "0600"; | ||||||
|  |       user = cfg.services.${service}.user.name; | ||||||
|  |       group = cfg.services.${service}.group.name; | ||||||
|  |     }; | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|   mkServiceSecret = name: service: { |   mkServiceSecret = name: service: { | ||||||
|     ${name} = { |     ${name} = { | ||||||
|       file = "${self}/secrets/containers/${name}.age"; |       file = "${self}/secrets/containers/${name}.age"; | ||||||
|  | @ -130,6 +139,17 @@ | ||||||
|       group = cfg.services.${service}.group.name; |       group = cfg.services.${service}.group.name; | ||||||
|     }; |     }; | ||||||
|   }; |   }; | ||||||
|  | 
 | ||||||
|  |   mkNetworkService = name: network: | ||||||
|  |     nameValuePair "podman-network-${name}" { | ||||||
|  |       description = "Podman network ${name} for ookflix"; | ||||||
|  |       serviceConfig = { | ||||||
|  |         Type = "oneshot"; | ||||||
|  |         RemainsAfterExit = true; | ||||||
|  |         ExecStart = "${getExe podman.package} network create -d bridge ${name}"; | ||||||
|  |         ExecStop = "${getExe podman.package} network rm -f ${name}"; | ||||||
|  |       }; | ||||||
|  |     }; | ||||||
| in { | in { | ||||||
|   inherit mkServiceSecret mkBasicServiceOptions mkServiceOptions mkServiceStateDir mkServiceUser mkUserOption mkPortOption mkGroupOption mkVolumeOption mkSubdomainOption; |   inherit mkServiceStateFile mkServiceSecret mkBasicServiceOptions mkServiceOptions mkServiceStateDir mkServiceUser mkUserOption mkPortOption mkGroupOption mkVolumeOption mkSubdomainOption mkNetworkService; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -0,0 +1,5 @@ | ||||||
|  | { | ||||||
|  |   imports = [ | ||||||
|  |     ./tautulli.nix | ||||||
|  |   ]; | ||||||
|  | } | ||||||
|  | @ -5,7 +5,7 @@ | ||||||
|   self, |   self, | ||||||
|   ... |   ... | ||||||
| }: let | }: let | ||||||
|   ookflixLib = import ./lib.nix {inherit lib config self;}; |   ookflixLib = import ../lib.nix {inherit lib config self;}; | ||||||
|   inherit (ookflixLib) mkServiceUser mkServiceStateDir; |   inherit (ookflixLib) mkServiceUser mkServiceStateDir; | ||||||
|   inherit (lib) mkIf; |   inherit (lib) mkIf; | ||||||
|   inherit (ook.lib.container) mkContainerLabel mkContainerEnvironment mkContainerPort; |   inherit (ook.lib.container) mkContainerLabel mkContainerEnvironment mkContainerPort; | ||||||
|  | @ -14,7 +14,7 @@ | ||||||
| in { | in { | ||||||
|   config = mkIf tautulli.enable { |   config = mkIf tautulli.enable { | ||||||
|     users = mkServiceUser tautulli.user.name; |     users = mkServiceUser tautulli.user.name; | ||||||
|     systemd.tmpfiles = mkServiceStateDir "tautulli" tautulli.stateDir; |     systemd.tmpfiles.settings.tautulliStateDir = mkServiceStateDir "tautulli"; | ||||||
|     virtualisation.oci-containers.containers = { |     virtualisation.oci-containers.containers = { | ||||||
|       # plex monitoring service |       # plex monitoring service | ||||||
|       tautulli = { |       tautulli = { | ||||||
|  | @ -0,0 +1,7 @@ | ||||||
|  | { | ||||||
|  |   imports = [ | ||||||
|  |     ./gluetun.nix | ||||||
|  |     ./traefik.nix | ||||||
|  |     #  ./networks.nix | ||||||
|  |   ]; | ||||||
|  | } | ||||||
|  | @ -5,10 +5,10 @@ | ||||||
|   self, |   self, | ||||||
|   ... |   ... | ||||||
| }: let | }: let | ||||||
|   ookflixLib = import ./lib.nix {inherit self lib config;}; |   ookflixLib = import ../lib.nix {inherit self lib config;}; | ||||||
|   inherit (ookflixLib) mkServiceUser mkServiceSecret; |   inherit (ookflixLib) mkServiceUser mkServiceSecret; | ||||||
|   inherit (lib) mkIf; |   inherit (lib) mkIf; | ||||||
|   inherit (ook.lib.container) mkContainerEnvironment mkContainerPort; |   inherit (ook.lib.container) mkContainerEnvironment; | ||||||
|   inherit (config.ooknet.server.ookflix.services) qbittorrent gluetun; |   inherit (config.ooknet.server.ookflix.services) qbittorrent gluetun; | ||||||
| in { | in { | ||||||
|   config = mkIf gluetun.enable { |   config = mkIf gluetun.enable { | ||||||
|  | @ -21,7 +21,7 @@ in { | ||||||
|         # should make this an option. |         # should make this an option. | ||||||
|         environmentFiles = [config.age.secrets.vpn_env.path]; |         environmentFiles = [config.age.secrets.vpn_env.path]; | ||||||
|         ports = [ |         ports = [ | ||||||
|           (mkContainerPort qbittorrent.port) |           "${toString qbittorrent.exposedPort}:${toString qbittorrent.port}" | ||||||
|         ]; |         ]; | ||||||
|         environment = mkContainerEnvironment gluetun.user.id gluetun.group.id; |         environment = mkContainerEnvironment gluetun.user.id gluetun.group.id; | ||||||
|         extraOptions = [ |         extraOptions = [ | ||||||
|  | @ -0,0 +1,28 @@ | ||||||
|  | { | ||||||
|  |   lib, | ||||||
|  |   config, | ||||||
|  |   pkgs, | ||||||
|  |   ... | ||||||
|  | }: let | ||||||
|  |   inherit (lib) mkIf getExe; | ||||||
|  |   inherit (config.ooknet.server) ookflix; | ||||||
|  |   inherit (config.virtualisation) podman; | ||||||
|  |   podmanCommand = getExe podman.package; | ||||||
|  | in { | ||||||
|  |   config = mkIf ookflix.enable { | ||||||
|  |     systemd.services = { | ||||||
|  |       "podman-ookflix-network" = { | ||||||
|  |         serviceConfig = { | ||||||
|  |           Type = "oneshot"; | ||||||
|  |           RemainAfterExit = true; | ||||||
|  |           SyslogIdentifier = "%N"; | ||||||
|  |         }; | ||||||
|  |         unitConfig = { | ||||||
|  |           "RequiresMountsFor" = "%t/containers"; | ||||||
|  |         }; | ||||||
|  |         wantedBy = ["multi-user.target"]; | ||||||
|  |         script = "${podmanCommand} network create --ignore --driver=bridge ookflix"; | ||||||
|  |       }; | ||||||
|  |     }; | ||||||
|  |   }; | ||||||
|  | } | ||||||
							
								
								
									
										80
									
								
								modules/nixos/server/services/ookflix/networking/traefik.nix
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										80
									
								
								modules/nixos/server/services/ookflix/networking/traefik.nix
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,80 @@ | ||||||
|  | { | ||||||
|  |   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; | ||||||
|  |       }; | ||||||
|  |     }; | ||||||
|  |   }; | ||||||
|  | } | ||||||
|  | @ -94,8 +94,11 @@ in { | ||||||
|           uid = 377; |           uid = 377; | ||||||
|           gid = 377; |           gid = 377; | ||||||
|         } |         } | ||||||
|         // {torrentPort = mkPortOption 58080 "Torrenting Port for qbittorrent" 58080;}; |         // { | ||||||
|       jellyseer = mkServiceOptions "jellyseer" { |           torrentPort = mkPortOption 58080 "Torrenting Port for qbittorrent" 58080; | ||||||
|  |           exposedPort = mkPortOption 8081 "Port exposed by qbittorrent" 8081; | ||||||
|  |         }; | ||||||
|  |       jellyseerr = mkServiceOptions "jellyseerr" { | ||||||
|         port = 5055; |         port = 5055; | ||||||
|         uid = 345; |         uid = 345; | ||||||
|         gid = 345; |         gid = 345; | ||||||
|  | @ -105,6 +108,16 @@ in { | ||||||
|         uid = 355; |         uid = 355; | ||||||
|         gid = 355; |         gid = 355; | ||||||
|       }; |       }; | ||||||
|  |       traefik = mkServiceOptions "traefik" { | ||||||
|  |         port = 8080; | ||||||
|  |         uid = 389; | ||||||
|  |         gid = 389; | ||||||
|  |       }; | ||||||
|  |       homepage = mkServiceOptions "homepage" { | ||||||
|  |         port = 3000; | ||||||
|  |         uid = 400; | ||||||
|  |         gid = 400; | ||||||
|  |       }; | ||||||
|       gluetun = mkBasicServiceOptions "gluetun" { |       gluetun = mkBasicServiceOptions "gluetun" { | ||||||
|         uid = 356; |         uid = 356; | ||||||
|         gid = 357; |         gid = 357; | ||||||
|  |  | ||||||
							
								
								
									
										35
									
								
								modules/nixos/server/services/ookflix/podman.nix
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								modules/nixos/server/services/ookflix/podman.nix
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,35 @@ | ||||||
|  | { | ||||||
|  |   lib, | ||||||
|  |   config, | ||||||
|  |   ... | ||||||
|  | }: let | ||||||
|  |   inherit (lib) mkIf; | ||||||
|  |   inherit (config.ooknet.host) admin; | ||||||
|  |   inherit (config.ooknet.server) ookflix; | ||||||
|  | in { | ||||||
|  |   config = mkIf ookflix.enable { | ||||||
|  |     # add admin to podman group | ||||||
|  |     users.groups.podman.members = [admin.name]; | ||||||
|  |     virtualisation = { | ||||||
|  |       # explicitly set this even though its the default value | ||||||
|  |       # this enables the module below | ||||||
|  |       oci-containers.backend = "podman"; | ||||||
|  |       podman = { | ||||||
|  |         # periodically prunes podman resources | ||||||
|  |         # defaults to --all, weekly | ||||||
|  |         autoPrune.enable = true; | ||||||
|  | 
 | ||||||
|  |         # aliases docker command to podman | ||||||
|  |         dockerCompat = true; | ||||||
|  | 
 | ||||||
|  |         # makes the podman sockaet available in place of docker socket | ||||||
|  |         dockerSocket.enable = true; | ||||||
|  |         # settings for containers/networks/podman.json | ||||||
|  |         defaultNetwork.settings = { | ||||||
|  |           # allows udp port 53 on podmans network interface: podman+ | ||||||
|  |           dns_enabled = true; | ||||||
|  |         }; | ||||||
|  |       }; | ||||||
|  |     }; | ||||||
|  |   }; | ||||||
|  | } | ||||||
|  | @ -0,0 +1,6 @@ | ||||||
|  | { | ||||||
|  |   imports = [ | ||||||
|  |     ./plex.nix | ||||||
|  |     ./jellyfin.nix | ||||||
|  |   ]; | ||||||
|  | } | ||||||
|  | @ -5,7 +5,7 @@ | ||||||
|   self, |   self, | ||||||
|   ... |   ... | ||||||
| }: let | }: let | ||||||
|   ookflixLib = import ./lib.nix {inherit lib config self;}; |   ookflixLib = import ../lib.nix {inherit lib config self;}; | ||||||
|   inherit (ookflixLib) mkServiceStateDir mkServiceUser; |   inherit (ookflixLib) mkServiceStateDir mkServiceUser; | ||||||
|   inherit (lib) mkIf optionalAttrs; |   inherit (lib) mkIf optionalAttrs; | ||||||
|   inherit (ook.lib.container) mkContainerLabel mkContainerEnvironment mkContainerPort; |   inherit (ook.lib.container) mkContainerLabel mkContainerEnvironment mkContainerPort; | ||||||
|  | @ -15,7 +15,7 @@ in { | ||||||
|   config = mkIf services.jellyfin.enable { |   config = mkIf services.jellyfin.enable { | ||||||
|     hardware.nvidia-container-toolkit.enable = gpuAcceleration.enable && gpuAcceleration.type == "nvidia"; |     hardware.nvidia-container-toolkit.enable = gpuAcceleration.enable && gpuAcceleration.type == "nvidia"; | ||||||
|     users = mkServiceUser jellyfin.user.name; |     users = mkServiceUser jellyfin.user.name; | ||||||
|     systemd.tmpfiles = mkServiceStateDir "jellyfin" jellyfin.stateDir; |     systemd.tmpfiles.settings.jellyfinStateDir = mkServiceStateDir "jellyfin"; | ||||||
|     virtualisation.oci-containers.containers = { |     virtualisation.oci-containers.containers = { | ||||||
|       # media streaming server |       # media streaming server | ||||||
|       # docs: <https://docs.linuxserver.io/images/docker-jellyfin/> |       # docs: <https://docs.linuxserver.io/images/docker-jellyfin/> | ||||||
|  | @ -36,18 +36,6 @@ in { | ||||||
|             description = "media-server streamer"; |             description = "media-server streamer"; | ||||||
|           }; |           }; | ||||||
|         }; |         }; | ||||||
| 
 |  | ||||||
|         extraOptions = optionalAttrs gpuAcceleration.enable ( |  | ||||||
|           if gpuAcceleration.type == "nvidia" |  | ||||||
|           then [ |  | ||||||
|             "--runtime=nvidia" |  | ||||||
|           ] |  | ||||||
|           else if gpuAcceleration.type == "intel" || "amd" |  | ||||||
|           then [ |  | ||||||
|             "--device=/dev/dri:/dev/dri" |  | ||||||
|           ] |  | ||||||
|           else [] |  | ||||||
|         ); |  | ||||||
|         environment = |         environment = | ||||||
|           mkContainerEnvironment jellyfin.user.id groups.media.id |           mkContainerEnvironment jellyfin.user.id groups.media.id | ||||||
|           // {JELLYFIN_PublishedServerUrl = jellyfin.domain;} |           // {JELLYFIN_PublishedServerUrl = jellyfin.domain;} | ||||||
|  | @ -5,7 +5,7 @@ | ||||||
|   self, |   self, | ||||||
|   ... |   ... | ||||||
| }: let | }: let | ||||||
|   ookflixLib = import ./lib.nix {inherit lib config self;}; |   ookflixLib = import ../lib.nix {inherit lib config self;}; | ||||||
|   inherit (ookflixLib) mkServiceUser mkServiceStateDir; |   inherit (ookflixLib) mkServiceUser mkServiceStateDir; | ||||||
|   inherit (lib) mkIf optionalAttrs; |   inherit (lib) mkIf optionalAttrs; | ||||||
|   inherit (ook.lib.container) mkContainerLabel mkContainerEnvironment mkContainerPort; |   inherit (ook.lib.container) mkContainerLabel mkContainerEnvironment mkContainerPort; | ||||||
|  | @ -18,7 +18,7 @@ in { | ||||||
| 
 | 
 | ||||||
|     # users/group/directories configuration, see lib.nix |     # users/group/directories configuration, see lib.nix | ||||||
|     users = mkServiceUser plex.user.name; |     users = mkServiceUser plex.user.name; | ||||||
|     systemd.tmpfiles = mkServiceStateDir "plex" plex.stateDir; |     systemd.tmpfiles.settings.plexStateDir = mkServiceStateDir "plex"; | ||||||
| 
 | 
 | ||||||
|     # container configuration |     # container configuration | ||||||
|     virtualisation.oci-containers.containers = { |     virtualisation.oci-containers.containers = { | ||||||
|  | @ -29,8 +29,7 @@ in { | ||||||
|         hostname = "plex"; |         hostname = "plex"; | ||||||
|         ports = [(mkContainerPort plex.port)]; |         ports = [(mkContainerPort plex.port)]; | ||||||
|         volumes = [ |         volumes = [ | ||||||
|           "${volumes.media.movies}:/data/movies" |           "${volumes.media.root}:/data" | ||||||
|           "${volumes.media.tv}:/data/tv" |  | ||||||
|           "${plex.stateDir}:/config" |           "${plex.stateDir}:/config" | ||||||
|         ]; |         ]; | ||||||
|         labels = mkContainerLabel { |         labels = mkContainerLabel { | ||||||
|  | @ -41,21 +40,6 @@ in { | ||||||
|             description = "media-server streamer"; |             description = "media-server streamer"; | ||||||
|           }; |           }; | ||||||
|         }; |         }; | ||||||
|         extraOptions = optionalAttrs gpuAcceleration.enable ( |  | ||||||
|           if gpuAcceleration.type == "nvidia" |  | ||||||
|           then [ |  | ||||||
|             "--runtime=nvidia" |  | ||||||
|           ] |  | ||||||
|           else if gpuAcceleration.type == "intel" |  | ||||||
|           then [ |  | ||||||
|             "--device=/dev/dri:/dev/dri" |  | ||||||
|           ] |  | ||||||
|           else if gpuAcceleration.type == "amd" |  | ||||||
|           then [ |  | ||||||
|             "--device=/dev/dri:/dev/dri" |  | ||||||
|           ] |  | ||||||
|           else [] |  | ||||||
|         ); |  | ||||||
|         environment = |         environment = | ||||||
|           mkContainerEnvironment plex.user.id groups.media.id |           mkContainerEnvironment plex.user.id groups.media.id | ||||||
|           // optionalAttrs (gpuAcceleration.enable && gpuAcceleration.type == "nvidia") { |           // optionalAttrs (gpuAcceleration.enable && gpuAcceleration.type == "nvidia") { | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue