From 7cd3e1020cf29454e9d3a5be1947e00631993cd0 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sat, 3 Jan 2026 12:36:54 +0000 Subject: [PATCH] Release gohoarder 0.1.10 --- charts/gohoarder/Chart.yaml | 4 +-- charts/gohoarder/templates/_helpers.tpl | 14 +++++++++ .../templates/deployment-scanner.yaml | 1 + .../templates/deployment-server.yaml | 1 + charts/gohoarder/values.yaml | 27 ++++++++++++---- charts/packages/gohoarder-0.1.10.tgz | Bin 0 -> 16629 bytes index.yaml | 29 +++++++++++++++++- 7 files changed, 67 insertions(+), 9 deletions(-) create mode 100644 charts/packages/gohoarder-0.1.10.tgz diff --git a/charts/gohoarder/Chart.yaml b/charts/gohoarder/Chart.yaml index 03fecdd..c2ee078 100644 --- a/charts/gohoarder/Chart.yaml +++ b/charts/gohoarder/Chart.yaml @@ -2,8 +2,8 @@ apiVersion: v2 name: gohoarder description: A universal package cache proxy supporting npm, PyPI, and Go modules with security scanning type: application -version: 0.1.9 -appVersion: "0.1.9" +version: 0.1.10 +appVersion: "0.1.10" keywords: - package-manager - cache diff --git a/charts/gohoarder/templates/_helpers.tpl b/charts/gohoarder/templates/_helpers.tpl index b3232b5..859f65a 100644 --- a/charts/gohoarder/templates/_helpers.tpl +++ b/charts/gohoarder/templates/_helpers.tpl @@ -172,3 +172,17 @@ Trivy cache volume configuration emptyDir: {} {{- end }} {{- end }} + +{{/* +Validate SQLite configuration - SQLite cannot be used with SMB/NFS network storage +*/}} +{{- define "gohoarder.validateSQLiteConfig" -}} +{{- if eq .Values.metadata.backend "sqlite" }} + {{- if .Values.metadata.sqlite.persistence.enabled }} + {{- $storageClass := .Values.metadata.sqlite.persistence.storageClass | default .Values.storage.storageClass }} + {{- if or (contains "smb" ($storageClass | lower)) (contains "cifs" ($storageClass | lower)) (contains "nfs" ($storageClass | lower)) }} + {{- fail "\n\n❌ ERROR: SQLite cannot be used with SMB/CIFS/NFS network storage!\n\nSQLite requires POSIX file locking which is not reliably supported over network filesystems.\nThis will cause 'database is locked' errors and data corruption.\n\nPlease choose ONE of the following solutions:\n\n1. Use PostgreSQL for network storage (RECOMMENDED for production):\n metadata:\n backend: postgresql\n postgresql:\n host: your-postgres-host\n ...\n\n2. Use local storage for SQLite (OK for development):\n metadata:\n sqlite:\n persistence:\n enabled: true\n storageClass: local-path # or another local storage class\n\n3. Disable persistence (data will be lost on pod restart):\n metadata:\n sqlite:\n persistence:\n enabled: false\n\nFor more information, see: https://www.sqlite.org/lockingv3.html\n" }} + {{- end }} + {{- end }} +{{- end }} +{{- end }} diff --git a/charts/gohoarder/templates/deployment-scanner.yaml b/charts/gohoarder/templates/deployment-scanner.yaml index c1182f1..d0fbe92 100644 --- a/charts/gohoarder/templates/deployment-scanner.yaml +++ b/charts/gohoarder/templates/deployment-scanner.yaml @@ -1,4 +1,5 @@ {{- if .Values.security.enabled }} +{{- include "gohoarder.validateSQLiteConfig" . }} apiVersion: apps/v1 kind: Deployment metadata: diff --git a/charts/gohoarder/templates/deployment-server.yaml b/charts/gohoarder/templates/deployment-server.yaml index 9bbd6d4..92dd164 100644 --- a/charts/gohoarder/templates/deployment-server.yaml +++ b/charts/gohoarder/templates/deployment-server.yaml @@ -1,3 +1,4 @@ +{{- include "gohoarder.validateSQLiteConfig" . }} apiVersion: apps/v1 kind: Deployment metadata: diff --git a/charts/gohoarder/values.yaml b/charts/gohoarder/values.yaml index 945f035..c3431ba 100644 --- a/charts/gohoarder/values.yaml +++ b/charts/gohoarder/values.yaml @@ -51,17 +51,17 @@ image: server: repository: ghcr.io/lukaszraczylo/gohoarder-server pullPolicy: IfNotPresent - tag: "0.1.9" + tag: "0.1.10" frontend: repository: ghcr.io/lukaszraczylo/gohoarder-frontend pullPolicy: IfNotPresent - tag: "0.1.9" + tag: "0.1.10" scanner: repository: ghcr.io/lukaszraczylo/gohoarder-scanner pullPolicy: IfNotPresent - tag: "0.1.9" + tag: "0.1.10" # Service Account serviceAccount: @@ -273,15 +273,30 @@ storage: # Metadata storage configuration metadata: # Backend: sqlite, postgresql - # For multiple server replicas: postgresql is recommended (sqlite has concurrency limitations) + # + # IMPORTANT: SQLite CANNOT be used with SMB/CIFS/NFS network storage! + # SQLite requires POSIX file locking which causes "database is locked" errors on network filesystems. + # + # Choose your configuration: + # 1. SQLite with local storage (development/single-node only) + # - Set backend: sqlite + # - Set sqlite.persistence.storageClass to a LOCAL storage class (e.g., "local-path") + # - OR set sqlite.persistence.enabled: false to use emptyDir (data lost on pod restart) + # + # 2. PostgreSQL with any storage (RECOMMENDED for production) + # - Set backend: postgresql + # - Configure postgresql settings below + # backend: "sqlite" # SQLite configuration + # WARNING: Do NOT use SMB/CIFS/NFS storage classes with SQLite! sqlite: # Use PVC for SQLite database + # IMPORTANT: storageClass must be LOCAL storage, NOT network storage (smb/nfs) persistence: - enabled: true - storageClass: "" + enabled: false # Changed to false by default - use emptyDir unless you have local storage + storageClass: "" # Must be local-path or similar LOCAL storage class if enabled size: "10Gi" accessMode: "ReadWriteOnce" existingClaim: "" diff --git a/charts/packages/gohoarder-0.1.10.tgz b/charts/packages/gohoarder-0.1.10.tgz new file mode 100644 index 0000000000000000000000000000000000000000..1bc0f19802b56c9b2e541e2ff04765674e6285ba GIT binary patch literal 16629 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