Skip to content

feat(Booklore): add Booklore - #34

Merged
maverickd650 merged 3 commits into
mainfrom
booklore
Dec 6, 2025
Merged

feat(Booklore): add Booklore#34
maverickd650 merged 3 commits into
mainfrom
booklore

Conversation

@maverickd650

Copy link
Copy Markdown
Owner

Manual Pull Request

🚀 Summary

📦 Affected Areas

  • HelmRelease
  • Kustomization
  • Secrets (SOPS)
  • Cluster Bootstrap / Repos
  • Ingress
  • Monitoring
  • VolSync / Backups
  • CI
  • Other:

✅ Checklist

  • Secrets encrypted with SOPS and committed as encrypted only
  • No plaintext secrets committed
  • Base domain, hostnames, and URLs are templated correctly
  • Certifcate issuer set correctly
  • Required Helm repositories are defined in ./repositories/helm
  • Integrations set correctly
  • Chart versions are correct vs upstream
  • Ingress annotations and rules are correct
  • Volsync setup correctly
  • Kustomizations reference correct chart and path
  • CI workflows (if applicable) run successfully
  • Namespace is correct and consistent
  • Privileged setup where necessary

🧠 Notes for Myself

@github-actions github-actions Bot added the area/kubernetes Changes made in Kubernetes directory. label Dec 6, 2025
@mav-bot

mav-bot Bot commented Dec 6, 2025

Copy link
Copy Markdown
Contributor
--- kubernetes/apps Kustomization: flux-system/cluster-apps Kustomization: media/booklore

+++ kubernetes/apps Kustomization: flux-system/cluster-apps Kustomization: media/booklore

@@ -0,0 +1,52 @@

+---
+apiVersion: kustomize.toolkit.fluxcd.io/v1
+kind: Kustomization
+metadata:
+  labels:
+    kustomize.toolkit.fluxcd.io/name: cluster-apps
+    kustomize.toolkit.fluxcd.io/namespace: flux-system
+  name: booklore
+  namespace: media
+spec:
+  decryption:
+    provider: sops
+  deletionPolicy: WaitForTermination
+  interval: 1h
+  patches:
+  - patch: |-
+      apiVersion: helm.toolkit.fluxcd.io/v2
+      kind: HelmRelease
+      metadata:
+        name: _
+      spec:
+        install:
+          crds: CreateReplace
+          strategy:
+            name: RetryOnFailure
+        rollback:
+          cleanupOnFail: true
+          recreate: true
+        upgrade:
+          cleanupOnFail: true
+          crds: CreateReplace
+          strategy:
+            name: RemediateOnFailure
+          remediation:
+            remediateLastFailure: true
+            retries: 2
+    target:
+      group: helm.toolkit.fluxcd.io
+      kind: HelmRelease
+  path: ./kubernetes/apps/media/booklore/app
+  postBuild:
+    substituteFrom:
+    - kind: Secret
+      name: cluster-secrets
+  prune: true
+  sourceRef:
+    kind: GitRepository
+    name: flux-system
+    namespace: flux-system
+  targetNamespace: media
+  wait: true
+
--- kubernetes/apps/media/booklore/app Kustomization: media/booklore HelmRelease: media/booklore

+++ kubernetes/apps/media/booklore/app Kustomization: media/booklore HelmRelease: media/booklore

@@ -0,0 +1,71 @@

+---
+apiVersion: helm.toolkit.fluxcd.io/v2
+kind: HelmRelease
+metadata:
+  labels:
+    kustomize.toolkit.fluxcd.io/name: booklore
+    kustomize.toolkit.fluxcd.io/namespace: media
+  name: booklore
+  namespace: media
+spec:
+  chartRef:
+    kind: OCIRepository
+    name: booklore
+  install:
+    crds: CreateReplace
+    createNamespace: true
+    remediation:
+      retries: 3
+    strategy:
+      name: RetryOnFailure
+  interval: 1h
+  maxHistory: 3
+  rollback:
+    cleanupOnFail: true
+    recreate: true
+  timeout: 20m
+  uninstall:
+    keepHistory: false
+  upgrade:
+    cleanupOnFail: true
+    crds: CreateReplace
+    remediation:
+      remediateLastFailure: true
+      retries: 2
+    strategy:
+      name: RemediateOnFailure
+  values:
+    credentials:
+      s3:
+        accessKey: ..PLACEHOLDER_S3ID..
+        bucket: ..PLACEHOLDER_S3PREFIX..-booklore
+        encrKey: ..PLACEHOLDER_S3KEY..
+        secretKey: ..PLACEHOLDER_S3KEY..
+        type: s3
+        url: https://placeholder.example
+    global:
+      stopAll: false
+    persistence:
+      books:
+        enabled: true
+        mountPath: /books
+        path: /mnt/media/calibre
+        server: 192.168.50.118
+        type: nfs
+      data:
+        volsync:
+        - credentials: s3
+          dest:
+            enabled: true
+            moverSecurityContext:
+              fsGroup: 0
+              runAsGroup: 0
+              runAsUser: 0
+          name: data
+          src:
+            enabled: true
+            moverSecurityContext:
+              runAsGroup: 0
+              runAsUser: 0
+          type: restic
+
--- kubernetes/apps/media/booklore/app Kustomization: media/booklore OCIRepository: media/booklore

