diff --git a/manifests/media/kavita.yaml b/manifests/media/kavita.yaml new file mode 100644 index 0000000..303a8d1 --- /dev/null +++ b/manifests/media/kavita.yaml @@ -0,0 +1,169 @@ +# 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: 192.168.7.183 + 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