247 lines
9.6 KiB
YAML
247 lines
9.6 KiB
YAML
{{- if .Values.langflow.enabled }}
|
|
apiVersion: apps/v1
|
|
kind: Deployment
|
|
metadata:
|
|
name: {{ include "openrag.fullname" . }}-langflow
|
|
namespace: {{ include "openrag.namespace" . }}
|
|
labels:
|
|
{{- include "openrag.langflow.labels" . | nindent 4 }}
|
|
spec:
|
|
replicas: 1 # Always 1 for SQLite-based Langflow
|
|
strategy:
|
|
type: Recreate # Required for RWO PVC
|
|
selector:
|
|
matchLabels:
|
|
{{- include "openrag.langflow.selectorLabels" . | nindent 6 }}
|
|
template:
|
|
metadata:
|
|
labels:
|
|
{{- include "openrag.langflow.selectorLabels" . | nindent 8 }}
|
|
annotations:
|
|
checksum/secret: {{ include (print $.Template.BasePath "/secrets/langflow-secret.yaml") . | sha256sum }}
|
|
checksum/config: {{ include (print $.Template.BasePath "/configmaps/flow-ids-configmap.yaml") . | sha256sum }}
|
|
spec:
|
|
serviceAccountName: {{ include "openrag.serviceAccountName" . }}
|
|
{{- with .Values.podSecurityContext }}
|
|
securityContext:
|
|
{{- toYaml . | nindent 8 }}
|
|
{{- end }}
|
|
{{- with .Values.global.imagePullSecrets }}
|
|
imagePullSecrets:
|
|
{{- toYaml . | nindent 8 }}
|
|
{{- end }}
|
|
{{- if .Values.langflow.flows.loadDefaults }}
|
|
initContainers:
|
|
- name: load-default-flows
|
|
image: busybox:1.36
|
|
command:
|
|
- /bin/sh
|
|
- -c
|
|
- |
|
|
FLOWS_DIR="{{ .Values.langflow.persistence.mountPath }}/{{ .Values.langflow.persistence.flowsSubPath }}"
|
|
mkdir -p "$FLOWS_DIR"
|
|
if [ -z "$(ls -A $FLOWS_DIR 2>/dev/null)" ]; then
|
|
echo "Loading default flows..."
|
|
cp /default-flows/*.json "$FLOWS_DIR/"
|
|
echo "Flows loaded: $(ls $FLOWS_DIR)"
|
|
else
|
|
echo "Flows already exist, skipping."
|
|
fi
|
|
volumeMounts:
|
|
- name: langflow-data
|
|
mountPath: {{ .Values.langflow.persistence.mountPath }}
|
|
- name: default-flows
|
|
mountPath: /default-flows
|
|
{{- end }}
|
|
containers:
|
|
- name: langflow
|
|
image: "{{ .Values.langflow.image.repository }}:{{ .Values.langflow.image.tag | default .Values.global.imageTag }}"
|
|
imagePullPolicy: {{ .Values.global.imagePullPolicy }}
|
|
{{- with .Values.securityContext }}
|
|
securityContext:
|
|
{{- toYaml . | nindent 12 }}
|
|
{{- end }}
|
|
ports:
|
|
- name: http
|
|
containerPort: 7860
|
|
protocol: TCP
|
|
env:
|
|
# Langflow core settings
|
|
- name: LANGFLOW_LOAD_FLOWS_PATH
|
|
value: {{ .Values.langflow.persistence.mountPath }}/{{ .Values.langflow.persistence.flowsSubPath }}
|
|
- name: LANGFLOW_DATABASE_URL
|
|
value: "sqlite:///{{ .Values.langflow.persistence.mountPath }}/{{ .Values.langflow.persistence.dbSubPath }}"
|
|
- name: LANGFLOW_DEACTIVATE_TRACING
|
|
value: {{ .Values.langflow.deactivateTracing | quote }}
|
|
- name: LANGFLOW_LOG_LEVEL
|
|
value: {{ .Values.langflow.logLevel | quote }}
|
|
- name: HIDE_GETTING_STARTED_PROGRESS
|
|
value: "true"
|
|
# Auth settings
|
|
- name: LANGFLOW_AUTO_LOGIN
|
|
value: {{ .Values.langflow.auth.autoLogin | quote }}
|
|
- name: LANGFLOW_NEW_USER_IS_ACTIVE
|
|
value: {{ .Values.langflow.auth.newUserIsActive | quote }}
|
|
- name: LANGFLOW_ENABLE_SUPERUSER_CLI
|
|
value: {{ .Values.langflow.auth.enableSuperuserCli | quote }}
|
|
# Variables to expose to flows
|
|
- name: LANGFLOW_VARIABLES_TO_GET_FROM_ENVIRONMENT
|
|
value: {{ .Values.langflow.variablesToGetFromEnvironment | quote }}
|
|
# Flow context variables (defaults for flow execution)
|
|
- name: JWT
|
|
value: "None"
|
|
- name: OWNER
|
|
value: "None"
|
|
- name: OWNER_NAME
|
|
value: "None"
|
|
- name: OWNER_EMAIL
|
|
value: "None"
|
|
- name: CONNECTOR_TYPE
|
|
value: "system"
|
|
- name: CONNECTOR_TYPE_URL
|
|
value: "url"
|
|
- name: OPENRAG-QUERY-FILTER
|
|
value: "{}"
|
|
- name: FILENAME
|
|
value: "None"
|
|
- name: MIMETYPE
|
|
value: "None"
|
|
- name: FILESIZE
|
|
value: "0"
|
|
- name: SELECTED_EMBEDDING_MODEL
|
|
value: ""
|
|
# Secrets from langflow secret
|
|
- name: LANGFLOW_SECRET_KEY
|
|
valueFrom:
|
|
secretKeyRef:
|
|
name: {{ include "openrag.fullname" . }}-langflow
|
|
key: secret-key
|
|
- name: LANGFLOW_SUPERUSER
|
|
valueFrom:
|
|
secretKeyRef:
|
|
name: {{ include "openrag.fullname" . }}-langflow
|
|
key: superuser
|
|
- name: LANGFLOW_SUPERUSER_PASSWORD
|
|
valueFrom:
|
|
secretKeyRef:
|
|
name: {{ include "openrag.fullname" . }}-langflow
|
|
key: superuser-password
|
|
# OpenSearch password (for flows)
|
|
{{- if .Values.global.opensearch.password }}
|
|
- name: OPENSEARCH_PASSWORD
|
|
valueFrom:
|
|
secretKeyRef:
|
|
name: {{ include "openrag.fullname" . }}-opensearch
|
|
key: password
|
|
{{- end }}
|
|
# LLM Provider keys
|
|
{{- if .Values.llmProviders.openai.enabled }}
|
|
- name: OPENAI_API_KEY
|
|
valueFrom:
|
|
secretKeyRef:
|
|
name: {{ include "openrag.fullname" . }}-llm-providers
|
|
key: openai-api-key
|
|
{{- else }}
|
|
- name: OPENAI_API_KEY
|
|
value: "None"
|
|
{{- end }}
|
|
{{- if .Values.llmProviders.anthropic.enabled }}
|
|
- name: ANTHROPIC_API_KEY
|
|
valueFrom:
|
|
secretKeyRef:
|
|
name: {{ include "openrag.fullname" . }}-llm-providers
|
|
key: anthropic-api-key
|
|
{{- else }}
|
|
- name: ANTHROPIC_API_KEY
|
|
value: "None"
|
|
{{- end }}
|
|
{{- if .Values.llmProviders.watsonx.enabled }}
|
|
- name: WATSONX_API_KEY
|
|
valueFrom:
|
|
secretKeyRef:
|
|
name: {{ include "openrag.fullname" . }}-llm-providers
|
|
key: watsonx-api-key
|
|
- name: WATSONX_ENDPOINT
|
|
valueFrom:
|
|
secretKeyRef:
|
|
name: {{ include "openrag.fullname" . }}-llm-providers
|
|
key: watsonx-endpoint
|
|
- name: WATSONX_PROJECT_ID
|
|
valueFrom:
|
|
secretKeyRef:
|
|
name: {{ include "openrag.fullname" . }}-llm-providers
|
|
key: watsonx-project-id
|
|
{{- else }}
|
|
- name: WATSONX_API_KEY
|
|
value: "None"
|
|
- name: WATSONX_ENDPOINT
|
|
value: "None"
|
|
- name: WATSONX_PROJECT_ID
|
|
value: "None"
|
|
{{- end }}
|
|
{{- if .Values.llmProviders.ollama.enabled }}
|
|
- name: OLLAMA_BASE_URL
|
|
value: {{ .Values.llmProviders.ollama.endpoint | quote }}
|
|
{{- else }}
|
|
- name: OLLAMA_BASE_URL
|
|
value: "None"
|
|
{{- end }}
|
|
volumeMounts:
|
|
- name: langflow-data
|
|
mountPath: {{ .Values.langflow.persistence.mountPath }}
|
|
resources:
|
|
{{- toYaml .Values.langflow.resources | nindent 12 }}
|
|
{{- if .Values.langflow.livenessProbe.enabled }}
|
|
livenessProbe:
|
|
httpGet:
|
|
path: /health
|
|
port: http
|
|
initialDelaySeconds: {{ .Values.langflow.livenessProbe.initialDelaySeconds }}
|
|
periodSeconds: {{ .Values.langflow.livenessProbe.periodSeconds }}
|
|
timeoutSeconds: {{ .Values.langflow.livenessProbe.timeoutSeconds }}
|
|
failureThreshold: {{ .Values.langflow.livenessProbe.failureThreshold }}
|
|
{{- end }}
|
|
{{- if .Values.langflow.readinessProbe.enabled }}
|
|
readinessProbe:
|
|
httpGet:
|
|
path: /health
|
|
port: http
|
|
initialDelaySeconds: {{ .Values.langflow.readinessProbe.initialDelaySeconds }}
|
|
periodSeconds: {{ .Values.langflow.readinessProbe.periodSeconds }}
|
|
timeoutSeconds: {{ .Values.langflow.readinessProbe.timeoutSeconds }}
|
|
failureThreshold: {{ .Values.langflow.readinessProbe.failureThreshold }}
|
|
{{- end }}
|
|
volumes:
|
|
- name: langflow-data
|
|
{{- if .Values.langflow.persistence.enabled }}
|
|
persistentVolumeClaim:
|
|
claimName: {{ include "openrag.fullname" . }}-langflow
|
|
{{- else }}
|
|
emptyDir: {}
|
|
{{- end }}
|
|
{{- if .Values.langflow.flows.loadDefaults }}
|
|
- name: default-flows
|
|
projected:
|
|
sources:
|
|
- configMap:
|
|
name: {{ include "openrag.fullname" . }}-flow-ingestion
|
|
- configMap:
|
|
name: {{ include "openrag.fullname" . }}-flow-agent
|
|
- configMap:
|
|
name: {{ include "openrag.fullname" . }}-flow-nudges
|
|
- configMap:
|
|
name: {{ include "openrag.fullname" . }}-flow-url
|
|
{{- end }}
|
|
{{- with .Values.nodeSelector }}
|
|
nodeSelector:
|
|
{{- toYaml . | nindent 8 }}
|
|
{{- end }}
|
|
{{- with .Values.affinity }}
|
|
affinity:
|
|
{{- toYaml . | nindent 8 }}
|
|
{{- end }}
|
|
{{- with .Values.tolerations }}
|
|
tolerations:
|
|
{{- toYaml . | nindent 8 }}
|
|
{{- end }}
|
|
{{- end }}
|