+++ kubernetes/apps/media/booklore/app Kustomization: media/booklore OCIRepository: media/booklore

@@ -0,0 +1,18 @@

+---
+apiVersion: source.toolkit.fluxcd.io/v1
+kind: OCIRepository
+metadata:
+  labels:
+    kustomize.toolkit.fluxcd.io/name: booklore
+    kustomize.toolkit.fluxcd.io/namespace: media
+  name: booklore
+  namespace: media
+spec:
+  interval: 15m
+  layerSelector:
+    mediaType: application/vnd.cncf.helm.chart.content.v1.tar+gzip
+    operation: copy
+  ref:
+    tag: 1.6.1
+  url: oci://oci.trueforge.org/truecharts/booklore
+
--- kubernetes/apps/media/booklore/app Kustomization: media/booklore HTTPRoute: media/booklore

+++ kubernetes/apps/media/booklore/app Kustomization: media/booklore HTTPRoute: media/booklore

@@ -0,0 +1,25 @@

+---
+apiVersion: gateway.networking.k8s.io/v1
+kind: HTTPRoute
+metadata:
+  annotations:
+    gatus.home-operations.com/endpoint: |
+      client:
+        dns-resolver: tcp://..PLACEHOLDER_UNIFI_HOST..:53
+  labels:
+    kustomize.toolkit.fluxcd.io/name: booklore
+    kustomize.toolkit.fluxcd.io/namespace: media
+  name: booklore
+  namespace: media
+spec:
+  hostnames:
+  - book...PLACEHOLDER_SECRET_DOMAIN..
+  parentRefs:
+  - name: envoy-internal
+    namespace: network
+    sectionName: https
+  rules:
+  - backendRefs:
+    - name: booklore
+      port: 6060
+

@mav-bot

mav-bot Bot commented Dec 6, 2025

Copy link
Copy Markdown
Contributor
--- HelmRelease: media/booklore ConfigMap: media/booklore-mariadb-passinit

+++ HelmRelease: media/booklore ConfigMap: media/booklore-mariadb-passinit

@@ -0,0 +1,18 @@

+---
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: booklore-mariadb-passinit
+  namespace: media
+  labels:
+    app.kubernetes.io/instance: booklore
+    app.kubernetes.io/managed-by: Helm
+    app.kubernetes.io/name: mariadb
+    helm-revision: '1'
+    release: booklore
+data:
+  passinit.sql: |
+    ALTER USER root@'%' IDENTIFIED VIA mysql_native_password USING PASSWORD("PLACEHOLDERROOTPASSWORD");
+    ALTER USER booklore@'%' IDENTIFIED VIA mysql_native_password USING PASSWORD("PLACEHOLDERPASSWORD");
+    FLUSH PRIVILEGES;
+
--- HelmRelease: media/booklore PersistentVolumeClaim: media/booklore-mariadb-data

+++ HelmRelease: media/booklore PersistentVolumeClaim: media/booklore-mariadb-data

@@ -0,0 +1,19 @@

+---
+apiVersion: v1
+kind: PersistentVolumeClaim
+metadata:
+  name: booklore-mariadb-data
+  namespace: media
+  labels:
+    app.kubernetes.io/instance: booklore
+    app.kubernetes.io/managed-by: Helm
+    app.kubernetes.io/name: mariadb
+    helm-revision: '1'
+    release: booklore
+spec:
+  accessModes:
+  - ReadWriteOnce
+  resources:
+    requests:
+      storage: 100Gi
+
--- HelmRelease: media/booklore PersistentVolumeClaim: media/booklore-data

