# Apply: kubectl apply -f manifests/media/kavita2.yaml # Delete: kubectl delete -f manifests/media/kavita2.yaml # Description: Second Kavita instance (separate library) with NFS book PV, local config PVC, and IngressRoute at books2.home.arpa. apiVersion: v1 kind: Namespace metadata: name: kavita2 --- apiVersion: v1 kind: PersistentVolume metadata: name: kavita2-books-pv spec: capacity: storage: 500Gi accessModes: - ReadOnlyMany persistentVolumeReclaimPolicy: Retain nfs: server: 192.168.7.183 path: /mnt/storage/jellyfin/other nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/hostname operator: In values: - minisforum --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: kavita2-books namespace: kavita2 annotations: helm.sh/resource-policy: keep spec: accessModes: - ReadOnlyMany storageClassName: "" volumeName: kavita2-books-pv resources: requests: storage: 500Gi --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: kavita2-config namespace: kavita2 annotations: helm.sh/resource-policy: keep spec: accessModes: - ReadWriteOnce storageClassName: local-path resources: requests: storage: 5Gi --- apiVersion: apps/v1 kind: Deployment metadata: name: kavita2 namespace: kavita2 spec: replicas: 1 selector: matchLabels: app: kavita2 template: metadata: labels: app: kavita2 spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: node-role operator: In values: - primary containers: - name: kavita2 image: lscr.io/linuxserver/kavita:latest ports: - containerPort: 5000 env: - name: PUID value: "1000" - name: PGID value: "1000" - name: TZ value: "Asia/Tokyo" readinessProbe: tcpSocket: port: 5000 initialDelaySeconds: 15 periodSeconds: 15 livenessProbe: tcpSocket: port: 5000 initialDelaySeconds: 30 periodSeconds: 30 resources: requests: cpu: 100m memory: 256Mi limits: cpu: 1000m memory: 1Gi volumeMounts: - name: config mountPath: /config - name: books mountPath: /data readOnly: true volumes: - name: config persistentVolumeClaim: claimName: kavita2-config - name: books persistentVolumeClaim: claimName: kavita2-books --- apiVersion: v1 kind: Service metadata: name: kavita2 namespace: kavita2 spec: selector: app: kavita2 ports: - port: 5000 targetPort: 5000 --- apiVersion: cert-manager.io/v1 kind: Certificate metadata: name: kavita2-tls namespace: kavita2 spec: secretName: kavita2-tls issuerRef: name: internal-ca-issuer kind: ClusterIssuer dnsNames: - books2.home.arpa --- apiVersion: traefik.io/v1alpha1 kind: IngressRoute metadata: name: kavita2 namespace: kavita2 spec: entryPoints: - websecure routes: - match: Host(`books2.home.arpa`) kind: Rule services: - name: kavita2 port: 5000 tls: secretName: kavita2-tls