{moduleWithSystem, ...}: { flake.nixosModules.containerArrStack = moduleWithSystem ({pkgs, ...}: {config, ...}: { virtualisation.oci-containers.containers."bazarr" = { image = "lscr.io/linuxserver/bazarr:latest"; environment = { "PGID" = "0"; "PUID" = "0"; "TZ" = "Etc/UTC"; }; volumes = [ "/containers/arr/bazarr-config:/config:rw" "/mnt/storage/streaming:/data:rw" ]; ports = [ "8994:6767/tcp" ]; log-driver = "journald"; extraOptions = [ "--network-alias=bazarr" "--network=arr-stack_default" ]; }; systemd.services."podman-bazarr" = { serviceConfig = { Restart = pkgs.lib.mkOverride 90 "always"; }; after = [ "podman-network-arr-stack_default.service" ]; requires = [ "podman-network-arr-stack_default.service" ]; partOf = [ "podman-compose-arr-stack-root.target" ]; wantedBy = [ "podman-compose-arr-stack-root.target" ]; }; virtualisation.oci-containers.containers."flaresolverr" = { image = "ghcr.io/flaresolverr/flaresolverr:latest"; environment = { "CAPTCHA_SOLVER" = "none"; "LOG_HTML" = "false"; "LOG_LEVEL" = "info"; "TZ" = "Europe/London"; }; ports = [ "8191:8191/tcp" ]; log-driver = "journald"; extraOptions = [ "--network-alias=flaresolverr" "--network=arr-stack_default" ]; }; systemd.services."podman-flaresolverr" = { serviceConfig = { Restart = pkgs.lib.mkOverride 90 "always"; }; after = [ "podman-network-arr-stack_default.service" ]; requires = [ "podman-network-arr-stack_default.service" ]; partOf = [ "podman-compose-arr-stack-root.target" ]; wantedBy = [ "podman-compose-arr-stack-root.target" ]; }; virtualisation.oci-containers.containers."lidarr" = { image = "lscr.io/linuxserver/lidarr:nightly"; environment = { "PGID" = "0"; "PUID" = "0"; "TZ" = "Europe/London"; }; volumes = [ "/containers/arr/lidarr-config:/config:rw" "/mnt/storage/streaming:/data:rw" ]; ports = [ "8992:8686/tcp" ]; log-driver = "journald"; extraOptions = [ "--network-alias=lidarr" "--network=arr-stack_default" ]; }; systemd.services."podman-lidarr" = { serviceConfig = { Restart = pkgs.lib.mkOverride 90 "always"; }; after = [ "podman-network-arr-stack_default.service" ]; requires = [ "podman-network-arr-stack_default.service" ]; partOf = [ "podman-compose-arr-stack-root.target" ]; wantedBy = [ "podman-compose-arr-stack-root.target" ]; }; virtualisation.oci-containers.containers."lidatube" = { image = "thewicklowwolf/lidatube:latest"; environment = { "PGID" = "0"; "PUID" = "0"; "lidarr_address" = "http://192.168.1.180:8992"; }; environmentFiles = [config.sops.secrets.lidarr-api-key.path]; volumes = [ "/containers/arr/lidatube-config:/lidatube/config:rw" "/etc/localtime:/etc/localtime:ro" "/mnt/storage/streaming/lidarr:/lidatube/downloads:rw" ]; ports = [ "8997:5000/tcp" ]; log-driver = "journald"; extraOptions = [ "--network-alias=lidatube" "--network=arr-stack_default" ]; }; systemd.services."podman-lidatube" = { serviceConfig = { Restart = pkgs.lib.mkOverride 90 "always"; }; after = [ "podman-network-arr-stack_default.service" ]; requires = [ "podman-network-arr-stack_default.service" ]; partOf = [ "podman-compose-arr-stack-root.target" ]; wantedBy = [ "podman-compose-arr-stack-root.target" ]; }; virtualisation.oci-containers.containers."nginx" = { image = "lscr.io/linuxserver/nginx:latest"; environment = { "NGINX_AUTORELOAD" = "true"; "PGID" = "1000"; "PUID" = "1000"; "TZ" = "Europe/London"; }; volumes = [ "/containers/arr/nginx-config:/config:rw" ]; ports = [ "8989:80/tcp" ]; log-driver = "journald"; extraOptions = [ "--network-alias=nginx" "--network=arr-stack_default" ]; }; systemd.services."podman-nginx" = { serviceConfig = { Restart = pkgs.lib.mkOverride 90 "always"; }; after = [ "podman-network-arr-stack_default.service" ]; requires = [ "podman-network-arr-stack_default.service" ]; partOf = [ "podman-compose-arr-stack-root.target" ]; wantedBy = [ "podman-compose-arr-stack-root.target" ]; }; virtualisation.oci-containers.containers."prowlarr" = { image = "lscr.io/linuxserver/prowlarr:latest"; environment = { "PGID" = "1000"; "PUID" = "1000"; "TZ" = "Etc/UTC"; }; volumes = [ "/containers/arr/prowlarr-config:/config:rw" ]; ports = [ "8996:9696/tcp" ]; log-driver = "journald"; extraOptions = [ "--network-alias=prowlarr" "--network=arr-stack_default" ]; }; systemd.services."podman-prowlarr" = { serviceConfig = { Restart = pkgs.lib.mkOverride 90 "always"; }; after = [ "podman-network-arr-stack_default.service" ]; requires = [ "podman-network-arr-stack_default.service" ]; partOf = [ "podman-compose-arr-stack-root.target" ]; wantedBy = [ "podman-compose-arr-stack-root.target" ]; }; virtualisation.oci-containers.containers."qbittorrent" = { image = "lscr.io/linuxserver/qbittorrent:latest"; environment = { "PGID" = "0"; "PUID" = "0"; "TORRENTING_PORT" = "6881"; "TZ" = "Etc/UTC"; "WEBUI_PORT" = "8995"; }; volumes = [ "/containers/arr/qbittorrnt-config:/config:rw" "/mnt/storage/streaming/downloadclient:/data/downloadclient:rw" ]; ports = [ "8995:8995/tcp" "6881:6881/tcp" "6881:6881/udp" ]; log-driver = "journald"; extraOptions = [ "--network-alias=qbittorrent" "--network=arr-stack_default" ]; }; systemd.services."podman-qbittorrent" = { serviceConfig = { Restart = pkgs.lib.mkOverride 90 "always"; }; after = [ "podman-network-arr-stack_default.service" ]; requires = [ "podman-network-arr-stack_default.service" ]; partOf = [ "podman-compose-arr-stack-root.target" ]; wantedBy = [ "podman-compose-arr-stack-root.target" ]; }; virtualisation.oci-containers.containers."radarr" = { image = "lscr.io/linuxserver/radarr:latest"; environment = { "PGID" = "0"; "PUID" = "0"; "TZ" = "Europe/London"; }; volumes = [ "/containers/arr/radarr-config:/config:rw" "/mnt/storage/streaming:/data:rw" ]; ports = [ "8991:7878/tcp" ]; log-driver = "journald"; extraOptions = [ "--network-alias=radarr" "--network=arr-stack_default" ]; }; systemd.services."podman-radarr" = { serviceConfig = { Restart = pkgs.lib.mkOverride 90 "always"; }; after = [ "podman-network-arr-stack_default.service" ]; requires = [ "podman-network-arr-stack_default.service" ]; partOf = [ "podman-compose-arr-stack-root.target" ]; wantedBy = [ "podman-compose-arr-stack-root.target" ]; }; virtualisation.oci-containers.containers."sonarr" = { image = "lscr.io/linuxserver/sonarr:latest"; environment = { "PGID" = "0"; "PUID" = "0"; "TZ" = "Europe/London"; }; volumes = [ "/containers/arr/sonarr-config:/config:rw" "/mnt/storage/streaming:/data:rw" ]; ports = [ "8990:8989/tcp" ]; log-driver = "journald"; extraOptions = [ "--network-alias=sonarr" "--network=arr-stack_default" ]; }; systemd.services."podman-sonarr" = { serviceConfig = { Restart = pkgs.lib.mkOverride 90 "always"; }; after = [ "podman-network-arr-stack_default.service" ]; requires = [ "podman-network-arr-stack_default.service" ]; partOf = [ "podman-compose-arr-stack-root.target" ]; wantedBy = [ "podman-compose-arr-stack-root.target" ]; }; # Networks systemd.services."podman-network-arr-stack_default" = { path = [pkgs.podman]; serviceConfig = { Type = "oneshot"; RemainAfterExit = true; ExecStop = "podman network rm -f arr-stack_default"; }; script = '' podman network inspect arr-stack_default || podman network create arr-stack_default ''; partOf = ["podman-compose-arr-stack-root.target"]; wantedBy = ["podman-compose-arr-stack-root.target"]; }; # Root service # When started, this will automatically create all resources and start # the containers. When stopped, this will teardown all resources. systemd.targets."podman-compose-arr-stack-root" = { unitConfig = { Description = "Root target generated by compose2nix."; }; wantedBy = ["multi-user.target"]; }; }); }