+++ HelmRelease: media/booklore PersistentVolumeClaim: media/booklore-data

@@ -0,0 +1,23 @@

+---
+apiVersion: v1
+kind: PersistentVolumeClaim
+metadata:
+  name: booklore-data
+  namespace: media
+  labels:
+    app.kubernetes.io/instance: booklore
+    app.kubernetes.io/managed-by: Helm
+    app.kubernetes.io/name: booklore
+    helm-revision: '1'
+    release: booklore
+spec:
+  accessModes:
+  - ReadWriteOnce
+  resources:
+    requests:
+      storage: 100Gi
+  dataSourceRef:
+    kind: ReplicationDestination
+    name: booklore-data-data-dest
+    apiGroup: volsync.backube
+
--- HelmRelease: media/booklore Service: media/booklore-mariadb

+++ HelmRelease: media/booklore Service: media/booklore-mariadb

@@ -0,0 +1,26 @@

+---
+apiVersion: v1
+kind: Service
+metadata:
+  name: booklore-mariadb
+  namespace: media
+  labels:
+    app.kubernetes.io/instance: booklore
+    app.kubernetes.io/managed-by: Helm
+    app.kubernetes.io/name: mariadb
+    helm-revision: '1'
+    release: booklore
+    service.name: main
+spec:
+  type: ClusterIP
+  publishNotReadyAddresses: false
+  ports:
+  - name: main
+    port: 3306
+    protocol: TCP
+    targetPort: 3306
+  selector:
+    pod.name: main
+    app.kubernetes.io/name: mariadb
+    app.kubernetes.io/instance: booklore
+
--- HelmRelease: media/booklore Service: media/booklore

+++ HelmRelease: media/booklore Service: media/booklore

@@ -0,0 +1,26 @@

+---
+apiVersion: v1
+kind: Service
+metadata:
+  name: booklore
+  namespace: media
+  labels:
+    app.kubernetes.io/instance: booklore
+    app.kubernetes.io/managed-by: Helm
+    app.kubernetes.io/name: booklore
+    helm-revision: '1'
+    release: booklore
+    service.name: main
+spec:
+  type: ClusterIP
+  publishNotReadyAddresses: false
+  ports:
+  - name: main
+    port: 6060
+    protocol: TCP
+    targetPort: 6060
+  selector:
+    pod.name: main
+    app.kubernetes.io/name: booklore
+    app.kubernetes.io/instance: booklore
+
--- HelmRelease: media/booklore Deployment: media/booklore-mariadb

+++ HelmRelease: media/booklore Deployment: media/booklore-mariadb

@@ -0,0 +1,235 @@

