diff --git a/docker_swarm/roles/media/docker-stack.yml.j2 b/docker_swarm/roles/media/docker-stack.yml.j2 index fbdc776..63eb7f2 100644 --- a/docker_swarm/roles/media/docker-stack.yml.j2 +++ b/docker_swarm/roles/media/docker-stack.yml.j2 @@ -49,61 +49,6 @@ volumes: jellyfin_cache: services: - # prowlarr: - # image: lscr.io/linuxserver/prowlarr:latest - # environment: - # - PUID=1000 - # - PGID=1000 - # - TZ=Europe/Amsterdam - # volumes: - # - type: volume - # source: prowlarr_config - # target: /config - # volume: - # nocopy: true - # networks: - # - traefik - # deploy: - # labels: - # - traefik.enable=true - # - traefik.http.routers.prowlarr.entrypoints=localsecure - # - traefik.http.routers.prowlarr.rule=Host(`prowlarr.kun.is`) - # - traefik.http.routers.prowlarr.tls=true - # - traefik.http.routers.prowlarr.tls.certresolver=letsencrypt - # - traefik.http.routers.prowlarr.service=prowlarr - # - traefik.http.services.prowlarr.loadbalancer.server.port=9696 - # - traefik.docker.network=traefik - - sonarr: - image: lscr.io/linuxserver/sonarr:latest - environment: - - PUID=1000 - - PGID=1000 - - TZ=Europe/Amsterdam - volumes: - - type: volume - source: sonarr_config - target: /config - volume: - nocopy: true - - type: volume - source: media - target: /media - volume: - nocopy: true - networks: - - traefik - deploy: - labels: - - traefik.enable=true - - traefik.http.routers.sonarr.entrypoints=localsecure - - traefik.http.routers.sonarr.rule=Host(`sonarr.kun.is`) - - traefik.http.routers.sonarr.tls=true - - traefik.http.routers.sonarr.tls.certresolver=letsencrypt - - traefik.http.routers.sonarr.service=sonarr - - traefik.http.services.sonarr.loadbalancer.server.port=8989 - - traefik.docker.network=traefik - bazarr: image: lscr.io/linuxserver/bazarr:latest environment: diff --git a/docker_swarm/roles/traefik/docker-stack.yml.j2 b/docker_swarm/roles/traefik/docker-stack.yml.j2 index e29ed3c..75bc5b0 100644 --- a/docker_swarm/roles/traefik/docker-stack.yml.j2 +++ b/docker_swarm/roles/traefik/docker-stack.yml.j2 @@ -150,6 +150,12 @@ services: - traefik.http.routers.prowlarr.rule=Host(`prowlarr.kun.is`) - traefik.http.routers.prowlarr.tls=true - traefik.http.routers.prowlarr.tls.certresolver=letsencrypt + + - traefik.http.routers.sonarr.entrypoints=localsecure + - traefik.http.routers.sonarr.service=k3s@file + - traefik.http.routers.sonarr.rule=Host(`sonarr.kun.is`) + - traefik.http.routers.sonarr.tls=true + - traefik.http.routers.sonarr.tls.certresolver=letsencrypt volumes: - type: bind source: /var/run/docker.sock diff --git a/nix/flake/kubenix/media.nix b/nix/flake/kubenix/media.nix index cac5414..c8e2596 100644 --- a/nix/flake/kubenix/media.nix +++ b/nix/flake/kubenix/media.nix @@ -24,6 +24,12 @@ PGID = "1000"; TZ = "Europe/Amsterdam"; }; + + sonarr-env.data = { + PUID = "1000"; + PGID = "1000"; + TZ = "Europe/Amsterdam"; + }; }; deployments = { @@ -285,6 +291,61 @@ }; }; }; + + sonarr = { + metadata.labels = { + app = "media"; + component = "sonarr"; + }; + + spec = { + selector.matchLabels = { + app = "media"; + component = "sonarr"; + }; + + template = { + metadata.labels = { + app = "media"; + component = "sonarr"; + }; + + spec = { + containers.sonarr = { + image = "lscr.io/linuxserver/sonarr:latest"; + envFrom = [{ configMapRef.name = "sonarr-env"; }]; + + ports = [{ + containerPort = 8989; + protocol = "TCP"; + }]; + + volumeMounts = [ + { + name = "config"; + mountPath = "/config"; + } + { + name = "media"; + mountPath = "/media"; + } + ]; + }; + + volumes = [ + { + name = "config"; + persistentVolumeClaim.claimName = "sonarr-config"; + } + { + name = "media"; + persistentVolumeClaim.claimName = "media"; + } + ]; + }; + }; + }; + }; }; persistentVolumes = { @@ -347,6 +408,16 @@ path = "/mnt/data/nfs/prowlarr/config"; }; }; + + sonarr-config.spec = { + capacity.storage = "1Mi"; + accessModes = [ "ReadWriteMany" ]; + + nfs = { + server = "lewis.hyp"; + path = "/mnt/data/nfs/sonarr/config"; + }; + }; }; persistentVolumeClaims = { @@ -391,6 +462,13 @@ resources.requests.storage = "1Mi"; volumeName = "prowlarr-config"; }; + + sonarr-config.spec = { + accessModes = [ "ReadWriteMany" ]; + storageClassName = ""; + resources.requests.storage = "1Mi"; + volumeName = "sonarr-config"; + }; }; services = { @@ -474,6 +552,19 @@ targetPort = 9696; }]; }; + + sonarr.spec = { + selector = { + app = "media"; + component = "sonarr"; + }; + + ports = [{ + protocol = "TCP"; + port = 80; + targetPort = 8989; + }]; + }; }; ingresses = { @@ -566,6 +657,24 @@ }]; }]; }; + + sonarr.spec = { + ingressClassName = "traefik"; + + rules = [{ + host = "sonarr.kun.is"; + + http.paths = [{ + path = "/"; + pathType = "Prefix"; + + backend.service = { + name = "sonarr"; + port.number = 80; + }; + }]; + }]; + }; }; }; }