# 1) Deployment apiVersion: apps/v1 kind: Deployment metadata: name: openwebui namespace: default spec: replicas: 1 selector: matchLabels: app: openwebui template: metadata: labels: app: openwebui spec: containers: - name: openwebui image: ghcr.io/open-webui/open-webui:main-slim imagePullPolicy: Always ports: - containerPort: 8080 resources: requests: cpu: "250m" memory: "512Mi" limits: cpu: "1000m" memory: "1Gi" volumeMounts: - name: openwebui-data mountPath: /app/backend/data volumes: - name: openwebui-data persistentVolumeClaim: claimName: openwebui-data --- # 2) Service apiVersion: v1 kind: Service metadata: name: openwebui namespace: default spec: type: ClusterIP selector: app: openwebui ports: - port: 8080 targetPort: 8080 --- # 3) PersistentVolumeClaim apiVersion: v1 kind: PersistentVolumeClaim metadata: name: openwebui-data namespace: default annotations: nfs.io/storage-path: "openwebui-data" spec: storageClassName: "nfs-client" accessModes: - ReadWriteOnce resources: requests: storage: 5Gi limits: storage: 10Gi --- # 4) Ingress apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: openwebui namespace: default annotations: nginx.ingress.kubernetes.io/proxy-body-size: "50m" spec: ingressClassName: nginx rules: - host: openwebui.haven http: paths: - path: / pathType: Prefix backend: service: name: openwebui port: number: 8080