+---
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  name: booklore-mariadb
+  namespace: media
+  labels:
+    app.kubernetes.io/instance: booklore
+    app.kubernetes.io/managed-by: Helm
+    app.kubernetes.io/name: mariadb
+    helm-revision: '1'
+    release: booklore
+spec:
+  replicas: 1
+  revisionHistoryLimit: 3
+  strategy:
+    type: Recreate
+  selector:
+    matchLabels:
+      pod.name: main
+      app.kubernetes.io/name: mariadb
+      app.kubernetes.io/instance: booklore
+  template:
+    metadata:
+      labels:
+        app.kubernetes.io/instance: booklore
+        app.kubernetes.io/managed-by: Helm
+        app.kubernetes.io/name: mariadb
+        helm-revision: '1'
+        pod.lifecycle: permanent
+        pod.name: main
+        release: booklore
+        truecharts.org/pvc: data
+      annotations:
+        checksum/cnpg: fc940fff4269c53072f7039f0811133e9b83400670af014010bf50d3f13740f4
+        checksum/configmaps: 2f70d6807f093247fad96153a9c6c0d57b4aa02789e19be1b9c088c65f4e2d07
+        checksum/mariadb: 09c85576cb45b1eecd1467732b11ea8fa3363b0105c465f02a6ad64991521d52
+        checksum/mongodb: 09c85576cb45b1eecd1467732b11ea8fa3363b0105c465f02a6ad64991521d52
+        checksum/persistence: 8ffd0e1ed704294dee132aa12aa878607a18e34eb50683c4740e2587a5b9361b
+        checksum/services: 3c1dd612ec74ee9e0f9d1999416f52f56037e0b49ff3a1234059de4203563ec5
+        checksum/solr: 29c14feeaddbf7762052db593898d274941f539cee681ddc613957587686f347
+    spec:
+      serviceAccountName: default
+      automountServiceAccountToken: false
+      runtimeClassName: null
+      hostNetwork: false
+      hostPID: false
+      hostIPC: false
+      shareProcessNamespace: false
+      enableServiceLinks: false
+      restartPolicy: Always
+      nodeSelector:
+        kubernetes.io/arch: amd64
+      affinity:
+        podAffinity:
+          requiredDuringSchedulingIgnoredDuringExecution:
+          - topologyKey: kubernetes.io/hostname
+            labelSelector:
+              matchExpressions:
+              - key: truecharts.org/pvc
+                operator: In
+                values:
+                - data
+      topologySpreadConstraints:
+      - maxSkew: 1
+        whenUnsatisfiable: ScheduleAnyway
+        topologyKey: kubernetes.io/hostname
+        labelSelector:
+          matchLabels:
+            pod.name: main
+            app.kubernetes.io/name: mariadb
+            app.kubernetes.io/instance: booklore
+        nodeAffinityPolicy: Honor
+        nodeTaintsPolicy: Honor
+      dnsPolicy: ClusterFirst
+      dnsConfig:
+        options:
+        - name: ndots
+          value: '1'
+      terminationGracePeriodSeconds: 60
+      securityContext:
+        fsGroup: 568
+        fsGroupChangePolicy: OnRootMismatch
+        supplementalGroups:
+        - 568
+        sysctls: []
+      hostUsers: true
+      containers:
+      - name: booklore-mariadb
+        image: docker.io/bitnamisecure/mariadb:latest@sha256:3226e489fa1441a6faaa7142742af2c5b65b9183485c80c8ce2014fcb688c13d
+        imagePullPolicy: IfNotPresent
+        tty: false
+        stdin: false
+        ports:
+        - name: main
+          containerPort: 3306
+          protocol: TCP
+          hostPort: null
+        volumeMounts:
+        - name: data
+          mountPath: /bitnami/mariadb
+          readOnly: false
+        - name: devshm
+          mountPath: /dev/shm
+          readOnly: false
+        - name: passinit
+          mountPath: /init/passinit.sql
+          readOnly: false
+          subPath: passinit.sql
+        - name: shared
+          mountPath: /shared
+          readOnly: false
+        - name: tmp
+          mountPath: /tmp
+          readOnly: false
+        - name: varlogs
+          mountPath: /var/logs
+          readOnly: false
+        - name: varrun
+          mountPath: /var/run
+          readOnly: false
+        livenessProbe:
+          exec:
+            command:
+            - /bin/bash
+            - -ec
+            - until /opt/bitnami/scripts/mariadb/healthcheck.sh; do sleep 2; done
+          initialDelaySeconds: 12
+          failureThreshold: 5
+          successThreshold: 1
+          timeoutSeconds: 5
+          periodSeconds: 15
+        readinessProbe:
+          exec:
+            command:
+            - /bin/bash
+            - -ec
+            - until /opt/bitnami/scripts/mariadb/healthcheck.sh; do sleep 2; done
+          initialDelaySeconds: 10
+          failureThreshold: 4
+          successThreshold: 2
+          timeoutSeconds: 5
+          periodSeconds: 12
+        startupProbe:
+          exec:
+            command:
+            - /bin/bash
+            - -ec
+            - until /opt/bitnami/scripts/mariadb/healthcheck.sh; do sleep 2; done
+          initialDelaySeconds: 10
+          failureThreshold: 60
+          successThreshold: 1
+          timeoutSeconds: 3
+          periodSeconds: 5
+        resources:
+          requests:
+            cpu: 75m
+            memory: 200Mi
+          limits:
+            cpu: 1500m
+            memory: 2400Mi
+        securityContext:
+          runAsNonRoot: false
+          runAsUser: 568
+          runAsGroup: 0
+          readOnlyRootFilesystem: false
+          allowPrivilegeEscalation: false
+          privileged: false
+          seccompProfile:
+            type: RuntimeDefault
+          capabilities:
+            add: []
+            drop:
+            - ALL
+        env:
+        - name: TZ
+          value: UTC
+        - name: UMASK
+          value: '0022'
+        - name: UMASK_SET
+          value: '0022'
+        - name: NVIDIA_VISIBLE_DEVICES
+          value: void
+        - name: PUID
+          value: '568'
+        - name: USER_ID
+          value: '568'
+        - name: UID
+          value: '568'
+        - name: PGID
+          value: '568'
+        - name: GROUP_ID
+          value: '568'
+        - name: GID
+          value: '568'
+        - name: MARIADB_DATABASE
+          value: test
+        - name: MARIADB_EXTRA_FLAGS
+          value: --init-file=/init/passinit.sql
+        - name: MARIADB_PASSWORD
+          value: PLACEHOLDERPASSWORD
+        - name: MARIADB_ROOT_PASSWORD
+          value: PLACEHOLDERROOTPASSWORD
+        - name: MARIADB_USER
+          value: booklore
+      volumes:
+      - name: passinit
+        configMap:
+          name: booklore-mariadb-passinit
+          optional: false
+          items:
+          - key: passinit.sql
+            path: passinit.sql
+      - name: devshm
+        emptyDir:
+          medium: Memory
+          sizeLimit: 2400Mi
+      - name: shared
+        emptyDir: {}
+      - name: tmp
+        emptyDir:
+          medium: Memory
+          sizeLimit: 2400Mi
+      - name: varlogs
+        emptyDir:
+          medium: Memory
+          sizeLimit: 2400Mi
+      - name: varrun
+        emptyDir:
+          medium: Memory
+          sizeLimit: 2400Mi
+      - name: data
+        persistentVolumeClaim:
+          claimName: booklore-mariadb-data
+
--- HelmRelease: media/booklore Deployment: media/booklore

