add tautulli
This commit is contained in:
		
							
								
								
									
										21
									
								
								clusters/cl01tl/applications/tautulli/Chart.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								clusters/cl01tl/applications/tautulli/Chart.yaml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,21 @@
 | 
			
		||||
apiVersion: v2
 | 
			
		||||
name: tautulli
 | 
			
		||||
version: 1.0.0
 | 
			
		||||
description: Tautulli
 | 
			
		||||
keywords:
 | 
			
		||||
  - tautulli
 | 
			
		||||
  - plex
 | 
			
		||||
home: https://wiki.alexlebens.dev/doc/tautulli-7FKi7SM33K
 | 
			
		||||
sources:
 | 
			
		||||
  - https://github.com/Tautulli/Tautulli
 | 
			
		||||
  - https://github.com/Tautulli/Tautulli/pkgs/container/tautulli
 | 
			
		||||
  - https://github.com/bjw-s/helm-charts/tree/main/charts/other/app-template
 | 
			
		||||
maintainers:
 | 
			
		||||
  - name: alexlebens
 | 
			
		||||
dependencies:
 | 
			
		||||
  - name: app-template
 | 
			
		||||
    alias: tautulli
 | 
			
		||||
    repository: https://bjw-s.github.io/helm-charts/
 | 
			
		||||
    version: 3.7.1
 | 
			
		||||
icon: https://raw.githubusercontent.com/walkxcode/dashboard-icons/main/png/tautulli.png
 | 
			
		||||
appVersion: v2.15.0
 | 
			
		||||
@@ -0,0 +1,57 @@
 | 
			
		||||
# apiVersion: external-secrets.io/v1beta1
 | 
			
		||||
# kind: ExternalSecret
 | 
			
		||||
# metadata:
 | 
			
		||||
#   name: tautulli-config-backup-secret
 | 
			
		||||
#   namespace: {{ .Release.Namespace }}
 | 
			
		||||
#   labels:
 | 
			
		||||
#     app.kubernetes.io/name: tautulli-config-backup-secret
 | 
			
		||||
#     app.kubernetes.io/instance: {{ .Release.Name }}
 | 
			
		||||
#     app.kubernetes.io/version: {{ .Chart.AppVersion }}
 | 
			
		||||
#     app.kubernetes.io/component: backup
 | 
			
		||||
#     app.kubernetes.io/part-of: {{ .Release.Name }}
 | 
			
		||||
# spec:
 | 
			
		||||
#   secretStoreRef:
 | 
			
		||||
#     kind: ClusterSecretStore
 | 
			
		||||
#     name: vault
 | 
			
		||||
#   target:
 | 
			
		||||
#     template:
 | 
			
		||||
#       mergePolicy: Merge
 | 
			
		||||
#       engineVersion: v2
 | 
			
		||||
#       data:
 | 
			
		||||
#         RESTIC_REPOSITORY: "{{ `{{ .BUCKET_ENDPOINT }}` }}/tautulli/tautulli-config"
 | 
			
		||||
#   data:
 | 
			
		||||
#     - secretKey: BUCKET_ENDPOINT
 | 
			
		||||
#       remoteRef:
 | 
			
		||||
#         conversionStrategy: Default
 | 
			
		||||
#         decodingStrategy: None
 | 
			
		||||
#         key: /cl01tl/volsync/restic/config
 | 
			
		||||
#         metadataPolicy: None
 | 
			
		||||
#         property: S3_BUCKET_ENDPOINT
 | 
			
		||||
#     - secretKey: RESTIC_PASSWORD
 | 
			
		||||
#       remoteRef:
 | 
			
		||||
#         conversionStrategy: Default
 | 
			
		||||
#         decodingStrategy: None
 | 
			
		||||
#         key: /cl01tl/volsync/restic/config
 | 
			
		||||
#         metadataPolicy: None
 | 
			
		||||
#         property: RESTIC_PASSWORD
 | 
			
		||||
#     - secretKey: AWS_DEFAULT_REGION
 | 
			
		||||
#       remoteRef:
 | 
			
		||||
#         conversionStrategy: Default
 | 
			
		||||
#         decodingStrategy: None
 | 
			
		||||
