feat(helm): add Qdrant local mode support with three deployment options [skip ci]
Add support for three Qdrant deployment modes in Helm chart: 1. In-memory mode (:memory:) - Default, zero-config, ephemeral storage 2. Persistent local mode (path-based) - File-based storage with PVC 3. Network mode (URL-based) - Dedicated Qdrant service or external instance Changes: - Restructured qdrant configuration in values.yaml with mode selector - Added conditional environment variable logic in deployment.yaml - Created PVC template for persistent local mode with optional existingClaim - Added qdrantPvcName helper template in _helpers.tpl - Updated README.md with Helm registry URL (https://cbcoutinho.github.io/nextcloud-mcp-server) Breaking change: Default changed from requiring qdrant.enabled to using in-memory mode (:memory:) when no Qdrant configuration is provided. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -14,8 +14,12 @@ This Helm chart deploys the Nextcloud MCP (Model Context Protocol) Server on a K
|
|||||||
### Quick Start with Basic Authentication
|
### Quick Start with Basic Authentication
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
|
# Add the Helm repository
|
||||||
|
helm repo add nextcloud-mcp https://cbcoutinho.github.io/nextcloud-mcp-server
|
||||||
|
helm repo update
|
||||||
|
|
||||||
# Install with basic auth (recommended for most users)
|
# Install with basic auth (recommended for most users)
|
||||||
helm install nextcloud-mcp ./helm/nextcloud-mcp-server \
|
helm install nextcloud-mcp nextcloud-mcp/nextcloud-mcp-server \
|
||||||
--set nextcloud.host=https://cloud.example.com \
|
--set nextcloud.host=https://cloud.example.com \
|
||||||
--set auth.basic.username=myuser \
|
--set auth.basic.username=myuser \
|
||||||
--set auth.basic.password=mypassword
|
--set auth.basic.password=mypassword
|
||||||
@@ -47,7 +51,7 @@ resources:
|
|||||||
Install with your custom values:
|
Install with your custom values:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
helm install nextcloud-mcp ./helm/nextcloud-mcp-server -f custom-values.yaml
|
helm install nextcloud-mcp nextcloud-mcp/nextcloud-mcp-server -f custom-values.yaml
|
||||||
```
|
```
|
||||||
|
|
||||||
### OAuth Authentication Mode (Experimental)
|
### OAuth Authentication Mode (Experimental)
|
||||||
@@ -529,13 +533,17 @@ openai:
|
|||||||
### To upgrade an existing deployment:
|
### To upgrade an existing deployment:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
helm upgrade nextcloud-mcp ./helm/nextcloud-mcp-server -f custom-values.yaml
|
# Update the repository
|
||||||
|
helm repo update
|
||||||
|
|
||||||
|
# Upgrade with your custom values
|
||||||
|
helm upgrade nextcloud-mcp nextcloud-mcp/nextcloud-mcp-server -f custom-values.yaml
|
||||||
```
|
```
|
||||||
|
|
||||||
### To upgrade with new values:
|
### To upgrade with new values:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
helm upgrade nextcloud-mcp ./helm/nextcloud-mcp-server \
|
helm upgrade nextcloud-mcp nextcloud-mcp/nextcloud-mcp-server \
|
||||||
--set resources.limits.memory=1Gi
|
--set resources.limits.memory=1Gi
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|||||||
@@ -94,6 +94,17 @@ Create the name of the PVC to use for OAuth storage
|
|||||||
{{- end }}
|
{{- end }}
|
||||||
{{- end }}
|
{{- end }}
|
||||||
|
|
||||||
|
{{/*
|
||||||
|
Create the name of the PVC to use for Qdrant local persistent storage
|
||||||
|
*/}}
|
||||||
|
{{- define "nextcloud-mcp-server.qdrantPvcName" -}}
|
||||||
|
{{- if .Values.qdrant.localPersistence.existingClaim }}
|
||||||
|
{{- .Values.qdrant.localPersistence.existingClaim }}
|
||||||
|
{{- else }}
|
||||||
|
{{- include "nextcloud-mcp-server.fullname" . }}-qdrant-data
|
||||||
|
{{- end }}
|
||||||
|
{{- end }}
|
||||||
|
|
||||||
{{/*
|
{{/*
|
||||||
Return the MCP server port
|
Return the MCP server port
|
||||||
*/}}
|
*/}}
|
||||||
|
|||||||
@@ -152,19 +152,33 @@ spec:
|
|||||||
value: {{ .Values.vectorSync.queueMaxSize | quote }}
|
value: {{ .Values.vectorSync.queueMaxSize | quote }}
|
||||||
{{- end }}
|
{{- end }}
|
||||||
# Qdrant Vector Database
|
# Qdrant Vector Database
|
||||||
{{- if .Values.qdrant.enabled }}
|
{{- if eq .Values.qdrant.mode "network" }}
|
||||||
|
# Network mode: Use dedicated Qdrant service
|
||||||
|
{{- if .Values.qdrant.networkMode.deploySubchart }}
|
||||||
- name: QDRANT_URL
|
- name: QDRANT_URL
|
||||||
value: "http://{{ .Release.Name }}-qdrant:6333"
|
value: "http://{{ .Release.Name }}-qdrant:6333"
|
||||||
- name: QDRANT_COLLECTION
|
{{- else if .Values.qdrant.networkMode.externalUrl }}
|
||||||
value: "nextcloud_content"
|
- name: QDRANT_URL
|
||||||
{{- if .Values.qdrant.apiKey }}
|
value: {{ .Values.qdrant.networkMode.externalUrl | quote }}
|
||||||
|
{{- end }}
|
||||||
|
{{- if or .Values.qdrant.networkMode.apiKey .Values.qdrant.networkMode.existingSecret }}
|
||||||
- name: QDRANT_API_KEY
|
- name: QDRANT_API_KEY
|
||||||
valueFrom:
|
valueFrom:
|
||||||
secretKeyRef:
|
secretKeyRef:
|
||||||
name: {{ .Release.Name }}-qdrant
|
name: {{ .Values.qdrant.networkMode.existingSecret | default (printf "%s-qdrant" .Release.Name) }}
|
||||||
key: api-key
|
key: {{ .Values.qdrant.networkMode.secretKey }}
|
||||||
{{- end }}
|
{{- end }}
|
||||||
|
{{- else if eq .Values.qdrant.mode "persistent" }}
|
||||||
|
# Persistent local mode: File-based storage
|
||||||
|
- name: QDRANT_LOCATION
|
||||||
|
value: {{ .Values.qdrant.localPersistence.dataPath | quote }}
|
||||||
|
{{- else }}
|
||||||
|
# In-memory mode (default): Ephemeral storage
|
||||||
|
- name: QDRANT_LOCATION
|
||||||
|
value: ":memory:"
|
||||||
{{- end }}
|
{{- end }}
|
||||||
|
- name: QDRANT_COLLECTION
|
||||||
|
value: {{ .Values.qdrant.collection | quote }}
|
||||||
# Ollama Embedding Service
|
# Ollama Embedding Service
|
||||||
{{- if or .Values.ollama.enabled .Values.ollama.url }}
|
{{- if or .Values.ollama.enabled .Values.ollama.url }}
|
||||||
- name: OLLAMA_BASE_URL
|
- name: OLLAMA_BASE_URL
|
||||||
@@ -206,6 +220,10 @@ spec:
|
|||||||
- name: oauth-storage
|
- name: oauth-storage
|
||||||
mountPath: /app/.oauth
|
mountPath: /app/.oauth
|
||||||
{{- end }}
|
{{- end }}
|
||||||
|
{{- if and (eq .Values.qdrant.mode "persistent") .Values.qdrant.localPersistence.enabled }}
|
||||||
|
- name: qdrant-data
|
||||||
|
mountPath: /app/data
|
||||||
|
{{- end }}
|
||||||
{{- with .Values.volumeMounts }}
|
{{- with .Values.volumeMounts }}
|
||||||
{{- toYaml . | nindent 12 }}
|
{{- toYaml . | nindent 12 }}
|
||||||
{{- end }}
|
{{- end }}
|
||||||
@@ -217,6 +235,11 @@ spec:
|
|||||||
persistentVolumeClaim:
|
persistentVolumeClaim:
|
||||||
claimName: {{ include "nextcloud-mcp-server.oauthPvcName" . }}
|
claimName: {{ include "nextcloud-mcp-server.oauthPvcName" . }}
|
||||||
{{- end }}
|
{{- end }}
|
||||||
|
{{- if and (eq .Values.qdrant.mode "persistent") .Values.qdrant.localPersistence.enabled }}
|
||||||
|
- name: qdrant-data
|
||||||
|
persistentVolumeClaim:
|
||||||
|
claimName: {{ include "nextcloud-mcp-server.qdrantPvcName" . }}
|
||||||
|
{{- end }}
|
||||||
{{- with .Values.volumes }}
|
{{- with .Values.volumes }}
|
||||||
{{- toYaml . | nindent 8 }}
|
{{- toYaml . | nindent 8 }}
|
||||||
{{- end }}
|
{{- end }}
|
||||||
|
|||||||
@@ -15,3 +15,21 @@ spec:
|
|||||||
requests:
|
requests:
|
||||||
storage: {{ .Values.auth.oauth.persistence.size }}
|
storage: {{ .Values.auth.oauth.persistence.size }}
|
||||||
{{- end }}
|
{{- end }}
|
||||||
|
---
|
||||||
|
{{- if and (eq .Values.qdrant.mode "persistent") .Values.qdrant.localPersistence.enabled (not .Values.qdrant.localPersistence.existingClaim) }}
|
||||||
|
apiVersion: v1
|
||||||
|
kind: PersistentVolumeClaim
|
||||||
|
metadata:
|
||||||
|
name: {{ include "nextcloud-mcp-server.fullname" . }}-qdrant-data
|
||||||
|
labels:
|
||||||
|
{{- include "nextcloud-mcp-server.labels" . | nindent 4 }}
|
||||||
|
spec:
|
||||||
|
accessModes:
|
||||||
|
- {{ .Values.qdrant.localPersistence.accessMode }}
|
||||||
|
{{- if .Values.qdrant.localPersistence.storageClass }}
|
||||||
|
storageClassName: {{ .Values.qdrant.localPersistence.storageClass }}
|
||||||
|
{{- end }}
|
||||||
|
resources:
|
||||||
|
requests:
|
||||||
|
storage: {{ .Values.qdrant.localPersistence.size }}
|
||||||
|
{{- end }}
|
||||||
|
|||||||
@@ -277,19 +277,58 @@ vectorSync:
|
|||||||
# Maximum queue size for documents pending indexing
|
# Maximum queue size for documents pending indexing
|
||||||
queueMaxSize: 10000
|
queueMaxSize: 10000
|
||||||
|
|
||||||
# Qdrant Vector Database
|
# Qdrant Vector Database Configuration
|
||||||
# Deployed as a subchart when enabled. All values are passed through to the qdrant/qdrant chart.
|
# Three deployment modes available:
|
||||||
# See https://github.com/qdrant/qdrant-helm for full configuration options.
|
# 1. Local In-Memory: Fast, ephemeral, zero-config (mode: "memory")
|
||||||
|
# 2. Local Persistent: File-based, survives restarts (mode: "persistent")
|
||||||
|
# 3. Network: Dedicated Qdrant service, production-ready (mode: "network")
|
||||||
qdrant:
|
qdrant:
|
||||||
# Enable Qdrant subchart deployment
|
# Qdrant mode: "memory", "persistent", or "network"
|
||||||
enabled: false
|
# - memory: In-memory storage (:memory:) - default, zero config, data lost on restart
|
||||||
|
# - persistent: Local file storage - data persists across restarts, suitable for small/medium deployments
|
||||||
|
# - network: Dedicated Qdrant service (see networkMode below)
|
||||||
|
mode: "memory"
|
||||||
|
|
||||||
|
# Collection name for vector data
|
||||||
|
collection: "nextcloud_content"
|
||||||
|
|
||||||
|
# Local persistent mode configuration (only used when mode: "persistent")
|
||||||
|
localPersistence:
|
||||||
|
# Enable persistent volume for local Qdrant data
|
||||||
|
enabled: true
|
||||||
|
# Storage class (leave empty for default)
|
||||||
|
storageClass: ""
|
||||||
|
accessMode: ReadWriteOnce
|
||||||
|
# Size for local Qdrant storage
|
||||||
|
size: 1Gi
|
||||||
|
# Path where Qdrant data is stored (relative to /app/data)
|
||||||
|
# Default: /app/data/qdrant
|
||||||
|
dataPath: "/app/data/qdrant"
|
||||||
|
# Use existing PVC
|
||||||
|
existingClaim: ""
|
||||||
|
|
||||||
|
# Network mode configuration (only used when mode: "network")
|
||||||
|
networkMode:
|
||||||
|
# Deploy Qdrant as a subchart (if true) or use external Qdrant (if false)
|
||||||
|
deploySubchart: false
|
||||||
|
# External Qdrant URL (used when deploySubchart: false)
|
||||||
|
# Example: "http://qdrant.default.svc.cluster.local:6333"
|
||||||
|
externalUrl: ""
|
||||||
|
# Optional API key for Qdrant authentication
|
||||||
|
apiKey: ""
|
||||||
|
# Use existing secret for API key
|
||||||
|
existingSecret: ""
|
||||||
|
secretKey: "api-key"
|
||||||
|
|
||||||
|
# Qdrant subchart configuration (only used when mode: "network" and networkMode.deploySubchart: true)
|
||||||
|
# All values are passed through to the qdrant/qdrant chart.
|
||||||
|
# See https://github.com/qdrant/qdrant-helm for full configuration options.
|
||||||
|
subchart:
|
||||||
# Number of Qdrant replicas
|
# Number of Qdrant replicas
|
||||||
replicaCount: 1
|
replicaCount: 1
|
||||||
image:
|
image:
|
||||||
# Qdrant version
|
# Qdrant version
|
||||||
tag: v1.12.5
|
tag: v1.12.5
|
||||||
# Optional API key for Qdrant authentication
|
|
||||||
apiKey: ""
|
|
||||||
config:
|
config:
|
||||||
cluster:
|
cluster:
|
||||||
# Enable distributed cluster mode
|
# Enable distributed cluster mode
|
||||||
|
|||||||
Reference in New Issue
Block a user