Prowlarr

Manages the torrent indexers and feeds them to Sonarr, Radarr, and qBittorrent

Prowlarr manages indexers and hands them to Sonarr, Radarr, and the rest, with FlareSolverr behind it for protected sites.

Manifests & templates

templates/prowlarr/prowlarr-rollout.yaml

Prowlarr Rollout

Show manifest
{{- $projectName  := .Values.global.projectName }}
{{- $imagePullSecretsName  := .Values.global.imagePullSecretsName }}
{{- $timeZone := .Values.global.timeZone -}}
{{- $userID := .Values.global.userID -}}
{{- with .Values.applications.prowlarr }}
apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
  name: {{ .name }}
  namespace: {{ $projectName }}
spec:
  replicas: 1
  strategy:
    canary:
      maxSurge: 0
      maxUnavailable: 1
      steps:
      - setWeight: 100
  selector:
    matchLabels:
      app: {{ .name  }}
  template:
    metadata:
      labels:
        app: {{ .name  }}
    spec:
      {{- include "media-systems.nodePlacement" $ | nindent 6 }}
      serviceAccount: {{ $projectName }}-service-account
      serviceAccountName: {{ $projectName }}-service-account
      automountServiceAccountToken: true
      containers:
      - name: {{ .name  }}
        image: {{ .image }}
        imagePullPolicy: IfNotPresent
        ports:
        - name: {{ .name | substr 0 9 }}-http
          containerPort: {{ .ports.http }}
          protocol: TCP
        env:
        - name: PGID
          value: {{ $userID | quote }}
        - name: PUID
          value: {{ $userID | quote }}
        - name: TZ
          value: {{ $timeZone | quote }}
        volumeMounts:
        - name: {{ .name }}-config
          mountPath: {{ .configMount }}
        resources:
          requests:
            memory: "128Mi"
            cpu: "100m"
        securityContext:
          privileged: true
      initContainers:
      - name: {{ .name }}-configuration
        image: busybox
        command:
          - "/bin/sh"
          - "-c"
          - |
              echo "######## Mount config file #######";
              mkdir -p {{ .configMount }};
              cp /tmp/config.xml {{ .configMount }}/config.xml;
              chown {{ $userID }}:{{ $userID }} {{ .configMount }}/config.xml;
              chmod 400 {{ .configMount }}/config.xml;
              chown -R {{ $userID }}:{{ $userID }} {{ .configMount }};
              echo "Config Done";
        volumeMounts:
        - name: {{ .name }}-config
          mountPath: {{ .configMount }}
        - name: {{ .name }}-config-xml
          mountPath: /tmp/config.xml
          subPath: config.xml
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      schedulerName: default-scheduler
      volumes:
      - name: {{ .name }}-config
        emptyDir: {}
      - name: {{ .name }}-config-xml
        secret:
          secretName: apps-configs-secret
          items:
            - key: prowlarr_config
              path: config.xml
{{- end -}}

templates/_shared-templates/config-tpl/prowlarr-config-tpl.yaml

Config volume template: renders the Prowlarr config directory

Show manifest
apiVersion: v1
kind: ConfigMap
metadata:
  name: prowlarr-configs-config-tpl
  namespace: {{ .Release.Namespace }}
data:
  prowlarr_config: |
    <Config>
      <BindAddress>*</BindAddress>
      <Port>9696</Port>
      <SslPort>6969</SslPort>
      <EnableSsl>False</EnableSsl>
      <LaunchBrowser>True</LaunchBrowser>
      <ApiKey>{{ `{{ .prowlarr_api_key }}` }}</ApiKey>
      <AuthenticationMethod>Forms</AuthenticationMethod>
      <AuthenticationRequired>DisabledForLocalAddresses</AuthenticationRequired>
      <Branch>master</Branch>
      <LogLevel>debug</LogLevel>
      <SslCertPath></SslCertPath>
      <SslCertPassword></SslCertPassword>
      <UrlBase></UrlBase>
      <InstanceName>Prowlarr</InstanceName>
      <UpdateMechanism>Docker</UpdateMechanism>
      <AnalyticsEnabled>False</AnalyticsEnabled>
      <PostgresUser>{{ `{{ .db_username }}` }}</PostgresUser>
      <PostgresPassword>{{ `{{ .db_password }}` }}</PostgresPassword>
      <PostgresPort>{{ `{{ .db_port }}` }}</PostgresPort>
      <PostgresHost>{{ `{{ .db_host_name }}` }}</PostgresHost>
      <PostgresMainDb>{{ `{{ .prowlarr_db_name }}` }}</PostgresMainDb>
      <PostgresLogDb>{{ `{{ .prowlarr_db_name }}` }}_logs</PostgresLogDb>
    </Config>
  • media-systems is one umbrella Application: the whole pipeline deploys as a unit, pinned to a single node with local SSD storage. Per-app settings live in the media chart, not here.
  • This app is a section of the shared media-systems values file above; the media stack deploys as one ArgoCD Application.

Trade-offs

Decision. Centralised indexer management

Alternative. Configuring indexers in each arr app

Why. One place to add or fix an indexer; every consumer updates automatically.

← Back to Media · All service groups