#         key: /cl01tl/volsync/restic/config
 | 
			
		||||
#         metadataPolicy: None
 | 
			
		||||
#         property: AWS_DEFAULT_REGION
 | 
			
		||||
#     - secretKey: AWS_ACCESS_KEY_ID
 | 
			
		||||
#       remoteRef:
 | 
			
		||||
#         conversionStrategy: Default
 | 
			
		||||
#         decodingStrategy: None
 | 
			
		||||
#         key: /digital-ocean/home-infra/volsync-backups
 | 
			
		||||
#         metadataPolicy: None
 | 
			
		||||
#         property: access_key
 | 
			
		||||
#     - secretKey: AWS_SECRET_ACCESS_KEY
 | 
			
		||||
#       remoteRef:
 | 
			
		||||
#         conversionStrategy: Default
 | 
			
		||||
#         decodingStrategy: None
 | 
			
		||||
#         key: /digital-ocean/home-infra/volsync-backups
 | 
			
		||||
#         metadataPolicy: None
 | 
			
		||||
#         property: secret_key
 | 
			
		||||
@@ -0,0 +1,30 @@
 | 
			
		||||
apiVersion: gateway.networking.k8s.io/v1
 | 
			
		||||
kind: HTTPRoute
 | 
			
		||||
metadata:
 | 
			
		||||
  name: http-route-tautulli
 | 
			
		||||
  namespace: {{ .Release.Namespace }}
 | 
			
		||||
  labels:
 | 
			
		||||
    app.kubernetes.io/name: http-route-tautulli
 | 
			
		||||
    app.kubernetes.io/instance: {{ .Release.Name }}
 | 
			
		||||
    app.kubernetes.io/version: {{ .Chart.AppVersion }}
 | 
			
		||||
    app.kubernetes.io/component: web
 | 
			
		||||
    app.kubernetes.io/part-of: {{ .Release.Name }}
 | 
			
		||||
spec:
 | 
			
		||||
  parentRefs:
 | 
			
		||||
    - group: gateway.networking.k8s.io
 | 
			
		||||
      kind: Gateway
 | 
			
		||||
      name: traefik-gateway
 | 
			
		||||
      namespace: traefik
 | 
			
		||||
  hostnames:
 | 
			
		||||
    - tautulli.alexlebens.net
 | 
			
		||||
  rules:
 | 
			
		||||
    - matches:
 | 
			
		||||
      - path:
 | 
			
		||||
          type: PathPrefix
 | 
			
		||||
          value: /
 | 
			
		||||
      backendRefs:
 | 
			
		||||
        - group: ''
 | 
			
		||||
          kind: Service
 | 
			
		||||
          name: tautulli
 | 
			
		||||
          port: 80
 | 
			
		||||
          weight: 100
 | 
			
		||||
@@ -0,0 +1,27 @@
 | 
			
		||||
# apiVersion: volsync.backube/v1alpha1
 | 
			
		||||
# kind: ReplicationSource
 | 
			
		||||
# metadata:
 | 
			
		||||
#   name: tautulli-config-backup-source
 | 
			
		||||
#   namespace: {{ .Release.Namespace }}
 | 
			
		||||
#   labels:
 | 
			
		||||
#     app.kubernetes.io/name: tautulli-config-backup-source
 | 
			
		||||
#     app.kubernetes.io/instance: {{ .Release.Name }}
 | 
			
		||||
#     app.kubernetes.io/version: {{ .Chart.AppVersion }}
 | 
			
		||||
#     app.kubernetes.io/component: backup
 | 
			
		||||
#     app.kubernetes.io/part-of: {{ .Release.Name }}
 | 
			
		||||
# spec:
 | 
			
		||||
#   sourcePVC: tautulli-config
 | 
			
		||||
#   trigger:
 | 
			
		||||
#     schedule: 0 0 */3 * *
 | 
			
		||||
#   restic:
 | 
			
		||||
#     pruneIntervalDays: 14
 | 
			
		||||
#     repository: tautulli-config-backup-secret
 | 
			
		||||
#     retain:
 | 
			
		||||
#       hourly: 1
 | 
			
		||||
#       daily: 1
 | 
			
		||||
#       weekly: 1
 | 
			
		||||
#       monthly: 2
 | 
			
		||||
