# Apply: kubectl apply -f manifests/media/kavita.yaml # Delete: kubectl delete -f manifests/media/kavita.yaml # Description: Kavita e-book/comic/manga server with NFS book library PV, local config PVC, and IngressRoute at books.home.arpa. apiVersion: v1 kind: Namespace metadata: name: kavita --- apiVersion: v1 kind: PersistentVolume metadata: name: kavita-books-pv spec: capacity: storage: 500Gi accessModes: - ReadOnlyMany persistentVolumeReclaimPolicy: Retain nfs: server: 10.10.40.20 path: /mnt/storage/books nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/hostname operator: In values: - minisforum --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: kavita-books namespace: kavita annotations: helm.sh/resource-policy: keep spec: accessModes: - ReadOnlyMany storageClassName: "" volumeName: kavita-books-pv resources: requests: storage: 500Gi --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: kavita-config namespace: kavita annotations: helm.sh/resource-policy: keep spec: accessModes: - ReadWriteOnce storageClassName: local-path resources: requests: storage: 5Gi --- apiVersion: apps/v1 kind: Deployment metadata: name: kavita namespace: kavita spec: replicas: 1 selector: matchLabels: app: kavita template: metadata: labels: app: kavita spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: node-role operator: In values: - primary containers: - name: kavita 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: kavita-config - name: books persistentVolumeClaim: claimName: kavita-books --- apiVersion: v1 kind: Service metadata: name: kavita namespace: kavita spec: selector: app: kavita ports: - port: 5000 targetPort: 5000 --- apiVersion: cert-manager.io/v1 kind: Certificate metadata: name: kavita-tls namespace: kavita spec: secretName: kavita-tls issuerRef: name: internal-ca-issuer kind: ClusterIssuer dnsNames: - books.home.arpa --- apiVersion: traefik.io/v1alpha1 kind: IngressRoute metadata: name: kavita namespace: kavita spec: entryPoints: - websecure routes: - match: Host(`books.home.arpa`) kind: Rule services: - name: kavita port: 5000 tls: secretName: kavita-tls