+++ HelmRelease: media/booklore Deployment: media/booklore

@@ -0,0 +1,296 @@

+---
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+  name: booklore
+  namespace: media
+  labels:
+    app.kubernetes.io/instance: booklore
+    app.kubernetes.io/managed-by: Helm
+    app.kubernetes.io/name: booklore
+    helm-revision: '1'
+    release: booklore
+spec:
+  replicas: 1
+  revisionHistoryLimit: 3
+  strategy:
+    type: Recreate
+  selector:
+    matchLabels:
+      pod.name: main
+      app.kubernetes.io/name: booklore
+      app.kubernetes.io/instance: booklore
+  template:
+    metadata:
+      labels:
+        app.kubernetes.io/instance: booklore
+        app.kubernetes.io/managed-by: Helm
+        app.kubernetes.io/name: booklore
+        helm-revision: '1'
+        pod.lifecycle: permanent
+        pod.name: main
+        release: booklore
+        truecharts.org/pvc: data
+      annotations:
+        checksum/cnpg: fc940fff4269c53072f7039f0811133e9b83400670af014010bf50d3f13740f4
+        checksum/configmaps: 44136fa355b3678a1146ad16f7e8649e94fb4fc21fe77e8310c060f61caaff8a
+        checksum/mariadb: db8dcc0a958e6d03b5fc546ac43a65c2e783126cf1c59ec885bd63072fe5ac86
+        checksum/mongodb: 09c85576cb45b1eecd1467732b11ea8fa3363b0105c465f02a6ad64991521d52
+        checksum/persistence: fb910516287a74fa82e92dad650785cb8f0ca930086d5daac2a53afc91452e97
+        checksum/services: e7a651656b12e6a7ab0fa253c37a88f40b00e43ee28182ad394b470a16eb564b
+        checksum/solr: 29c14feeaddbf7762052db593898d274941f539cee681ddc613957587686f347
+    spec:
+      serviceAccountName: default
+      automountServiceAccountToken: false
+      runtimeClassName: null
+      hostNetwork: false
+      hostPID: false
+      hostIPC: false
+      shareProcessNamespace: false
+      enableServiceLinks: false
+      restartPolicy: Always
+      nodeSelector:
+        kubernetes.io/arch: amd64
+      affinity:
+        podAffinity:
+          requiredDuringSchedulingIgnoredDuringExecution:
+          - topologyKey: kubernetes.io/hostname
+            labelSelector:
+              matchExpressions:
+              - key: truecharts.org/pvc
+                operator: In
+                values:
+                - data
+      topologySpreadConstraints:
+      - maxSkew: 1
+        whenUnsatisfiable: ScheduleAnyway
+        topologyKey: kubernetes.io/hostname
+        labelSelector:
+          matchLabels:
+            pod.name: main
+            app.kubernetes.io/name: booklore
+            app.kubernetes.io/instance: booklore
+        nodeAffinityPolicy: Honor
+        nodeTaintsPolicy: Honor
+      dnsPolicy: ClusterFirst
+      dnsConfig:
+        options:
+        - name: ndots
+          value: '1'
+      terminationGracePeriodSeconds: 60
+      securityContext:
+        fsGroup: 568
+        fsGroupChangePolicy: OnRootMismatch
+        supplementalGroups:
+        - 568
+        sysctls: []
+      hostUsers: true
+      containers:
+      - name: booklore
+        image: ghcr.io/booklore-app/booklore:v1.13.1@sha256:4979f536ae7dfde891cd998e8545cd2e3d534a164c23bc4663d83616d9a9f3a7
+        imagePullPolicy: IfNotPresent
+        tty: false
+        stdin: false
+        ports:
+        - name: main
+          containerPort: 6060
+          protocol: TCP
+          hostPort: null
+        volumeMounts:
+        - name: books
+          mountPath: /books
+          readOnly: false
+        - name: data
+          mountPath: /app/data
+          readOnly: false
+        - name: devshm
+          mountPath: /dev/shm
+          readOnly: false
+        - name: shared
+          mountPath: /shared
+          readOnly: false
+        - name: tmp
+          mountPath: /tmp
+          readOnly: false
+        - name: varlogs
+          mountPath: /var/logs
+          readOnly: false
+        livenessProbe:
+          httpGet:
+            port: 6060
+            path: /
+            scheme: HTTP
+          initialDelaySeconds: 12
+          failureThreshold: 5
+          successThreshold: 1
+          timeoutSeconds: 5
+          periodSeconds: 15
+        readinessProbe:
+          httpGet:
+            port: 6060
+            path: /
+            scheme: HTTP
+          initialDelaySeconds: 10
+          failureThreshold: 4
+          successThreshold: 2
+          timeoutSeconds: 5
+          periodSeconds: 12
+        startupProbe:
+          httpGet:
+            port: 6060
+            path: /
+            scheme: HTTP
+          initialDelaySeconds: 10
+          failureThreshold: 60
+          successThreshold: 1
+          timeoutSeconds: 3
+          periodSeconds: 5
+        resources:
+          requests:
+            cpu: 75m
+            memory: 200Mi
+          limits:
+            cpu: 1500m
+            memory: 2400Mi
+        securityContext:
+          runAsNonRoot: false
+          runAsUser: 0
+          runAsGroup: 0
+          readOnlyRootFilesystem: false
+          allowPrivilegeEscalation: false
+          privileged: false
+          seccompProfile:
+            type: RuntimeDefault
+          capabilities:
+            add:
+            - CHOWN
+            - SETUID
+            - SETGID
+            - FOWNER
+            - DAC_OVERRIDE
+            drop:
+            - ALL
+        env:
+        - name: TZ
+          value: UTC
+        - name: UMASK
+          value: '0022'
+        - name: UMASK_SET
+          value: '0022'
+        - name: NVIDIA_VISIBLE_DEVICES
+          value: void
+        - name: PUID
+          value: '568'
+        - name: USER_ID
+          value: '568'
+        - name: UID
+          value: '568'
+        - name: PGID
+          value: '568'
+        - name: GROUP_ID
+          value: '568'
+        - name: GID
+          value: '568'
+        - name: BOOKLORE_PORT
+          value: '6060'
+        - name: DATABASE_PASSWORD
+          value: PLACEHOLDERPASSWORD
+        - name: DATABASE_URL
+          valueFrom:
+            secretKeyRef:
+              key: jdbc-mariadb
+              name: booklore-mariadbcreds
+        - name: DATABASE_USERNAME
+          value: booklore
+      initContainers:
+      - name: booklore-system-mariadb-wait
+        image: oci.trueforge.org/containerforge/mariadb-client:1.1.0
+        imagePullPolicy: IfNotPresent
+        tty: false
+        stdin: false
+        command:
+        - /bin/sh
+        - -c
+        - |-
+          /bin/bash <<'EOF'
+          echo "Executing DB waits..."
+          until
+            mysqladmin -uroot -h"${MARIADB_HOST}" -p"${MARIADB_ROOT_PASSWORD}" ping \
+            && mysqladmin -uroot -h"${MARIADB_HOST}" -p"${MARIADB_ROOT_PASSWORD}" status;
+            do sleep 2;
+          done
+          EOF
+        volumeMounts:
+        - name: devshm
+          mountPath: /dev/shm
+          readOnly: false
+        - name: shared
+          mountPath: /shared
+          readOnly: false
+        - name: tmp
+          mountPath: /tmp
+          readOnly: false
+        - name: varlogs
+          mountPath: /var/logs
+          readOnly: false
+        resources:
+          requests:
+            cpu: 10m
+            memory: 50Mi
+          limits:
+            cpu: 500m
+            memory: 512Mi
+        securityContext:
+          runAsNonRoot: true
+          runAsUser: 568
+          runAsGroup: 568
+          readOnlyRootFilesystem: true
+          allowPrivilegeEscalation: false
+          privileged: false
+          seccompProfile:
+            type: RuntimeDefault
+          capabilities:
+            add: []
+            drop:
+            - ALL
+        env:
+        - name: TZ
+          value: UTC
+        - name: UMASK
+          value: '0022'
+        - name: UMASK_SET
+          value: '0022'
+        - name: NVIDIA_VISIBLE_DEVICES
+          value: void
+        - name: S6_READ_ONLY_ROOT
+          value: '1'
+        - name: MARIADB_HOST
+          valueFrom:
+            secretKeyRef:
+              key: plainhost
+              name: booklore-mariadbcreds
+        - name: MARIADB_ROOT_PASSWORD
+          value: PLACEHOLDERROOTPASSWORD
+      volumes:
+      - name: devshm
+        emptyDir:
+          medium: Memory
+          sizeLimit: 2400Mi
+      - name: shared
+        emptyDir: {}
+      - name: tmp
+        emptyDir:
+          medium: Memory
+          sizeLimit: 2400Mi
+      - name: varlogs
+        emptyDir:
+          medium: Memory
+          sizeLimit: 2400Mi
+      - name: books
+        nfs:
+          path: /mnt/media/calibre
+          server: 192.168.50.118
+      - name: data
+        persistentVolumeClaim:
+          claimName: booklore-data
+
--- HelmRelease: media/booklore ReplicationDestination: media/booklore-data-data-dest