#       yearly: 4
 | 
			
		||||
#     copyMethod: Snapshot
 | 
			
		||||
#     storageClassName: ceph-block
 | 
			
		||||
#     volumeSnapshotClassName: ceph-blockpool-snapshot
 | 
			
		||||
							
								
								
									
										149
									
								
								clusters/cl01tl/applications/tautulli/values.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										149
									
								
								clusters/cl01tl/applications/tautulli/values.yaml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,149 @@
 | 
			
		||||
tautulli:
 | 
			
		||||
  controllers:
 | 
			
		||||
    main:
 | 
			
		||||
      type: deployment
 | 
			
		||||
      annotations:
 | 
			
		||||
        reloader.stakater.com/auto: "true"
 | 
			
		||||
      replicas: 1
 | 
			
		||||
      strategy: Recreate
 | 
			
		||||
      revisionHistoryLimit: 3
 | 
			
		||||
      containers:
 | 
			
		||||
        main:
 | 
			
		||||
          image:
 | 
			
		||||
            repository: ghcr.io/tautulli/tautulli
 | 
			
		||||
            tag: v2.15.1
 | 
			
		||||
            pullPolicy: IfNotPresent
 | 
			
		||||
          env:
 | 
			
		||||
            - name: PUID
 | 
			
		||||
              value: 1001
 | 
			
		||||
            - name: GUID
 | 
			
		||||
              value: 1001
 | 
			
		||||
            - name: TZ
 | 
			
		||||
              value: US/Central
 | 
			
		||||
          resources:
 | 
			
		||||
            requests:
 | 
			
		||||
              cpu: 10m
 | 
			
		||||
              memory: 128Mi
 | 
			
		||||
  serviceAccount:
 | 
			
		||||
    create: true
 | 
			
		||||
  configMaps:
 | 
			
		||||
    scripts:
 | 
			
		||||
      enabled: true
 | 
			
		||||
      data:
 | 
			
		||||
        select_tmdb_poster.py: |
 | 
			
		||||
          #!/usr/bin/env python
 | 
			
		||||
          # -*- coding: utf-8 -*-
 | 
			
		||||
 | 
			
		||||
          '''
 | 
			
		||||
          Description:  Selects the default TMDB poster if no poster is selected
 | 
			
		||||
                        or the current poster is from Gracenote.
 | 
			
		||||
          Author:       /u/SwiftPanda16
 | 
			
		||||
          Requires:     plexapi
 | 
			
		||||
          Usage:
 | 
			
		||||
              * Change the posters for an entire library:
 | 
			
		||||
                  python select_tmdb_poster.py --library "Movies"
 | 
			
		||||
 | 
			
		||||
              * Change the poster for a specific item:
 | 
			
		||||
                  python select_tmdb_poster.py --rating_key 1234
 | 
			
		||||
 | 
			
		||||
              * By default locked posters are skipped. To update locked posters:
 | 
			
		||||
                  python select_tmdb_poster.py --library "Movies" --include_locked
 | 
			
		||||
 | 
			
		||||
          Tautulli script trigger:
 | 
			
		||||
              * Notify on recently added
 | 
			
		||||
          Tautulli script conditions:
 | 
			
		||||
              * Filter which media to select the poster. Examples:
 | 
			
		||||
                  [ Media Type | is | movie ]
 | 
			
		||||
          Tautulli script arguments:
 | 
			
		||||
              * Recently Added:
 | 
			
		||||
                  --rating_key {rating_key}
 | 
			
		||||
          '''
 | 
			
		||||
 | 
			
		||||
          import argparse
 | 
			
		||||
          import os
 | 
			
		||||
          import plexapi.base
 | 
			
		||||
          from plexapi.server import PlexServer
 | 
			
		||||
          plexapi.base.USER_DONT_RELOAD_FOR_KEYS.add('fields')
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
          # Environmental Variables
 | 
			
		||||
          PLEX_URL = os.getenv('PLEX_URL')
 | 
			
		||||
          PLEX_TOKEN = os.getenv('PLEX_TOKEN')
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
          def select_tmdb_poster_library(library, include_locked=False):
 | 
			
		||||
              for item in library.all(includeGuids=False):
 | 
			
		||||
                  # Only reload for fields
 | 
			
		||||
                  item.reload(**{k: 0 for k, v in item._INCLUDES.items()})
 | 
			
		||||
                  select_tmdb_poster_item(item, include_locked=include_locked)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
          def select_tmdb_poster_item(item, include_locked=False):
 | 
			
		||||
              if item.isLocked('thumb') and not include_locked:  # PlexAPI 4.5.10
 | 
			
		||||
                  print(f"Locked poster for {item.title}. Skipping.")
 | 
			
		||||
                  return
 | 
			
		||||
 | 
			
		||||
              posters = item.posters()
 | 
			
		||||
              selected_poster = next((p for p in posters if p.selected), None)
 | 
			
		||||
 | 
			
		||||
              if selected_poster is None:
 | 
			
		||||
                  print(f"WARNING: No poster selected for {item.title}.")
 | 
			
		||||
              else:
 | 
			
		||||
                  skipping = ' Skipping.' if selected_poster.provider != 'gracenote' else ''
 | 
			
		||||
                  print(f"Poster provider is '{selected_poster.provider}' for {item.title}.{skipping}")
 | 
			
		||||
 | 
			
		||||
              if posters and (selected_poster is None or selected_poster.provider == 'gracenote'):
 | 
			
		||||
                  # Fallback to first poster if no TMDB posters are available
 | 
			
		||||
                  tmdb_poster = next((p for p in posters if p.provider == 'tmdb'), posters[0])
 | 
			
		||||
                  # Selecting the poster automatically locks it
 | 
			
		||||
                  tmdb_poster.select()
 | 
			
		||||
                  print(f"Selected {tmdb_poster.provider} poster for {item.title}.")
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
          if __name__ == '__main__':
 | 
			
		||||
              parser = argparse.ArgumentParser()
 | 
			
		||||
              parser.add_argument('--rating_key', type=int)
 | 
			
		||||
              parser.add_argument('--library')
 | 
			
		||||
              parser.add_argument('--include_locked', action='store_true')
 | 
			
		||||
              opts = parser.parse_args()
 | 
			
		||||
 | 
			
		||||
              plex = PlexServer(PLEX_URL, PLEX_TOKEN)
 | 
			
		||||
 | 
			
		||||
              if opts.rating_key:
 | 
			
		||||
                  item = plex.fetchItem(opts.rating_key)
 | 
			
		||||
                  select_tmdb_poster_item(item, opts.include_locked)
 | 
			
		||||
              elif opts.library:
 | 
			
		||||
                  library = plex.library.section(opts.library)
 | 
			
		||||
                  select_tmdb_poster_library(library, opts.include_locked)
 | 
			
		||||
              else:
 | 
			
		||||
                  print("No --rating_key or --library specified. Exiting.")
 | 
			
		||||
  service:
 | 
			
		||||
    main:
 | 
			
		||||
      controller: main
 | 
			
		||||
      ports:
 | 
			
		||||
        http:
 | 
			
		||||
          port: 80
 | 
			
		||||
          targetPort: 8181
 | 
			
		||||
          protocol: HTTP
 | 
			
		||||
  persistence:
 | 
			
		||||
    config:
 | 
			
		||||
      storageClass: ceph-block
 | 
			
		||||
      accessMode: ReadWriteOnce
 | 
			
		||||
      size: 5Gi
 | 
			
		||||
      retain: true
 | 
			
		||||
      advancedMounts:
 | 
			
		||||
        main:
 | 
			
		||||
          main:
 | 
			
		||||
            - path: /config
 | 
			
		||||
              readOnly: false
 | 
			
		||||
    scripts:
 | 
			
		||||
      enabled: true
 | 
			
		||||
      type: configMap
 | 
			
		||||
      name: tautulli-scripts
 | 
			
		||||
      advancedMounts:
 | 
			
		||||
        main:
 | 
			
		||||
          main:
 | 
			
		||||
            - path: /config/scripts/select_tmdb_poster.py
 | 
			
		||||
              readOnly: true
 | 
			
		||||
              mountPropagation: None
 | 
			
		||||
              subPath: select_tmdb_poster.py
 | 
			
		||||
		Reference in New Issue
	
	Block a user