Merge pull request #589 from cbcoutinho/feat/docker-compose-profiles-login-flow
feat: Docker Compose profiles and Login Flow v2 integration tests
This commit is contained in:
@@ -25,6 +25,15 @@ annotations:
|
||||
# Grafana dashboard support
|
||||
grafana_dashboard: "true"
|
||||
grafana_dashboard_folder: "Nextcloud MCP"
|
||||
artifacthub.io/changes: |
|
||||
- kind: added
|
||||
description: Login Flow v2 auth mode for Helm chart (ADR-022)
|
||||
- kind: added
|
||||
description: Multi-user BasicAuth guidance in post-install NOTES
|
||||
- kind: added
|
||||
description: Version and changelog info in post-install NOTES
|
||||
- kind: changed
|
||||
description: Updated appVersion to 0.64.4
|
||||
dependencies:
|
||||
- name: qdrant
|
||||
version: "1.17.0"
|
||||
|
||||
@@ -57,6 +57,28 @@ Your Nextcloud MCP Server has been deployed in {{ .Values.auth.mode }} authentic
|
||||
|
||||
IMPORTANT: OAuth mode is experimental and requires patches to the user_oidc app.
|
||||
See: https://github.com/cbcoutinho/nextcloud-mcp-server#authentication
|
||||
{{- else if eq .Values.auth.mode "multi-user-basic" }}
|
||||
|
||||
3. Multi-User BasicAuth Mode (Pass-Through):
|
||||
- Users provide credentials via Authorization header
|
||||
- Connected to: {{ .Values.nextcloud.host }}
|
||||
{{- if .Values.auth.multiUserBasic.enableOfflineAccess }}
|
||||
- Offline access: Enabled (background operations with app passwords)
|
||||
- Token storage: {{ .Values.auth.multiUserBasic.tokenStorageDb }}
|
||||
{{- else }}
|
||||
- Offline access: Disabled (stateless pass-through)
|
||||
{{- end }}
|
||||
{{- else if eq .Values.auth.mode "login-flow" }}
|
||||
|
||||
3. Login Flow v2 Mode (Experimental, ADR-022):
|
||||
- Server URL: {{ include "nextcloud-mcp-server.mcpServerUrl" . }}
|
||||
- Connected to: {{ .Values.nextcloud.host }}
|
||||
- Token storage: {{ .Values.auth.loginFlow.tokenStorageDb }}
|
||||
|
||||
Users authenticate via Nextcloud's native Login Flow v2 — no OAuth patches required.
|
||||
Each user gets a per-device app password managed by the MCP server.
|
||||
|
||||
IMPORTANT: Login Flow v2 is experimental. See ADR-022 for details.
|
||||
{{- end }}
|
||||
|
||||
{{- if .Values.documentProcessing.enabled }}
|
||||
@@ -169,6 +191,12 @@ After migrating, remove the deprecated settings:
|
||||
================================================================================
|
||||
{{- end }}
|
||||
|
||||
Deployed version:
|
||||
- Chart: {{ .Chart.Version }}
|
||||
- App: {{ .Chart.AppVersion }}
|
||||
|
||||
Full changelog: https://github.com/cbcoutinho/nextcloud-mcp-server/blob/master/charts/nextcloud-mcp-server/CHANGELOG.md
|
||||
|
||||
For more information and documentation:
|
||||
- GitHub: https://github.com/cbcoutinho/nextcloud-mcp-server
|
||||
- Documentation: https://github.com/cbcoutinho/nextcloud-mcp-server#readme
|
||||
|
||||
@@ -105,6 +105,17 @@ Create the name of the secret to use for OAuth
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Create the name of the secret to use for Login Flow v2
|
||||
*/}}
|
||||
{{- define "nextcloud-mcp-server.loginFlowSecretName" -}}
|
||||
{{- if .Values.auth.loginFlow.existingSecret }}
|
||||
{{- .Values.auth.loginFlow.existingSecret }}
|
||||
{{- else }}
|
||||
{{- include "nextcloud-mcp-server.fullname" . }}-login-flow
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Create the name of the PVC to use for OAuth storage
|
||||
*/}}
|
||||
@@ -147,6 +158,8 @@ Checks new dataStorage.enabled OR legacy persistence configs
|
||||
true
|
||||
{{- else if and (eq .Values.auth.mode "multi-user-basic") .Values.auth.multiUserBasic.enableOfflineAccess .Values.auth.multiUserBasic.persistence.enabled -}}
|
||||
true
|
||||
{{- else if eq .Values.auth.mode "login-flow" -}}
|
||||
true
|
||||
{{- else if and (eq .Values.qdrant.mode "persistent") .Values.qdrant.localPersistence.enabled -}}
|
||||
true
|
||||
{{- else -}}
|
||||
|
||||
@@ -46,8 +46,10 @@ spec:
|
||||
args:
|
||||
- "--transport"
|
||||
- "{{ .Values.mcp.transport }}"
|
||||
{{- if eq .Values.auth.mode "oauth" }}
|
||||
{{- if or (eq .Values.auth.mode "oauth") (eq .Values.auth.mode "login-flow") }}
|
||||
- "--oauth"
|
||||
{{- end }}
|
||||
{{- if eq .Values.auth.mode "oauth" }}
|
||||
- "--oauth-token-type"
|
||||
- "{{ .Values.auth.oauth.tokenType }}"
|
||||
{{- end }}
|
||||
@@ -134,6 +136,21 @@ spec:
|
||||
name: {{ include "nextcloud-mcp-server.oauthSecretName" . }}
|
||||
key: {{ .Values.auth.oauth.clientSecretKey }}
|
||||
{{- end }}
|
||||
{{- else if eq .Values.auth.mode "login-flow" }}
|
||||
# Login Flow v2 mode (ADR-022)
|
||||
- name: ENABLE_LOGIN_FLOW
|
||||
value: "true"
|
||||
- name: NEXTCLOUD_MCP_SERVER_URL
|
||||
value: {{ include "nextcloud-mcp-server.mcpServerUrl" . | quote }}
|
||||
- name: NEXTCLOUD_PUBLIC_ISSUER_URL
|
||||
value: {{ include "nextcloud-mcp-server.publicIssuerUrl" . | quote }}
|
||||
- name: TOKEN_STORAGE_DB
|
||||
value: {{ .Values.auth.loginFlow.tokenStorageDb | quote }}
|
||||
- name: TOKEN_ENCRYPTION_KEY
|
||||
valueFrom:
|
||||
secretKeyRef:
|
||||
name: {{ include "nextcloud-mcp-server.loginFlowSecretName" . }}
|
||||
key: {{ .Values.auth.loginFlow.tokenEncryptionKeyKey }}
|
||||
{{- end }}
|
||||
{{- if .Values.documentProcessing.enabled }}
|
||||
# Document processing
|
||||
@@ -282,7 +299,7 @@ spec:
|
||||
volumeMounts:
|
||||
- name: tmp
|
||||
mountPath: /tmp
|
||||
{{- if and (eq .Values.auth.mode "oauth") .Values.auth.oauth.persistence.enabled }}
|
||||
{{- if or (and (eq .Values.auth.mode "oauth") .Values.auth.oauth.persistence.enabled) (eq .Values.auth.mode "login-flow") }}
|
||||
- name: oauth-storage
|
||||
mountPath: /app/.oauth
|
||||
{{- end }}
|
||||
@@ -294,7 +311,7 @@ spec:
|
||||
volumes:
|
||||
- name: tmp
|
||||
emptyDir: {}
|
||||
{{- if and (eq .Values.auth.mode "oauth") .Values.auth.oauth.persistence.enabled }}
|
||||
{{- if or (and (eq .Values.auth.mode "oauth") .Values.auth.oauth.persistence.enabled) (eq .Values.auth.mode "login-flow") }}
|
||||
- name: oauth-storage
|
||||
persistentVolumeClaim:
|
||||
claimName: {{ include "nextcloud-mcp-server.oauthPvcName" . }}
|
||||
|
||||
@@ -16,6 +16,21 @@ spec:
|
||||
storage: {{ .Values.auth.oauth.persistence.size }}
|
||||
{{- end }}
|
||||
---
|
||||
{{- if eq .Values.auth.mode "login-flow" }}
|
||||
apiVersion: v1
|
||||
kind: PersistentVolumeClaim
|
||||
metadata:
|
||||
name: {{ include "nextcloud-mcp-server.fullname" . }}-oauth-storage
|
||||
labels:
|
||||
{{- include "nextcloud-mcp-server.labels" . | nindent 4 }}
|
||||
spec:
|
||||
accessModes:
|
||||
- ReadWriteOnce
|
||||
resources:
|
||||
requests:
|
||||
storage: 100Mi
|
||||
{{- end }}
|
||||
---
|
||||
{{- if and (eq (include "nextcloud-mcp-server.dataStorageEnabled" .) "true") (not .Values.dataStorage.existingClaim) }}
|
||||
{{- $legacyMultiUserBasic := eq (include "nextcloud-mcp-server.legacyMultiUserBasicPersistence" .) "true" }}
|
||||
{{- $legacyQdrant := eq (include "nextcloud-mcp-server.legacyQdrantPersistence" .) "true" }}
|
||||
|
||||
@@ -45,3 +45,17 @@ data:
|
||||
{{ .Values.auth.oauth.clientSecretKey }}: {{ .Values.auth.oauth.clientSecret | b64enc | quote }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
---
|
||||
{{- if eq .Values.auth.mode "login-flow" }}
|
||||
{{- if not .Values.auth.loginFlow.existingSecret }}
|
||||
apiVersion: v1
|
||||
kind: Secret
|
||||
metadata:
|
||||
name: {{ include "nextcloud-mcp-server.fullname" . }}-login-flow
|
||||
labels:
|
||||
{{- include "nextcloud-mcp-server.labels" . | nindent 4 }}
|
||||
type: Opaque
|
||||
data:
|
||||
{{ .Values.auth.loginFlow.tokenEncryptionKeyKey }}: {{ .Values.auth.loginFlow.tokenEncryptionKey | b64enc | quote }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
|
||||
@@ -40,12 +40,13 @@ nextcloud:
|
||||
publicIssuerUrl: ""
|
||||
|
||||
# Authentication configuration
|
||||
# Choose one mode: "basic", "multi-user-basic", or "oauth"
|
||||
# Choose one mode: "basic", "multi-user-basic", "oauth", or "login-flow"
|
||||
auth:
|
||||
# Authentication mode: "basic", "multi-user-basic", or "oauth"
|
||||
# Authentication mode: "basic", "multi-user-basic", "oauth", or "login-flow"
|
||||
# basic: Single-user with username/password (recommended for personal use)
|
||||
# multi-user-basic: Multi-user with BasicAuth pass-through (credentials in request headers)
|
||||
# oauth: Uses OAuth2/OIDC (experimental, requires patches)
|
||||
# login-flow: Multi-user via Nextcloud Login Flow v2 (experimental, ADR-022)
|
||||
mode: basic
|
||||
|
||||
# Basic authentication settings (single-user mode)
|
||||
@@ -139,6 +140,21 @@ auth:
|
||||
# Use existing PVC
|
||||
existingClaim: ""
|
||||
|
||||
# Login Flow v2 settings (experimental, ADR-022)
|
||||
# Uses Nextcloud's native Login Flow v2 to obtain app passwords per user.
|
||||
# No OAuth patches required — works with stock Nextcloud.
|
||||
# See: docs/ADR-022-deployment-mode-consolidation.md
|
||||
loginFlow:
|
||||
# Token encryption key (required, ignored if existingSecret is set)
|
||||
# Generate with: python -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())"
|
||||
tokenEncryptionKey: ""
|
||||
# Token storage database path
|
||||
tokenStorageDb: "/app/data/tokens.db"
|
||||
# Use existing secret instead of creating one
|
||||
existingSecret: ""
|
||||
# Key in the existing secret
|
||||
tokenEncryptionKeyKey: "token_encryption_key"
|
||||
|
||||
# Data Storage Configuration
|
||||
# Persistent volume for /app/data directory
|
||||
# Used for: token databases, qdrant persistent storage, and any app data
|
||||
@@ -147,6 +163,7 @@ dataStorage:
|
||||
# Enable persistent storage for /app/data
|
||||
# Set to true when using:
|
||||
# - Multi-user basic auth with offline access (stores tokens.db)
|
||||
# - Login flow mode (stores app passwords in tokens.db)
|
||||
# - Qdrant persistent mode (stores vector database)
|
||||
# - Any feature requiring persistent app data
|
||||
# Set to false for basic auth without persistence (uses emptyDir)
|
||||
|
||||
Reference in New Issue
Block a user