+++ HelmRelease: media/booklore ReplicationDestination: media/booklore-data-data-dest

@@ -0,0 +1,29 @@

+---
+apiVersion: volsync.backube/v1alpha1
+kind: ReplicationDestination
+metadata:
+  name: booklore-data-data-dest
+  namespace: media
+  labels:
+    app.kubernetes.io/instance: booklore
+    app.kubernetes.io/managed-by: Helm
+    app.kubernetes.io/name: booklore
+    helm-revision: '1'
+    release: booklore
+spec:
+  trigger:
+    manual: restore-once
+  restic:
+    repository: booklore-data-volsync-data
+    copyMethod: Snapshot
+    capacity: 100Gi
+    cleanupTempPVC: false
+    cleanupCachePVC: false
+    accessModes:
+    - ReadWriteOnce
+    cacheCapacity: 10Gi
+    moverSecurityContext:
+      runAsUser: 0
+      runAsGroup: 0
+      fsGroup: 0
+
--- HelmRelease: media/booklore ReplicationSource: media/booklore-data-data

+++ HelmRelease: media/booklore ReplicationSource: media/booklore-data-data

@@ -0,0 +1,35 @@

+---
+apiVersion: volsync.backube/v1alpha1
+kind: ReplicationSource
+metadata:
+  name: booklore-data-data
+  namespace: media
+  labels:
+    app.kubernetes.io/instance: booklore
+    app.kubernetes.io/managed-by: Helm
+    app.kubernetes.io/name: booklore
+    helm-revision: '1'
+    release: booklore
+spec:
+  sourcePVC: booklore-data
+  trigger:
+    schedule: 0 0 * * *
+  restic:
+    repository: booklore-data-volsync-data
+    copyMethod: Snapshot
+    pruneIntervalDays: 7
+    unlock: '20251206112248'
+    retain:
+      hourly: 6
+      daily: 5
+      weekly: 4
+      monthly: 3
+      yearly: 1
+    accessModes:
+    - ReadWriteOnce
+    cacheCapacity: 10Gi
+    moverSecurityContext:
+      runAsUser: 0
+      runAsGroup: 0
+      fsGroup: 568
+

@maverickd650
maverickd650 merged commit 603a4d2 into main Dec 6, 2025
7 checks passed
@maverickd650
maverickd650 deleted the booklore branch December 6, 2025 11:26
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area/kubernetes Changes made in Kubernetes directory.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant