Add Ai model and GUI
This commit is contained in:
commit
6095a43000
23
argocd-apps/ollama.yaml
Normal file
23
argocd-apps/ollama.yaml
Normal file
@ -0,0 +1,23 @@
|
||||
apiVersion: argoproj.io/v1alpha1
|
||||
kind: Application
|
||||
metadata:
|
||||
name: ollama
|
||||
namespace: argocd
|
||||
spec:
|
||||
project: ai
|
||||
source:
|
||||
repoURL: https://git.dvirlabs.com/dvirlabs/ai-stack.git
|
||||
targetRevision: HEAD
|
||||
path: charts/ollama
|
||||
helm:
|
||||
valueFiles:
|
||||
- ../../manifests/ollama/values.yaml
|
||||
destination:
|
||||
server: https://kubernetes.default.svc
|
||||
namespace: ai
|
||||
syncPolicy:
|
||||
automated:
|
||||
prune: true
|
||||
selfHeal: true
|
||||
syncOptions:
|
||||
- CreateNamespace=true
|
||||
0
argocd-apps/openwebui.yaml
Normal file
0
argocd-apps/openwebui.yaml
Normal file
30
charts/ollama/.helmignore
Normal file
30
charts/ollama/.helmignore
Normal file
@ -0,0 +1,30 @@
|
||||
# Patterns to ignore when building packages.
|
||||
# This supports shell glob matching, relative path matching, and
|
||||
# negation (prefixed with !). Only one pattern per line.
|
||||
.DS_Store
|
||||
# Common VCS dirs
|
||||
.git/
|
||||
.gitignore
|
||||
.bzr/
|
||||
.bzrignore
|
||||
.hg/
|
||||
.hgignore
|
||||
.svn/
|
||||
# Common backup files
|
||||
*.swp
|
||||
*.bak
|
||||
*.tmp
|
||||
*.orig
|
||||
*~
|
||||
# Various IDEs
|
||||
.project
|
||||
.idea/
|
||||
.drone.yml
|
||||
*.tmproj
|
||||
.vscode/
|
||||
|
||||
#others
|
||||
.github
|
||||
kind-config.yml
|
||||
ci/
|
||||
|
||||
33
charts/ollama/Chart.yaml
Normal file
33
charts/ollama/Chart.yaml
Normal file
@ -0,0 +1,33 @@
|
||||
annotations:
|
||||
artifacthub.io/category: ai-machine-learning
|
||||
artifacthub.io/changes: |
|
||||
- kind: changed
|
||||
description: upgrade app version to 0.13.3
|
||||
links:
|
||||
- name: Ollama release v0.13.3
|
||||
url: https://github.com/ollama/ollama/releases/tag/v0.13.3
|
||||
- kind: added
|
||||
description: add ipFamilies and ipFamilyPolicy to the service
|
||||
links:
|
||||
- name: PR#207
|
||||
url: https://github.com/otwld/ollama-helm/pull/207
|
||||
apiVersion: v2
|
||||
appVersion: 0.13.3
|
||||
description: Get up and running with large language models locally.
|
||||
home: https://ollama.ai/
|
||||
icon: https://ollama.ai/public/ollama.png
|
||||
keywords:
|
||||
- ai
|
||||
- llm
|
||||
- llama
|
||||
- mistral
|
||||
kubeVersion: ^1.16.0-0
|
||||
maintainers:
|
||||
- email: contact@otwld.com
|
||||
name: OTWLD
|
||||
name: ollama
|
||||
sources:
|
||||
- https://github.com/ollama/ollama
|
||||
- https://github.com/otwld/ollama-helm
|
||||
type: application
|
||||
version: 1.36.0
|
||||
21
charts/ollama/LICENSE
Normal file
21
charts/ollama/LICENSE
Normal file
@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2024 OTWLD
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
333
charts/ollama/README.md
Normal file
333
charts/ollama/README.md
Normal file
@ -0,0 +1,333 @@
|
||||

|
||||
|
||||

|
||||
[](https://artifacthub.io/packages/helm/ollama-helm/ollama)
|
||||
[](https://github.com/otwld/ollama-helm/actions/workflows/ci.yaml)
|
||||
[](https://discord.gg/U24mpqTynB)
|
||||
|
||||
[Ollama](https://ollama.ai/), get up and running with large language models, locally.
|
||||
|
||||
This Community Chart is for deploying [Ollama](https://github.com/ollama/ollama).
|
||||
|
||||
## Requirements
|
||||
|
||||
- Kubernetes: `>= 1.16.0-0` for **CPU only**
|
||||
|
||||
- Kubernetes: `>= 1.26.0-0` for **GPU** stable support (NVIDIA and AMD)
|
||||
|
||||
*Not all GPUs are currently supported with ollama (especially with AMD)*
|
||||
|
||||
## Deploying Ollama chart
|
||||
|
||||
To install the `ollama` chart in the `ollama` namespace:
|
||||
|
||||
> [!IMPORTANT]
|
||||
> We are migrating the registry from https://otwld.github.io/ollama-helm/ url to OTWLD Helm central
|
||||
> registry https://helm.otwld.com/
|
||||
> Please update your Helm registry accordingly.
|
||||
|
||||
```console
|
||||
helm repo add otwld https://helm.otwld.com/
|
||||
helm repo update
|
||||
helm install ollama otwld/ollama --namespace ollama --create-namespace
|
||||
```
|
||||
|
||||
## Upgrading Ollama chart
|
||||
|
||||
First please read the [release notes](https://github.com/ollama/ollama/releases) of Ollama to make sure there are no
|
||||
backwards incompatible changes.
|
||||
|
||||
Make adjustments to your values as needed, then run `helm upgrade`:
|
||||
|
||||
```console
|
||||
# -- This pulls the latest version of the ollama chart from the repo.
|
||||
helm repo update
|
||||
helm upgrade ollama otwld/ollama --namespace ollama --values values.yaml
|
||||
```
|
||||
|
||||
## Uninstalling Ollama chart
|
||||
|
||||
To uninstall/delete the `ollama` deployment in the `ollama` namespace:
|
||||
|
||||
```console
|
||||
helm delete ollama --namespace ollama
|
||||
```
|
||||
|
||||
Substitute your values if they differ from the examples. See `helm delete --help` for a full reference on `delete`
|
||||
parameters and flags.
|
||||
|
||||
## Interact with Ollama
|
||||
|
||||
- **Ollama documentation can be found [HERE](https://github.com/ollama/ollama/tree/main/docs)**
|
||||
- Interact with RESTful API: [Ollama API](https://github.com/ollama/ollama/blob/main/docs/api.md)
|
||||
- Interact with official clients libraries: [ollama-js](https://github.com/ollama/ollama-js#custom-client)
|
||||
and [ollama-python](https://github.com/ollama/ollama-python#custom-client)
|
||||
- Interact with langchain: [langchain-js](https://github.com/ollama/ollama/blob/main/docs/tutorials/langchainjs.md)
|
||||
and [langchain-python](https://github.com/ollama/ollama/blob/main/docs/tutorials/langchainpy.md)
|
||||
|
||||
## Examples
|
||||
|
||||
- **It's highly recommended to run an updated version of Kubernetes for deploying ollama with GPU**
|
||||
|
||||
### Basic values.yaml example with GPU and two models pulled at startup
|
||||
|
||||
```
|
||||
ollama:
|
||||
gpu:
|
||||
# -- Enable GPU integration
|
||||
enabled: true
|
||||
|
||||
# -- GPU type: 'nvidia' or 'amd'
|
||||
type: 'nvidia'
|
||||
|
||||
# -- Specify the number of GPU to 1
|
||||
number: 1
|
||||
|
||||
# -- List of models to pull at container startup
|
||||
models:
|
||||
pull:
|
||||
- mistral
|
||||
- llama2
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Basic values.yaml example with Ingress
|
||||
|
||||
```
|
||||
ollama:
|
||||
models:
|
||||
pull:
|
||||
- llama2
|
||||
|
||||
ingress:
|
||||
enabled: true
|
||||
hosts:
|
||||
- host: ollama.domain.lan
|
||||
paths:
|
||||
- path: /
|
||||
pathType: Prefix
|
||||
```
|
||||
|
||||
- *API is now reachable at `ollama.domain.lan`*
|
||||
|
||||
---
|
||||
|
||||
### Create and run model from template
|
||||
|
||||
```
|
||||
ollama:
|
||||
models:
|
||||
create:
|
||||
- name: llama3.1-ctx32768
|
||||
template: |
|
||||
FROM llama3.1
|
||||
PARAMETER num_ctx 32768
|
||||
run:
|
||||
- llama3.1-ctx32768
|
||||
```
|
||||
|
||||
## Upgrading from 0.X.X to 1.X.X
|
||||
|
||||
The version 1.X.X introduces the ability to load models in memory at startup, the values have been changed.
|
||||
|
||||
Please change `ollama.models` to `ollama.models.pull` to avoid errors before upgrading:
|
||||
|
||||
```yaml
|
||||
ollama:
|
||||
models:
|
||||
- mistral
|
||||
- llama2
|
||||
```
|
||||
|
||||
To:
|
||||
|
||||
```yaml
|
||||
ollama:
|
||||
models:
|
||||
pull:
|
||||
- mistral
|
||||
- llama2
|
||||
```
|
||||
|
||||
## Helm Values
|
||||
|
||||
- See [values.yaml](values.yaml) to see the Chart's default values.
|
||||
|
||||
| Key | Type | Default | Description |
|
||||
|--------------------------------------------|--------|---------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||
| affinity | object | `{}` | Affinity for pod assignment |
|
||||
| autoscaling.enabled | bool | `false` | Enable autoscaling |
|
||||
| autoscaling.maxReplicas | int | `100` | Number of maximum replicas |
|
||||
| autoscaling.minReplicas | int | `1` | Number of minimum replicas |
|
||||
| autoscaling.targetCPUUtilizationPercentage | int | `80` | CPU usage to target replica |
|
||||
| deployment.labels | object | `{}` | Labels to add to the deployment |
|
||||
| extraArgs | list | `[]` | Additional arguments on the output Deployment definition. |
|
||||
| extraEnv | list | `[]` | Additional environments variables on the output Deployment definition. For extra OLLAMA env, please refer to https://github.com/ollama/ollama/blob/main/envconfig/config.go |
|
||||
| extraEnvFrom | list | `[]` | Additionl environment variables from external sources (like ConfigMap) |
|
||||
| extraObjects | list | `[]` | Extra K8s manifests to deploy |
|
||||
| fullnameOverride | string | `""` | String to fully override template |
|
||||
| hostIPC | bool | `false` | Use the host’s ipc namespace. |
|
||||
| hostNetwork | bool | `false` | Use the host's network namespace. |
|
||||
| hostPID | bool | `false` | Use the host’s pid namespace |
|
||||
| image.pullPolicy | string | `"IfNotPresent"` | Docker pull policy |
|
||||
| image.repository | string | `"ollama/ollama"` | Docker image registry |
|
||||
| image.tag | string | `""` | Docker image tag, overrides the image tag whose default is the chart appVersion. |
|
||||
| imagePullSecrets | list | `[]` | Docker registry secret names as an array |
|
||||
| ingress.annotations | object | `{}` | Additional annotations for the Ingress resource. |
|
||||
| ingress.className | string | `""` | IngressClass that will be used to implement the Ingress (Kubernetes 1.18+) |
|
||||
| ingress.enabled | bool | `false` | Enable ingress controller resource |
|
||||
| ingress.hosts[0].host | string | `"ollama.local"` | |
|
||||
| ingress.hosts[0].paths[0].path | string | `"/"` | |
|
||||
| ingress.hosts[0].paths[0].pathType | string | `"Prefix"` | |
|
||||
| ingress.tls | list | `[]` | The tls configuration for hostnames to be covered with this ingress record. |
|
||||
| initContainers | list | `[]` | Init containers to add to the pod |
|
||||
| knative.annotations | object | `{}` | Knative service annotations |
|
||||
| knative.containerConcurrency | int | `0` | Knative service container concurrency |
|
||||
| knative.enabled | bool | `false` | Enable Knative integration |
|
||||
| knative.idleTimeoutSeconds | int | `300` | Knative service idle timeout seconds |
|
||||
| knative.responseStartTimeoutSeconds | int | `300` | Knative service response start timeout seconds |
|
||||
| knative.timeoutSeconds | int | `300` | Knative service timeout seconds |
|
||||
| lifecycle | object | `{}` | Lifecycle for pod assignment (override ollama.models startup pull/run) |
|
||||
| livenessProbe.enabled | bool | `true` | Enable livenessProbe |
|
||||
| livenessProbe.failureThreshold | int | `6` | Failure threshold for livenessProbe |
|
||||
| livenessProbe.initialDelaySeconds | int | `60` | Initial delay seconds for livenessProbe |
|
||||
| livenessProbe.path | string | `"/"` | Request path for livenessProbe |
|
||||
| livenessProbe.periodSeconds | int | `10` | Period seconds for livenessProbe |
|
||||
| livenessProbe.successThreshold | int | `1` | Success threshold for livenessProbe |
|
||||
| livenessProbe.timeoutSeconds | int | `5` | Timeout seconds for livenessProbe |
|
||||
| nameOverride | string | `""` | String to partially override template (will maintain the release name) |
|
||||
| namespaceOverride | string | `""` | String to fully override namespace |
|
||||
| nodeSelector | object | `{}` | Node labels for pod assignment. |
|
||||
| ollama.gpu.draDriverClass | string | `"gpu.nvidia.com"` | DRA GPU DriverClass |
|
||||
| ollama.gpu.draEnabled | bool | `false` | Enable DRA GPU integration If enabled, it will use DRA instead of Device Driver Plugin and create a ResourceClaim and GpuClaimParameters |
|
||||
| ollama.gpu.draExistingClaimTemplate | string | `""` | Existing DRA GPU ResourceClaim Template |
|
||||
| ollama.gpu.enabled | bool | `false` | Enable GPU integration |
|
||||
| ollama.gpu.mig.devices | object | `{}` | Specify the mig devices and the corresponding number |
|
||||
| ollama.gpu.mig.enabled | bool | `false` | Enable multiple mig devices If enabled you will have to specify the mig devices If enabled is set to false this section is ignored |
|
||||
| ollama.gpu.number | int | `1` | Specify the number of GPU If you use MIG section below then this parameter is ignored |
|
||||
| ollama.gpu.nvidiaResource | string | `"nvidia.com/gpu"` | only for nvidia cards; change to (example) 'nvidia.com/mig-1g.10gb' to use MIG slice |
|
||||
| ollama.gpu.type | string | `"nvidia"` | GPU type: 'nvidia' or 'amd' If 'ollama.gpu.enabled', default value is nvidia If set to 'amd', this will add 'rocm' suffix to image tag if 'image.tag' is not override This is due cause AMD and CPU/CUDA are different images |
|
||||
| ollama.insecure | bool | `false` | Add insecure flag for pulling at container startup |
|
||||
| ollama.models.clean | bool | `false` | Automatically remove models present on the disk but not specified in the values file |
|
||||
| ollama.models.create | list | `[]` | List of models to create at container startup, there are two options 1. Create a raw model 2. Load a model from configMaps, configMaps must be created before and are loaded as volume in "/models" directory. create: - name: llama3.1-ctx32768 configMapRef: my-configmap configMapKeyRef: configmap-key - name: llama3.1-ctx32768 template: | FROM llama3.1 PARAMETER num_ctx 32768 |
|
||||
| ollama.models.pull | list | `[]` | List of models to pull at container startup The more you add, the longer the container will take to start if models are not present pull: - llama2 - mistral |
|
||||
| ollama.models.run | list | `[]` | List of models to load in memory at container startup run: - llama2 - mistral |
|
||||
| ollama.mountPath | string | `""` | Override ollama-data volume mount path, default: "/root/.ollama" |
|
||||
| ollama.port | int | `11434` | |
|
||||
| persistentVolume.accessModes | list | `["ReadWriteOnce"]` | Ollama server data Persistent Volume access modes Must match those of existing PV or dynamic provisioner Ref: http://kubernetes.io/docs/user-guide/persistent-volumes/ |
|
||||
| persistentVolume.annotations | object | `{}` | Ollama server data Persistent Volume annotations |
|
||||
| persistentVolume.enabled | bool | `false` | Enable persistence using PVC |
|
||||
| persistentVolume.existingClaim | string | `""` | If you'd like to bring your own PVC for persisting Ollama state, pass the name of the created + ready PVC here. If set, this Chart will not create the default PVC. Requires server.persistentVolume.enabled: true |
|
||||
| persistentVolume.size | string | `"30Gi"` | Ollama server data Persistent Volume size |
|
||||
| persistentVolume.storageClass | string | `""` | Ollama server data Persistent Volume Storage Class If defined, storageClassName: <storageClass> If set to "-", storageClassName: "", which disables dynamic provisioning If undefined (the default) or set to null, no storageClassName spec is set, choosing the default provisioner. (gp2 on AWS, standard on GKE, AWS & OpenStack) |
|
||||
| persistentVolume.subPath | string | `""` | Subdirectory of Ollama server data Persistent Volume to mount Useful if the volume's root directory is not empty |
|
||||
| persistentVolume.volumeMode | string | `""` | Ollama server data Persistent Volume Binding Mode If defined, volumeMode: <volumeMode> If empty (the default) or set to null, no volumeBindingMode spec is set, choosing the default mode. |
|
||||
| persistentVolume.volumeName | string | `""` | Pre-existing PV to attach this claim to Useful if a CSI auto-provisions a PV for you and you want to always reference the PV moving forward |
|
||||
| podAnnotations | object | `{}` | Map of annotations to add to the pods |
|
||||
| podLabels | object | `{}` | Map of labels to add to the pods |
|
||||
| podSecurityContext | object | `{}` | Pod Security Context |
|
||||
| priorityClassName | string | `""` | Priority Class Name |
|
||||
| readinessProbe.enabled | bool | `true` | Enable readinessProbe |
|
||||
| readinessProbe.failureThreshold | int | `6` | Failure threshold for readinessProbe |
|
||||
| readinessProbe.initialDelaySeconds | int | `30` | Initial delay seconds for readinessProbe |
|
||||
| readinessProbe.path | string | `"/"` | Request path for readinessProbe |
|
||||
| readinessProbe.periodSeconds | int | `5` | Period seconds for readinessProbe |
|
||||
| readinessProbe.successThreshold | int | `1` | Success threshold for readinessProbe |
|
||||
| readinessProbe.timeoutSeconds | int | `3` | Timeout seconds for readinessProbe |
|
||||
| replicaCount | int | `1` | Number of replicas |
|
||||
| resources.limits | object | `{}` | Pod limit |
|
||||
| resources.requests | object | `{}` | Pod requests |
|
||||
| runtimeClassName | string | `""` | Specify runtime class |
|
||||
| securityContext | object | `{}` | Container Security Context |
|
||||
| service.annotations | object | `{}` | Annotations to add to the service |
|
||||
| service.ipFamilies | object | `[]` | The IP families supported by the service |
|
||||
| service.ipFamilyPolicy | string | `""` | Allows configuring Dual-stack service |
|
||||
| service.labels | object | `{}` | Labels to add to the service |
|
||||
| service.loadBalancerIP | string | `nil` | Load Balancer IP address |
|
||||
| service.nodePort | int | `31434` | Service node port when service type is 'NodePort' |
|
||||
| service.port | int | `11434` | Service port |
|
||||
| service.type | string | `"ClusterIP"` | Service type |
|
||||
| serviceAccount.annotations | object | `{}` | Annotations to add to the service account |
|
||||
| serviceAccount.automount | bool | `true` | Automatically mount a ServiceAccount's API credentials? |
|
||||
| serviceAccount.create | bool | `true` | Specifies whether a service account should be created |
|
||||
| serviceAccount.name | string | `""` | The name of the service account to use. If not set and create is true, a name is generated using the fullname template |
|
||||
| terminationGracePeriodSeconds | int | `120` | Wait for a grace period |
|
||||
| tests.annotations | object | `{}` | Annotations to add to the tests |
|
||||
| tests.enabled | bool | `true` | |
|
||||
| tests.labels | object | `{}` | Labels to add to the tests |
|
||||
| tolerations | list | `[]` | Tolerations for pod assignment |
|
||||
| topologySpreadConstraints | object | `{}` | Topology Spread Constraints for pod assignment |
|
||||
| updateStrategy.type | string | `"Recreate"` | Deployment strategy can be "Recreate" or "RollingUpdate". Default is Recreate |
|
||||
| volumeMounts | list | `[]` | Additional volumeMounts on the output Deployment definition. |
|
||||
| volumes | list | `[]` | Additional volumes on the output Deployment definition. |
|
||||
|
||||
----------------------------------------------
|
||||
|
||||
## Core team
|
||||
|
||||
<table>
|
||||
<tr>
|
||||
<td align="center">
|
||||
<a href="https://github.com/jdetroyes"
|
||||
><img
|
||||
src="https://github.com/jdetroyes.png?size=200"
|
||||
width="50"
|
||||
style="margin-bottom: -4px; border-radius: 8px;"
|
||||
alt="Jean Baptiste Detroyes"
|
||||
/><br /><b> Jean Baptiste Detroyes </b></a
|
||||
>
|
||||
<div style="margin-top: 4px">
|
||||
<a href="https://github.com/jdetroyes" title="Github"
|
||||
><img
|
||||
width="16"
|
||||
src="https://raw.githubusercontent.com/MarsiBarsi/readme-icons/main/github.svg"
|
||||
/></a>
|
||||
<a
|
||||
href="mailto:jdetroyes@otwld.com"
|
||||
title="Email"
|
||||
><img
|
||||
width="16"
|
||||
src="https://raw.githubusercontent.com/MarsiBarsi/readme-icons/main/send.svg"
|
||||
/></a>
|
||||
</div>
|
||||
</td>
|
||||
<td align="center">
|
||||
<a href="https://github.com/ntrehout"
|
||||
><img
|
||||
src="https://github.com/ntrehout.png?size=200"
|
||||
width="50"
|
||||
style="margin-bottom: -4px; border-radius: 8px;"
|
||||
alt="Jean Baptiste Detroyes"
|
||||
/><br /><b> Nathan Tréhout </b></a
|
||||
>
|
||||
<div style="margin-top: 4px">
|
||||
<a href="https://x.com/n_trehout" title="Twitter"
|
||||
><img
|
||||
width="16"
|
||||
src="https://raw.githubusercontent.com/MarsiBarsi/readme-icons/main/twitter.svg"
|
||||
/></a>
|
||||
<a href="https://github.com/ntrehout" title="Github"
|
||||
><img
|
||||
width="16"
|
||||
src="https://raw.githubusercontent.com/MarsiBarsi/readme-icons/main/github.svg"
|
||||
/></a>
|
||||
<a
|
||||
href="mailto:ntrehout@otwld.com"
|
||||
title="Email"
|
||||
><img
|
||||
width="16"
|
||||
src="https://raw.githubusercontent.com/MarsiBarsi/readme-icons/main/send.svg"
|
||||
/></a>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
## Support
|
||||
|
||||
- For questions, suggestions, and discussion about Ollama please refer to
|
||||
the [Ollama issue page](https://github.com/ollama/ollama/issues)
|
||||
- For questions, suggestions, and discussion about this chart please
|
||||
visit [Ollama-Helm issue page](https://github.com/otwld/ollama-helm/issues) or join
|
||||
our [OTWLD Discord](https://discord.gg/U24mpqTynB)
|
||||
25
charts/ollama/templates/NOTES.txt
Normal file
25
charts/ollama/templates/NOTES.txt
Normal file
@ -0,0 +1,25 @@
|
||||
1. Get the application URL by running these commands:
|
||||
{{- if .Values.knative.enabled }}
|
||||
export KSERVICE_URL=$(kubectl get ksvc --namespace {{ .Release.Namespace }} {{ include "ollama.fullname" . }} -o jsonpath={.status.url})
|
||||
echo "Visit $KSERVICE_URL to use your application"
|
||||
{{- else if .Values.ingress.enabled }}
|
||||
{{- range $host := .Values.ingress.hosts }}
|
||||
{{- range .paths }}
|
||||
http{{ if $.Values.ingress.tls }}s{{ end }}://{{ $host.host }}{{ .path }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- else if contains "NodePort" .Values.service.type }}
|
||||
export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "ollama.fullname" . }})
|
||||
export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}")
|
||||
echo http://$NODE_IP:$NODE_PORT
|
||||
{{- else if contains "LoadBalancer" .Values.service.type }}
|
||||
NOTE: It may take a few minutes for the LoadBalancer IP to be available.
|
||||
You can watch the status of by running 'kubectl get --namespace {{ .Release.Namespace }} svc -w {{ include "ollama.fullname" . }}'
|
||||
export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ include "ollama.fullname" . }} --template "{{"{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}"}}")
|
||||
echo http://$SERVICE_IP:{{ .Values.service.port }}
|
||||
{{- else if contains "ClusterIP" .Values.service.type }}
|
||||
export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app.kubernetes.io/name={{ include "ollama.name" . }},app.kubernetes.io/instance={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}")
|
||||
export CONTAINER_PORT=$(kubectl get pod --namespace {{ .Release.Namespace }} $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}")
|
||||
echo "Visit http://127.0.0.1:8080 to use your application"
|
||||
kubectl --namespace {{ .Release.Namespace }} port-forward $POD_NAME 8080:$CONTAINER_PORT
|
||||
{{- end }}
|
||||
80
charts/ollama/templates/_helpers.tpl
Normal file
80
charts/ollama/templates/_helpers.tpl
Normal file
@ -0,0 +1,80 @@
|
||||
{{/*
|
||||
Allow the release namespace to be overridden for multi-namespace deployments in combined charts
|
||||
*/}}
|
||||
{{- define "ollama.namespace" -}}
|
||||
{{- if .Values.namespaceOverride -}}
|
||||
{{- .Values.namespaceOverride -}}
|
||||
{{- else -}}
|
||||
{{- .Release.Namespace -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
|
||||
{{/*
|
||||
Expand the name of the chart.
|
||||
*/}}
|
||||
{{- define "ollama.name" -}}
|
||||
{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Create a default fully qualified app name.
|
||||
We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
|
||||
If release name contains chart name it will be used as a full name.
|
||||
*/}}
|
||||
{{- define "ollama.fullname" -}}
|
||||
{{- if .Values.fullnameOverride }}
|
||||
{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }}
|
||||
{{- else }}
|
||||
{{- $name := default .Chart.Name .Values.nameOverride }}
|
||||
{{- if contains $name .Release.Name }}
|
||||
{{- .Release.Name | trunc 63 | trimSuffix "-" }}
|
||||
{{- else }}
|
||||
{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Create chart name and version as used by the chart label.
|
||||
*/}}
|
||||
{{- define "ollama.chart" -}}
|
||||
{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Common labels
|
||||
*/}}
|
||||
{{- define "ollama.labels" -}}
|
||||
helm.sh/chart: {{ include "ollama.chart" . }}
|
||||
{{ include "ollama.selectorLabels" . }}
|
||||
{{- if .Chart.AppVersion }}
|
||||
app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
|
||||
{{- end }}
|
||||
app.kubernetes.io/managed-by: {{ .Release.Service }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Selector labels
|
||||
*/}}
|
||||
{{- define "ollama.selectorLabels" -}}
|
||||
app.kubernetes.io/name: {{ include "ollama.name" . }}
|
||||
app.kubernetes.io/instance: {{ .Release.Name }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Create the name of the service account to use
|
||||
*/}}
|
||||
{{- define "ollama.serviceAccountName" -}}
|
||||
{{- if .Values.serviceAccount.create }}
|
||||
{{- default (include "ollama.fullname" .) .Values.serviceAccount.name }}
|
||||
{{- else }}
|
||||
{{- default "default" .Values.serviceAccount.name }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Models mount path
|
||||
*/}}
|
||||
{{- define "ollama.modelsMountPath" -}}
|
||||
{{- printf "%s/models" (((.Values).ollama).mountPath | default "/root/.ollama") }}
|
||||
{{- end -}}
|
||||
293
charts/ollama/templates/deployment.yaml
Normal file
293
charts/ollama/templates/deployment.yaml
Normal file
@ -0,0 +1,293 @@
|
||||
---
|
||||
{{- if not .Values.knative.enabled }}
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: {{ include "ollama.fullname" . }}
|
||||
namespace: {{ include "ollama.namespace" . }}
|
||||
labels:
|
||||
{{- include "ollama.labels" . | nindent 4 }}
|
||||
{{- with .Values.deployment.labels }}
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
spec:
|
||||
{{- if not .Values.autoscaling.enabled }}
|
||||
replicas: {{ .Values.replicaCount }}
|
||||
{{- end }}
|
||||
{{- if or .Values.updateStrategy.type .Values.updateStrategy.rollingUpdate }}
|
||||
strategy: {{ .Values.updateStrategy | toYaml | nindent 4 }}
|
||||
{{- end }}
|
||||
selector:
|
||||
matchLabels:
|
||||
{{- include "ollama.selectorLabels" . | nindent 6 }}
|
||||
template:
|
||||
metadata:
|
||||
{{- with .Values.podAnnotations }}
|
||||
annotations:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
labels:
|
||||
{{- include "ollama.labels" . | nindent 8 }}
|
||||
{{- with .Values.podLabels }}
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
spec:
|
||||
{{- if .Values.hostIPC }}
|
||||
hostIPC: {{ .Values.hostIPC }}
|
||||
{{- end }}
|
||||
{{- if .Values.hostPID }}
|
||||
hostPID: {{ .Values.hostPID }}
|
||||
{{- end }}
|
||||
{{- if .Values.hostNetwork }}
|
||||
hostNetwork: {{ .Values.hostNetwork }}
|
||||
{{- end }}
|
||||
{{- with .Values.imagePullSecrets }}
|
||||
imagePullSecrets:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
serviceAccountName: {{ include "ollama.serviceAccountName" . }}
|
||||
{{- if .Values.priorityClassName }}
|
||||
priorityClassName: {{ .Values.priorityClassName | quote }}
|
||||
{{- end }}
|
||||
{{- if .Values.terminationGracePeriodSeconds }}
|
||||
terminationGracePeriodSeconds: {{ .Values.terminationGracePeriodSeconds }}
|
||||
{{- end }}
|
||||
securityContext:
|
||||
{{- toYaml .Values.podSecurityContext | nindent 8 }}
|
||||
{{- if .Values.runtimeClassName }}
|
||||
runtimeClassName: {{ .Values.runtimeClassName | quote }}
|
||||
{{- end }}
|
||||
{{- with .Values.initContainers }}
|
||||
initContainers:
|
||||
{{- tpl (toYaml . ) $ | nindent 8 }}
|
||||
{{- end }}
|
||||
containers:
|
||||
- name: {{ .Chart.Name }}
|
||||
securityContext:
|
||||
{{- toYaml .Values.securityContext | nindent 12 }}
|
||||
image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default (ternary (printf "%s-rocm" .Chart.AppVersion) (.Chart.AppVersion) (and (.Values.ollama.gpu.enabled) (eq .Values.ollama.gpu.type "amd"))) }}"
|
||||
imagePullPolicy: {{ .Values.image.pullPolicy }}
|
||||
ports:
|
||||
- name: http
|
||||
containerPort: {{ .Values.ollama.port }}
|
||||
protocol: TCP
|
||||
env:
|
||||
- name: OLLAMA_HOST
|
||||
value: "0.0.0.0:{{ .Values.ollama.port }}"
|
||||
{{- if and .Values.ollama.gpu.enabled (or (eq .Values.ollama.gpu.type "nvidia") (not .Values.ollama.gpu.type))}}
|
||||
- name: PATH
|
||||
value: /usr/local/nvidia/bin:/usr/local/cuda/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
|
||||
{{- end}}
|
||||
{{- with .Values.extraEnv }}
|
||||
{{- toYaml . | nindent 12 }}
|
||||
{{- end }}
|
||||
envFrom:
|
||||
{{- with .Values.extraEnvFrom }}
|
||||
{{- toYaml . | nindent 12 }}
|
||||
{{- end }}
|
||||
args:
|
||||
{{- with .Values.extraArgs }}
|
||||
{{- toYaml . | nindent 12 }}
|
||||
{{- end }}
|
||||
{{- if .Values.resources }}
|
||||
resources:
|
||||
{{- $limits := default dict .Values.resources.limits }}
|
||||
{{- if .Values.ollama.gpu.enabled }}
|
||||
{{- if .Values.ollama.gpu.draEnabled}}
|
||||
claims:
|
||||
- name: gpu
|
||||
{{- else }}
|
||||
# If gpu is enabled, it can either be a NVIDIA card or a AMD card
|
||||
{{- if or (eq .Values.ollama.gpu.type "nvidia") (not .Values.ollama.gpu.type) }}
|
||||
# NVIDIA is assumed by default if no value is set and GPU is enabled
|
||||
# NVIDIA cards can have mig enabled (i.e., the card is sliced into parts
|
||||
# Therefore, the first case is no migs enabled
|
||||
{{- if or (not .Values.ollama.gpu.mig) (not .Values.ollama.gpu.mig.enabled ) }}
|
||||
{{- $gpuLimit := dict (.Values.ollama.gpu.nvidiaResource | default "nvidia.com/gpu") (.Values.ollama.gpu.number | default 1) }}
|
||||
{{- $limits = merge $limits $gpuLimit }}
|
||||
# Second case is mig is enabled
|
||||
{{- else if or (.Values.ollama.gpu.mig.enabled) }}
|
||||
# Initialize empty dictionary
|
||||
{{- $migDevices := dict -}}
|
||||
# Loop over the entries in the mig devices
|
||||
{{- range $key, $value := .Values.ollama.gpu.mig.devices }}
|
||||
{{- $migKey := printf "nvidia.com/mig-%s" $key -}}
|
||||
{{- $migDevices = merge $migDevices (dict $migKey $value) -}}
|
||||
{{- end }}
|
||||
{{- $limits = merge $limits $migDevices}}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- if eq .Values.ollama.gpu.type "amd" }}
|
||||
{{- $gpuLimit := dict "amd.com/gpu" (.Values.ollama.gpu.number | default 1) }}
|
||||
{{- $limits = merge $limits $gpuLimit }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- $ressources := deepCopy (dict "limits" $limits) | mergeOverwrite .Values.resources }}
|
||||
{{- toYaml $ressources | nindent 12 }}
|
||||
{{- end}}
|
||||
volumeMounts:
|
||||
- name: ollama-data
|
||||
mountPath: {{ .Values.ollama.mountPath | default "/root/.ollama" }}
|
||||
{{- if .Values.persistentVolume.subPath }}
|
||||
subPath: {{ .Values.persistentVolume.subPath }}
|
||||
{{- end }}
|
||||
{{- range .Values.ollama.models.create }}
|
||||
{{- if .configMapRef }}
|
||||
- name: {{ .name }}-config-model-volume
|
||||
mountPath: /models
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- with .Values.volumeMounts }}
|
||||
{{- toYaml . | nindent 12 }}
|
||||
{{- end }}
|
||||
{{- if .Values.livenessProbe.enabled }}
|
||||
livenessProbe:
|
||||
httpGet:
|
||||
path: {{ .Values.livenessProbe.path }}
|
||||
port: http
|
||||
initialDelaySeconds: {{ .Values.livenessProbe.initialDelaySeconds }}
|
||||
periodSeconds: {{ .Values.livenessProbe.periodSeconds }}
|
||||
timeoutSeconds: {{ .Values.livenessProbe.timeoutSeconds }}
|
||||
successThreshold: {{ .Values.livenessProbe.successThreshold }}
|
||||
failureThreshold: {{ .Values.livenessProbe.failureThreshold }}
|
||||
{{- end }}
|
||||
{{- if .Values.readinessProbe.enabled }}
|
||||
readinessProbe:
|
||||
httpGet:
|
||||
path: {{ .Values.readinessProbe.path }}
|
||||
port: http
|
||||
initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }}
|
||||
periodSeconds: {{ .Values.readinessProbe.periodSeconds }}
|
||||
timeoutSeconds: {{ .Values.readinessProbe.timeoutSeconds }}
|
||||
successThreshold: {{ .Values.readinessProbe.successThreshold }}
|
||||
failureThreshold: {{ .Values.readinessProbe.failureThreshold }}
|
||||
{{- end }}
|
||||
{{- with .Values.lifecycle}}
|
||||
lifecycle:
|
||||
{{- toYaml . | nindent 12 }}
|
||||
{{- else }}
|
||||
{{- if or .Values.ollama.models.pull .Values.ollama.models.run .Values.ollama.models.create }}
|
||||
lifecycle:
|
||||
postStart:
|
||||
exec:
|
||||
command:
|
||||
- /bin/sh
|
||||
- -c
|
||||
- |
|
||||
while ! /bin/ollama ps > /dev/null 2>&1; do
|
||||
sleep 5
|
||||
done
|
||||
|
||||
{{- $allModels := list -}}
|
||||
|
||||
{{- if .Values.ollama.models.pull }}
|
||||
{{- range .Values.ollama.models.pull }}
|
||||
|
||||
{{- if contains ":" . }}
|
||||
{{- $allModels = append $allModels . }}
|
||||
{{- else }}
|
||||
{{- $allModels = append $allModels (printf "%s:latest" .) }}
|
||||
{{- end }}
|
||||
|
||||
/bin/ollama pull {{ternary "--insecure" "" $.Values.ollama.insecure | toString }} {{ . }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
|
||||
{{- if .Values.ollama.models.create }}
|
||||
{{- range .Values.ollama.models.create }}
|
||||
{{- $allModels = append $allModels .name }}
|
||||
{{- if .template }}
|
||||
cat <<EOF > {{ include "ollama.modelsMountPath" $ }}/{{ .name }}
|
||||
{{- .template | nindent 20 }}
|
||||
EOF
|
||||
/bin/ollama create {{ .name }} -f {{ include "ollama.modelsMountPath" $ }}/{{ .name }}
|
||||
{{- end }}
|
||||
{{- if .configMapRef }}
|
||||
/bin/ollama create {{ .name }} -f /models/{{ .name }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
|
||||
{{- if .Values.ollama.models.run }}
|
||||
{{- range .Values.ollama.models.run }}
|
||||
|
||||
{{- if contains ":" . }}
|
||||
{{- $allModels = append $allModels . }}
|
||||
{{- else }}
|
||||
{{- $allModels = append $allModels (printf "%s:latest" .) }}
|
||||
{{- end }}
|
||||
|
||||
/bin/ollama run {{ . }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
|
||||
{{- if .Values.ollama.models.clean }}
|
||||
/bin/ollama list | awk 'NR>1 {print $1}' | while read model; do
|
||||
echo "{{ $allModels | join " " }}" | tr ' ' '\n' | grep -Fqx "$model" || /bin/ollama rm "$model"
|
||||
done
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- if and .Values.ollama.gpu.enabled .Values.ollama.gpu.draEnabled }}
|
||||
resourceClaims:
|
||||
- name: gpu
|
||||
resourceClaimTemplateName: {{ .Values.ollama.gpu.draExistingClaimTemplate | default (printf "%s" (include "ollama.fullname" .)) }}
|
||||
{{- end }}
|
||||
volumes:
|
||||
- name: ollama-data
|
||||
{{- if .Values.persistentVolume.enabled }}
|
||||
persistentVolumeClaim:
|
||||
claimName: {{ .Values.persistentVolume.existingClaim | default (printf "%s" (include "ollama.fullname" .)) }}
|
||||
{{- else }}
|
||||
emptyDir: { }
|
||||
{{- end }}
|
||||
{{- range .Values.ollama.models.create }}
|
||||
{{- if .configMapRef }}
|
||||
- name: {{ .name }}-config-model-volume
|
||||
configMap:
|
||||
name: {{ .configMapRef }}
|
||||
items:
|
||||
- key: {{ .configMapKeyRef }}
|
||||
path: {{ .name }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- with .Values.volumes }}
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- with .Values.nodeSelector }}
|
||||
nodeSelector:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- with .Values.affinity }}
|
||||
affinity:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- with .Values.topologySpreadConstraints }}
|
||||
topologySpreadConstraints:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- if or .Values.ollama.gpu.enabled .Values.tolerations }}
|
||||
tolerations:
|
||||
{{- if and .Values.ollama.gpu.enabled (and
|
||||
( or (eq .Values.ollama.gpu.type "nvidia") (not .Values.ollama.gpu.type))
|
||||
( or (not .Values.ollama.gpu.mig) (not .Values.ollama.gpu.mig.enabled))
|
||||
) }}
|
||||
- key: "{{(.Values.ollama.gpu.nvidiaResource | default "nvidia.com/gpu")}}"
|
||||
operator: Exists
|
||||
effect: NoSchedule
|
||||
{{- else if and .Values.ollama.gpu.enabled (and
|
||||
( or (eq .Values.ollama.gpu.type "nvidia") (not .Values.ollama.gpu.type))
|
||||
(( .Values.ollama.gpu.mig.enabled))
|
||||
) }}
|
||||
{{- range $key, $value := .Values.ollama.gpu.mig.devices }}
|
||||
- key: nvidia.com/mig-{{ $key }}
|
||||
operator: Exists
|
||||
effect: NoSchedule
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- with .Values.tolerations }}
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
4
charts/ollama/templates/extra-manifests.yaml
Normal file
4
charts/ollama/templates/extra-manifests.yaml
Normal file
@ -0,0 +1,4 @@
|
||||
{{ range .Values.extraObjects }}
|
||||
---
|
||||
{{ tpl (toYaml .) $ }}
|
||||
{{ end }}
|
||||
34
charts/ollama/templates/hpa.yaml
Normal file
34
charts/ollama/templates/hpa.yaml
Normal file
@ -0,0 +1,34 @@
|
||||
---
|
||||
{{- if .Values.autoscaling.enabled }}
|
||||
apiVersion: autoscaling/v2
|
||||
kind: HorizontalPodAutoscaler
|
||||
metadata:
|
||||
name: {{ include "ollama.fullname" . }}
|
||||
namespace: {{ include "ollama.namespace" . }}
|
||||
labels:
|
||||
{{- include "ollama.labels" . | nindent 4 }}
|
||||
spec:
|
||||
scaleTargetRef:
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
name: {{ include "ollama.fullname" . }}
|
||||
minReplicas: {{ .Values.autoscaling.minReplicas }}
|
||||
maxReplicas: {{ .Values.autoscaling.maxReplicas }}
|
||||
metrics:
|
||||
{{- if .Values.autoscaling.targetCPUUtilizationPercentage }}
|
||||
- type: Resource
|
||||
resource:
|
||||
name: cpu
|
||||
target:
|
||||
type: Utilization
|
||||
averageUtilization: {{ .Values.autoscaling.targetCPUUtilizationPercentage }}
|
||||
{{- end }}
|
||||
{{- if .Values.autoscaling.targetMemoryUtilizationPercentage }}
|
||||
- type: Resource
|
||||
resource:
|
||||
name: memory
|
||||
target:
|
||||
type: Utilization
|
||||
averageUtilization: {{ .Values.autoscaling.targetMemoryUtilizationPercentage }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
63
charts/ollama/templates/ingress.yaml
Normal file
63
charts/ollama/templates/ingress.yaml
Normal file
@ -0,0 +1,63 @@
|
||||
{{- if .Values.ingress.enabled -}}
|
||||
{{- $fullName := include "ollama.fullname" . -}}
|
||||
{{- $svcPort := .Values.service.port -}}
|
||||
{{- if and .Values.ingress.className (not (semverCompare ">=1.18-0" .Capabilities.KubeVersion.GitVersion)) }}
|
||||
{{- if not (hasKey .Values.ingress.annotations "kubernetes.io/ingress.class") }}
|
||||
{{- $_ := set .Values.ingress.annotations "kubernetes.io/ingress.class" .Values.ingress.className }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
---
|
||||
{{- if semverCompare ">=1.19-0" .Capabilities.KubeVersion.GitVersion }}
|
||||
apiVersion: networking.k8s.io/v1
|
||||
{{- else if semverCompare ">=1.14-0" .Capabilities.KubeVersion.GitVersion }}
|
||||
apiVersion: networking.k8s.io/v1beta1
|
||||
{{- else }}
|
||||
apiVersion: extensions/v1beta1
|
||||
{{- end }}
|
||||
kind: Ingress
|
||||
metadata:
|
||||
name: {{ $fullName }}
|
||||
namespace: {{ include "ollama.namespace" . }}
|
||||
labels:
|
||||
{{- include "ollama.labels" . | nindent 4 }}
|
||||
{{- with .Values.ingress.annotations }}
|
||||
annotations:
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
spec:
|
||||
{{- if and .Values.ingress.className (semverCompare ">=1.18-0" .Capabilities.KubeVersion.GitVersion) }}
|
||||
ingressClassName: {{ .Values.ingress.className }}
|
||||
{{- end }}
|
||||
{{- if .Values.ingress.tls }}
|
||||
tls:
|
||||
{{- range .Values.ingress.tls }}
|
||||
- hosts:
|
||||
{{- range .hosts }}
|
||||
- {{ . | quote }}
|
||||
{{- end }}
|
||||
secretName: {{ .secretName }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
rules:
|
||||
{{- range .Values.ingress.hosts }}
|
||||
- host: {{ .host | quote }}
|
||||
http:
|
||||
paths:
|
||||
{{- range .paths }}
|
||||
- path: {{ .path }}
|
||||
{{- if and .pathType (semverCompare ">=1.18-0" $.Capabilities.KubeVersion.GitVersion) }}
|
||||
pathType: {{ .pathType }}
|
||||
{{- end }}
|
||||
backend:
|
||||
{{- if semverCompare ">=1.19-0" $.Capabilities.KubeVersion.GitVersion }}
|
||||
service:
|
||||
name: {{ $fullName }}
|
||||
port:
|
||||
number: {{ $svcPort }}
|
||||
{{- else }}
|
||||
serviceName: {{ $fullName }}
|
||||
servicePort: {{ $svcPort }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
200
charts/ollama/templates/knative/service.yaml
Normal file
200
charts/ollama/templates/knative/service.yaml
Normal file
@ -0,0 +1,200 @@
|
||||
---
|
||||
{{- if .Values.knative.enabled }}
|
||||
apiVersion: serving.knative.dev/v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: {{ include "ollama.fullname" . }}
|
||||
namespace: {{ include "ollama.namespace" . }}
|
||||
labels:
|
||||
{{- include "ollama.labels" . | nindent 4 }}
|
||||
{{- with .Values.knative.annotations }}
|
||||
annotations:
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
spec:
|
||||
template:
|
||||
spec:
|
||||
containerConcurrency: {{ .Values.knative.containerConcurrency }}
|
||||
timeoutSeconds: {{ .Values.knative.timeoutSeconds }}
|
||||
responseStartTimeoutSeconds: {{ .Values.knative.responseStartTimeoutSeconds }}
|
||||
idleTimeoutSeconds: {{ .Values.knative.idleTimeoutSeconds }}
|
||||
{{- with .Values.imagePullSecrets }}
|
||||
imagePullSecrets:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
serviceAccountName: {{ include "ollama.serviceAccountName" . }}
|
||||
{{- if .Values.runtimeClassName }}
|
||||
runtimeClassName: {{ .Values.runtimeClassName | quote }}
|
||||
{{- end }}
|
||||
{{- if .Values.terminationGracePeriodSeconds }}
|
||||
terminationGracePeriodSeconds: {{ .Values.terminationGracePeriodSeconds }}
|
||||
{{- end }}
|
||||
{{- with .Values.initContainers }}
|
||||
initContainers:
|
||||
{{- tpl (toYaml . ) $ | nindent 8 }}
|
||||
{{- end }}
|
||||
containers:
|
||||
- image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default (ternary (printf "%s-rocm" .Chart.AppVersion) (.Chart.AppVersion) (and (.Values.ollama.gpu.enabled) (eq .Values.ollama.gpu.type "amd"))) }}"
|
||||
imagePullPolicy: {{ .Values.image.pullPolicy }}
|
||||
securityContext:
|
||||
{{- toYaml .Values.securityContext | nindent 12 }}
|
||||
ports:
|
||||
- containerPort: {{ .Values.ollama.port }}
|
||||
env:
|
||||
- name: OLLAMA_HOST
|
||||
value: "0.0.0.0:{{ .Values.ollama.port }}"
|
||||
{{- if and .Values.ollama.gpu.enabled (or (eq .Values.ollama.gpu.type "nvidia") (not .Values.ollama.gpu.type))}}
|
||||
- name: PATH
|
||||
value: /usr/local/nvidia/bin:/usr/local/cuda/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
|
||||
{{- end}}
|
||||
{{- with .Values.extraEnv }}
|
||||
{{- toYaml . | nindent 12 }}
|
||||
{{- end }}
|
||||
envFrom:
|
||||
{{- with .Values.extraEnvFrom }}
|
||||
{{- toYaml . | nindent 12 }}
|
||||
{{- end }}
|
||||
args:
|
||||
{{- with .Values.extraArgs }}
|
||||
{{- toYaml . | nindent 12 }}
|
||||
{{- end }}
|
||||
{{- if .Values.resources }}
|
||||
resources:
|
||||
{{- $limits := default dict .Values.resources.limits }}
|
||||
{{- if .Values.ollama.gpu.enabled }}
|
||||
{{- if or (eq .Values.ollama.gpu.type "nvidia") (not .Values.ollama.gpu.type) }}
|
||||
{{- $gpuLimit := dict (.Values.ollama.gpu.nvidiaResource | default "nvidia.com/gpu") (.Values.ollama.gpu.number | default 1) }}
|
||||
{{- $limits = merge $limits $gpuLimit }}
|
||||
{{- end }}
|
||||
{{- if eq .Values.ollama.gpu.type "amd" }}
|
||||
{{- $gpuLimit := dict "amd.com/gpu" (.Values.ollama.gpu.number | default 1) }}
|
||||
{{- $limits = merge $limits $gpuLimit }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- $ressources := deepCopy (dict "limits" $limits) | mergeOverwrite .Values.resources }}
|
||||
{{- toYaml $ressources | nindent 12 }}
|
||||
{{- end}}
|
||||
volumeMounts:
|
||||
- name: ollama-data
|
||||
mountPath: {{ .Values.ollama.mountPath | default "/root/.ollama" }}
|
||||
{{- if .Values.persistentVolume.subPath }}
|
||||
subPath: {{ .Values.persistentVolume.subPath }}
|
||||
{{- end }}
|
||||
{{- range .Values.ollama.models.create }}
|
||||
{{- if .configMapRef }}
|
||||
- name: {{ .name }}-config-model-volume
|
||||
mountPath: /models
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- with .Values.volumeMounts }}
|
||||
{{- toYaml . | nindent 12 }}
|
||||
{{- end }}
|
||||
{{- if .Values.livenessProbe.enabled }}
|
||||
livenessProbe:
|
||||
httpGet:
|
||||
path: {{ .Values.livenessProbe.path }}
|
||||
port: http
|
||||
initialDelaySeconds: {{ .Values.livenessProbe.initialDelaySeconds }}
|
||||
periodSeconds: {{ .Values.livenessProbe.periodSeconds }}
|
||||
timeoutSeconds: {{ .Values.livenessProbe.timeoutSeconds }}
|
||||
successThreshold: {{ .Values.livenessProbe.successThreshold }}
|
||||
failureThreshold: {{ .Values.livenessProbe.failureThreshold }}
|
||||
{{- end }}
|
||||
{{- if .Values.readinessProbe.enabled }}
|
||||
readinessProbe:
|
||||
httpGet:
|
||||
path: {{ .Values.readinessProbe.path }}
|
||||
port: http
|
||||
initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }}
|
||||
periodSeconds: {{ .Values.readinessProbe.periodSeconds }}
|
||||
timeoutSeconds: {{ .Values.readinessProbe.timeoutSeconds }}
|
||||
successThreshold: {{ .Values.readinessProbe.successThreshold }}
|
||||
failureThreshold: {{ .Values.readinessProbe.failureThreshold }}
|
||||
{{- end }}
|
||||
{{- with .Values.lifecycle}}
|
||||
lifecycle:
|
||||
{{- toYaml . | nindent 12 }}
|
||||
{{- else }}
|
||||
{{- if or .Values.ollama.models.pull .Values.ollama.models.run .Values.ollama.models.create }}
|
||||
lifecycle:
|
||||
postStart:
|
||||
exec:
|
||||
command:
|
||||
- /bin/sh
|
||||
- -c
|
||||
- |
|
||||
while ! /bin/ollama ps > /dev/null 2>&1; do
|
||||
sleep 5
|
||||
done
|
||||
{{- if .Values.ollama.models.pull }}
|
||||
{{- range .Values.ollama.models.pull }}
|
||||
/bin/ollama pull {{ternary "--insecure" "" $.Values.ollama.insecure | toString }} {{ . }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
|
||||
{{- if .Values.ollama.models.create }}
|
||||
{{- range .Values.ollama.models.create }}
|
||||
{{- if .template }}
|
||||
cat <<EOF > {{ include "ollama.modelsMountPath" $ }}/{{ .name }}
|
||||
{{- .template | nindent 20 }}
|
||||
EOF
|
||||
/bin/ollama create {{ .name }} -f {{ include "ollama.modelsMountPath" . }}/{{ .name }}
|
||||
{{- end }}
|
||||
{{- if .configMapRef }}
|
||||
/bin/ollama create {{ .name }} -f /models/{{ .name }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
|
||||
{{- if .Values.ollama.models.run }}
|
||||
{{- range .Values.ollama.models.run }}
|
||||
/bin/ollama run {{ . }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
volumes:
|
||||
- name: ollama-data
|
||||
{{- if .Values.persistentVolume.enabled }}
|
||||
persistentVolumeClaim:
|
||||
claimName: {{ .Values.persistentVolume.existingClaim | default (printf "%s" (include "ollama.fullname" .)) }}
|
||||
{{- else }}
|
||||
emptyDir: { }
|
||||
{{- end }}
|
||||
{{- range .Values.ollama.models.create }}
|
||||
{{- if .configMapRef }}
|
||||
- name: {{ .name }}-config-model-volume
|
||||
configMap:
|
||||
name: {{ .configMapRef }}
|
||||
items:
|
||||
- key: {{ .configMapKeyRef }}
|
||||
path: {{ .name }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- with .Values.volumes }}
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- with .Values.nodeSelector }}
|
||||
nodeSelector:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- with .Values.affinity }}
|
||||
affinity:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- with .Values.topologySpreadConstraints }}
|
||||
topologySpreadConstraints:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- if or .Values.ollama.gpu.enabled .Values.tolerations }}
|
||||
tolerations:
|
||||
{{- if and .Values.ollama.gpu.enabled (or (eq .Values.ollama.gpu.type "nvidia") (not .Values.ollama.gpu.type)) }}
|
||||
- key: "{{(.Values.ollama.gpu.nvidiaResource | default "nvidia.com/gpu")}}"
|
||||
operator: Exists
|
||||
effect: NoSchedule
|
||||
{{- end }}
|
||||
{{- with .Values.tolerations }}
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
33
charts/ollama/templates/pvc.yaml
Normal file
33
charts/ollama/templates/pvc.yaml
Normal file
@ -0,0 +1,33 @@
|
||||
{{- if (and .Values.persistentVolume.enabled (not .Values.persistentVolume.existingClaim)) -}}
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: PersistentVolumeClaim
|
||||
metadata:
|
||||
{{- if .Values.persistentVolume.annotations }}
|
||||
annotations:
|
||||
{{ toYaml .Values.persistentVolume.annotations | indent 4 }}
|
||||
{{- end }}
|
||||
labels:
|
||||
{{- include "ollama.labels" . | nindent 4 }}
|
||||
name: {{ template "ollama.fullname" . }}
|
||||
namespace: {{ include "ollama.namespace" . }}
|
||||
spec:
|
||||
accessModes:
|
||||
{{ toYaml .Values.persistentVolume.accessModes | indent 4 }}
|
||||
{{- if .Values.persistentVolume.storageClass }}
|
||||
{{- if (eq "-" .Values.persistentVolume.storageClass) }}
|
||||
storageClassName: ""
|
||||
{{- else }}
|
||||
storageClassName: "{{ .Values.persistentVolume.storageClass }}"
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- if .Values.persistentVolume.volumeMode }}
|
||||
volumeMode: "{{ .Values.persistentVolume.volumeMode }}"
|
||||
{{- end }}
|
||||
{{- if .Values.persistentVolume.volumeName }}
|
||||
volumeName: "{{ .Values.persistentVolume.volumeName }}"
|
||||
{{- end }}
|
||||
resources:
|
||||
requests:
|
||||
storage: "{{ .Values.persistentVolume.size }}"
|
||||
{{- end -}}
|
||||
19
charts/ollama/templates/resourceclaimtemplate.yaml
Normal file
19
charts/ollama/templates/resourceclaimtemplate.yaml
Normal file
@ -0,0 +1,19 @@
|
||||
{{- if and .Values.ollama.gpu.enabled .Values.ollama.gpu.draEnabled (not .Values.ollama.gpu.draExistingClaimTemplate) -}}
|
||||
---
|
||||
{{- if semverCompare ">=1.34-0" .Capabilities.KubeVersion.GitVersion }}
|
||||
apiVersion: resource.k8s.io/v1
|
||||
{{- else }}
|
||||
apiVersion: resource.k8s.io/v1beta1
|
||||
{{- end }}
|
||||
kind: ResourceClaimTemplate
|
||||
metadata:
|
||||
name: {{ template "ollama.fullname" . }}
|
||||
namespace: {{ include "ollama.namespace" . }}
|
||||
spec:
|
||||
spec:
|
||||
devices:
|
||||
requests:
|
||||
- name: gpu
|
||||
deviceClassName: {{ .Values.ollama.gpu.draDriverClass }}
|
||||
count: {{(.Values.ollama.gpu.number | default 1)}}
|
||||
{{- end -}}
|
||||
40
charts/ollama/templates/service.yaml
Normal file
40
charts/ollama/templates/service.yaml
Normal file
@ -0,0 +1,40 @@
|
||||
---
|
||||
{{- if not .Values.knative.enabled }}
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: {{ include "ollama.fullname" . }}
|
||||
namespace: {{ include "ollama.namespace" . }}
|
||||
labels:
|
||||
{{- include "ollama.labels" . | nindent 4 }}
|
||||
{{- with .Values.service.labels }}
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
{{- with .Values.service.annotations }}
|
||||
annotations:
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
spec:
|
||||
type: {{ .Values.service.type }}
|
||||
ports:
|
||||
- port: {{ .Values.service.port }}
|
||||
targetPort: http
|
||||
protocol: TCP
|
||||
name: http
|
||||
{{- if contains "NodePort" .Values.service.type }}
|
||||
nodePort: {{ .Values.service.nodePort }}
|
||||
{{- end }}
|
||||
{{- if .Values.service.loadBalancerIP }}
|
||||
loadBalancerIP: {{ .Values.service.loadBalancerIP | quote }}
|
||||
{{- end }}
|
||||
selector:
|
||||
{{- include "ollama.selectorLabels" . | nindent 4 }}
|
||||
{{- end }}
|
||||
{{- with .Values.service.ipFamilies }}
|
||||
ipFamilies:
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
{{- with .Values.service.ipFamilyPolicy }}
|
||||
ipFamilyPolicy: {{ . }}
|
||||
{{- end }}
|
||||
|
||||
15
charts/ollama/templates/serviceaccount.yaml
Normal file
15
charts/ollama/templates/serviceaccount.yaml
Normal file
@ -0,0 +1,15 @@
|
||||
{{- if .Values.serviceAccount.create -}}
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: ServiceAccount
|
||||
metadata:
|
||||
name: {{ include "ollama.serviceAccountName" . }}
|
||||
namespace: {{ include "ollama.namespace" . }}
|
||||
labels:
|
||||
{{- include "ollama.labels" . | nindent 4 }}
|
||||
{{- with .Values.serviceAccount.annotations }}
|
||||
annotations:
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
automountServiceAccountToken: {{ .Values.serviceAccount.automount }}
|
||||
{{- end }}
|
||||
25
charts/ollama/templates/tests/test-connection.yaml
Normal file
25
charts/ollama/templates/tests/test-connection.yaml
Normal file
@ -0,0 +1,25 @@
|
||||
---
|
||||
{{- if .Values.tests.enabled }}
|
||||
apiVersion: v1
|
||||
kind: Pod
|
||||
metadata:
|
||||
name: "{{ include "ollama.fullname" . }}-test-connection"
|
||||
namespace: {{ include "ollama.namespace" . }}
|
||||
labels:
|
||||
{{- include "ollama.labels" . | nindent 4 }}
|
||||
{{- with .Values.tests.labels }}
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
annotations:
|
||||
"helm.sh/hook": test
|
||||
{{- with .Values.tests.annotations }}
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
spec:
|
||||
containers:
|
||||
- name: wget
|
||||
image: busybox
|
||||
command: ['wget']
|
||||
args: ['{{ include "ollama.fullname" . }}:{{ .Values.service.port }}']
|
||||
restartPolicy: Never
|
||||
{{ end }}
|
||||
451
charts/ollama/values.yaml
Normal file
451
charts/ollama/values.yaml
Normal file
@ -0,0 +1,451 @@
|
||||
# Default values for ollama-helm.
|
||||
# This is a YAML-formatted file.
|
||||
# Declare variables to be passed into your templates.
|
||||
|
||||
# -- Number of replicas
|
||||
replicaCount: 1
|
||||
|
||||
# Knative configuration
|
||||
knative:
|
||||
# -- Enable Knative integration
|
||||
enabled: false
|
||||
# -- Knative service container concurrency
|
||||
containerConcurrency: 0
|
||||
# -- Knative service timeout seconds
|
||||
timeoutSeconds: 300
|
||||
# -- Knative service response start timeout seconds
|
||||
responseStartTimeoutSeconds: 300
|
||||
# -- Knative service idle timeout seconds
|
||||
idleTimeoutSeconds: 300
|
||||
# -- Knative service annotations
|
||||
annotations: {}
|
||||
|
||||
# Docker image
|
||||
image:
|
||||
# -- Docker image registry
|
||||
repository: ollama/ollama
|
||||
|
||||
# -- Docker pull policy
|
||||
pullPolicy: IfNotPresent
|
||||
|
||||
# -- Docker image tag, overrides the image tag whose default is the chart appVersion.
|
||||
tag: ""
|
||||
|
||||
# -- Docker registry secret names as an array
|
||||
imagePullSecrets: []
|
||||
|
||||
# -- String to partially override template (will maintain the release name)
|
||||
nameOverride: ""
|
||||
|
||||
# -- String to fully override template
|
||||
fullnameOverride: ""
|
||||
|
||||
# -- String to fully override namespace
|
||||
namespaceOverride: ""
|
||||
|
||||
# Ollama parameters
|
||||
ollama:
|
||||
# Port Ollama is listening on
|
||||
port: 11434
|
||||
|
||||
gpu:
|
||||
# -- Enable GPU integration
|
||||
enabled: false
|
||||
|
||||
# -- Enable DRA GPU integration
|
||||
# If enabled, it will use DRA instead of Device Driver Plugin and create a ResourceClaim and GpuClaimParameters
|
||||
draEnabled: false
|
||||
|
||||
# -- DRA GPU DriverClass
|
||||
draDriverClass: "gpu.nvidia.com"
|
||||
|
||||
# -- Existing DRA GPU ResourceClaim Template
|
||||
draExistingClaimTemplate: ""
|
||||
|
||||
# -- GPU type: 'nvidia' or 'amd'
|
||||
# If 'ollama.gpu.enabled', default value is nvidia
|
||||
# If set to 'amd', this will add 'rocm' suffix to image tag if 'image.tag' is not override
|
||||
# This is due cause AMD and CPU/CUDA are different images
|
||||
type: 'nvidia'
|
||||
|
||||
# -- Specify the number of GPU
|
||||
# If you use MIG section below then this parameter is ignored
|
||||
number: 1
|
||||
|
||||
# -- only for nvidia cards; change to (example) 'nvidia.com/mig-1g.10gb' to use MIG slice
|
||||
nvidiaResource: "nvidia.com/gpu"
|
||||
# nvidiaResource: "nvidia.com/mig-1g.10gb" # example
|
||||
# If you want to use more than one NVIDIA MIG you can use the following syntax (then nvidiaResource is ignored and only the configuration in the following MIG section is used)
|
||||
|
||||
mig:
|
||||
# -- Enable multiple mig devices
|
||||
# If enabled you will have to specify the mig devices
|
||||
# If enabled is set to false this section is ignored
|
||||
enabled: false
|
||||
|
||||
# -- Specify the mig devices and the corresponding number
|
||||
devices: {}
|
||||
# 1g.10gb: 1
|
||||
# 3g.40gb: 1
|
||||
|
||||
models:
|
||||
# -- List of models to pull at container startup
|
||||
# The more you add, the longer the container will take to start if models are not present
|
||||
# pull:
|
||||
# - llama2
|
||||
# - mistral
|
||||
pull: []
|
||||
|
||||
# -- List of models to load in memory at container startup
|
||||
# run:
|
||||
# - llama2
|
||||
# - mistral
|
||||
run: []
|
||||
|
||||
# -- List of models to create at container startup, there are two options
|
||||
# 1. Create a raw model
|
||||
# 2. Load a model from configMaps, configMaps must be created before and are loaded as volume in "/models" directory.
|
||||
# create:
|
||||
# - name: llama3.1-ctx32768
|
||||
# configMapRef: my-configmap
|
||||
# configMapKeyRef: configmap-key
|
||||
# - name: llama3.1-ctx32768
|
||||
# template: |
|
||||
# FROM llama3.1
|
||||
# PARAMETER num_ctx 32768
|
||||
create: []
|
||||
|
||||
# -- Automatically remove models present on the disk but not specified in the values file
|
||||
clean: false
|
||||
|
||||
# -- Add insecure flag for pulling at container startup
|
||||
insecure: false
|
||||
|
||||
# -- Override ollama-data volume mount path, default: "/root/.ollama"
|
||||
mountPath: ""
|
||||
|
||||
# Service account
|
||||
# ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/
|
||||
serviceAccount:
|
||||
# -- Specifies whether a service account should be created
|
||||
create: true
|
||||
|
||||
# -- Automatically mount a ServiceAccount's API credentials?
|
||||
automount: true
|
||||
|
||||
# -- Annotations to add to the service account
|
||||
annotations: {}
|
||||
|
||||
# -- The name of the service account to use.
|
||||
# If not set and create is true, a name is generated using the fullname template
|
||||
name: ""
|
||||
|
||||
# -- Map of annotations to add to the pods
|
||||
podAnnotations: {}
|
||||
|
||||
# -- Map of labels to add to the pods
|
||||
podLabels: {}
|
||||
|
||||
# -- Pod Security Context
|
||||
podSecurityContext: {}
|
||||
# fsGroup: 2000
|
||||
|
||||
# -- Priority Class Name
|
||||
priorityClassName: ""
|
||||
|
||||
# -- Container Security Context
|
||||
securityContext: {}
|
||||
# capabilities:
|
||||
# drop:
|
||||
# - ALL
|
||||
# readOnlyRootFilesystem: true
|
||||
# runAsNonRoot: true
|
||||
# runAsUser: 1000
|
||||
|
||||
# -- Specify runtime class
|
||||
runtimeClassName: ""
|
||||
|
||||
# Configure Service
|
||||
service:
|
||||
|
||||
# -- Service type
|
||||
type: ClusterIP
|
||||
|
||||
# -- Service port
|
||||
port: 11434
|
||||
|
||||
# -- Service node port when service type is 'NodePort'
|
||||
nodePort: 31434
|
||||
|
||||
# -- Load Balancer IP address
|
||||
loadBalancerIP:
|
||||
|
||||
# -- Annotations to add to the service
|
||||
annotations: {}
|
||||
|
||||
# -- Labels to add to the service
|
||||
labels: {}
|
||||
|
||||
# -- IP Families for the service
|
||||
ipFamilies: []
|
||||
# - IPv4
|
||||
# - IPv6
|
||||
|
||||
# -- IP Family Policy for the service
|
||||
ipFamilyPolicy: ""
|
||||
# SingleStack
|
||||
# PreferDualStack
|
||||
# RequireDualStack
|
||||
|
||||
# Configure Deployment
|
||||
deployment:
|
||||
|
||||
# -- Labels to add to the deployment
|
||||
labels: {}
|
||||
|
||||
# Configure the ingress resource that allows you to access the
|
||||
ingress:
|
||||
# -- Enable ingress controller resource
|
||||
enabled: false
|
||||
|
||||
# -- IngressClass that will be used to implement the Ingress (Kubernetes 1.18+)
|
||||
className: ""
|
||||
|
||||
# -- Additional annotations for the Ingress resource.
|
||||
annotations: {}
|
||||
# kubernetes.io/ingress.class: traefik
|
||||
# kubernetes.io/ingress.class: nginx
|
||||
# kubernetes.io/tls-acme: "true"
|
||||
|
||||
# The list of hostnames to be covered with this ingress record.
|
||||
hosts:
|
||||
- host: ollama.local
|
||||
paths:
|
||||
- path: /
|
||||
pathType: Prefix
|
||||
|
||||
# -- The tls configuration for hostnames to be covered with this ingress record.
|
||||
tls: []
|
||||
# - secretName: chart-example-tls
|
||||
# hosts:
|
||||
# - chart-example.local
|
||||
|
||||
# Configure resource requests and limits
|
||||
# ref: http://kubernetes.io/docs/user-guide/compute-resources/
|
||||
resources:
|
||||
# -- Pod requests
|
||||
requests: {}
|
||||
# Memory request
|
||||
# memory: 4096Mi
|
||||
|
||||
# CPU request
|
||||
# cpu: 2000m
|
||||
|
||||
# -- Pod limit
|
||||
limits: {}
|
||||
# Memory limit
|
||||
# memory: 8192Mi
|
||||
|
||||
# CPU limit
|
||||
# cpu: 4000m
|
||||
|
||||
# Configure extra options for liveness probe
|
||||
# ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes
|
||||
livenessProbe:
|
||||
# -- Enable livenessProbe
|
||||
enabled: true
|
||||
|
||||
# -- Request path for livenessProbe
|
||||
path: /
|
||||
|
||||
# -- Initial delay seconds for livenessProbe
|
||||
initialDelaySeconds: 60
|
||||
|
||||
# -- Period seconds for livenessProbe
|
||||
periodSeconds: 10
|
||||
|
||||
# -- Timeout seconds for livenessProbe
|
||||
timeoutSeconds: 5
|
||||
|
||||
# -- Failure threshold for livenessProbe
|
||||
failureThreshold: 6
|
||||
|
||||
# -- Success threshold for livenessProbe
|
||||
successThreshold: 1
|
||||
|
||||
# Configure extra options for readiness probe
|
||||
# ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes
|
||||
readinessProbe:
|
||||
# -- Enable readinessProbe
|
||||
enabled: true
|
||||
|
||||
# -- Request path for readinessProbe
|
||||
path: /
|
||||
|
||||
# -- Initial delay seconds for readinessProbe
|
||||
initialDelaySeconds: 30
|
||||
|
||||
# -- Period seconds for readinessProbe
|
||||
periodSeconds: 5
|
||||
|
||||
# -- Timeout seconds for readinessProbe
|
||||
timeoutSeconds: 3
|
||||
|
||||
# -- Failure threshold for readinessProbe
|
||||
failureThreshold: 6
|
||||
|
||||
# -- Success threshold for readinessProbe
|
||||
successThreshold: 1
|
||||
|
||||
# Configure autoscaling
|
||||
autoscaling:
|
||||
# -- Enable autoscaling
|
||||
enabled: false
|
||||
|
||||
# -- Number of minimum replicas
|
||||
minReplicas: 1
|
||||
|
||||
# -- Number of maximum replicas
|
||||
maxReplicas: 100
|
||||
|
||||
# -- CPU usage to target replica
|
||||
targetCPUUtilizationPercentage: 80
|
||||
|
||||
# -- targetMemoryUtilizationPercentage: 80
|
||||
|
||||
# -- Additional volumes on the output Deployment definition.
|
||||
volumes: []
|
||||
# -- - name: foo
|
||||
# secret:
|
||||
# secretName: mysecret
|
||||
# optional: false
|
||||
|
||||
# -- Additional volumeMounts on the output Deployment definition.
|
||||
volumeMounts: []
|
||||
# -- - name: foo
|
||||
# mountPath: "/etc/foo"
|
||||
# readOnly: true
|
||||
|
||||
# -- Additional arguments on the output Deployment definition.
|
||||
extraArgs: []
|
||||
|
||||
# -- Additional environments variables on the output Deployment definition.
|
||||
# For extra OLLAMA env, please refer to https://github.com/ollama/ollama/blob/main/envconfig/config.go
|
||||
extraEnv: []
|
||||
# - name: OLLAMA_DEBUG
|
||||
# value: "1"
|
||||
|
||||
# -- Additionl environment variables from external sources (like ConfigMap)
|
||||
extraEnvFrom: []
|
||||
# - configMapRef:
|
||||
# name: my-env-configmap
|
||||
|
||||
# Enable persistence using Persistent Volume Claims
|
||||
# ref: https://kubernetes.io/docs/concepts/storage/persistent-volumes/
|
||||
persistentVolume:
|
||||
# -- Enable persistence using PVC
|
||||
enabled: false
|
||||
|
||||
# -- Ollama server data Persistent Volume access modes
|
||||
# Must match those of existing PV or dynamic provisioner
|
||||
# Ref: http://kubernetes.io/docs/user-guide/persistent-volumes/
|
||||
accessModes:
|
||||
- ReadWriteOnce
|
||||
|
||||
# -- Ollama server data Persistent Volume annotations
|
||||
annotations: {}
|
||||
|
||||
# -- If you'd like to bring your own PVC for persisting Ollama state, pass the name of the
|
||||
# created + ready PVC here. If set, this Chart will not create the default PVC.
|
||||
# Requires server.persistentVolume.enabled: true
|
||||
existingClaim: ""
|
||||
|
||||
# -- Ollama server data Persistent Volume size
|
||||
size: 30Gi
|
||||
|
||||
# -- Ollama server data Persistent Volume Storage Class
|
||||
# If defined, storageClassName: <storageClass>
|
||||
# If set to "-", storageClassName: "", which disables dynamic provisioning
|
||||
# If undefined (the default) or set to null, no storageClassName spec is
|
||||
# set, choosing the default provisioner. (gp2 on AWS, standard on
|
||||
# GKE, AWS & OpenStack)
|
||||
storageClass: ""
|
||||
|
||||
# -- Ollama server data Persistent Volume Binding Mode
|
||||
# If defined, volumeMode: <volumeMode>
|
||||
# If empty (the default) or set to null, no volumeBindingMode spec is
|
||||
# set, choosing the default mode.
|
||||
volumeMode: ""
|
||||
|
||||
# -- Subdirectory of Ollama server data Persistent Volume to mount
|
||||
# Useful if the volume's root directory is not empty
|
||||
subPath: ""
|
||||
|
||||
# -- Pre-existing PV to attach this claim to
|
||||
# Useful if a CSI auto-provisions a PV for you and you want to always
|
||||
# reference the PV moving forward
|
||||
volumeName: ""
|
||||
|
||||
# -- Node labels for pod assignment.
|
||||
nodeSelector: {}
|
||||
|
||||
# -- Tolerations for pod assignment
|
||||
tolerations: []
|
||||
|
||||
# -- Affinity for pod assignment
|
||||
affinity: {}
|
||||
|
||||
# -- Lifecycle for pod assignment (override ollama.models startup pull/run)
|
||||
lifecycle: {}
|
||||
|
||||
# How to replace existing pods
|
||||
updateStrategy:
|
||||
# -- Deployment strategy can be "Recreate" or "RollingUpdate". Default is Recreate
|
||||
type: "Recreate"
|
||||
|
||||
# -- Topology Spread Constraints for pod assignment
|
||||
topologySpreadConstraints: {}
|
||||
|
||||
# -- Wait for a grace period
|
||||
terminationGracePeriodSeconds: 120
|
||||
|
||||
# -- Init containers to add to the pod
|
||||
initContainers: []
|
||||
# - name: startup-tool
|
||||
# image: alpine:3
|
||||
# command: [sh, -c]
|
||||
# args:
|
||||
# - echo init
|
||||
|
||||
# -- Use the host’s ipc namespace.
|
||||
hostIPC: false
|
||||
|
||||
# -- Use the host’s pid namespace
|
||||
hostPID: false
|
||||
|
||||
# -- Use the host's network namespace.
|
||||
hostNetwork: false
|
||||
|
||||
# -- Extra K8s manifests to deploy
|
||||
extraObjects: []
|
||||
# - apiVersion: v1
|
||||
# kind: PersistentVolume
|
||||
# metadata:
|
||||
# name: aws-efs
|
||||
# data:
|
||||
# key: "value"
|
||||
# - apiVersion: scheduling.k8s.io/v1
|
||||
# kind: PriorityClass
|
||||
# metadata:
|
||||
# name: high-priority
|
||||
# value: 1000000
|
||||
# globalDefault: false
|
||||
# description: "This priority class should be used for XYZ service pods only."
|
||||
|
||||
# Test connection pods
|
||||
tests:
|
||||
enabled: true
|
||||
# -- Labels to add to the tests
|
||||
labels: {}
|
||||
# -- Annotations to add to the tests
|
||||
annotations: {}
|
||||
25
charts/open-webui/.helmignore
Normal file
25
charts/open-webui/.helmignore
Normal file
@ -0,0 +1,25 @@
|
||||
# Patterns to ignore when building packages.
|
||||
# This supports shell glob matching, relative path matching, and
|
||||
# negation (prefixed with !). Only one pattern per line.
|
||||
.DS_Store
|
||||
# Common VCS dirs
|
||||
.git/
|
||||
.gitignore
|
||||
.bzr/
|
||||
.bzrignore
|
||||
.hg/
|
||||
.hgignore
|
||||
.svn/
|
||||
# Common backup files
|
||||
*.swp
|
||||
*.bak
|
||||
*.tmp
|
||||
*.orig
|
||||
*~
|
||||
# Various IDEs
|
||||
.project
|
||||
.idea/
|
||||
.drone.yml
|
||||
*.tmproj
|
||||
.vscode/
|
||||
values-minikube.yaml
|
||||
12
charts/open-webui/Chart.lock
Normal file
12
charts/open-webui/Chart.lock
Normal file
@ -0,0 +1,12 @@
|
||||
dependencies:
|
||||
- name: ollama
|
||||
repository: https://otwld.github.io/ollama-helm/
|
||||
version: 1.33.0
|
||||
- name: pipelines
|
||||
repository: https://helm.openwebui.com
|
||||
version: 0.10.0
|
||||
- name: tika
|
||||
repository: https://apache.jfrog.io/artifactory/tika
|
||||
version: 3.2.2
|
||||
digest: sha256:c632e1dce7c85821cc944a97dd66380b4f1bf2718b5b50b49a19fdf2bfcb666d
|
||||
generated: "2025-11-06T15:43:32.206196-07:00"
|
||||
38
charts/open-webui/Chart.yaml
Normal file
38
charts/open-webui/Chart.yaml
Normal file
@ -0,0 +1,38 @@
|
||||
annotations:
|
||||
licenses: MIT
|
||||
apiVersion: v2
|
||||
appVersion: 0.6.43
|
||||
dependencies:
|
||||
- condition: ollama.enabled
|
||||
import-values:
|
||||
- child: service
|
||||
parent: ollama.service
|
||||
name: ollama
|
||||
repository: https://otwld.github.io/ollama-helm/
|
||||
version: '>=0.24.0'
|
||||
- condition: pipelines.enabled
|
||||
import-values:
|
||||
- child: service
|
||||
parent: pipelines.service
|
||||
name: pipelines
|
||||
repository: https://helm.openwebui.com
|
||||
version: '>=0.0.1'
|
||||
- condition: tika.enabled
|
||||
name: tika
|
||||
repository: https://apache.jfrog.io/artifactory/tika
|
||||
version: '>=2.9.0'
|
||||
description: "Open WebUI: A User-Friendly Web Interface for Chat Interactions \U0001F44B"
|
||||
home: https://www.openwebui.com/
|
||||
icon: https://raw.githubusercontent.com/open-webui/open-webui/main/static/favicon.png
|
||||
keywords:
|
||||
- llm
|
||||
- chat
|
||||
- web-ui
|
||||
- open-webui
|
||||
name: open-webui
|
||||
sources:
|
||||
- https://github.com/open-webui/helm-charts
|
||||
- https://github.com/open-webui/open-webui/pkgs/container/open-webui
|
||||
- https://github.com/otwld/ollama-helm/
|
||||
- https://hub.docker.com/r/ollama/ollama
|
||||
version: 8.22.0
|
||||
328
charts/open-webui/README.md
Normal file
328
charts/open-webui/README.md
Normal file
@ -0,0 +1,328 @@
|
||||
# open-webui
|
||||
|
||||
 
|
||||
|
||||
Open WebUI: A User-Friendly Web Interface for Chat Interactions 👋
|
||||
|
||||
**Homepage:** <https://www.openwebui.com/>
|
||||
|
||||
## Source Code
|
||||
|
||||
* <https://github.com/open-webui/helm-charts>
|
||||
* <https://github.com/open-webui/open-webui/pkgs/container/open-webui>
|
||||
* <https://github.com/otwld/ollama-helm/>
|
||||
* <https://hub.docker.com/r/ollama/ollama>
|
||||
|
||||
## Installing
|
||||
|
||||
Before you can install, you need to add the `open-webui` repo to [Helm](https://helm.sh)
|
||||
|
||||
```shell
|
||||
helm repo add open-webui https://helm.openwebui.com/
|
||||
helm repo update
|
||||
```
|
||||
|
||||
Now you can install the chart:
|
||||
|
||||
```shell
|
||||
helm upgrade --install open-webui open-webui/open-webui
|
||||
```
|
||||
|
||||
## Requirements
|
||||
|
||||
| Repository | Name | Version |
|
||||
|------------|------|---------|
|
||||
| https://apache.jfrog.io/artifactory/tika | tika | >=2.9.0 |
|
||||
| https://helm.openwebui.com | pipelines | >=0.0.1 |
|
||||
| https://otwld.github.io/ollama-helm/ | ollama | >=0.24.0 |
|
||||
|
||||
## Values
|
||||
|
||||
### OpenAI API configuration
|
||||
|
||||
| Key | Type | Default | Description |
|
||||
|-----|------|---------|-------------|
|
||||
| enableOpenaiApi | bool | `true` | Enables the use of OpenAI APIs |
|
||||
| openaiApiKey | string | `"0p3n-w3bu!"` | OpenAI API key to use. Default API key value for Pipelines if `openaiBaseApiUrl` is blank. Should be updated in a production deployment, or be changed to the required API key if not using Pipelines |
|
||||
| openaiApiKeys | list | `[]` | List of OpenAI API keys for each OpenAI base API URLs to use. The number of keys must match the number of URLs in `openaiBaseApiUrls` and respect the same order. If `pipelines.enabled` is true, it needs one more key (so the list length should be openaiBaseApiUrls length + 1) and the first key will be used for Pipelines. |
|
||||
| openaiBaseApiUrl | string | `"https://api.openai.com/v1"` | OpenAI base API URL to use. Defaults to the Pipelines service endpoint when Pipelines are enabled, and "https://api.openai.com/v1" if Pipelines are not enabled and this value is blank |
|
||||
| openaiBaseApiUrls | list | `[]` | OpenAI base API URLs to use. Overwrites the value in openaiBaseApiUrl if set |
|
||||
|
||||
### Image configuration
|
||||
|
||||
| Key | Type | Default | Description |
|
||||
|-----|------|---------|-------------|
|
||||
| image.pullPolicy | string | `"IfNotPresent"` | Open WebUI image pull policy |
|
||||
| image.repository | string | `"ghcr.io/open-webui/open-webui"` | Open WebUI image repository |
|
||||
| image.tag | string | `""` | Open WebUI image tag (Open WebUI image tags can be found here: https://github.com/open-webui/open-webui) |
|
||||
| image.useSlim | bool | `false` | Use a slim version of the Open WebUI image |
|
||||
| imagePullSecrets | list | `[]` | Configure imagePullSecrets to use private registry ref: <https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry> |
|
||||
|
||||
### Ingress configuration
|
||||
|
||||
| Key | Type | Default | Description |
|
||||
|-----|------|---------|-------------|
|
||||
| ingress.additionalHosts | list | `[]` | Additional hosts for the Ingress record |
|
||||
| ingress.annotations | object | `{}` | Use appropriate annotations for your Ingress controller, e.g., for NGINX: |
|
||||
| ingress.class | string | `""` | Ingress class to use, e.g., for GKE Ingress use "gce", for NGINX Ingress use "nginx". If using an Ingress class other than the default, ensure your cluster has the corresponding Ingress controller installed and configured. |
|
||||
| ingress.enabled | bool | `false` | Enable Ingress controller for Open WebUI |
|
||||
| ingress.existingSecret | string | `""` | TLS secret name for the Ingress record |
|
||||
| ingress.extraLabels | object | `{}` | Additional custom labels to add to the Ingress metadata |
|
||||
| ingress.host | string | `"chat.example.com"` | Host for the Ingress record |
|
||||
| ingress.tls | bool | `false` | TLS configuration for the Ingress resource |
|
||||
| managedCertificate.domains | list | `["chat.example.com"]` | Domains to include in the Managed Certificate |
|
||||
| managedCertificate.enabled | bool | `false` | Enable GKE Managed Certificate for Ingress TLS |
|
||||
| managedCertificate.name | string | `"mydomain-chat-cert"` | Name of the Managed Certificate resource to create |
|
||||
|
||||
### Probes configuration
|
||||
|
||||
| Key | Type | Default | Description |
|
||||
|-----|------|---------|-------------|
|
||||
| livenessProbe | object | `{}` | Probe for liveness of the Open WebUI container ref: <https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes> |
|
||||
| readinessProbe | object | `{}` | Probe for readiness of the Open WebUI container ref: <https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes> |
|
||||
| startupProbe | object | `{}` | Probe for startup of the Open WebUI container ref: <https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes> |
|
||||
|
||||
### Logging configuration
|
||||
|
||||
| Key | Type | Default | Description |
|
||||
|-----|------|---------|-------------|
|
||||
| logging.components.audio | string | `""` | Set the log level for the Audio processing component |
|
||||
| logging.components.comfyui | string | `""` | Set the log level for the ComfyUI Integration component |
|
||||
| logging.components.config | string | `""` | Set the log level for the Configuration Management component |
|
||||
| logging.components.db | string | `""` | Set the log level for the Database Operations (Peewee) component |
|
||||
| logging.components.images | string | `""` | Set the log level for the Image Generation component |
|
||||
| logging.components.main | string | `""` | Set the log level for the Main Application Execution component |
|
||||
| logging.components.models | string | `""` | Set the log level for the Model Management component |
|
||||
| logging.components.ollama | string | `""` | Set the log level for the Ollama Backend Integration component |
|
||||
| logging.components.openai | string | `""` | Set the log level for the OpenAI API Integration component |
|
||||
| logging.components.rag | string | `""` | Set the log level for the Retrieval-Augmented Generation (RAG) component |
|
||||
| logging.components.webhook | string | `""` | Set the log level for the Authentication Webhook component |
|
||||
| logging.level | string | `""` | Set the global log level ["notset", "debug", "info" (default), "warning", "error", "critical"] |
|
||||
|
||||
### External Tools configuration
|
||||
|
||||
| Key | Type | Default | Description |
|
||||
|-----|------|---------|-------------|
|
||||
| ollama.enabled | bool | `true` | Automatically install Ollama Helm chart from https://otwld.github.io/ollama-helm/. Use [Helm Values](https://github.com/otwld/ollama-helm/#helm-values) to configure |
|
||||
| ollama.fullnameOverride | string | `"open-webui-ollama"` | If enabling embedded Ollama, update fullnameOverride to your desired Ollama name value, or else it will use the default ollama.name value from the Ollama chart |
|
||||
| ollamaUrls | list | `[]` | A list of Ollama API endpoints. These can be added in lieu of automatically installing the Ollama Helm chart, or in addition to it. |
|
||||
| ollamaUrlsFromExtraEnv | bool | `false` | Disables taking Ollama Urls from `ollamaUrls` list |
|
||||
| pipelines.enabled | bool | `true` | Automatically install Pipelines chart to extend Open WebUI functionality using Pipelines: https://github.com/open-webui/pipelines |
|
||||
| pipelines.extraEnvVars | list | `[]` | This section can be used to pass required environment variables to your pipelines (e.g. Langfuse hostname) |
|
||||
| tika.enabled | bool | `false` | Automatically install Apache Tika to extend Open WebUI |
|
||||
|
||||
### Persistence configuration
|
||||
|
||||
| Key | Type | Default | Description |
|
||||
|-----|------|---------|-------------|
|
||||
| persistence.accessModes | list | `["ReadWriteOnce"]` | If using multiple replicas, you must update accessModes to ReadWriteMany |
|
||||
| persistence.annotations | object | `{}` | Additional annotations to add to the PVC |
|
||||
| persistence.enabled | bool | `true` | Enable persistence using PVC for Open WebUI data |
|
||||
| persistence.existingClaim | string | `""` | Use existingClaim if you want to re-use an existing Open WebUI PVC instead of creating a new one |
|
||||
| persistence.provider | string | `"local"` | Sets the storage provider, availables values are `local`, `s3`, `gcs` or `azure` |
|
||||
| persistence.selector | object | `{}` | Selector to match to get the volume bound to the claim |
|
||||
| persistence.size | string | `"2Gi"` | Size of the Open WebUI PVC |
|
||||
| persistence.storageClass | string | `""` | Storage class of the Open WebUI PVC |
|
||||
| persistence.subPath | string | `""` | Subdirectory of Open WebUI PVC to mount. Useful if root directory is not empty. |
|
||||
|
||||
### Azure Storage configuration
|
||||
|
||||
| Key | Type | Default | Description |
|
||||
|-----|------|---------|-------------|
|
||||
| persistence.azure.container | string | `""` | Sets the container name for Azure Storage |
|
||||
| persistence.azure.endpointUrl | string | `""` | Sets the endpoint URL for Azure Storage |
|
||||
| persistence.azure.key | string | `""` | Set the access key for Azure Storage (ignored if keyExistingSecret is set). Optional - if not provided, credentials will be taken from the environment. User credentials if run locally and Managed Identity if run in Azure services |
|
||||
| persistence.azure.keyExistingSecret | string | `""` | Set the access key for Azure Storage from existing secret |
|
||||
| persistence.azure.keyExistingSecretKey | string | `""` | Set the access key for Azure Storage from existing secret key |
|
||||
|
||||
### Google Cloud Storage configuration
|
||||
|
||||
| Key | Type | Default | Description |
|
||||
|-----|------|---------|-------------|
|
||||
| persistence.gcs.appCredentialsJson | string | `""` | Contents of Google Application Credentials JSON file (ignored if appCredentialsJsonExistingSecret is set). Optional - if not provided, credentials will be taken from the environment. User credentials if run locally and Google Metadata server if run on a Google Compute Engine. File can be generated for a service account following this guide: https://developers.google.com/workspace/guides/create-credentials#service-account |
|
||||
| persistence.gcs.appCredentialsJsonExistingSecret | string | `""` | Set the Google Application Credentials JSON file for Google Cloud Storage from existing secret |
|
||||
| persistence.gcs.appCredentialsJsonExistingSecretKey | string | `""` | Set the Google Application Credentials JSON file for Google Cloud Storage from existing secret key |
|
||||
| persistence.gcs.bucket | string | `""` | Sets the bucket name for Google Cloud Storage. Bucket must already exist |
|
||||
|
||||
### Amazon S3 Storage configuration
|
||||
|
||||
| Key | Type | Default | Description |
|
||||
|-----|------|---------|-------------|
|
||||
| persistence.s3.accessKey | string | `""` | Sets the access key ID for S3 storage |
|
||||
| persistence.s3.accessKeyExistingAccessKey | string | `""` | Set the secret access key for S3 storage from existing k8s secret key |
|
||||
| persistence.s3.accessKeyExistingSecret | string | `""` | Set the secret access key for S3 storage from existing k8s secret |
|
||||
| persistence.s3.bucket | string | `""` | Sets the bucket name for S3 storage |
|
||||
| persistence.s3.endpointUrl | string | `""` | Sets the endpoint url for S3 storage |
|
||||
| persistence.s3.keyPrefix | string | `""` | Sets the key prefix for a S3 object |
|
||||
| persistence.s3.region | string | `""` | Sets the region name for S3 storage |
|
||||
| persistence.s3.secretKey | string | `""` | Sets the secret access key for S3 storage (ignored if secretKeyExistingSecret is set) |
|
||||
| persistence.s3.secretKeyExistingSecret | string | `""` | Set the secret key for S3 storage from existing k8s secret |
|
||||
| persistence.s3.secretKeyExistingSecretKey | string | `""` | Set the secret key for S3 storage from existing k8s secret key |
|
||||
|
||||
### Service configuration
|
||||
|
||||
| Key | Type | Default | Description |
|
||||
|-----|------|---------|-------------|
|
||||
| service.annotations | object | `{}` | Additional annotations to add to the Service |
|
||||
| service.containerPort | int | `8080` | Target port for the Open WebUI container |
|
||||
| service.labels | object | `{}` | Additional custom labels to add to the Service metadata |
|
||||
| service.loadBalancerClass | string | `""` | Load balancer class to use if service type is LoadBalancer (e.g., for GKE use "gce") |
|
||||
| service.nodePort | string | `""` | Node port to use if service type is NodePort |
|
||||
| service.port | int | `80` | Port to expose Open WebUI service on |
|
||||
| service.type | string | `"ClusterIP"` | Service type to expose Open WebUI pods to cluster. Options are ClusterIP, NodePort, LoadBalancer, or ExternalName |
|
||||
|
||||
### Service Account configuration
|
||||
|
||||
| Key | Type | Default | Description |
|
||||
|-----|------|---------|-------------|
|
||||
| serviceAccount.annotations | object | `{}` | Additional annotations to add to the ServiceAccount |
|
||||
| serviceAccount.automountServiceAccountToken | bool | `false` | Automount service account token for the Open WebUI pods |
|
||||
| serviceAccount.create | bool | `true` | If create is set to false, set `name` to existing service account name |
|
||||
| serviceAccount.enable | bool | `true` | Enable service account creation |
|
||||
| serviceAccount.name | string | `"existing-sa"` | Service account name to use. If `ServiceAccount.create` is false, this assumes an existing service account exists with the set name. If not set and `serviceAccount.create` is true, a name is generated using the fullname template. |
|
||||
|
||||
### SSO Configuration
|
||||
|
||||
| Key | Type | Default | Description |
|
||||
|-----|------|---------|-------------|
|
||||
| sso.enableGroupManagement | bool | `false` | Enable OAuth group management through access token groups claim |
|
||||
| sso.enableRoleManagement | bool | `false` | Enable OAuth role management through access token roles claim |
|
||||
| sso.enableSignup | bool | `false` | Enable account creation when logging in with OAuth (distinct from regular signup) |
|
||||
| sso.enabled | bool | `false` | **Enable SSO authentication globally** must enable to use SSO authentication |
|
||||
| sso.groupManagement.groupsClaim | string | `"groups"` | The claim that contains the groups (can be nested, e.g., user.memberOf) |
|
||||
| sso.mergeAccountsByEmail | bool | `false` | Allow logging into accounts that match email from OAuth provider (considered insecure) |
|
||||
|
||||
### GitHub OAuth configuration
|
||||
|
||||
| Key | Type | Default | Description |
|
||||
|-----|------|---------|-------------|
|
||||
| sso.github.clientExistingSecret | string | `""` | GitHub OAuth client secret from existing secret |
|
||||
| sso.github.clientExistingSecretKey | string | `""` | GitHub OAuth client secret key from existing secret |
|
||||
| sso.github.clientId | string | `""` | GitHub OAuth client ID |
|
||||
| sso.github.clientSecret | string | `""` | GitHub OAuth client secret (ignored if clientExistingSecret is set) |
|
||||
| sso.github.enabled | bool | `false` | Enable GitHub OAuth |
|
||||
|
||||
### Google OAuth configuration
|
||||
|
||||
| Key | Type | Default | Description |
|
||||
|-----|------|---------|-------------|
|
||||
| sso.google.clientExistingSecret | string | `""` | Google OAuth client secret from existing secret |
|
||||
| sso.google.clientExistingSecretKey | string | `""` | Google OAuth client secret key from existing secret |
|
||||
| sso.google.clientId | string | `""` | Google OAuth client ID |
|
||||
| sso.google.clientSecret | string | `""` | Google OAuth client secret (ignored if clientExistingSecret is set) |
|
||||
| sso.google.enabled | bool | `false` | Enable Google OAuth |
|
||||
|
||||
### Microsoft OAuth configuration
|
||||
|
||||
| Key | Type | Default | Description |
|
||||
|-----|------|---------|-------------|
|
||||
| sso.microsoft.clientExistingSecret | string | `""` | Microsoft OAuth client secret from existing secret |
|
||||
| sso.microsoft.clientExistingSecretKey | string | `""` | Microsoft OAuth client secret key from existing secret |
|
||||
| sso.microsoft.clientId | string | `""` | Microsoft OAuth client ID |
|
||||
| sso.microsoft.clientSecret | string | `""` | Microsoft OAuth client secret (ignored if clientExistingSecret is set) |
|
||||
| sso.microsoft.enabled | bool | `false` | Enable Microsoft OAuth |
|
||||
| sso.microsoft.tenantId | string | `""` | Microsoft tenant ID - use 9188040d-6c67-4c5b-b112-36a304b66dad for personal accounts |
|
||||
|
||||
### OIDC configuration
|
||||
|
||||
| Key | Type | Default | Description |
|
||||
|-----|------|---------|-------------|
|
||||
| sso.oidc.clientExistingSecret | string | `""` | OICD client secret from existing secret |
|
||||
| sso.oidc.clientExistingSecretKey | string | `""` | OIDC client secret key from existing secret |
|
||||
| sso.oidc.clientId | string | `""` | OIDC client ID |
|
||||
| sso.oidc.clientSecret | string | `""` | OIDC client secret (ignored if clientExistingSecret is set) |
|
||||
| sso.oidc.enabled | bool | `false` | Enable OIDC authentication |
|
||||
| sso.oidc.providerName | string | `"SSO"` | Name of the provider to show on the UI |
|
||||
| sso.oidc.providerUrl | string | `""` | OIDC provider well known URL |
|
||||
| sso.oidc.scopes | string | `"openid email profile"` | Scopes to request (space-separated). |
|
||||
|
||||
### Role management configuration
|
||||
|
||||
| Key | Type | Default | Description |
|
||||
|-----|------|---------|-------------|
|
||||
| sso.roleManagement.adminRoles | string | `""` | Comma-separated list of roles allowed to log in as admin (receive open webui role admin) |
|
||||
| sso.roleManagement.allowedRoles | string | `""` | Comma-separated list of roles allowed to log in (receive open webui role user) |
|
||||
| sso.roleManagement.rolesClaim | string | `"roles"` | The claim that contains the roles (can be nested, e.g., user.roles) |
|
||||
|
||||
### SSO trusted header authentication
|
||||
|
||||
| Key | Type | Default | Description |
|
||||
|-----|------|---------|-------------|
|
||||
| sso.trustedHeader.emailHeader | string | `""` | Header containing the user's email address |
|
||||
| sso.trustedHeader.enabled | bool | `false` | Enable trusted header authentication |
|
||||
| sso.trustedHeader.nameHeader | string | `""` | Header containing the user's name (optional, used for new user creation) |
|
||||
|
||||
### Websocket configuration
|
||||
|
||||
| Key | Type | Default | Description |
|
||||
|-----|------|---------|-------------|
|
||||
| websocket.enabled | bool | `false` | Enables websocket support in Open WebUI with env `ENABLE_WEBSOCKET_SUPPORT` |
|
||||
| websocket.manager | string | `"redis"` | Specifies the websocket manager to use with env `WEBSOCKET_MANAGER`: redis (default) |
|
||||
| websocket.nodeSelector | object | `{}` | Node selector for websocket pods |
|
||||
| websocket.redis.affinity | object | `{}` | Redis affinity for pod assignment |
|
||||
| websocket.redis.annotations | object | `{}` | Redis annotations |
|
||||
| websocket.redis.args | list | `[]` | Redis arguments (overrides default) |
|
||||
| websocket.redis.command | list | `[]` | Redis command (overrides default) |
|
||||
| websocket.redis.containerSecurityContext | object | `{}` | Redis container security context (certain specs are not allowed on a pod level), if readOnlyRootFilesystem is true, an emtpyDir will be mounted on the redis container |
|
||||
| websocket.redis.enabled | bool | `true` | Enable redis installation |
|
||||
| websocket.redis.image.pullPolicy | string | `"IfNotPresent"` | Redis image pull policy |
|
||||
| websocket.redis.image.repository | string | `"redis"` | Redis image repository |
|
||||
| websocket.redis.image.tag | string | `"7.4.2-alpine3.21"` | Redis image tag |
|
||||
| websocket.redis.labels | object | `{}` | Redis labels |
|
||||
| websocket.redis.name | string | `"open-webui-redis"` | Redis name |
|
||||
| websocket.redis.podSecurityContext | object | `{}` | Redis pod security context |
|
||||
| websocket.redis.pods.annotations | object | `{}` | Redis pod annotations |
|
||||
| websocket.redis.pods.labels | object | `{}` | Redis pod labels |
|
||||
| websocket.redis.resources | object | `{}` | Redis resources |
|
||||
| websocket.redis.service.annotations | object | `{}` | Redis service annotations |
|
||||
| websocket.redis.service.containerPort | int | `6379` | Redis container/target port |
|
||||
| websocket.redis.service.labels | object | `{}` | Redis service labels |
|
||||
| websocket.redis.service.nodePort | string | `""` | Redis service node port. Valid only when type is `NodePort` |
|
||||
| websocket.redis.service.port | int | `6379` | Redis service port |
|
||||
| websocket.redis.service.portName | string | `"http"` | Redis service port name. Istio needs this to be something like `tcp-redis` |
|
||||
| websocket.redis.service.type | string | `"ClusterIP"` | Redis service type |
|
||||
| websocket.redis.tolerations | list | `[]` | Redis tolerations for pod assignment |
|
||||
| websocket.url | string | `"redis://open-webui-redis:6379/0"` | Specifies the URL of the Redis instance for websocket communication. Template with `redis://[:<password>@]<hostname>:<port>/<db>` |
|
||||
|
||||
### Other Values
|
||||
|
||||
| Key | Type | Default | Description |
|
||||
|-----|------|---------|-------------|
|
||||
| affinity | object | `{}` | Affinity for pod assignment |
|
||||
| annotations | object | `{}` | Additional annotations to add to the Open WebUI deployment/statefulset metadata |
|
||||
| args | list | `[]` | Open WebUI container arguments (overrides default) |
|
||||
| clusterDomain | string | `"cluster.local"` | Value of cluster domain |
|
||||
| command | list | `[]` | Open WebUI container command (overrides default entrypoint) |
|
||||
| commonEnvVars | list | `[]` | Env vars added to the Open WebUI deployment, common across environments. Most up-to-date environment variables can be found here: https://docs.openwebui.com/getting-started/env-configuration/ (caution: environment variables defined in both `extraEnvVars` and `commonEnvVars` will result in a conflict. Avoid duplicates) |
|
||||
| containerSecurityContext | object | `{}` | Configure container security context ref: <https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-containe> |
|
||||
| copyAppData.args | list | `[]` | Open WebUI copy-app-data init container arguments (overrides default) |
|
||||
| copyAppData.command | list | `[]` | Open WebUI copy-app-data init container command (overrides default) |
|
||||
| copyAppData.resources | object | `{}` | Resource requests and limits for the Open WebUI copy-app-data init container |
|
||||
| databaseUrl | string | `""` | Configure database URL, needed to work with Postgres (example: `postgresql://<user>:<password>@<service>:<port>/<database>`), leave empty to use the default sqlite database. Alternatively, use extraEnvVars to construct the database URL by setting the `DATABASE_TYPE`, `DATABASE_USER`, `DATABASE_PASSWORD`, `DATABASE_HOST`, and `DATABASE_NAME` environment variables. |
|
||||
| extraEnvFrom | list | `[]` | Env vars added from configmap or secret to the Open WebUI deployment. Most up-to-date environment variables can be found here: https://docs.openwebui.com/getting-started/env-configuration/ (caution: `extraEnvVars` will take precedence over the value from `extraEnvFrom`) |
|
||||
| extraEnvVars | list | `[]` | Env vars added to the Open WebUI deployment. Most up-to-date environment variables can be found here: https://docs.openwebui.com/getting-started/env-configuration. Variables can be defined as list or map style. |
|
||||
| extraInitContainers | list | `[]` | Additional init containers to add to the deployment/statefulset ref: <https://kubernetes.io/docs/concepts/workloads/pods/init-containers/> |
|
||||
| extraLabels | object | `{}` | Additional custom labels to add to the Open WebUI deployment/statefulset metadata |
|
||||
| extraResources | list | `[]` | Extra resources to deploy with Open WebUI |
|
||||
| hostAliases | list | `[]` | HostAliases to be added to hosts-file of each container |
|
||||
| nameOverride | string | `""` | Provide a name in place of the default application name |
|
||||
| namespaceOverride | string | `""` | Provide a namespace in place of the default release namespace |
|
||||
| nodeSelector | object | `{}` | Node labels for pod assignment. |
|
||||
| podAnnotations | object | `{}` | Additional annotations to add to the Open WebUI pods |
|
||||
| podLabels | object | `{}` | Additional custom labels to add to the Open WebUI pods |
|
||||
| podSecurityContext | object | `{}` | Configure pod security context ref: <https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-container> |
|
||||
| priorityClassName | string | `""` | Priority class name for the Open WebUI pods |
|
||||
| replicaCount | int | `1` | Number of Open WebUI replicas |
|
||||
| resources | object | `{}` | Resource requests and limits for the Open WebUI container |
|
||||
| revisionHistoryLimit | int | `10` | Revision history limit for the workload manager (deployment). |
|
||||
| runtimeClassName | string | `""` | Configure runtime class ref: <https://kubernetes.io/docs/concepts/containers/runtime-class/> |
|
||||
| strategy | object | `{}` | Strategy for updating the workload manager: deployment or statefulset |
|
||||
| tolerations | list | `[]` | Tolerations for pod assignment |
|
||||
| topologySpreadConstraints | list | `[]` | Topology Spread Constraints for pod assignment |
|
||||
| volumeMounts | object | `{"container":[],"initContainer":[]}` | Configure container volume mounts ref: <https://kubernetes.io/docs/tasks/configure-pod-container/configure-volume-storage/> |
|
||||
| volumes | list | `[]` | Configure pod volumes ref: <https://kubernetes.io/docs/tasks/configure-pod-container/configure-volume-storage/> |
|
||||
| workload.kind | string | `""` | Workload kind to use. Options are "Deployment", "StatefulSet". If not set, the chart will determine the kind based on persistence settings. NOTE: When using Deployment with local persistence and replicaCount > 1, ensure persistence.accessModes includes ReadWriteMany (RWX). |
|
||||
|
||||
----------------------------------------------
|
||||
|
||||
Autogenerated from chart metadata using [helm-docs](https://github.com/norwoodj/helm-docs/).
|
||||
36
charts/open-webui/README.md.gotmpl
Normal file
36
charts/open-webui/README.md.gotmpl
Normal file
@ -0,0 +1,36 @@
|
||||
{{ template "chart.header" . }}
|
||||
|
||||
{{ template "chart.deprecationWarning" . }}
|
||||
|
||||
{{ template "chart.badgesSection" . }}
|
||||
|
||||
{{ template "chart.description" . }}
|
||||
|
||||
{{ template "chart.homepageLine" . }}
|
||||
|
||||
{{ template "chart.maintainersSection" . }}
|
||||
|
||||
{{ template "chart.sourcesSection" . }}
|
||||
|
||||
## Installing
|
||||
|
||||
Before you can install, you need to add the `open-webui` repo to [Helm](https://helm.sh)
|
||||
|
||||
```shell
|
||||
helm repo add open-webui https://helm.openwebui.com/
|
||||
helm repo update
|
||||
```
|
||||
|
||||
Now you can install the chart:
|
||||
|
||||
```shell
|
||||
helm upgrade --install open-webui open-webui/open-webui
|
||||
```
|
||||
|
||||
{{ template "chart.requirementsSection" . }}
|
||||
|
||||
{{ template "chart.valuesSection" . }}
|
||||
|
||||
----------------------------------------------
|
||||
|
||||
Autogenerated from chart metadata using [helm-docs](https://github.com/norwoodj/helm-docs/).
|
||||
30
charts/open-webui/charts/ollama/.helmignore
Normal file
30
charts/open-webui/charts/ollama/.helmignore
Normal file
@ -0,0 +1,30 @@
|
||||
# Patterns to ignore when building packages.
|
||||
# This supports shell glob matching, relative path matching, and
|
||||
# negation (prefixed with !). Only one pattern per line.
|
||||
.DS_Store
|
||||
# Common VCS dirs
|
||||
.git/
|
||||
.gitignore
|
||||
.bzr/
|
||||
.bzrignore
|
||||
.hg/
|
||||
.hgignore
|
||||
.svn/
|
||||
# Common backup files
|
||||
*.swp
|
||||
*.bak
|
||||
*.tmp
|
||||
*.orig
|
||||
*~
|
||||
# Various IDEs
|
||||
.project
|
||||
.idea/
|
||||
.drone.yml
|
||||
*.tmproj
|
||||
.vscode/
|
||||
|
||||
#others
|
||||
.github
|
||||
kind-config.yml
|
||||
ci/
|
||||
|
||||
30
charts/open-webui/charts/ollama/.ollama-helm/.helmignore
Normal file
30
charts/open-webui/charts/ollama/.ollama-helm/.helmignore
Normal file
@ -0,0 +1,30 @@
|
||||
# Patterns to ignore when building packages.
|
||||
# This supports shell glob matching, relative path matching, and
|
||||
# negation (prefixed with !). Only one pattern per line.
|
||||
.DS_Store
|
||||
# Common VCS dirs
|
||||
.git/
|
||||
.gitignore
|
||||
.bzr/
|
||||
.bzrignore
|
||||
.hg/
|
||||
.hgignore
|
||||
.svn/
|
||||
# Common backup files
|
||||
*.swp
|
||||
*.bak
|
||||
*.tmp
|
||||
*.orig
|
||||
*~
|
||||
# Various IDEs
|
||||
.project
|
||||
.idea/
|
||||
.drone.yml
|
||||
*.tmproj
|
||||
.vscode/
|
||||
|
||||
#others
|
||||
.github
|
||||
kind-config.yml
|
||||
ci/
|
||||
|
||||
33
charts/open-webui/charts/ollama/.ollama-helm/Chart.yaml
Normal file
33
charts/open-webui/charts/ollama/.ollama-helm/Chart.yaml
Normal file
@ -0,0 +1,33 @@
|
||||
apiVersion: v2
|
||||
name: ollama
|
||||
description: Get up and running with large language models locally.
|
||||
|
||||
type: application
|
||||
|
||||
version: 1.33.0
|
||||
|
||||
appVersion: "0.12.9"
|
||||
|
||||
annotations:
|
||||
artifacthub.io/category: ai-machine-learning
|
||||
artifacthub.io/changes: |
|
||||
- kind: changed
|
||||
description: upgrade app version to 0.12.9
|
||||
links:
|
||||
- name: Ollama release v0.12.9
|
||||
url: https://github.com/ollama/ollama/releases/tag/v0.12.9
|
||||
|
||||
kubeVersion: "^1.16.0-0"
|
||||
home: https://ollama.ai/
|
||||
icon: https://ollama.ai/public/ollama.png
|
||||
keywords:
|
||||
- ai
|
||||
- llm
|
||||
- llama
|
||||
- mistral
|
||||
sources:
|
||||
- https://github.com/ollama/ollama
|
||||
- https://github.com/otwld/ollama-helm
|
||||
maintainers:
|
||||
- name: OTWLD
|
||||
email: contact@otwld.com
|
||||
21
charts/open-webui/charts/ollama/.ollama-helm/LICENSE
Normal file
21
charts/open-webui/charts/ollama/.ollama-helm/LICENSE
Normal file
@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2024 OTWLD
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
331
charts/open-webui/charts/ollama/.ollama-helm/README.md
Normal file
331
charts/open-webui/charts/ollama/.ollama-helm/README.md
Normal file
@ -0,0 +1,331 @@
|
||||

|
||||
|
||||

|
||||
[](https://artifacthub.io/packages/helm/ollama-helm/ollama)
|
||||
[](https://github.com/otwld/ollama-helm/actions/workflows/ci.yaml)
|
||||
[](https://discord.gg/U24mpqTynB)
|
||||
|
||||
[Ollama](https://ollama.ai/), get up and running with large language models, locally.
|
||||
|
||||
This Community Chart is for deploying [Ollama](https://github.com/ollama/ollama).
|
||||
|
||||
## Requirements
|
||||
|
||||
- Kubernetes: `>= 1.16.0-0` for **CPU only**
|
||||
|
||||
- Kubernetes: `>= 1.26.0-0` for **GPU** stable support (NVIDIA and AMD)
|
||||
|
||||
*Not all GPUs are currently supported with ollama (especially with AMD)*
|
||||
|
||||
## Deploying Ollama chart
|
||||
|
||||
To install the `ollama` chart in the `ollama` namespace:
|
||||
|
||||
> [!IMPORTANT]
|
||||
> We are migrating the registry from https://otwld.github.io/ollama-helm/ url to OTWLD Helm central
|
||||
> registry https://helm.otwld.com/
|
||||
> Please update your Helm registry accordingly.
|
||||
|
||||
```console
|
||||
helm repo add otwld https://helm.otwld.com/
|
||||
helm repo update
|
||||
helm install ollama otwld/ollama --namespace ollama --create-namespace
|
||||
```
|
||||
|
||||
## Upgrading Ollama chart
|
||||
|
||||
First please read the [release notes](https://github.com/ollama/ollama/releases) of Ollama to make sure there are no
|
||||
backwards incompatible changes.
|
||||
|
||||
Make adjustments to your values as needed, then run `helm upgrade`:
|
||||
|
||||
```console
|
||||
# -- This pulls the latest version of the ollama chart from the repo.
|
||||
helm repo update
|
||||
helm upgrade ollama otwld/ollama --namespace ollama --values values.yaml
|
||||
```
|
||||
|
||||
## Uninstalling Ollama chart
|
||||
|
||||
To uninstall/delete the `ollama` deployment in the `ollama` namespace:
|
||||
|
||||
```console
|
||||
helm delete ollama --namespace ollama
|
||||
```
|
||||
|
||||
Substitute your values if they differ from the examples. See `helm delete --help` for a full reference on `delete`
|
||||
parameters and flags.
|
||||
|
||||
## Interact with Ollama
|
||||
|
||||
- **Ollama documentation can be found [HERE](https://github.com/ollama/ollama/tree/main/docs)**
|
||||
- Interact with RESTful API: [Ollama API](https://github.com/ollama/ollama/blob/main/docs/api.md)
|
||||
- Interact with official clients libraries: [ollama-js](https://github.com/ollama/ollama-js#custom-client)
|
||||
and [ollama-python](https://github.com/ollama/ollama-python#custom-client)
|
||||
- Interact with langchain: [langchain-js](https://github.com/ollama/ollama/blob/main/docs/tutorials/langchainjs.md)
|
||||
and [langchain-python](https://github.com/ollama/ollama/blob/main/docs/tutorials/langchainpy.md)
|
||||
|
||||
## Examples
|
||||
|
||||
- **It's highly recommended to run an updated version of Kubernetes for deploying ollama with GPU**
|
||||
|
||||
### Basic values.yaml example with GPU and two models pulled at startup
|
||||
|
||||
```
|
||||
ollama:
|
||||
gpu:
|
||||
# -- Enable GPU integration
|
||||
enabled: true
|
||||
|
||||
# -- GPU type: 'nvidia' or 'amd'
|
||||
type: 'nvidia'
|
||||
|
||||
# -- Specify the number of GPU to 1
|
||||
number: 1
|
||||
|
||||
# -- List of models to pull at container startup
|
||||
models:
|
||||
pull:
|
||||
- mistral
|
||||
- llama2
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Basic values.yaml example with Ingress
|
||||
|
||||
```
|
||||
ollama:
|
||||
models:
|
||||
pull:
|
||||
- llama2
|
||||
|
||||
ingress:
|
||||
enabled: true
|
||||
hosts:
|
||||
- host: ollama.domain.lan
|
||||
paths:
|
||||
- path: /
|
||||
pathType: Prefix
|
||||
```
|
||||
|
||||
- *API is now reachable at `ollama.domain.lan`*
|
||||
|
||||
---
|
||||
|
||||
### Create and run model from template
|
||||
|
||||
```
|
||||
ollama:
|
||||
models:
|
||||
create:
|
||||
- name: llama3.1-ctx32768
|
||||
template: |
|
||||
FROM llama3.1
|
||||
PARAMETER num_ctx 32768
|
||||
run:
|
||||
- llama3.1-ctx32768
|
||||
```
|
||||
|
||||
## Upgrading from 0.X.X to 1.X.X
|
||||
|
||||
The version 1.X.X introduces the ability to load models in memory at startup, the values have been changed.
|
||||
|
||||
Please change `ollama.models` to `ollama.models.pull` to avoid errors before upgrading:
|
||||
|
||||
```yaml
|
||||
ollama:
|
||||
models:
|
||||
- mistral
|
||||
- llama2
|
||||
```
|
||||
|
||||
To:
|
||||
|
||||
```yaml
|
||||
ollama:
|
||||
models:
|
||||
pull:
|
||||
- mistral
|
||||
- llama2
|
||||
```
|
||||
|
||||
## Helm Values
|
||||
|
||||
- See [values.yaml](values.yaml) to see the Chart's default values.
|
||||
|
||||
| Key | Type | Default | Description |
|
||||
|--------------------------------------------|--------|---------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||
| affinity | object | `{}` | Affinity for pod assignment |
|
||||
| autoscaling.enabled | bool | `false` | Enable autoscaling |
|
||||
| autoscaling.maxReplicas | int | `100` | Number of maximum replicas |
|
||||
| autoscaling.minReplicas | int | `1` | Number of minimum replicas |
|
||||
| autoscaling.targetCPUUtilizationPercentage | int | `80` | CPU usage to target replica |
|
||||
| deployment.labels | object | `{}` | Labels to add to the deployment |
|
||||
| extraArgs | list | `[]` | Additional arguments on the output Deployment definition. |
|
||||
| extraEnv | list | `[]` | Additional environments variables on the output Deployment definition. For extra OLLAMA env, please refer to https://github.com/ollama/ollama/blob/main/envconfig/config.go |
|
||||
| extraEnvFrom | list | `[]` | Additionl environment variables from external sources (like ConfigMap) |
|
||||
| extraObjects | list | `[]` | Extra K8s manifests to deploy |
|
||||
| fullnameOverride | string | `""` | String to fully override template |
|
||||
| hostIPC | bool | `false` | Use the host’s ipc namespace. |
|
||||
| hostNetwork | bool | `false` | Use the host's network namespace. |
|
||||
| hostPID | bool | `false` | Use the host’s pid namespace |
|
||||
| image.pullPolicy | string | `"IfNotPresent"` | Docker pull policy |
|
||||
| image.repository | string | `"ollama/ollama"` | Docker image registry |
|
||||
| image.tag | string | `""` | Docker image tag, overrides the image tag whose default is the chart appVersion. |
|
||||
| imagePullSecrets | list | `[]` | Docker registry secret names as an array |
|
||||
| ingress.annotations | object | `{}` | Additional annotations for the Ingress resource. |
|
||||
| ingress.className | string | `""` | IngressClass that will be used to implement the Ingress (Kubernetes 1.18+) |
|
||||
| ingress.enabled | bool | `false` | Enable ingress controller resource |
|
||||
| ingress.hosts[0].host | string | `"ollama.local"` | |
|
||||
| ingress.hosts[0].paths[0].path | string | `"/"` | |
|
||||
| ingress.hosts[0].paths[0].pathType | string | `"Prefix"` | |
|
||||
| ingress.tls | list | `[]` | The tls configuration for hostnames to be covered with this ingress record. |
|
||||
| initContainers | list | `[]` | Init containers to add to the pod |
|
||||
| knative.annotations | object | `{}` | Knative service annotations |
|
||||
| knative.containerConcurrency | int | `0` | Knative service container concurrency |
|
||||
| knative.enabled | bool | `false` | Enable Knative integration |
|
||||
| knative.idleTimeoutSeconds | int | `300` | Knative service idle timeout seconds |
|
||||
| knative.responseStartTimeoutSeconds | int | `300` | Knative service response start timeout seconds |
|
||||
| knative.timeoutSeconds | int | `300` | Knative service timeout seconds |
|
||||
| lifecycle | object | `{}` | Lifecycle for pod assignment (override ollama.models startup pull/run) |
|
||||
| livenessProbe.enabled | bool | `true` | Enable livenessProbe |
|
||||
| livenessProbe.failureThreshold | int | `6` | Failure threshold for livenessProbe |
|
||||
| livenessProbe.initialDelaySeconds | int | `60` | Initial delay seconds for livenessProbe |
|
||||
| livenessProbe.path | string | `"/"` | Request path for livenessProbe |
|
||||
| livenessProbe.periodSeconds | int | `10` | Period seconds for livenessProbe |
|
||||
| livenessProbe.successThreshold | int | `1` | Success threshold for livenessProbe |
|
||||
| livenessProbe.timeoutSeconds | int | `5` | Timeout seconds for livenessProbe |
|
||||
| nameOverride | string | `""` | String to partially override template (will maintain the release name) |
|
||||
| namespaceOverride | string | `""` | String to fully override namespace |
|
||||
| nodeSelector | object | `{}` | Node labels for pod assignment. |
|
||||
| ollama.gpu.draDriverClass | string | `"gpu.nvidia.com"` | DRA GPU DriverClass |
|
||||
| ollama.gpu.draEnabled | bool | `false` | Enable DRA GPU integration If enabled, it will use DRA instead of Device Driver Plugin and create a ResourceClaim and GpuClaimParameters |
|
||||
| ollama.gpu.draExistingClaimTemplate | string | `""` | Existing DRA GPU ResourceClaim Template |
|
||||
| ollama.gpu.enabled | bool | `false` | Enable GPU integration |
|
||||
| ollama.gpu.mig.devices | object | `{}` | Specify the mig devices and the corresponding number |
|
||||
| ollama.gpu.mig.enabled | bool | `false` | Enable multiple mig devices If enabled you will have to specify the mig devices If enabled is set to false this section is ignored |
|
||||
| ollama.gpu.number | int | `1` | Specify the number of GPU If you use MIG section below then this parameter is ignored |
|
||||
| ollama.gpu.nvidiaResource | string | `"nvidia.com/gpu"` | only for nvidia cards; change to (example) 'nvidia.com/mig-1g.10gb' to use MIG slice |
|
||||
| ollama.gpu.type | string | `"nvidia"` | GPU type: 'nvidia' or 'amd' If 'ollama.gpu.enabled', default value is nvidia If set to 'amd', this will add 'rocm' suffix to image tag if 'image.tag' is not override This is due cause AMD and CPU/CUDA are different images |
|
||||
| ollama.insecure | bool | `false` | Add insecure flag for pulling at container startup |
|
||||
| ollama.models.clean | bool | `false` | Automatically remove models present on the disk but not specified in the values file |
|
||||
| ollama.models.create | list | `[]` | List of models to create at container startup, there are two options 1. Create a raw model 2. Load a model from configMaps, configMaps must be created before and are loaded as volume in "/models" directory. create: - name: llama3.1-ctx32768 configMapRef: my-configmap configMapKeyRef: configmap-key - name: llama3.1-ctx32768 template: | FROM llama3.1 PARAMETER num_ctx 32768 |
|
||||
| ollama.models.pull | list | `[]` | List of models to pull at container startup The more you add, the longer the container will take to start if models are not present pull: - llama2 - mistral |
|
||||
| ollama.models.run | list | `[]` | List of models to load in memory at container startup run: - llama2 - mistral |
|
||||
| ollama.mountPath | string | `""` | Override ollama-data volume mount path, default: "/root/.ollama" |
|
||||
| ollama.port | int | `11434` | |
|
||||
| persistentVolume.accessModes | list | `["ReadWriteOnce"]` | Ollama server data Persistent Volume access modes Must match those of existing PV or dynamic provisioner Ref: http://kubernetes.io/docs/user-guide/persistent-volumes/ |
|
||||
| persistentVolume.annotations | object | `{}` | Ollama server data Persistent Volume annotations |
|
||||
| persistentVolume.enabled | bool | `false` | Enable persistence using PVC |
|
||||
| persistentVolume.existingClaim | string | `""` | If you'd like to bring your own PVC for persisting Ollama state, pass the name of the created + ready PVC here. If set, this Chart will not create the default PVC. Requires server.persistentVolume.enabled: true |
|
||||
| persistentVolume.size | string | `"30Gi"` | Ollama server data Persistent Volume size |
|
||||
| persistentVolume.storageClass | string | `""` | Ollama server data Persistent Volume Storage Class If defined, storageClassName: <storageClass> If set to "-", storageClassName: "", which disables dynamic provisioning If undefined (the default) or set to null, no storageClassName spec is set, choosing the default provisioner. (gp2 on AWS, standard on GKE, AWS & OpenStack) |
|
||||
| persistentVolume.subPath | string | `""` | Subdirectory of Ollama server data Persistent Volume to mount Useful if the volume's root directory is not empty |
|
||||
| persistentVolume.volumeMode | string | `""` | Ollama server data Persistent Volume Binding Mode If defined, volumeMode: <volumeMode> If empty (the default) or set to null, no volumeBindingMode spec is set, choosing the default mode. |
|
||||
| persistentVolume.volumeName | string | `""` | Pre-existing PV to attach this claim to Useful if a CSI auto-provisions a PV for you and you want to always reference the PV moving forward |
|
||||
| podAnnotations | object | `{}` | Map of annotations to add to the pods |
|
||||
| podLabels | object | `{}` | Map of labels to add to the pods |
|
||||
| podSecurityContext | object | `{}` | Pod Security Context |
|
||||
| priorityClassName | string | `""` | Priority Class Name |
|
||||
| readinessProbe.enabled | bool | `true` | Enable readinessProbe |
|
||||
| readinessProbe.failureThreshold | int | `6` | Failure threshold for readinessProbe |
|
||||
| readinessProbe.initialDelaySeconds | int | `30` | Initial delay seconds for readinessProbe |
|
||||
| readinessProbe.path | string | `"/"` | Request path for readinessProbe |
|
||||
| readinessProbe.periodSeconds | int | `5` | Period seconds for readinessProbe |
|
||||
| readinessProbe.successThreshold | int | `1` | Success threshold for readinessProbe |
|
||||
| readinessProbe.timeoutSeconds | int | `3` | Timeout seconds for readinessProbe |
|
||||
| replicaCount | int | `1` | Number of replicas |
|
||||
| resources.limits | object | `{}` | Pod limit |
|
||||
| resources.requests | object | `{}` | Pod requests |
|
||||
| runtimeClassName | string | `""` | Specify runtime class |
|
||||
| securityContext | object | `{}` | Container Security Context |
|
||||
| service.annotations | object | `{}` | Annotations to add to the service |
|
||||
| service.labels | object | `{}` | Labels to add to the service |
|
||||
| service.loadBalancerIP | string | `nil` | Load Balancer IP address |
|
||||
| service.nodePort | int | `31434` | Service node port when service type is 'NodePort' |
|
||||
| service.port | int | `11434` | Service port |
|
||||
| service.type | string | `"ClusterIP"` | Service type |
|
||||
| serviceAccount.annotations | object | `{}` | Annotations to add to the service account |
|
||||
| serviceAccount.automount | bool | `true` | Automatically mount a ServiceAccount's API credentials? |
|
||||
| serviceAccount.create | bool | `true` | Specifies whether a service account should be created |
|
||||
| serviceAccount.name | string | `""` | The name of the service account to use. If not set and create is true, a name is generated using the fullname template |
|
||||
| terminationGracePeriodSeconds | int | `120` | Wait for a grace period |
|
||||
| tests.annotations | object | `{}` | Annotations to add to the tests |
|
||||
| tests.enabled | bool | `true` | |
|
||||
| tests.labels | object | `{}` | Labels to add to the tests |
|
||||
| tolerations | list | `[]` | Tolerations for pod assignment |
|
||||
| topologySpreadConstraints | object | `{}` | Topology Spread Constraints for pod assignment |
|
||||
| updateStrategy.type | string | `"Recreate"` | Deployment strategy can be "Recreate" or "RollingUpdate". Default is Recreate |
|
||||
| volumeMounts | list | `[]` | Additional volumeMounts on the output Deployment definition. |
|
||||
| volumes | list | `[]` | Additional volumes on the output Deployment definition. |
|
||||
|
||||
----------------------------------------------
|
||||
|
||||
## Core team
|
||||
|
||||
<table>
|
||||
<tr>
|
||||
<td align="center">
|
||||
<a href="https://github.com/jdetroyes"
|
||||
><img
|
||||
src="https://github.com/jdetroyes.png?size=200"
|
||||
width="50"
|
||||
style="margin-bottom: -4px; border-radius: 8px;"
|
||||
alt="Jean Baptiste Detroyes"
|
||||
/><br /><b> Jean Baptiste Detroyes </b></a
|
||||
>
|
||||
<div style="margin-top: 4px">
|
||||
<a href="https://github.com/jdetroyes" title="Github"
|
||||
><img
|
||||
width="16"
|
||||
src="https://raw.githubusercontent.com/MarsiBarsi/readme-icons/main/github.svg"
|
||||
/></a>
|
||||
<a
|
||||
href="mailto:jdetroyes@otwld.com"
|
||||
title="Email"
|
||||
><img
|
||||
width="16"
|
||||
src="https://raw.githubusercontent.com/MarsiBarsi/readme-icons/main/send.svg"
|
||||
/></a>
|
||||
</div>
|
||||
</td>
|
||||
<td align="center">
|
||||
<a href="https://github.com/ntrehout"
|
||||
><img
|
||||
src="https://github.com/ntrehout.png?size=200"
|
||||
width="50"
|
||||
style="margin-bottom: -4px; border-radius: 8px;"
|
||||
alt="Jean Baptiste Detroyes"
|
||||
/><br /><b> Nathan Tréhout </b></a
|
||||
>
|
||||
<div style="margin-top: 4px">
|
||||
<a href="https://x.com/n_trehout" title="Twitter"
|
||||
><img
|
||||
width="16"
|
||||
src="https://raw.githubusercontent.com/MarsiBarsi/readme-icons/main/twitter.svg"
|
||||
/></a>
|
||||
<a href="https://github.com/ntrehout" title="Github"
|
||||
><img
|
||||
width="16"
|
||||
src="https://raw.githubusercontent.com/MarsiBarsi/readme-icons/main/github.svg"
|
||||
/></a>
|
||||
<a
|
||||
href="mailto:ntrehout@otwld.com"
|
||||
title="Email"
|
||||
><img
|
||||
width="16"
|
||||
src="https://raw.githubusercontent.com/MarsiBarsi/readme-icons/main/send.svg"
|
||||
/></a>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
## Support
|
||||
|
||||
- For questions, suggestions, and discussion about Ollama please refer to
|
||||
the [Ollama issue page](https://github.com/ollama/ollama/issues)
|
||||
- For questions, suggestions, and discussion about this chart please
|
||||
visit [Ollama-Helm issue page](https://github.com/otwld/ollama-helm/issues) or join
|
||||
our [OTWLD Discord](https://discord.gg/U24mpqTynB)
|
||||
@ -0,0 +1,25 @@
|
||||
1. Get the application URL by running these commands:
|
||||
{{- if .Values.knative.enabled }}
|
||||
export KSERVICE_URL=$(kubectl get ksvc --namespace {{ .Release.Namespace }} {{ include "ollama.fullname" . }} -o jsonpath={.status.url})
|
||||
echo "Visit $KSERVICE_URL to use your application"
|
||||
{{- else if .Values.ingress.enabled }}
|
||||
{{- range $host := .Values.ingress.hosts }}
|
||||
{{- range .paths }}
|
||||
http{{ if $.Values.ingress.tls }}s{{ end }}://{{ $host.host }}{{ .path }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- else if contains "NodePort" .Values.service.type }}
|
||||
export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "ollama.fullname" . }})
|
||||
export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}")
|
||||
echo http://$NODE_IP:$NODE_PORT
|
||||
{{- else if contains "LoadBalancer" .Values.service.type }}
|
||||
NOTE: It may take a few minutes for the LoadBalancer IP to be available.
|
||||
You can watch the status of by running 'kubectl get --namespace {{ .Release.Namespace }} svc -w {{ include "ollama.fullname" . }}'
|
||||
export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ include "ollama.fullname" . }} --template "{{"{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}"}}")
|
||||
echo http://$SERVICE_IP:{{ .Values.service.port }}
|
||||
{{- else if contains "ClusterIP" .Values.service.type }}
|
||||
export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app.kubernetes.io/name={{ include "ollama.name" . }},app.kubernetes.io/instance={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}")
|
||||
export CONTAINER_PORT=$(kubectl get pod --namespace {{ .Release.Namespace }} $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}")
|
||||
echo "Visit http://127.0.0.1:8080 to use your application"
|
||||
kubectl --namespace {{ .Release.Namespace }} port-forward $POD_NAME 8080:$CONTAINER_PORT
|
||||
{{- end }}
|
||||
@ -0,0 +1,80 @@
|
||||
{{/*
|
||||
Allow the release namespace to be overridden for multi-namespace deployments in combined charts
|
||||
*/}}
|
||||
{{- define "ollama.namespace" -}}
|
||||
{{- if .Values.namespaceOverride -}}
|
||||
{{- .Values.namespaceOverride -}}
|
||||
{{- else -}}
|
||||
{{- .Release.Namespace -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
|
||||
{{/*
|
||||
Expand the name of the chart.
|
||||
*/}}
|
||||
{{- define "ollama.name" -}}
|
||||
{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Create a default fully qualified app name.
|
||||
We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
|
||||
If release name contains chart name it will be used as a full name.
|
||||
*/}}
|
||||
{{- define "ollama.fullname" -}}
|
||||
{{- if .Values.fullnameOverride }}
|
||||
{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }}
|
||||
{{- else }}
|
||||
{{- $name := default .Chart.Name .Values.nameOverride }}
|
||||
{{- if contains $name .Release.Name }}
|
||||
{{- .Release.Name | trunc 63 | trimSuffix "-" }}
|
||||
{{- else }}
|
||||
{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Create chart name and version as used by the chart label.
|
||||
*/}}
|
||||
{{- define "ollama.chart" -}}
|
||||
{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Common labels
|
||||
*/}}
|
||||
{{- define "ollama.labels" -}}
|
||||
helm.sh/chart: {{ include "ollama.chart" . }}
|
||||
{{ include "ollama.selectorLabels" . }}
|
||||
{{- if .Chart.AppVersion }}
|
||||
app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
|
||||
{{- end }}
|
||||
app.kubernetes.io/managed-by: {{ .Release.Service }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Selector labels
|
||||
*/}}
|
||||
{{- define "ollama.selectorLabels" -}}
|
||||
app.kubernetes.io/name: {{ include "ollama.name" . }}
|
||||
app.kubernetes.io/instance: {{ .Release.Name }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Create the name of the service account to use
|
||||
*/}}
|
||||
{{- define "ollama.serviceAccountName" -}}
|
||||
{{- if .Values.serviceAccount.create }}
|
||||
{{- default (include "ollama.fullname" .) .Values.serviceAccount.name }}
|
||||
{{- else }}
|
||||
{{- default "default" .Values.serviceAccount.name }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Models mount path
|
||||
*/}}
|
||||
{{- define "ollama.modelsMountPath" -}}
|
||||
{{- printf "%s/models" (((.Values).ollama).mountPath | default "/root/.ollama") }}
|
||||
{{- end -}}
|
||||
@ -0,0 +1,293 @@
|
||||
---
|
||||
{{- if not .Values.knative.enabled }}
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: {{ include "ollama.fullname" . }}
|
||||
namespace: {{ include "ollama.namespace" . }}
|
||||
labels:
|
||||
{{- include "ollama.labels" . | nindent 4 }}
|
||||
{{- with .Values.deployment.labels }}
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
spec:
|
||||
{{- if not .Values.autoscaling.enabled }}
|
||||
replicas: {{ .Values.replicaCount }}
|
||||
{{- end }}
|
||||
{{- if or .Values.updateStrategy.type .Values.updateStrategy.rollingUpdate }}
|
||||
strategy: {{ .Values.updateStrategy | toYaml | nindent 4 }}
|
||||
{{- end }}
|
||||
selector:
|
||||
matchLabels:
|
||||
{{- include "ollama.selectorLabels" . | nindent 6 }}
|
||||
template:
|
||||
metadata:
|
||||
{{- with .Values.podAnnotations }}
|
||||
annotations:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
labels:
|
||||
{{- include "ollama.labels" . | nindent 8 }}
|
||||
{{- with .Values.podLabels }}
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
spec:
|
||||
{{- if .Values.hostIPC }}
|
||||
hostIPC: {{ .Values.hostIPC }}
|
||||
{{- end }}
|
||||
{{- if .Values.hostPID }}
|
||||
hostPID: {{ .Values.hostPID }}
|
||||
{{- end }}
|
||||
{{- if .Values.hostNetwork }}
|
||||
hostNetwork: {{ .Values.hostNetwork }}
|
||||
{{- end }}
|
||||
{{- with .Values.imagePullSecrets }}
|
||||
imagePullSecrets:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
serviceAccountName: {{ include "ollama.serviceAccountName" . }}
|
||||
{{- if .Values.priorityClassName }}
|
||||
priorityClassName: {{ .Values.priorityClassName | quote }}
|
||||
{{- end }}
|
||||
{{- if .Values.terminationGracePeriodSeconds }}
|
||||
terminationGracePeriodSeconds: {{ .Values.terminationGracePeriodSeconds }}
|
||||
{{- end }}
|
||||
securityContext:
|
||||
{{- toYaml .Values.podSecurityContext | nindent 8 }}
|
||||
{{- if .Values.runtimeClassName }}
|
||||
runtimeClassName: {{ .Values.runtimeClassName | quote }}
|
||||
{{- end }}
|
||||
{{- with .Values.initContainers }}
|
||||
initContainers:
|
||||
{{- tpl (toYaml . ) $ | nindent 8 }}
|
||||
{{- end }}
|
||||
containers:
|
||||
- name: {{ .Chart.Name }}
|
||||
securityContext:
|
||||
{{- toYaml .Values.securityContext | nindent 12 }}
|
||||
image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default (ternary (printf "%s-rocm" .Chart.AppVersion) (.Chart.AppVersion) (and (.Values.ollama.gpu.enabled) (eq .Values.ollama.gpu.type "amd"))) }}"
|
||||
imagePullPolicy: {{ .Values.image.pullPolicy }}
|
||||
ports:
|
||||
- name: http
|
||||
containerPort: {{ .Values.ollama.port }}
|
||||
protocol: TCP
|
||||
env:
|
||||
- name: OLLAMA_HOST
|
||||
value: "0.0.0.0:{{ .Values.ollama.port }}"
|
||||
{{- if and .Values.ollama.gpu.enabled (or (eq .Values.ollama.gpu.type "nvidia") (not .Values.ollama.gpu.type))}}
|
||||
- name: PATH
|
||||
value: /usr/local/nvidia/bin:/usr/local/cuda/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
|
||||
{{- end}}
|
||||
{{- with .Values.extraEnv }}
|
||||
{{- toYaml . | nindent 12 }}
|
||||
{{- end }}
|
||||
envFrom:
|
||||
{{- with .Values.extraEnvFrom }}
|
||||
{{- toYaml . | nindent 12 }}
|
||||
{{- end }}
|
||||
args:
|
||||
{{- with .Values.extraArgs }}
|
||||
{{- toYaml . | nindent 12 }}
|
||||
{{- end }}
|
||||
{{- if .Values.resources }}
|
||||
resources:
|
||||
{{- $limits := default dict .Values.resources.limits }}
|
||||
{{- if .Values.ollama.gpu.enabled }}
|
||||
{{- if .Values.ollama.gpu.draEnabled}}
|
||||
claims:
|
||||
- name: gpu
|
||||
{{- else }}
|
||||
# If gpu is enabled, it can either be a NVIDIA card or a AMD card
|
||||
{{- if or (eq .Values.ollama.gpu.type "nvidia") (not .Values.ollama.gpu.type) }}
|
||||
# NVIDIA is assumed by default if no value is set and GPU is enabled
|
||||
# NVIDIA cards can have mig enabled (i.e., the card is sliced into parts
|
||||
# Therefore, the first case is no migs enabled
|
||||
{{- if or (not .Values.ollama.gpu.mig) (not .Values.ollama.gpu.mig.enabled ) }}
|
||||
{{- $gpuLimit := dict (.Values.ollama.gpu.nvidiaResource | default "nvidia.com/gpu") (.Values.ollama.gpu.number | default 1) }}
|
||||
{{- $limits = merge $limits $gpuLimit }}
|
||||
# Second case is mig is enabled
|
||||
{{- else if or (.Values.ollama.gpu.mig.enabled) }}
|
||||
# Initialize empty dictionary
|
||||
{{- $migDevices := dict -}}
|
||||
# Loop over the entries in the mig devices
|
||||
{{- range $key, $value := .Values.ollama.gpu.mig.devices }}
|
||||
{{- $migKey := printf "nvidia.com/mig-%s" $key -}}
|
||||
{{- $migDevices = merge $migDevices (dict $migKey $value) -}}
|
||||
{{- end }}
|
||||
{{- $limits = merge $limits $migDevices}}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- if eq .Values.ollama.gpu.type "amd" }}
|
||||
{{- $gpuLimit := dict "amd.com/gpu" (.Values.ollama.gpu.number | default 1) }}
|
||||
{{- $limits = merge $limits $gpuLimit }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- $ressources := deepCopy (dict "limits" $limits) | mergeOverwrite .Values.resources }}
|
||||
{{- toYaml $ressources | nindent 12 }}
|
||||
{{- end}}
|
||||
volumeMounts:
|
||||
- name: ollama-data
|
||||
mountPath: {{ .Values.ollama.mountPath | default "/root/.ollama" }}
|
||||
{{- if .Values.persistentVolume.subPath }}
|
||||
subPath: {{ .Values.persistentVolume.subPath }}
|
||||
{{- end }}
|
||||
{{- range .Values.ollama.models.create }}
|
||||
{{- if .configMapRef }}
|
||||
- name: {{ .name }}-config-model-volume
|
||||
mountPath: /models
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- with .Values.volumeMounts }}
|
||||
{{- toYaml . | nindent 12 }}
|
||||
{{- end }}
|
||||
{{- if .Values.livenessProbe.enabled }}
|
||||
livenessProbe:
|
||||
httpGet:
|
||||
path: {{ .Values.livenessProbe.path }}
|
||||
port: http
|
||||
initialDelaySeconds: {{ .Values.livenessProbe.initialDelaySeconds }}
|
||||
periodSeconds: {{ .Values.livenessProbe.periodSeconds }}
|
||||
timeoutSeconds: {{ .Values.livenessProbe.timeoutSeconds }}
|
||||
successThreshold: {{ .Values.livenessProbe.successThreshold }}
|
||||
failureThreshold: {{ .Values.livenessProbe.failureThreshold }}
|
||||
{{- end }}
|
||||
{{- if .Values.readinessProbe.enabled }}
|
||||
readinessProbe:
|
||||
httpGet:
|
||||
path: {{ .Values.readinessProbe.path }}
|
||||
port: http
|
||||
initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }}
|
||||
periodSeconds: {{ .Values.readinessProbe.periodSeconds }}
|
||||
timeoutSeconds: {{ .Values.readinessProbe.timeoutSeconds }}
|
||||
successThreshold: {{ .Values.readinessProbe.successThreshold }}
|
||||
failureThreshold: {{ .Values.readinessProbe.failureThreshold }}
|
||||
{{- end }}
|
||||
{{- with .Values.lifecycle}}
|
||||
lifecycle:
|
||||
{{- toYaml . | nindent 12 }}
|
||||
{{- else }}
|
||||
{{- if or .Values.ollama.models.pull .Values.ollama.models.run .Values.ollama.models.create }}
|
||||
lifecycle:
|
||||
postStart:
|
||||
exec:
|
||||
command:
|
||||
- /bin/sh
|
||||
- -c
|
||||
- |
|
||||
while ! /bin/ollama ps > /dev/null 2>&1; do
|
||||
sleep 5
|
||||
done
|
||||
|
||||
{{- $allModels := list -}}
|
||||
|
||||
{{- if .Values.ollama.models.pull }}
|
||||
{{- range .Values.ollama.models.pull }}
|
||||
|
||||
{{- if contains ":" . }}
|
||||
{{- $allModels = append $allModels . }}
|
||||
{{- else }}
|
||||
{{- $allModels = append $allModels (printf "%s:latest" .) }}
|
||||
{{- end }}
|
||||
|
||||
/bin/ollama pull {{ternary "--insecure" "" $.Values.ollama.insecure | toString }} {{ . }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
|
||||
{{- if .Values.ollama.models.create }}
|
||||
{{- range .Values.ollama.models.create }}
|
||||
{{- $allModels = append $allModels .name }}
|
||||
{{- if .template }}
|
||||
cat <<EOF > {{ include "ollama.modelsMountPath" $ }}/{{ .name }}
|
||||
{{- .template | nindent 20 }}
|
||||
EOF
|
||||
/bin/ollama create {{ .name }} -f {{ include "ollama.modelsMountPath" $ }}/{{ .name }}
|
||||
{{- end }}
|
||||
{{- if .configMapRef }}
|
||||
/bin/ollama create {{ .name }} -f /models/{{ .name }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
|
||||
{{- if .Values.ollama.models.run }}
|
||||
{{- range .Values.ollama.models.run }}
|
||||
|
||||
{{- if contains ":" . }}
|
||||
{{- $allModels = append $allModels . }}
|
||||
{{- else }}
|
||||
{{- $allModels = append $allModels (printf "%s:latest" .) }}
|
||||
{{- end }}
|
||||
|
||||
/bin/ollama run {{ . }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
|
||||
{{- if .Values.ollama.models.clean }}
|
||||
/bin/ollama list | awk 'NR>1 {print $1}' | while read model; do
|
||||
echo "{{ $allModels | join " " }}" | tr ' ' '\n' | grep -Fqx "$model" || /bin/ollama rm "$model"
|
||||
done
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- if and .Values.ollama.gpu.enabled .Values.ollama.gpu.draEnabled }}
|
||||
resourceClaims:
|
||||
- name: gpu
|
||||
resourceClaimTemplateName: {{ .Values.ollama.gpu.draExistingClaimTemplate | default (printf "%s" (include "ollama.fullname" .)) }}
|
||||
{{- end }}
|
||||
volumes:
|
||||
- name: ollama-data
|
||||
{{- if .Values.persistentVolume.enabled }}
|
||||
persistentVolumeClaim:
|
||||
claimName: {{ .Values.persistentVolume.existingClaim | default (printf "%s" (include "ollama.fullname" .)) }}
|
||||
{{- else }}
|
||||
emptyDir: { }
|
||||
{{- end }}
|
||||
{{- range .Values.ollama.models.create }}
|
||||
{{- if .configMapRef }}
|
||||
- name: {{ .name }}-config-model-volume
|
||||
configMap:
|
||||
name: {{ .configMapRef }}
|
||||
items:
|
||||
- key: {{ .configMapKeyRef }}
|
||||
path: {{ .name }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- with .Values.volumes }}
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- with .Values.nodeSelector }}
|
||||
nodeSelector:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- with .Values.affinity }}
|
||||
affinity:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- with .Values.topologySpreadConstraints }}
|
||||
topologySpreadConstraints:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- if or .Values.ollama.gpu.enabled .Values.tolerations }}
|
||||
tolerations:
|
||||
{{- if and .Values.ollama.gpu.enabled (and
|
||||
( or (eq .Values.ollama.gpu.type "nvidia") (not .Values.ollama.gpu.type))
|
||||
( or (not .Values.ollama.gpu.mig) (not .Values.ollama.gpu.mig.enabled))
|
||||
) }}
|
||||
- key: "{{(.Values.ollama.gpu.nvidiaResource | default "nvidia.com/gpu")}}"
|
||||
operator: Exists
|
||||
effect: NoSchedule
|
||||
{{- else if and .Values.ollama.gpu.enabled (and
|
||||
( or (eq .Values.ollama.gpu.type "nvidia") (not .Values.ollama.gpu.type))
|
||||
(( .Values.ollama.gpu.mig.enabled))
|
||||
) }}
|
||||
{{- range $key, $value := .Values.ollama.gpu.mig.devices }}
|
||||
- key: nvidia.com/mig-{{ $key }}
|
||||
operator: Exists
|
||||
effect: NoSchedule
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- with .Values.tolerations }}
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
@ -0,0 +1,4 @@
|
||||
{{ range .Values.extraObjects }}
|
||||
---
|
||||
{{ tpl (toYaml .) $ }}
|
||||
{{ end }}
|
||||
@ -0,0 +1,34 @@
|
||||
---
|
||||
{{- if .Values.autoscaling.enabled }}
|
||||
apiVersion: autoscaling/v2
|
||||
kind: HorizontalPodAutoscaler
|
||||
metadata:
|
||||
name: {{ include "ollama.fullname" . }}
|
||||
namespace: {{ include "ollama.namespace" . }}
|
||||
labels:
|
||||
{{- include "ollama.labels" . | nindent 4 }}
|
||||
spec:
|
||||
scaleTargetRef:
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
name: {{ include "ollama.fullname" . }}
|
||||
minReplicas: {{ .Values.autoscaling.minReplicas }}
|
||||
maxReplicas: {{ .Values.autoscaling.maxReplicas }}
|
||||
metrics:
|
||||
{{- if .Values.autoscaling.targetCPUUtilizationPercentage }}
|
||||
- type: Resource
|
||||
resource:
|
||||
name: cpu
|
||||
target:
|
||||
type: Utilization
|
||||
averageUtilization: {{ .Values.autoscaling.targetCPUUtilizationPercentage }}
|
||||
{{- end }}
|
||||
{{- if .Values.autoscaling.targetMemoryUtilizationPercentage }}
|
||||
- type: Resource
|
||||
resource:
|
||||
name: memory
|
||||
target:
|
||||
type: Utilization
|
||||
averageUtilization: {{ .Values.autoscaling.targetMemoryUtilizationPercentage }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
@ -0,0 +1,63 @@
|
||||
{{- if .Values.ingress.enabled -}}
|
||||
{{- $fullName := include "ollama.fullname" . -}}
|
||||
{{- $svcPort := .Values.service.port -}}
|
||||
{{- if and .Values.ingress.className (not (semverCompare ">=1.18-0" .Capabilities.KubeVersion.GitVersion)) }}
|
||||
{{- if not (hasKey .Values.ingress.annotations "kubernetes.io/ingress.class") }}
|
||||
{{- $_ := set .Values.ingress.annotations "kubernetes.io/ingress.class" .Values.ingress.className }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
---
|
||||
{{- if semverCompare ">=1.19-0" .Capabilities.KubeVersion.GitVersion }}
|
||||
apiVersion: networking.k8s.io/v1
|
||||
{{- else if semverCompare ">=1.14-0" .Capabilities.KubeVersion.GitVersion }}
|
||||
apiVersion: networking.k8s.io/v1beta1
|
||||
{{- else }}
|
||||
apiVersion: extensions/v1beta1
|
||||
{{- end }}
|
||||
kind: Ingress
|
||||
metadata:
|
||||
name: {{ $fullName }}
|
||||
namespace: {{ include "ollama.namespace" . }}
|
||||
labels:
|
||||
{{- include "ollama.labels" . | nindent 4 }}
|
||||
{{- with .Values.ingress.annotations }}
|
||||
annotations:
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
spec:
|
||||
{{- if and .Values.ingress.className (semverCompare ">=1.18-0" .Capabilities.KubeVersion.GitVersion) }}
|
||||
ingressClassName: {{ .Values.ingress.className }}
|
||||
{{- end }}
|
||||
{{- if .Values.ingress.tls }}
|
||||
tls:
|
||||
{{- range .Values.ingress.tls }}
|
||||
- hosts:
|
||||
{{- range .hosts }}
|
||||
- {{ . | quote }}
|
||||
{{- end }}
|
||||
secretName: {{ .secretName }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
rules:
|
||||
{{- range .Values.ingress.hosts }}
|
||||
- host: {{ .host | quote }}
|
||||
http:
|
||||
paths:
|
||||
{{- range .paths }}
|
||||
- path: {{ .path }}
|
||||
{{- if and .pathType (semverCompare ">=1.18-0" $.Capabilities.KubeVersion.GitVersion) }}
|
||||
pathType: {{ .pathType }}
|
||||
{{- end }}
|
||||
backend:
|
||||
{{- if semverCompare ">=1.19-0" $.Capabilities.KubeVersion.GitVersion }}
|
||||
service:
|
||||
name: {{ $fullName }}
|
||||
port:
|
||||
number: {{ $svcPort }}
|
||||
{{- else }}
|
||||
serviceName: {{ $fullName }}
|
||||
servicePort: {{ $svcPort }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
@ -0,0 +1,200 @@
|
||||
---
|
||||
{{- if .Values.knative.enabled }}
|
||||
apiVersion: serving.knative.dev/v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: {{ include "ollama.fullname" . }}
|
||||
namespace: {{ include "ollama.namespace" . }}
|
||||
labels:
|
||||
{{- include "ollama.labels" . | nindent 4 }}
|
||||
{{- with .Values.knative.annotations }}
|
||||
annotations:
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
spec:
|
||||
template:
|
||||
spec:
|
||||
containerConcurrency: {{ .Values.knative.containerConcurrency }}
|
||||
timeoutSeconds: {{ .Values.knative.timeoutSeconds }}
|
||||
responseStartTimeoutSeconds: {{ .Values.knative.responseStartTimeoutSeconds }}
|
||||
idleTimeoutSeconds: {{ .Values.knative.idleTimeoutSeconds }}
|
||||
{{- with .Values.imagePullSecrets }}
|
||||
imagePullSecrets:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
serviceAccountName: {{ include "ollama.serviceAccountName" . }}
|
||||
{{- if .Values.runtimeClassName }}
|
||||
runtimeClassName: {{ .Values.runtimeClassName | quote }}
|
||||
{{- end }}
|
||||
{{- if .Values.terminationGracePeriodSeconds }}
|
||||
terminationGracePeriodSeconds: {{ .Values.terminationGracePeriodSeconds }}
|
||||
{{- end }}
|
||||
{{- with .Values.initContainers }}
|
||||
initContainers:
|
||||
{{- tpl (toYaml . ) $ | nindent 8 }}
|
||||
{{- end }}
|
||||
containers:
|
||||
- image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default (ternary (printf "%s-rocm" .Chart.AppVersion) (.Chart.AppVersion) (and (.Values.ollama.gpu.enabled) (eq .Values.ollama.gpu.type "amd"))) }}"
|
||||
imagePullPolicy: {{ .Values.image.pullPolicy }}
|
||||
securityContext:
|
||||
{{- toYaml .Values.securityContext | nindent 12 }}
|
||||
ports:
|
||||
- containerPort: {{ .Values.ollama.port }}
|
||||
env:
|
||||
- name: OLLAMA_HOST
|
||||
value: "0.0.0.0:{{ .Values.ollama.port }}"
|
||||
{{- if and .Values.ollama.gpu.enabled (or (eq .Values.ollama.gpu.type "nvidia") (not .Values.ollama.gpu.type))}}
|
||||
- name: PATH
|
||||
value: /usr/local/nvidia/bin:/usr/local/cuda/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
|
||||
{{- end}}
|
||||
{{- with .Values.extraEnv }}
|
||||
{{- toYaml . | nindent 12 }}
|
||||
{{- end }}
|
||||
envFrom:
|
||||
{{- with .Values.extraEnvFrom }}
|
||||
{{- toYaml . | nindent 12 }}
|
||||
{{- end }}
|
||||
args:
|
||||
{{- with .Values.extraArgs }}
|
||||
{{- toYaml . | nindent 12 }}
|
||||
{{- end }}
|
||||
{{- if .Values.resources }}
|
||||
resources:
|
||||
{{- $limits := default dict .Values.resources.limits }}
|
||||
{{- if .Values.ollama.gpu.enabled }}
|
||||
{{- if or (eq .Values.ollama.gpu.type "nvidia") (not .Values.ollama.gpu.type) }}
|
||||
{{- $gpuLimit := dict (.Values.ollama.gpu.nvidiaResource | default "nvidia.com/gpu") (.Values.ollama.gpu.number | default 1) }}
|
||||
{{- $limits = merge $limits $gpuLimit }}
|
||||
{{- end }}
|
||||
{{- if eq .Values.ollama.gpu.type "amd" }}
|
||||
{{- $gpuLimit := dict "amd.com/gpu" (.Values.ollama.gpu.number | default 1) }}
|
||||
{{- $limits = merge $limits $gpuLimit }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- $ressources := deepCopy (dict "limits" $limits) | mergeOverwrite .Values.resources }}
|
||||
{{- toYaml $ressources | nindent 12 }}
|
||||
{{- end}}
|
||||
volumeMounts:
|
||||
- name: ollama-data
|
||||
mountPath: {{ .Values.ollama.mountPath | default "/root/.ollama" }}
|
||||
{{- if .Values.persistentVolume.subPath }}
|
||||
subPath: {{ .Values.persistentVolume.subPath }}
|
||||
{{- end }}
|
||||
{{- range .Values.ollama.models.create }}
|
||||
{{- if .configMapRef }}
|
||||
- name: {{ .name }}-config-model-volume
|
||||
mountPath: /models
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- with .Values.volumeMounts }}
|
||||
{{- toYaml . | nindent 12 }}
|
||||
{{- end }}
|
||||
{{- if .Values.livenessProbe.enabled }}
|
||||
livenessProbe:
|
||||
httpGet:
|
||||
path: {{ .Values.livenessProbe.path }}
|
||||
port: http
|
||||
initialDelaySeconds: {{ .Values.livenessProbe.initialDelaySeconds }}
|
||||
periodSeconds: {{ .Values.livenessProbe.periodSeconds }}
|
||||
timeoutSeconds: {{ .Values.livenessProbe.timeoutSeconds }}
|
||||
successThreshold: {{ .Values.livenessProbe.successThreshold }}
|
||||
failureThreshold: {{ .Values.livenessProbe.failureThreshold }}
|
||||
{{- end }}
|
||||
{{- if .Values.readinessProbe.enabled }}
|
||||
readinessProbe:
|
||||
httpGet:
|
||||
path: {{ .Values.readinessProbe.path }}
|
||||
port: http
|
||||
initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }}
|
||||
periodSeconds: {{ .Values.readinessProbe.periodSeconds }}
|
||||
timeoutSeconds: {{ .Values.readinessProbe.timeoutSeconds }}
|
||||
successThreshold: {{ .Values.readinessProbe.successThreshold }}
|
||||
failureThreshold: {{ .Values.readinessProbe.failureThreshold }}
|
||||
{{- end }}
|
||||
{{- with .Values.lifecycle}}
|
||||
lifecycle:
|
||||
{{- toYaml . | nindent 12 }}
|
||||
{{- else }}
|
||||
{{- if or .Values.ollama.models.pull .Values.ollama.models.run .Values.ollama.models.create }}
|
||||
lifecycle:
|
||||
postStart:
|
||||
exec:
|
||||
command:
|
||||
- /bin/sh
|
||||
- -c
|
||||
- |
|
||||
while ! /bin/ollama ps > /dev/null 2>&1; do
|
||||
sleep 5
|
||||
done
|
||||
{{- if .Values.ollama.models.pull }}
|
||||
{{- range .Values.ollama.models.pull }}
|
||||
/bin/ollama pull {{ternary "--insecure" "" $.Values.ollama.insecure | toString }} {{ . }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
|
||||
{{- if .Values.ollama.models.create }}
|
||||
{{- range .Values.ollama.models.create }}
|
||||
{{- if .template }}
|
||||
cat <<EOF > {{ include "ollama.modelsMountPath" $ }}/{{ .name }}
|
||||
{{- .template | nindent 20 }}
|
||||
EOF
|
||||
/bin/ollama create {{ .name }} -f {{ include "ollama.modelsMountPath" . }}/{{ .name }}
|
||||
{{- end }}
|
||||
{{- if .configMapRef }}
|
||||
/bin/ollama create {{ .name }} -f /models/{{ .name }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
|
||||
{{- if .Values.ollama.models.run }}
|
||||
{{- range .Values.ollama.models.run }}
|
||||
/bin/ollama run {{ . }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
volumes:
|
||||
- name: ollama-data
|
||||
{{- if .Values.persistentVolume.enabled }}
|
||||
persistentVolumeClaim:
|
||||
claimName: {{ .Values.persistentVolume.existingClaim | default (printf "%s" (include "ollama.fullname" .)) }}
|
||||
{{- else }}
|
||||
emptyDir: { }
|
||||
{{- end }}
|
||||
{{- range .Values.ollama.models.create }}
|
||||
{{- if .configMapRef }}
|
||||
- name: {{ .name }}-config-model-volume
|
||||
configMap:
|
||||
name: {{ .configMapRef }}
|
||||
items:
|
||||
- key: {{ .configMapKeyRef }}
|
||||
path: {{ .name }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- with .Values.volumes }}
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- with .Values.nodeSelector }}
|
||||
nodeSelector:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- with .Values.affinity }}
|
||||
affinity:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- with .Values.topologySpreadConstraints }}
|
||||
topologySpreadConstraints:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- if or .Values.ollama.gpu.enabled .Values.tolerations }}
|
||||
tolerations:
|
||||
{{- if and .Values.ollama.gpu.enabled (or (eq .Values.ollama.gpu.type "nvidia") (not .Values.ollama.gpu.type)) }}
|
||||
- key: "{{(.Values.ollama.gpu.nvidiaResource | default "nvidia.com/gpu")}}"
|
||||
operator: Exists
|
||||
effect: NoSchedule
|
||||
{{- end }}
|
||||
{{- with .Values.tolerations }}
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
@ -0,0 +1,33 @@
|
||||
{{- if (and .Values.persistentVolume.enabled (not .Values.persistentVolume.existingClaim)) -}}
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: PersistentVolumeClaim
|
||||
metadata:
|
||||
{{- if .Values.persistentVolume.annotations }}
|
||||
annotations:
|
||||
{{ toYaml .Values.persistentVolume.annotations | indent 4 }}
|
||||
{{- end }}
|
||||
labels:
|
||||
{{- include "ollama.labels" . | nindent 4 }}
|
||||
name: {{ template "ollama.fullname" . }}
|
||||
namespace: {{ include "ollama.namespace" . }}
|
||||
spec:
|
||||
accessModes:
|
||||
{{ toYaml .Values.persistentVolume.accessModes | indent 4 }}
|
||||
{{- if .Values.persistentVolume.storageClass }}
|
||||
{{- if (eq "-" .Values.persistentVolume.storageClass) }}
|
||||
storageClassName: ""
|
||||
{{- else }}
|
||||
storageClassName: "{{ .Values.persistentVolume.storageClass }}"
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- if .Values.persistentVolume.volumeMode }}
|
||||
volumeMode: "{{ .Values.persistentVolume.volumeMode }}"
|
||||
{{- end }}
|
||||
{{- if .Values.persistentVolume.volumeName }}
|
||||
volumeName: "{{ .Values.persistentVolume.volumeName }}"
|
||||
{{- end }}
|
||||
resources:
|
||||
requests:
|
||||
storage: "{{ .Values.persistentVolume.size }}"
|
||||
{{- end -}}
|
||||
@ -0,0 +1,19 @@
|
||||
{{- if and .Values.ollama.gpu.enabled .Values.ollama.gpu.draEnabled (not .Values.ollama.gpu.draExistingClaimTemplate) -}}
|
||||
---
|
||||
{{- if semverCompare ">=1.34-0" .Capabilities.KubeVersion.GitVersion }}
|
||||
apiVersion: resource.k8s.io/v1
|
||||
{{- else }}
|
||||
apiVersion: resource.k8s.io/v1beta1
|
||||
{{- end }}
|
||||
kind: ResourceClaimTemplate
|
||||
metadata:
|
||||
name: {{ template "ollama.fullname" . }}
|
||||
namespace: {{ include "ollama.namespace" . }}
|
||||
spec:
|
||||
spec:
|
||||
devices:
|
||||
requests:
|
||||
- name: gpu
|
||||
deviceClassName: {{ .Values.ollama.gpu.draDriverClass }}
|
||||
count: {{(.Values.ollama.gpu.number | default 1)}}
|
||||
{{- end -}}
|
||||
@ -0,0 +1,32 @@
|
||||
---
|
||||
{{- if not .Values.knative.enabled }}
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: {{ include "ollama.fullname" . }}
|
||||
namespace: {{ include "ollama.namespace" . }}
|
||||
labels:
|
||||
{{- include "ollama.labels" . | nindent 4 }}
|
||||
{{- with .Values.service.labels }}
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
{{- with .Values.service.annotations }}
|
||||
annotations:
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
spec:
|
||||
type: {{ .Values.service.type }}
|
||||
ports:
|
||||
- port: {{ .Values.service.port }}
|
||||
targetPort: http
|
||||
protocol: TCP
|
||||
name: http
|
||||
{{- if contains "NodePort" .Values.service.type }}
|
||||
nodePort: {{ .Values.service.nodePort }}
|
||||
{{- end }}
|
||||
{{- if .Values.service.loadBalancerIP }}
|
||||
loadBalancerIP: {{ .Values.service.loadBalancerIP | quote }}
|
||||
{{- end }}
|
||||
selector:
|
||||
{{- include "ollama.selectorLabels" . | nindent 4 }}
|
||||
{{- end }}
|
||||
@ -0,0 +1,15 @@
|
||||
{{- if .Values.serviceAccount.create -}}
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: ServiceAccount
|
||||
metadata:
|
||||
name: {{ include "ollama.serviceAccountName" . }}
|
||||
namespace: {{ include "ollama.namespace" . }}
|
||||
labels:
|
||||
{{- include "ollama.labels" . | nindent 4 }}
|
||||
{{- with .Values.serviceAccount.annotations }}
|
||||
annotations:
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
automountServiceAccountToken: {{ .Values.serviceAccount.automount }}
|
||||
{{- end }}
|
||||
@ -0,0 +1,25 @@
|
||||
---
|
||||
{{- if .Values.tests.enabled }}
|
||||
apiVersion: v1
|
||||
kind: Pod
|
||||
metadata:
|
||||
name: "{{ include "ollama.fullname" . }}-test-connection"
|
||||
namespace: {{ include "ollama.namespace" . }}
|
||||
labels:
|
||||
{{- include "ollama.labels" . | nindent 4 }}
|
||||
{{- with .Values.tests.labels }}
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
annotations:
|
||||
"helm.sh/hook": test
|
||||
{{- with .Values.tests.annotations }}
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
spec:
|
||||
containers:
|
||||
- name: wget
|
||||
image: busybox
|
||||
command: ['wget']
|
||||
args: ['{{ include "ollama.fullname" . }}:{{ .Values.service.port }}']
|
||||
restartPolicy: Never
|
||||
{{ end }}
|
||||
440
charts/open-webui/charts/ollama/.ollama-helm/values.yaml
Normal file
440
charts/open-webui/charts/ollama/.ollama-helm/values.yaml
Normal file
@ -0,0 +1,440 @@
|
||||
# Default values for ollama-helm.
|
||||
# This is a YAML-formatted file.
|
||||
# Declare variables to be passed into your templates.
|
||||
|
||||
# -- Number of replicas
|
||||
replicaCount: 1
|
||||
|
||||
# Knative configuration
|
||||
knative:
|
||||
# -- Enable Knative integration
|
||||
enabled: false
|
||||
# -- Knative service container concurrency
|
||||
containerConcurrency: 0
|
||||
# -- Knative service timeout seconds
|
||||
timeoutSeconds: 300
|
||||
# -- Knative service response start timeout seconds
|
||||
responseStartTimeoutSeconds: 300
|
||||
# -- Knative service idle timeout seconds
|
||||
idleTimeoutSeconds: 300
|
||||
# -- Knative service annotations
|
||||
annotations: {}
|
||||
|
||||
# Docker image
|
||||
image:
|
||||
# -- Docker image registry
|
||||
repository: ollama/ollama
|
||||
|
||||
# -- Docker pull policy
|
||||
pullPolicy: IfNotPresent
|
||||
|
||||
# -- Docker image tag, overrides the image tag whose default is the chart appVersion.
|
||||
tag: ""
|
||||
|
||||
# -- Docker registry secret names as an array
|
||||
imagePullSecrets: []
|
||||
|
||||
# -- String to partially override template (will maintain the release name)
|
||||
nameOverride: ""
|
||||
|
||||
# -- String to fully override template
|
||||
fullnameOverride: ""
|
||||
|
||||
# -- String to fully override namespace
|
||||
namespaceOverride: ""
|
||||
|
||||
# Ollama parameters
|
||||
ollama:
|
||||
# Port Ollama is listening on
|
||||
port: 11434
|
||||
|
||||
gpu:
|
||||
# -- Enable GPU integration
|
||||
enabled: false
|
||||
|
||||
# -- Enable DRA GPU integration
|
||||
# If enabled, it will use DRA instead of Device Driver Plugin and create a ResourceClaim and GpuClaimParameters
|
||||
draEnabled: false
|
||||
|
||||
# -- DRA GPU DriverClass
|
||||
draDriverClass: "gpu.nvidia.com"
|
||||
|
||||
# -- Existing DRA GPU ResourceClaim Template
|
||||
draExistingClaimTemplate: ""
|
||||
|
||||
# -- GPU type: 'nvidia' or 'amd'
|
||||
# If 'ollama.gpu.enabled', default value is nvidia
|
||||
# If set to 'amd', this will add 'rocm' suffix to image tag if 'image.tag' is not override
|
||||
# This is due cause AMD and CPU/CUDA are different images
|
||||
type: 'nvidia'
|
||||
|
||||
# -- Specify the number of GPU
|
||||
# If you use MIG section below then this parameter is ignored
|
||||
number: 1
|
||||
|
||||
# -- only for nvidia cards; change to (example) 'nvidia.com/mig-1g.10gb' to use MIG slice
|
||||
nvidiaResource: "nvidia.com/gpu"
|
||||
# nvidiaResource: "nvidia.com/mig-1g.10gb" # example
|
||||
# If you want to use more than one NVIDIA MIG you can use the following syntax (then nvidiaResource is ignored and only the configuration in the following MIG section is used)
|
||||
|
||||
mig:
|
||||
# -- Enable multiple mig devices
|
||||
# If enabled you will have to specify the mig devices
|
||||
# If enabled is set to false this section is ignored
|
||||
enabled: false
|
||||
|
||||
# -- Specify the mig devices and the corresponding number
|
||||
devices: {}
|
||||
# 1g.10gb: 1
|
||||
# 3g.40gb: 1
|
||||
|
||||
models:
|
||||
# -- List of models to pull at container startup
|
||||
# The more you add, the longer the container will take to start if models are not present
|
||||
# pull:
|
||||
# - llama2
|
||||
# - mistral
|
||||
pull: []
|
||||
|
||||
# -- List of models to load in memory at container startup
|
||||
# run:
|
||||
# - llama2
|
||||
# - mistral
|
||||
run: []
|
||||
|
||||
# -- List of models to create at container startup, there are two options
|
||||
# 1. Create a raw model
|
||||
# 2. Load a model from configMaps, configMaps must be created before and are loaded as volume in "/models" directory.
|
||||
# create:
|
||||
# - name: llama3.1-ctx32768
|
||||
# configMapRef: my-configmap
|
||||
# configMapKeyRef: configmap-key
|
||||
# - name: llama3.1-ctx32768
|
||||
# template: |
|
||||
# FROM llama3.1
|
||||
# PARAMETER num_ctx 32768
|
||||
create: []
|
||||
|
||||
# -- Automatically remove models present on the disk but not specified in the values file
|
||||
clean: false
|
||||
|
||||
# -- Add insecure flag for pulling at container startup
|
||||
insecure: false
|
||||
|
||||
# -- Override ollama-data volume mount path, default: "/root/.ollama"
|
||||
mountPath: ""
|
||||
|
||||
# Service account
|
||||
# ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/
|
||||
serviceAccount:
|
||||
# -- Specifies whether a service account should be created
|
||||
create: true
|
||||
|
||||
# -- Automatically mount a ServiceAccount's API credentials?
|
||||
automount: true
|
||||
|
||||
# -- Annotations to add to the service account
|
||||
annotations: {}
|
||||
|
||||
# -- The name of the service account to use.
|
||||
# If not set and create is true, a name is generated using the fullname template
|
||||
name: ""
|
||||
|
||||
# -- Map of annotations to add to the pods
|
||||
podAnnotations: {}
|
||||
|
||||
# -- Map of labels to add to the pods
|
||||
podLabels: {}
|
||||
|
||||
# -- Pod Security Context
|
||||
podSecurityContext: {}
|
||||
# fsGroup: 2000
|
||||
|
||||
# -- Priority Class Name
|
||||
priorityClassName: ""
|
||||
|
||||
# -- Container Security Context
|
||||
securityContext: {}
|
||||
# capabilities:
|
||||
# drop:
|
||||
# - ALL
|
||||
# readOnlyRootFilesystem: true
|
||||
# runAsNonRoot: true
|
||||
# runAsUser: 1000
|
||||
|
||||
# -- Specify runtime class
|
||||
runtimeClassName: ""
|
||||
|
||||
# Configure Service
|
||||
service:
|
||||
|
||||
# -- Service type
|
||||
type: ClusterIP
|
||||
|
||||
# -- Service port
|
||||
port: 11434
|
||||
|
||||
# -- Service node port when service type is 'NodePort'
|
||||
nodePort: 31434
|
||||
|
||||
# -- Load Balancer IP address
|
||||
loadBalancerIP:
|
||||
|
||||
# -- Annotations to add to the service
|
||||
annotations: {}
|
||||
|
||||
# -- Labels to add to the service
|
||||
labels: {}
|
||||
|
||||
# Configure Deployment
|
||||
deployment:
|
||||
|
||||
# -- Labels to add to the deployment
|
||||
labels: {}
|
||||
|
||||
# Configure the ingress resource that allows you to access the
|
||||
ingress:
|
||||
# -- Enable ingress controller resource
|
||||
enabled: false
|
||||
|
||||
# -- IngressClass that will be used to implement the Ingress (Kubernetes 1.18+)
|
||||
className: ""
|
||||
|
||||
# -- Additional annotations for the Ingress resource.
|
||||
annotations: {}
|
||||
# kubernetes.io/ingress.class: traefik
|
||||
# kubernetes.io/ingress.class: nginx
|
||||
# kubernetes.io/tls-acme: "true"
|
||||
|
||||
# The list of hostnames to be covered with this ingress record.
|
||||
hosts:
|
||||
- host: ollama.local
|
||||
paths:
|
||||
- path: /
|
||||
pathType: Prefix
|
||||
|
||||
# -- The tls configuration for hostnames to be covered with this ingress record.
|
||||
tls: []
|
||||
# - secretName: chart-example-tls
|
||||
# hosts:
|
||||
# - chart-example.local
|
||||
|
||||
# Configure resource requests and limits
|
||||
# ref: http://kubernetes.io/docs/user-guide/compute-resources/
|
||||
resources:
|
||||
# -- Pod requests
|
||||
requests: {}
|
||||
# Memory request
|
||||
# memory: 4096Mi
|
||||
|
||||
# CPU request
|
||||
# cpu: 2000m
|
||||
|
||||
# -- Pod limit
|
||||
limits: {}
|
||||
# Memory limit
|
||||
# memory: 8192Mi
|
||||
|
||||
# CPU limit
|
||||
# cpu: 4000m
|
||||
|
||||
# Configure extra options for liveness probe
|
||||
# ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes
|
||||
livenessProbe:
|
||||
# -- Enable livenessProbe
|
||||
enabled: true
|
||||
|
||||
# -- Request path for livenessProbe
|
||||
path: /
|
||||
|
||||
# -- Initial delay seconds for livenessProbe
|
||||
initialDelaySeconds: 60
|
||||
|
||||
# -- Period seconds for livenessProbe
|
||||
periodSeconds: 10
|
||||
|
||||
# -- Timeout seconds for livenessProbe
|
||||
timeoutSeconds: 5
|
||||
|
||||
# -- Failure threshold for livenessProbe
|
||||
failureThreshold: 6
|
||||
|
||||
# -- Success threshold for livenessProbe
|
||||
successThreshold: 1
|
||||
|
||||
# Configure extra options for readiness probe
|
||||
# ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes
|
||||
readinessProbe:
|
||||
# -- Enable readinessProbe
|
||||
enabled: true
|
||||
|
||||
# -- Request path for readinessProbe
|
||||
path: /
|
||||
|
||||
# -- Initial delay seconds for readinessProbe
|
||||
initialDelaySeconds: 30
|
||||
|
||||
# -- Period seconds for readinessProbe
|
||||
periodSeconds: 5
|
||||
|
||||
# -- Timeout seconds for readinessProbe
|
||||
timeoutSeconds: 3
|
||||
|
||||
# -- Failure threshold for readinessProbe
|
||||
failureThreshold: 6
|
||||
|
||||
# -- Success threshold for readinessProbe
|
||||
successThreshold: 1
|
||||
|
||||
# Configure autoscaling
|
||||
autoscaling:
|
||||
# -- Enable autoscaling
|
||||
enabled: false
|
||||
|
||||
# -- Number of minimum replicas
|
||||
minReplicas: 1
|
||||
|
||||
# -- Number of maximum replicas
|
||||
maxReplicas: 100
|
||||
|
||||
# -- CPU usage to target replica
|
||||
targetCPUUtilizationPercentage: 80
|
||||
|
||||
# -- targetMemoryUtilizationPercentage: 80
|
||||
|
||||
# -- Additional volumes on the output Deployment definition.
|
||||
volumes: []
|
||||
# -- - name: foo
|
||||
# secret:
|
||||
# secretName: mysecret
|
||||
# optional: false
|
||||
|
||||
# -- Additional volumeMounts on the output Deployment definition.
|
||||
volumeMounts: []
|
||||
# -- - name: foo
|
||||
# mountPath: "/etc/foo"
|
||||
# readOnly: true
|
||||
|
||||
# -- Additional arguments on the output Deployment definition.
|
||||
extraArgs: []
|
||||
|
||||
# -- Additional environments variables on the output Deployment definition.
|
||||
# For extra OLLAMA env, please refer to https://github.com/ollama/ollama/blob/main/envconfig/config.go
|
||||
extraEnv: []
|
||||
# - name: OLLAMA_DEBUG
|
||||
# value: "1"
|
||||
|
||||
# -- Additionl environment variables from external sources (like ConfigMap)
|
||||
extraEnvFrom: []
|
||||
# - configMapRef:
|
||||
# name: my-env-configmap
|
||||
|
||||
# Enable persistence using Persistent Volume Claims
|
||||
# ref: https://kubernetes.io/docs/concepts/storage/persistent-volumes/
|
||||
persistentVolume:
|
||||
# -- Enable persistence using PVC
|
||||
enabled: false
|
||||
|
||||
# -- Ollama server data Persistent Volume access modes
|
||||
# Must match those of existing PV or dynamic provisioner
|
||||
# Ref: http://kubernetes.io/docs/user-guide/persistent-volumes/
|
||||
accessModes:
|
||||
- ReadWriteOnce
|
||||
|
||||
# -- Ollama server data Persistent Volume annotations
|
||||
annotations: {}
|
||||
|
||||
# -- If you'd like to bring your own PVC for persisting Ollama state, pass the name of the
|
||||
# created + ready PVC here. If set, this Chart will not create the default PVC.
|
||||
# Requires server.persistentVolume.enabled: true
|
||||
existingClaim: ""
|
||||
|
||||
# -- Ollama server data Persistent Volume size
|
||||
size: 30Gi
|
||||
|
||||
# -- Ollama server data Persistent Volume Storage Class
|
||||
# If defined, storageClassName: <storageClass>
|
||||
# If set to "-", storageClassName: "", which disables dynamic provisioning
|
||||
# If undefined (the default) or set to null, no storageClassName spec is
|
||||
# set, choosing the default provisioner. (gp2 on AWS, standard on
|
||||
# GKE, AWS & OpenStack)
|
||||
storageClass: ""
|
||||
|
||||
# -- Ollama server data Persistent Volume Binding Mode
|
||||
# If defined, volumeMode: <volumeMode>
|
||||
# If empty (the default) or set to null, no volumeBindingMode spec is
|
||||
# set, choosing the default mode.
|
||||
volumeMode: ""
|
||||
|
||||
# -- Subdirectory of Ollama server data Persistent Volume to mount
|
||||
# Useful if the volume's root directory is not empty
|
||||
subPath: ""
|
||||
|
||||
# -- Pre-existing PV to attach this claim to
|
||||
# Useful if a CSI auto-provisions a PV for you and you want to always
|
||||
# reference the PV moving forward
|
||||
volumeName: ""
|
||||
|
||||
# -- Node labels for pod assignment.
|
||||
nodeSelector: {}
|
||||
|
||||
# -- Tolerations for pod assignment
|
||||
tolerations: []
|
||||
|
||||
# -- Affinity for pod assignment
|
||||
affinity: {}
|
||||
|
||||
# -- Lifecycle for pod assignment (override ollama.models startup pull/run)
|
||||
lifecycle: {}
|
||||
|
||||
# How to replace existing pods
|
||||
updateStrategy:
|
||||
# -- Deployment strategy can be "Recreate" or "RollingUpdate". Default is Recreate
|
||||
type: "Recreate"
|
||||
|
||||
# -- Topology Spread Constraints for pod assignment
|
||||
topologySpreadConstraints: {}
|
||||
|
||||
# -- Wait for a grace period
|
||||
terminationGracePeriodSeconds: 120
|
||||
|
||||
# -- Init containers to add to the pod
|
||||
initContainers: []
|
||||
# - name: startup-tool
|
||||
# image: alpine:3
|
||||
# command: [sh, -c]
|
||||
# args:
|
||||
# - echo init
|
||||
|
||||
# -- Use the host’s ipc namespace.
|
||||
hostIPC: false
|
||||
|
||||
# -- Use the host’s pid namespace
|
||||
hostPID: false
|
||||
|
||||
# -- Use the host's network namespace.
|
||||
hostNetwork: false
|
||||
|
||||
# -- Extra K8s manifests to deploy
|
||||
extraObjects: []
|
||||
# - apiVersion: v1
|
||||
# kind: PersistentVolume
|
||||
# metadata:
|
||||
# name: aws-efs
|
||||
# data:
|
||||
# key: "value"
|
||||
# - apiVersion: scheduling.k8s.io/v1
|
||||
# kind: PriorityClass
|
||||
# metadata:
|
||||
# name: high-priority
|
||||
# value: 1000000
|
||||
# globalDefault: false
|
||||
# description: "This priority class should be used for XYZ service pods only."
|
||||
|
||||
# Test connection pods
|
||||
tests:
|
||||
enabled: true
|
||||
# -- Labels to add to the tests
|
||||
labels: {}
|
||||
# -- Annotations to add to the tests
|
||||
annotations: {}
|
||||
28
charts/open-webui/charts/ollama/Chart.yaml
Normal file
28
charts/open-webui/charts/ollama/Chart.yaml
Normal file
@ -0,0 +1,28 @@
|
||||
annotations:
|
||||
artifacthub.io/category: ai-machine-learning
|
||||
artifacthub.io/changes: |
|
||||
- kind: changed
|
||||
description: upgrade app version to 0.12.9
|
||||
links:
|
||||
- name: Ollama release v0.12.9
|
||||
url: https://github.com/ollama/ollama/releases/tag/v0.12.9
|
||||
apiVersion: v2
|
||||
appVersion: 0.12.9
|
||||
description: Get up and running with large language models locally.
|
||||
home: https://ollama.ai/
|
||||
icon: https://ollama.ai/public/ollama.png
|
||||
keywords:
|
||||
- ai
|
||||
- llm
|
||||
- llama
|
||||
- mistral
|
||||
kubeVersion: ^1.16.0-0
|
||||
maintainers:
|
||||
- email: contact@otwld.com
|
||||
name: OTWLD
|
||||
name: ollama
|
||||
sources:
|
||||
- https://github.com/ollama/ollama
|
||||
- https://github.com/otwld/ollama-helm
|
||||
type: application
|
||||
version: 1.33.0
|
||||
21
charts/open-webui/charts/ollama/LICENSE
Normal file
21
charts/open-webui/charts/ollama/LICENSE
Normal file
@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2024 OTWLD
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
331
charts/open-webui/charts/ollama/README.md
Normal file
331
charts/open-webui/charts/ollama/README.md
Normal file
@ -0,0 +1,331 @@
|
||||

|
||||
|
||||

|
||||
[](https://artifacthub.io/packages/helm/ollama-helm/ollama)
|
||||
[](https://github.com/otwld/ollama-helm/actions/workflows/ci.yaml)
|
||||
[](https://discord.gg/U24mpqTynB)
|
||||
|
||||
[Ollama](https://ollama.ai/), get up and running with large language models, locally.
|
||||
|
||||
This Community Chart is for deploying [Ollama](https://github.com/ollama/ollama).
|
||||
|
||||
## Requirements
|
||||
|
||||
- Kubernetes: `>= 1.16.0-0` for **CPU only**
|
||||
|
||||
- Kubernetes: `>= 1.26.0-0` for **GPU** stable support (NVIDIA and AMD)
|
||||
|
||||
*Not all GPUs are currently supported with ollama (especially with AMD)*
|
||||
|
||||
## Deploying Ollama chart
|
||||
|
||||
To install the `ollama` chart in the `ollama` namespace:
|
||||
|
||||
> [!IMPORTANT]
|
||||
> We are migrating the registry from https://otwld.github.io/ollama-helm/ url to OTWLD Helm central
|
||||
> registry https://helm.otwld.com/
|
||||
> Please update your Helm registry accordingly.
|
||||
|
||||
```console
|
||||
helm repo add otwld https://helm.otwld.com/
|
||||
helm repo update
|
||||
helm install ollama otwld/ollama --namespace ollama --create-namespace
|
||||
```
|
||||
|
||||
## Upgrading Ollama chart
|
||||
|
||||
First please read the [release notes](https://github.com/ollama/ollama/releases) of Ollama to make sure there are no
|
||||
backwards incompatible changes.
|
||||
|
||||
Make adjustments to your values as needed, then run `helm upgrade`:
|
||||
|
||||
```console
|
||||
# -- This pulls the latest version of the ollama chart from the repo.
|
||||
helm repo update
|
||||
helm upgrade ollama otwld/ollama --namespace ollama --values values.yaml
|
||||
```
|
||||
|
||||
## Uninstalling Ollama chart
|
||||
|
||||
To uninstall/delete the `ollama` deployment in the `ollama` namespace:
|
||||
|
||||
```console
|
||||
helm delete ollama --namespace ollama
|
||||
```
|
||||
|
||||
Substitute your values if they differ from the examples. See `helm delete --help` for a full reference on `delete`
|
||||
parameters and flags.
|
||||
|
||||
## Interact with Ollama
|
||||
|
||||
- **Ollama documentation can be found [HERE](https://github.com/ollama/ollama/tree/main/docs)**
|
||||
- Interact with RESTful API: [Ollama API](https://github.com/ollama/ollama/blob/main/docs/api.md)
|
||||
- Interact with official clients libraries: [ollama-js](https://github.com/ollama/ollama-js#custom-client)
|
||||
and [ollama-python](https://github.com/ollama/ollama-python#custom-client)
|
||||
- Interact with langchain: [langchain-js](https://github.com/ollama/ollama/blob/main/docs/tutorials/langchainjs.md)
|
||||
and [langchain-python](https://github.com/ollama/ollama/blob/main/docs/tutorials/langchainpy.md)
|
||||
|
||||
## Examples
|
||||
|
||||
- **It's highly recommended to run an updated version of Kubernetes for deploying ollama with GPU**
|
||||
|
||||
### Basic values.yaml example with GPU and two models pulled at startup
|
||||
|
||||
```
|
||||
ollama:
|
||||
gpu:
|
||||
# -- Enable GPU integration
|
||||
enabled: true
|
||||
|
||||
# -- GPU type: 'nvidia' or 'amd'
|
||||
type: 'nvidia'
|
||||
|
||||
# -- Specify the number of GPU to 1
|
||||
number: 1
|
||||
|
||||
# -- List of models to pull at container startup
|
||||
models:
|
||||
pull:
|
||||
- mistral
|
||||
- llama2
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Basic values.yaml example with Ingress
|
||||
|
||||
```
|
||||
ollama:
|
||||
models:
|
||||
pull:
|
||||
- llama2
|
||||
|
||||
ingress:
|
||||
enabled: true
|
||||
hosts:
|
||||
- host: ollama.domain.lan
|
||||
paths:
|
||||
- path: /
|
||||
pathType: Prefix
|
||||
```
|
||||
|
||||
- *API is now reachable at `ollama.domain.lan`*
|
||||
|
||||
---
|
||||
|
||||
### Create and run model from template
|
||||
|
||||
```
|
||||
ollama:
|
||||
models:
|
||||
create:
|
||||
- name: llama3.1-ctx32768
|
||||
template: |
|
||||
FROM llama3.1
|
||||
PARAMETER num_ctx 32768
|
||||
run:
|
||||
- llama3.1-ctx32768
|
||||
```
|
||||
|
||||
## Upgrading from 0.X.X to 1.X.X
|
||||
|
||||
The version 1.X.X introduces the ability to load models in memory at startup, the values have been changed.
|
||||
|
||||
Please change `ollama.models` to `ollama.models.pull` to avoid errors before upgrading:
|
||||
|
||||
```yaml
|
||||
ollama:
|
||||
models:
|
||||
- mistral
|
||||
- llama2
|
||||
```
|
||||
|
||||
To:
|
||||
|
||||
```yaml
|
||||
ollama:
|
||||
models:
|
||||
pull:
|
||||
- mistral
|
||||
- llama2
|
||||
```
|
||||
|
||||
## Helm Values
|
||||
|
||||
- See [values.yaml](values.yaml) to see the Chart's default values.
|
||||
|
||||
| Key | Type | Default | Description |
|
||||
|--------------------------------------------|--------|---------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
|
||||
| affinity | object | `{}` | Affinity for pod assignment |
|
||||
| autoscaling.enabled | bool | `false` | Enable autoscaling |
|
||||
| autoscaling.maxReplicas | int | `100` | Number of maximum replicas |
|
||||
| autoscaling.minReplicas | int | `1` | Number of minimum replicas |
|
||||
| autoscaling.targetCPUUtilizationPercentage | int | `80` | CPU usage to target replica |
|
||||
| deployment.labels | object | `{}` | Labels to add to the deployment |
|
||||
| extraArgs | list | `[]` | Additional arguments on the output Deployment definition. |
|
||||
| extraEnv | list | `[]` | Additional environments variables on the output Deployment definition. For extra OLLAMA env, please refer to https://github.com/ollama/ollama/blob/main/envconfig/config.go |
|
||||
| extraEnvFrom | list | `[]` | Additionl environment variables from external sources (like ConfigMap) |
|
||||
| extraObjects | list | `[]` | Extra K8s manifests to deploy |
|
||||
| fullnameOverride | string | `""` | String to fully override template |
|
||||
| hostIPC | bool | `false` | Use the host’s ipc namespace. |
|
||||
| hostNetwork | bool | `false` | Use the host's network namespace. |
|
||||
| hostPID | bool | `false` | Use the host’s pid namespace |
|
||||
| image.pullPolicy | string | `"IfNotPresent"` | Docker pull policy |
|
||||
| image.repository | string | `"ollama/ollama"` | Docker image registry |
|
||||
| image.tag | string | `""` | Docker image tag, overrides the image tag whose default is the chart appVersion. |
|
||||
| imagePullSecrets | list | `[]` | Docker registry secret names as an array |
|
||||
| ingress.annotations | object | `{}` | Additional annotations for the Ingress resource. |
|
||||
| ingress.className | string | `""` | IngressClass that will be used to implement the Ingress (Kubernetes 1.18+) |
|
||||
| ingress.enabled | bool | `false` | Enable ingress controller resource |
|
||||
| ingress.hosts[0].host | string | `"ollama.local"` | |
|
||||
| ingress.hosts[0].paths[0].path | string | `"/"` | |
|
||||
| ingress.hosts[0].paths[0].pathType | string | `"Prefix"` | |
|
||||
| ingress.tls | list | `[]` | The tls configuration for hostnames to be covered with this ingress record. |
|
||||
| initContainers | list | `[]` | Init containers to add to the pod |
|
||||
| knative.annotations | object | `{}` | Knative service annotations |
|
||||
| knative.containerConcurrency | int | `0` | Knative service container concurrency |
|
||||
| knative.enabled | bool | `false` | Enable Knative integration |
|
||||
| knative.idleTimeoutSeconds | int | `300` | Knative service idle timeout seconds |
|
||||
| knative.responseStartTimeoutSeconds | int | `300` | Knative service response start timeout seconds |
|
||||
| knative.timeoutSeconds | int | `300` | Knative service timeout seconds |
|
||||
| lifecycle | object | `{}` | Lifecycle for pod assignment (override ollama.models startup pull/run) |
|
||||
| livenessProbe.enabled | bool | `true` | Enable livenessProbe |
|
||||
| livenessProbe.failureThreshold | int | `6` | Failure threshold for livenessProbe |
|
||||
| livenessProbe.initialDelaySeconds | int | `60` | Initial delay seconds for livenessProbe |
|
||||
| livenessProbe.path | string | `"/"` | Request path for livenessProbe |
|
||||
| livenessProbe.periodSeconds | int | `10` | Period seconds for livenessProbe |
|
||||
| livenessProbe.successThreshold | int | `1` | Success threshold for livenessProbe |
|
||||
| livenessProbe.timeoutSeconds | int | `5` | Timeout seconds for livenessProbe |
|
||||
| nameOverride | string | `""` | String to partially override template (will maintain the release name) |
|
||||
| namespaceOverride | string | `""` | String to fully override namespace |
|
||||
| nodeSelector | object | `{}` | Node labels for pod assignment. |
|
||||
| ollama.gpu.draDriverClass | string | `"gpu.nvidia.com"` | DRA GPU DriverClass |
|
||||
| ollama.gpu.draEnabled | bool | `false` | Enable DRA GPU integration If enabled, it will use DRA instead of Device Driver Plugin and create a ResourceClaim and GpuClaimParameters |
|
||||
| ollama.gpu.draExistingClaimTemplate | string | `""` | Existing DRA GPU ResourceClaim Template |
|
||||
| ollama.gpu.enabled | bool | `false` | Enable GPU integration |
|
||||
| ollama.gpu.mig.devices | object | `{}` | Specify the mig devices and the corresponding number |
|
||||
| ollama.gpu.mig.enabled | bool | `false` | Enable multiple mig devices If enabled you will have to specify the mig devices If enabled is set to false this section is ignored |
|
||||
| ollama.gpu.number | int | `1` | Specify the number of GPU If you use MIG section below then this parameter is ignored |
|
||||
| ollama.gpu.nvidiaResource | string | `"nvidia.com/gpu"` | only for nvidia cards; change to (example) 'nvidia.com/mig-1g.10gb' to use MIG slice |
|
||||
| ollama.gpu.type | string | `"nvidia"` | GPU type: 'nvidia' or 'amd' If 'ollama.gpu.enabled', default value is nvidia If set to 'amd', this will add 'rocm' suffix to image tag if 'image.tag' is not override This is due cause AMD and CPU/CUDA are different images |
|
||||
| ollama.insecure | bool | `false` | Add insecure flag for pulling at container startup |
|
||||
| ollama.models.clean | bool | `false` | Automatically remove models present on the disk but not specified in the values file |
|
||||
| ollama.models.create | list | `[]` | List of models to create at container startup, there are two options 1. Create a raw model 2. Load a model from configMaps, configMaps must be created before and are loaded as volume in "/models" directory. create: - name: llama3.1-ctx32768 configMapRef: my-configmap configMapKeyRef: configmap-key - name: llama3.1-ctx32768 template: | FROM llama3.1 PARAMETER num_ctx 32768 |
|
||||
| ollama.models.pull | list | `[]` | List of models to pull at container startup The more you add, the longer the container will take to start if models are not present pull: - llama2 - mistral |
|
||||
| ollama.models.run | list | `[]` | List of models to load in memory at container startup run: - llama2 - mistral |
|
||||
| ollama.mountPath | string | `""` | Override ollama-data volume mount path, default: "/root/.ollama" |
|
||||
| ollama.port | int | `11434` | |
|
||||
| persistentVolume.accessModes | list | `["ReadWriteOnce"]` | Ollama server data Persistent Volume access modes Must match those of existing PV or dynamic provisioner Ref: http://kubernetes.io/docs/user-guide/persistent-volumes/ |
|
||||
| persistentVolume.annotations | object | `{}` | Ollama server data Persistent Volume annotations |
|
||||
| persistentVolume.enabled | bool | `false` | Enable persistence using PVC |
|
||||
| persistentVolume.existingClaim | string | `""` | If you'd like to bring your own PVC for persisting Ollama state, pass the name of the created + ready PVC here. If set, this Chart will not create the default PVC. Requires server.persistentVolume.enabled: true |
|
||||
| persistentVolume.size | string | `"30Gi"` | Ollama server data Persistent Volume size |
|
||||
| persistentVolume.storageClass | string | `""` | Ollama server data Persistent Volume Storage Class If defined, storageClassName: <storageClass> If set to "-", storageClassName: "", which disables dynamic provisioning If undefined (the default) or set to null, no storageClassName spec is set, choosing the default provisioner. (gp2 on AWS, standard on GKE, AWS & OpenStack) |
|
||||
| persistentVolume.subPath | string | `""` | Subdirectory of Ollama server data Persistent Volume to mount Useful if the volume's root directory is not empty |
|
||||
| persistentVolume.volumeMode | string | `""` | Ollama server data Persistent Volume Binding Mode If defined, volumeMode: <volumeMode> If empty (the default) or set to null, no volumeBindingMode spec is set, choosing the default mode. |
|
||||
| persistentVolume.volumeName | string | `""` | Pre-existing PV to attach this claim to Useful if a CSI auto-provisions a PV for you and you want to always reference the PV moving forward |
|
||||
| podAnnotations | object | `{}` | Map of annotations to add to the pods |
|
||||
| podLabels | object | `{}` | Map of labels to add to the pods |
|
||||
| podSecurityContext | object | `{}` | Pod Security Context |
|
||||
| priorityClassName | string | `""` | Priority Class Name |
|
||||
| readinessProbe.enabled | bool | `true` | Enable readinessProbe |
|
||||
| readinessProbe.failureThreshold | int | `6` | Failure threshold for readinessProbe |
|
||||
| readinessProbe.initialDelaySeconds | int | `30` | Initial delay seconds for readinessProbe |
|
||||
| readinessProbe.path | string | `"/"` | Request path for readinessProbe |
|
||||
| readinessProbe.periodSeconds | int | `5` | Period seconds for readinessProbe |
|
||||
| readinessProbe.successThreshold | int | `1` | Success threshold for readinessProbe |
|
||||
| readinessProbe.timeoutSeconds | int | `3` | Timeout seconds for readinessProbe |
|
||||
| replicaCount | int | `1` | Number of replicas |
|
||||
| resources.limits | object | `{}` | Pod limit |
|
||||
| resources.requests | object | `{}` | Pod requests |
|
||||
| runtimeClassName | string | `""` | Specify runtime class |
|
||||
| securityContext | object | `{}` | Container Security Context |
|
||||
| service.annotations | object | `{}` | Annotations to add to the service |
|
||||
| service.labels | object | `{}` | Labels to add to the service |
|
||||
| service.loadBalancerIP | string | `nil` | Load Balancer IP address |
|
||||
| service.nodePort | int | `31434` | Service node port when service type is 'NodePort' |
|
||||
| service.port | int | `11434` | Service port |
|
||||
| service.type | string | `"ClusterIP"` | Service type |
|
||||
| serviceAccount.annotations | object | `{}` | Annotations to add to the service account |
|
||||
| serviceAccount.automount | bool | `true` | Automatically mount a ServiceAccount's API credentials? |
|
||||
| serviceAccount.create | bool | `true` | Specifies whether a service account should be created |
|
||||
| serviceAccount.name | string | `""` | The name of the service account to use. If not set and create is true, a name is generated using the fullname template |
|
||||
| terminationGracePeriodSeconds | int | `120` | Wait for a grace period |
|
||||
| tests.annotations | object | `{}` | Annotations to add to the tests |
|
||||
| tests.enabled | bool | `true` | |
|
||||
| tests.labels | object | `{}` | Labels to add to the tests |
|
||||
| tolerations | list | `[]` | Tolerations for pod assignment |
|
||||
| topologySpreadConstraints | object | `{}` | Topology Spread Constraints for pod assignment |
|
||||
| updateStrategy.type | string | `"Recreate"` | Deployment strategy can be "Recreate" or "RollingUpdate". Default is Recreate |
|
||||
| volumeMounts | list | `[]` | Additional volumeMounts on the output Deployment definition. |
|
||||
| volumes | list | `[]` | Additional volumes on the output Deployment definition. |
|
||||
|
||||
----------------------------------------------
|
||||
|
||||
## Core team
|
||||
|
||||
<table>
|
||||
<tr>
|
||||
<td align="center">
|
||||
<a href="https://github.com/jdetroyes"
|
||||
><img
|
||||
src="https://github.com/jdetroyes.png?size=200"
|
||||
width="50"
|
||||
style="margin-bottom: -4px; border-radius: 8px;"
|
||||
alt="Jean Baptiste Detroyes"
|
||||
/><br /><b> Jean Baptiste Detroyes </b></a
|
||||
>
|
||||
<div style="margin-top: 4px">
|
||||
<a href="https://github.com/jdetroyes" title="Github"
|
||||
><img
|
||||
width="16"
|
||||
src="https://raw.githubusercontent.com/MarsiBarsi/readme-icons/main/github.svg"
|
||||
/></a>
|
||||
<a
|
||||
href="mailto:jdetroyes@otwld.com"
|
||||
title="Email"
|
||||
><img
|
||||
width="16"
|
||||
src="https://raw.githubusercontent.com/MarsiBarsi/readme-icons/main/send.svg"
|
||||
/></a>
|
||||
</div>
|
||||
</td>
|
||||
<td align="center">
|
||||
<a href="https://github.com/ntrehout"
|
||||
><img
|
||||
src="https://github.com/ntrehout.png?size=200"
|
||||
width="50"
|
||||
style="margin-bottom: -4px; border-radius: 8px;"
|
||||
alt="Jean Baptiste Detroyes"
|
||||
/><br /><b> Nathan Tréhout </b></a
|
||||
>
|
||||
<div style="margin-top: 4px">
|
||||
<a href="https://x.com/n_trehout" title="Twitter"
|
||||
><img
|
||||
width="16"
|
||||
src="https://raw.githubusercontent.com/MarsiBarsi/readme-icons/main/twitter.svg"
|
||||
/></a>
|
||||
<a href="https://github.com/ntrehout" title="Github"
|
||||
><img
|
||||
width="16"
|
||||
src="https://raw.githubusercontent.com/MarsiBarsi/readme-icons/main/github.svg"
|
||||
/></a>
|
||||
<a
|
||||
href="mailto:ntrehout@otwld.com"
|
||||
title="Email"
|
||||
><img
|
||||
width="16"
|
||||
src="https://raw.githubusercontent.com/MarsiBarsi/readme-icons/main/send.svg"
|
||||
/></a>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
## Support
|
||||
|
||||
- For questions, suggestions, and discussion about Ollama please refer to
|
||||
the [Ollama issue page](https://github.com/ollama/ollama/issues)
|
||||
- For questions, suggestions, and discussion about this chart please
|
||||
visit [Ollama-Helm issue page](https://github.com/otwld/ollama-helm/issues) or join
|
||||
our [OTWLD Discord](https://discord.gg/U24mpqTynB)
|
||||
17
charts/open-webui/charts/ollama/artifacthub-repo.yml
Normal file
17
charts/open-webui/charts/ollama/artifacthub-repo.yml
Normal file
@ -0,0 +1,17 @@
|
||||
# Artifact Hub repository metadata file
|
||||
#
|
||||
# Some settings like the verified publisher flag or the ignored packages won't
|
||||
# be applied until the next time the repository is processed. Please keep in
|
||||
# mind that the repository won't be processed if it has not changed since the
|
||||
# last time it was processed. Depending on the repository kind, this is checked
|
||||
# in a different way. For Helm http based repositories, we consider it has
|
||||
# changed if the `index.yaml` file changes. For git based repositories, it does
|
||||
# when the hash of the last commit in the branch you set up changes. This does
|
||||
# NOT apply to ownership claim operations, which are processed immediately.
|
||||
#
|
||||
repositoryID: 2ccfd0bd-c123-483e-96f6-eb446fa850ac
|
||||
owners:
|
||||
- name: OTWLD
|
||||
email: tech@otwld.com
|
||||
- name: Jean-Baptiste DETROYES
|
||||
email: jean-baptiste@detroyes.fr
|
||||
BIN
charts/open-webui/charts/ollama/banner.png
Normal file
BIN
charts/open-webui/charts/ollama/banner.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 132 KiB |
25
charts/open-webui/charts/ollama/templates/NOTES.txt
Normal file
25
charts/open-webui/charts/ollama/templates/NOTES.txt
Normal file
@ -0,0 +1,25 @@
|
||||
1. Get the application URL by running these commands:
|
||||
{{- if .Values.knative.enabled }}
|
||||
export KSERVICE_URL=$(kubectl get ksvc --namespace {{ .Release.Namespace }} {{ include "ollama.fullname" . }} -o jsonpath={.status.url})
|
||||
echo "Visit $KSERVICE_URL to use your application"
|
||||
{{- else if .Values.ingress.enabled }}
|
||||
{{- range $host := .Values.ingress.hosts }}
|
||||
{{- range .paths }}
|
||||
http{{ if $.Values.ingress.tls }}s{{ end }}://{{ $host.host }}{{ .path }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- else if contains "NodePort" .Values.service.type }}
|
||||
export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "ollama.fullname" . }})
|
||||
export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}")
|
||||
echo http://$NODE_IP:$NODE_PORT
|
||||
{{- else if contains "LoadBalancer" .Values.service.type }}
|
||||
NOTE: It may take a few minutes for the LoadBalancer IP to be available.
|
||||
You can watch the status of by running 'kubectl get --namespace {{ .Release.Namespace }} svc -w {{ include "ollama.fullname" . }}'
|
||||
export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ include "ollama.fullname" . }} --template "{{"{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}"}}")
|
||||
echo http://$SERVICE_IP:{{ .Values.service.port }}
|
||||
{{- else if contains "ClusterIP" .Values.service.type }}
|
||||
export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app.kubernetes.io/name={{ include "ollama.name" . }},app.kubernetes.io/instance={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}")
|
||||
export CONTAINER_PORT=$(kubectl get pod --namespace {{ .Release.Namespace }} $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}")
|
||||
echo "Visit http://127.0.0.1:8080 to use your application"
|
||||
kubectl --namespace {{ .Release.Namespace }} port-forward $POD_NAME 8080:$CONTAINER_PORT
|
||||
{{- end }}
|
||||
80
charts/open-webui/charts/ollama/templates/_helpers.tpl
Normal file
80
charts/open-webui/charts/ollama/templates/_helpers.tpl
Normal file
@ -0,0 +1,80 @@
|
||||
{{/*
|
||||
Allow the release namespace to be overridden for multi-namespace deployments in combined charts
|
||||
*/}}
|
||||
{{- define "ollama.namespace" -}}
|
||||
{{- if .Values.namespaceOverride -}}
|
||||
{{- .Values.namespaceOverride -}}
|
||||
{{- else -}}
|
||||
{{- .Release.Namespace -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
|
||||
{{/*
|
||||
Expand the name of the chart.
|
||||
*/}}
|
||||
{{- define "ollama.name" -}}
|
||||
{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Create a default fully qualified app name.
|
||||
We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
|
||||
If release name contains chart name it will be used as a full name.
|
||||
*/}}
|
||||
{{- define "ollama.fullname" -}}
|
||||
{{- if .Values.fullnameOverride }}
|
||||
{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }}
|
||||
{{- else }}
|
||||
{{- $name := default .Chart.Name .Values.nameOverride }}
|
||||
{{- if contains $name .Release.Name }}
|
||||
{{- .Release.Name | trunc 63 | trimSuffix "-" }}
|
||||
{{- else }}
|
||||
{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Create chart name and version as used by the chart label.
|
||||
*/}}
|
||||
{{- define "ollama.chart" -}}
|
||||
{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Common labels
|
||||
*/}}
|
||||
{{- define "ollama.labels" -}}
|
||||
helm.sh/chart: {{ include "ollama.chart" . }}
|
||||
{{ include "ollama.selectorLabels" . }}
|
||||
{{- if .Chart.AppVersion }}
|
||||
app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
|
||||
{{- end }}
|
||||
app.kubernetes.io/managed-by: {{ .Release.Service }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Selector labels
|
||||
*/}}
|
||||
{{- define "ollama.selectorLabels" -}}
|
||||
app.kubernetes.io/name: {{ include "ollama.name" . }}
|
||||
app.kubernetes.io/instance: {{ .Release.Name }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Create the name of the service account to use
|
||||
*/}}
|
||||
{{- define "ollama.serviceAccountName" -}}
|
||||
{{- if .Values.serviceAccount.create }}
|
||||
{{- default (include "ollama.fullname" .) .Values.serviceAccount.name }}
|
||||
{{- else }}
|
||||
{{- default "default" .Values.serviceAccount.name }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Models mount path
|
||||
*/}}
|
||||
{{- define "ollama.modelsMountPath" -}}
|
||||
{{- printf "%s/models" (((.Values).ollama).mountPath | default "/root/.ollama") }}
|
||||
{{- end -}}
|
||||
293
charts/open-webui/charts/ollama/templates/deployment.yaml
Normal file
293
charts/open-webui/charts/ollama/templates/deployment.yaml
Normal file
@ -0,0 +1,293 @@
|
||||
---
|
||||
{{- if not .Values.knative.enabled }}
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: {{ include "ollama.fullname" . }}
|
||||
namespace: {{ include "ollama.namespace" . }}
|
||||
labels:
|
||||
{{- include "ollama.labels" . | nindent 4 }}
|
||||
{{- with .Values.deployment.labels }}
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
spec:
|
||||
{{- if not .Values.autoscaling.enabled }}
|
||||
replicas: {{ .Values.replicaCount }}
|
||||
{{- end }}
|
||||
{{- if or .Values.updateStrategy.type .Values.updateStrategy.rollingUpdate }}
|
||||
strategy: {{ .Values.updateStrategy | toYaml | nindent 4 }}
|
||||
{{- end }}
|
||||
selector:
|
||||
matchLabels:
|
||||
{{- include "ollama.selectorLabels" . | nindent 6 }}
|
||||
template:
|
||||
metadata:
|
||||
{{- with .Values.podAnnotations }}
|
||||
annotations:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
labels:
|
||||
{{- include "ollama.labels" . | nindent 8 }}
|
||||
{{- with .Values.podLabels }}
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
spec:
|
||||
{{- if .Values.hostIPC }}
|
||||
hostIPC: {{ .Values.hostIPC }}
|
||||
{{- end }}
|
||||
{{- if .Values.hostPID }}
|
||||
hostPID: {{ .Values.hostPID }}
|
||||
{{- end }}
|
||||
{{- if .Values.hostNetwork }}
|
||||
hostNetwork: {{ .Values.hostNetwork }}
|
||||
{{- end }}
|
||||
{{- with .Values.imagePullSecrets }}
|
||||
imagePullSecrets:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
serviceAccountName: {{ include "ollama.serviceAccountName" . }}
|
||||
{{- if .Values.priorityClassName }}
|
||||
priorityClassName: {{ .Values.priorityClassName | quote }}
|
||||
{{- end }}
|
||||
{{- if .Values.terminationGracePeriodSeconds }}
|
||||
terminationGracePeriodSeconds: {{ .Values.terminationGracePeriodSeconds }}
|
||||
{{- end }}
|
||||
securityContext:
|
||||
{{- toYaml .Values.podSecurityContext | nindent 8 }}
|
||||
{{- if .Values.runtimeClassName }}
|
||||
runtimeClassName: {{ .Values.runtimeClassName | quote }}
|
||||
{{- end }}
|
||||
{{- with .Values.initContainers }}
|
||||
initContainers:
|
||||
{{- tpl (toYaml . ) $ | nindent 8 }}
|
||||
{{- end }}
|
||||
containers:
|
||||
- name: {{ .Chart.Name }}
|
||||
securityContext:
|
||||
{{- toYaml .Values.securityContext | nindent 12 }}
|
||||
image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default (ternary (printf "%s-rocm" .Chart.AppVersion) (.Chart.AppVersion) (and (.Values.ollama.gpu.enabled) (eq .Values.ollama.gpu.type "amd"))) }}"
|
||||
imagePullPolicy: {{ .Values.image.pullPolicy }}
|
||||
ports:
|
||||
- name: http
|
||||
containerPort: {{ .Values.ollama.port }}
|
||||
protocol: TCP
|
||||
env:
|
||||
- name: OLLAMA_HOST
|
||||
value: "0.0.0.0:{{ .Values.ollama.port }}"
|
||||
{{- if and .Values.ollama.gpu.enabled (or (eq .Values.ollama.gpu.type "nvidia") (not .Values.ollama.gpu.type))}}
|
||||
- name: PATH
|
||||
value: /usr/local/nvidia/bin:/usr/local/cuda/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
|
||||
{{- end}}
|
||||
{{- with .Values.extraEnv }}
|
||||
{{- toYaml . | nindent 12 }}
|
||||
{{- end }}
|
||||
envFrom:
|
||||
{{- with .Values.extraEnvFrom }}
|
||||
{{- toYaml . | nindent 12 }}
|
||||
{{- end }}
|
||||
args:
|
||||
{{- with .Values.extraArgs }}
|
||||
{{- toYaml . | nindent 12 }}
|
||||
{{- end }}
|
||||
{{- if .Values.resources }}
|
||||
resources:
|
||||
{{- $limits := default dict .Values.resources.limits }}
|
||||
{{- if .Values.ollama.gpu.enabled }}
|
||||
{{- if .Values.ollama.gpu.draEnabled}}
|
||||
claims:
|
||||
- name: gpu
|
||||
{{- else }}
|
||||
# If gpu is enabled, it can either be a NVIDIA card or a AMD card
|
||||
{{- if or (eq .Values.ollama.gpu.type "nvidia") (not .Values.ollama.gpu.type) }}
|
||||
# NVIDIA is assumed by default if no value is set and GPU is enabled
|
||||
# NVIDIA cards can have mig enabled (i.e., the card is sliced into parts
|
||||
# Therefore, the first case is no migs enabled
|
||||
{{- if or (not .Values.ollama.gpu.mig) (not .Values.ollama.gpu.mig.enabled ) }}
|
||||
{{- $gpuLimit := dict (.Values.ollama.gpu.nvidiaResource | default "nvidia.com/gpu") (.Values.ollama.gpu.number | default 1) }}
|
||||
{{- $limits = merge $limits $gpuLimit }}
|
||||
# Second case is mig is enabled
|
||||
{{- else if or (.Values.ollama.gpu.mig.enabled) }}
|
||||
# Initialize empty dictionary
|
||||
{{- $migDevices := dict -}}
|
||||
# Loop over the entries in the mig devices
|
||||
{{- range $key, $value := .Values.ollama.gpu.mig.devices }}
|
||||
{{- $migKey := printf "nvidia.com/mig-%s" $key -}}
|
||||
{{- $migDevices = merge $migDevices (dict $migKey $value) -}}
|
||||
{{- end }}
|
||||
{{- $limits = merge $limits $migDevices}}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- if eq .Values.ollama.gpu.type "amd" }}
|
||||
{{- $gpuLimit := dict "amd.com/gpu" (.Values.ollama.gpu.number | default 1) }}
|
||||
{{- $limits = merge $limits $gpuLimit }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- $ressources := deepCopy (dict "limits" $limits) | mergeOverwrite .Values.resources }}
|
||||
{{- toYaml $ressources | nindent 12 }}
|
||||
{{- end}}
|
||||
volumeMounts:
|
||||
- name: ollama-data
|
||||
mountPath: {{ .Values.ollama.mountPath | default "/root/.ollama" }}
|
||||
{{- if .Values.persistentVolume.subPath }}
|
||||
subPath: {{ .Values.persistentVolume.subPath }}
|
||||
{{- end }}
|
||||
{{- range .Values.ollama.models.create }}
|
||||
{{- if .configMapRef }}
|
||||
- name: {{ .name }}-config-model-volume
|
||||
mountPath: /models
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- with .Values.volumeMounts }}
|
||||
{{- toYaml . | nindent 12 }}
|
||||
{{- end }}
|
||||
{{- if .Values.livenessProbe.enabled }}
|
||||
livenessProbe:
|
||||
httpGet:
|
||||
path: {{ .Values.livenessProbe.path }}
|
||||
port: http
|
||||
initialDelaySeconds: {{ .Values.livenessProbe.initialDelaySeconds }}
|
||||
periodSeconds: {{ .Values.livenessProbe.periodSeconds }}
|
||||
timeoutSeconds: {{ .Values.livenessProbe.timeoutSeconds }}
|
||||
successThreshold: {{ .Values.livenessProbe.successThreshold }}
|
||||
failureThreshold: {{ .Values.livenessProbe.failureThreshold }}
|
||||
{{- end }}
|
||||
{{- if .Values.readinessProbe.enabled }}
|
||||
readinessProbe:
|
||||
httpGet:
|
||||
path: {{ .Values.readinessProbe.path }}
|
||||
port: http
|
||||
initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }}
|
||||
periodSeconds: {{ .Values.readinessProbe.periodSeconds }}
|
||||
timeoutSeconds: {{ .Values.readinessProbe.timeoutSeconds }}
|
||||
successThreshold: {{ .Values.readinessProbe.successThreshold }}
|
||||
failureThreshold: {{ .Values.readinessProbe.failureThreshold }}
|
||||
{{- end }}
|
||||
{{- with .Values.lifecycle}}
|
||||
lifecycle:
|
||||
{{- toYaml . | nindent 12 }}
|
||||
{{- else }}
|
||||
{{- if or .Values.ollama.models.pull .Values.ollama.models.run .Values.ollama.models.create }}
|
||||
lifecycle:
|
||||
postStart:
|
||||
exec:
|
||||
command:
|
||||
- /bin/sh
|
||||
- -c
|
||||
- |
|
||||
while ! /bin/ollama ps > /dev/null 2>&1; do
|
||||
sleep 5
|
||||
done
|
||||
|
||||
{{- $allModels := list -}}
|
||||
|
||||
{{- if .Values.ollama.models.pull }}
|
||||
{{- range .Values.ollama.models.pull }}
|
||||
|
||||
{{- if contains ":" . }}
|
||||
{{- $allModels = append $allModels . }}
|
||||
{{- else }}
|
||||
{{- $allModels = append $allModels (printf "%s:latest" .) }}
|
||||
{{- end }}
|
||||
|
||||
/bin/ollama pull {{ternary "--insecure" "" $.Values.ollama.insecure | toString }} {{ . }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
|
||||
{{- if .Values.ollama.models.create }}
|
||||
{{- range .Values.ollama.models.create }}
|
||||
{{- $allModels = append $allModels .name }}
|
||||
{{- if .template }}
|
||||
cat <<EOF > {{ include "ollama.modelsMountPath" $ }}/{{ .name }}
|
||||
{{- .template | nindent 20 }}
|
||||
EOF
|
||||
/bin/ollama create {{ .name }} -f {{ include "ollama.modelsMountPath" $ }}/{{ .name }}
|
||||
{{- end }}
|
||||
{{- if .configMapRef }}
|
||||
/bin/ollama create {{ .name }} -f /models/{{ .name }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
|
||||
{{- if .Values.ollama.models.run }}
|
||||
{{- range .Values.ollama.models.run }}
|
||||
|
||||
{{- if contains ":" . }}
|
||||
{{- $allModels = append $allModels . }}
|
||||
{{- else }}
|
||||
{{- $allModels = append $allModels (printf "%s:latest" .) }}
|
||||
{{- end }}
|
||||
|
||||
/bin/ollama run {{ . }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
|
||||
{{- if .Values.ollama.models.clean }}
|
||||
/bin/ollama list | awk 'NR>1 {print $1}' | while read model; do
|
||||
echo "{{ $allModels | join " " }}" | tr ' ' '\n' | grep -Fqx "$model" || /bin/ollama rm "$model"
|
||||
done
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- if and .Values.ollama.gpu.enabled .Values.ollama.gpu.draEnabled }}
|
||||
resourceClaims:
|
||||
- name: gpu
|
||||
resourceClaimTemplateName: {{ .Values.ollama.gpu.draExistingClaimTemplate | default (printf "%s" (include "ollama.fullname" .)) }}
|
||||
{{- end }}
|
||||
volumes:
|
||||
- name: ollama-data
|
||||
{{- if .Values.persistentVolume.enabled }}
|
||||
persistentVolumeClaim:
|
||||
claimName: {{ .Values.persistentVolume.existingClaim | default (printf "%s" (include "ollama.fullname" .)) }}
|
||||
{{- else }}
|
||||
emptyDir: { }
|
||||
{{- end }}
|
||||
{{- range .Values.ollama.models.create }}
|
||||
{{- if .configMapRef }}
|
||||
- name: {{ .name }}-config-model-volume
|
||||
configMap:
|
||||
name: {{ .configMapRef }}
|
||||
items:
|
||||
- key: {{ .configMapKeyRef }}
|
||||
path: {{ .name }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- with .Values.volumes }}
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- with .Values.nodeSelector }}
|
||||
nodeSelector:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- with .Values.affinity }}
|
||||
affinity:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- with .Values.topologySpreadConstraints }}
|
||||
topologySpreadConstraints:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- if or .Values.ollama.gpu.enabled .Values.tolerations }}
|
||||
tolerations:
|
||||
{{- if and .Values.ollama.gpu.enabled (and
|
||||
( or (eq .Values.ollama.gpu.type "nvidia") (not .Values.ollama.gpu.type))
|
||||
( or (not .Values.ollama.gpu.mig) (not .Values.ollama.gpu.mig.enabled))
|
||||
) }}
|
||||
- key: "{{(.Values.ollama.gpu.nvidiaResource | default "nvidia.com/gpu")}}"
|
||||
operator: Exists
|
||||
effect: NoSchedule
|
||||
{{- else if and .Values.ollama.gpu.enabled (and
|
||||
( or (eq .Values.ollama.gpu.type "nvidia") (not .Values.ollama.gpu.type))
|
||||
(( .Values.ollama.gpu.mig.enabled))
|
||||
) }}
|
||||
{{- range $key, $value := .Values.ollama.gpu.mig.devices }}
|
||||
- key: nvidia.com/mig-{{ $key }}
|
||||
operator: Exists
|
||||
effect: NoSchedule
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- with .Values.tolerations }}
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
@ -0,0 +1,4 @@
|
||||
{{ range .Values.extraObjects }}
|
||||
---
|
||||
{{ tpl (toYaml .) $ }}
|
||||
{{ end }}
|
||||
34
charts/open-webui/charts/ollama/templates/hpa.yaml
Normal file
34
charts/open-webui/charts/ollama/templates/hpa.yaml
Normal file
@ -0,0 +1,34 @@
|
||||
---
|
||||
{{- if .Values.autoscaling.enabled }}
|
||||
apiVersion: autoscaling/v2
|
||||
kind: HorizontalPodAutoscaler
|
||||
metadata:
|
||||
name: {{ include "ollama.fullname" . }}
|
||||
namespace: {{ include "ollama.namespace" . }}
|
||||
labels:
|
||||
{{- include "ollama.labels" . | nindent 4 }}
|
||||
spec:
|
||||
scaleTargetRef:
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
name: {{ include "ollama.fullname" . }}
|
||||
minReplicas: {{ .Values.autoscaling.minReplicas }}
|
||||
maxReplicas: {{ .Values.autoscaling.maxReplicas }}
|
||||
metrics:
|
||||
{{- if .Values.autoscaling.targetCPUUtilizationPercentage }}
|
||||
- type: Resource
|
||||
resource:
|
||||
name: cpu
|
||||
target:
|
||||
type: Utilization
|
||||
averageUtilization: {{ .Values.autoscaling.targetCPUUtilizationPercentage }}
|
||||
{{- end }}
|
||||
{{- if .Values.autoscaling.targetMemoryUtilizationPercentage }}
|
||||
- type: Resource
|
||||
resource:
|
||||
name: memory
|
||||
target:
|
||||
type: Utilization
|
||||
averageUtilization: {{ .Values.autoscaling.targetMemoryUtilizationPercentage }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
63
charts/open-webui/charts/ollama/templates/ingress.yaml
Normal file
63
charts/open-webui/charts/ollama/templates/ingress.yaml
Normal file
@ -0,0 +1,63 @@
|
||||
{{- if .Values.ingress.enabled -}}
|
||||
{{- $fullName := include "ollama.fullname" . -}}
|
||||
{{- $svcPort := .Values.service.port -}}
|
||||
{{- if and .Values.ingress.className (not (semverCompare ">=1.18-0" .Capabilities.KubeVersion.GitVersion)) }}
|
||||
{{- if not (hasKey .Values.ingress.annotations "kubernetes.io/ingress.class") }}
|
||||
{{- $_ := set .Values.ingress.annotations "kubernetes.io/ingress.class" .Values.ingress.className }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
---
|
||||
{{- if semverCompare ">=1.19-0" .Capabilities.KubeVersion.GitVersion }}
|
||||
apiVersion: networking.k8s.io/v1
|
||||
{{- else if semverCompare ">=1.14-0" .Capabilities.KubeVersion.GitVersion }}
|
||||
apiVersion: networking.k8s.io/v1beta1
|
||||
{{- else }}
|
||||
apiVersion: extensions/v1beta1
|
||||
{{- end }}
|
||||
kind: Ingress
|
||||
metadata:
|
||||
name: {{ $fullName }}
|
||||
namespace: {{ include "ollama.namespace" . }}
|
||||
labels:
|
||||
{{- include "ollama.labels" . | nindent 4 }}
|
||||
{{- with .Values.ingress.annotations }}
|
||||
annotations:
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
spec:
|
||||
{{- if and .Values.ingress.className (semverCompare ">=1.18-0" .Capabilities.KubeVersion.GitVersion) }}
|
||||
ingressClassName: {{ .Values.ingress.className }}
|
||||
{{- end }}
|
||||
{{- if .Values.ingress.tls }}
|
||||
tls:
|
||||
{{- range .Values.ingress.tls }}
|
||||
- hosts:
|
||||
{{- range .hosts }}
|
||||
- {{ . | quote }}
|
||||
{{- end }}
|
||||
secretName: {{ .secretName }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
rules:
|
||||
{{- range .Values.ingress.hosts }}
|
||||
- host: {{ .host | quote }}
|
||||
http:
|
||||
paths:
|
||||
{{- range .paths }}
|
||||
- path: {{ .path }}
|
||||
{{- if and .pathType (semverCompare ">=1.18-0" $.Capabilities.KubeVersion.GitVersion) }}
|
||||
pathType: {{ .pathType }}
|
||||
{{- end }}
|
||||
backend:
|
||||
{{- if semverCompare ">=1.19-0" $.Capabilities.KubeVersion.GitVersion }}
|
||||
service:
|
||||
name: {{ $fullName }}
|
||||
port:
|
||||
number: {{ $svcPort }}
|
||||
{{- else }}
|
||||
serviceName: {{ $fullName }}
|
||||
servicePort: {{ $svcPort }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
200
charts/open-webui/charts/ollama/templates/knative/service.yaml
Normal file
200
charts/open-webui/charts/ollama/templates/knative/service.yaml
Normal file
@ -0,0 +1,200 @@
|
||||
---
|
||||
{{- if .Values.knative.enabled }}
|
||||
apiVersion: serving.knative.dev/v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: {{ include "ollama.fullname" . }}
|
||||
namespace: {{ include "ollama.namespace" . }}
|
||||
labels:
|
||||
{{- include "ollama.labels" . | nindent 4 }}
|
||||
{{- with .Values.knative.annotations }}
|
||||
annotations:
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
spec:
|
||||
template:
|
||||
spec:
|
||||
containerConcurrency: {{ .Values.knative.containerConcurrency }}
|
||||
timeoutSeconds: {{ .Values.knative.timeoutSeconds }}
|
||||
responseStartTimeoutSeconds: {{ .Values.knative.responseStartTimeoutSeconds }}
|
||||
idleTimeoutSeconds: {{ .Values.knative.idleTimeoutSeconds }}
|
||||
{{- with .Values.imagePullSecrets }}
|
||||
imagePullSecrets:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
serviceAccountName: {{ include "ollama.serviceAccountName" . }}
|
||||
{{- if .Values.runtimeClassName }}
|
||||
runtimeClassName: {{ .Values.runtimeClassName | quote }}
|
||||
{{- end }}
|
||||
{{- if .Values.terminationGracePeriodSeconds }}
|
||||
terminationGracePeriodSeconds: {{ .Values.terminationGracePeriodSeconds }}
|
||||
{{- end }}
|
||||
{{- with .Values.initContainers }}
|
||||
initContainers:
|
||||
{{- tpl (toYaml . ) $ | nindent 8 }}
|
||||
{{- end }}
|
||||
containers:
|
||||
- image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default (ternary (printf "%s-rocm" .Chart.AppVersion) (.Chart.AppVersion) (and (.Values.ollama.gpu.enabled) (eq .Values.ollama.gpu.type "amd"))) }}"
|
||||
imagePullPolicy: {{ .Values.image.pullPolicy }}
|
||||
securityContext:
|
||||
{{- toYaml .Values.securityContext | nindent 12 }}
|
||||
ports:
|
||||
- containerPort: {{ .Values.ollama.port }}
|
||||
env:
|
||||
- name: OLLAMA_HOST
|
||||
value: "0.0.0.0:{{ .Values.ollama.port }}"
|
||||
{{- if and .Values.ollama.gpu.enabled (or (eq .Values.ollama.gpu.type "nvidia") (not .Values.ollama.gpu.type))}}
|
||||
- name: PATH
|
||||
value: /usr/local/nvidia/bin:/usr/local/cuda/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
|
||||
{{- end}}
|
||||
{{- with .Values.extraEnv }}
|
||||
{{- toYaml . | nindent 12 }}
|
||||
{{- end }}
|
||||
envFrom:
|
||||
{{- with .Values.extraEnvFrom }}
|
||||
{{- toYaml . | nindent 12 }}
|
||||
{{- end }}
|
||||
args:
|
||||
{{- with .Values.extraArgs }}
|
||||
{{- toYaml . | nindent 12 }}
|
||||
{{- end }}
|
||||
{{- if .Values.resources }}
|
||||
resources:
|
||||
{{- $limits := default dict .Values.resources.limits }}
|
||||
{{- if .Values.ollama.gpu.enabled }}
|
||||
{{- if or (eq .Values.ollama.gpu.type "nvidia") (not .Values.ollama.gpu.type) }}
|
||||
{{- $gpuLimit := dict (.Values.ollama.gpu.nvidiaResource | default "nvidia.com/gpu") (.Values.ollama.gpu.number | default 1) }}
|
||||
{{- $limits = merge $limits $gpuLimit }}
|
||||
{{- end }}
|
||||
{{- if eq .Values.ollama.gpu.type "amd" }}
|
||||
{{- $gpuLimit := dict "amd.com/gpu" (.Values.ollama.gpu.number | default 1) }}
|
||||
{{- $limits = merge $limits $gpuLimit }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- $ressources := deepCopy (dict "limits" $limits) | mergeOverwrite .Values.resources }}
|
||||
{{- toYaml $ressources | nindent 12 }}
|
||||
{{- end}}
|
||||
volumeMounts:
|
||||
- name: ollama-data
|
||||
mountPath: {{ .Values.ollama.mountPath | default "/root/.ollama" }}
|
||||
{{- if .Values.persistentVolume.subPath }}
|
||||
subPath: {{ .Values.persistentVolume.subPath }}
|
||||
{{- end }}
|
||||
{{- range .Values.ollama.models.create }}
|
||||
{{- if .configMapRef }}
|
||||
- name: {{ .name }}-config-model-volume
|
||||
mountPath: /models
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- with .Values.volumeMounts }}
|
||||
{{- toYaml . | nindent 12 }}
|
||||
{{- end }}
|
||||
{{- if .Values.livenessProbe.enabled }}
|
||||
livenessProbe:
|
||||
httpGet:
|
||||
path: {{ .Values.livenessProbe.path }}
|
||||
port: http
|
||||
initialDelaySeconds: {{ .Values.livenessProbe.initialDelaySeconds }}
|
||||
periodSeconds: {{ .Values.livenessProbe.periodSeconds }}
|
||||
timeoutSeconds: {{ .Values.livenessProbe.timeoutSeconds }}
|
||||
successThreshold: {{ .Values.livenessProbe.successThreshold }}
|
||||
failureThreshold: {{ .Values.livenessProbe.failureThreshold }}
|
||||
{{- end }}
|
||||
{{- if .Values.readinessProbe.enabled }}
|
||||
readinessProbe:
|
||||
httpGet:
|
||||
path: {{ .Values.readinessProbe.path }}
|
||||
port: http
|
||||
initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }}
|
||||
periodSeconds: {{ .Values.readinessProbe.periodSeconds }}
|
||||
timeoutSeconds: {{ .Values.readinessProbe.timeoutSeconds }}
|
||||
successThreshold: {{ .Values.readinessProbe.successThreshold }}
|
||||
failureThreshold: {{ .Values.readinessProbe.failureThreshold }}
|
||||
{{- end }}
|
||||
{{- with .Values.lifecycle}}
|
||||
lifecycle:
|
||||
{{- toYaml . | nindent 12 }}
|
||||
{{- else }}
|
||||
{{- if or .Values.ollama.models.pull .Values.ollama.models.run .Values.ollama.models.create }}
|
||||
lifecycle:
|
||||
postStart:
|
||||
exec:
|
||||
command:
|
||||
- /bin/sh
|
||||
- -c
|
||||
- |
|
||||
while ! /bin/ollama ps > /dev/null 2>&1; do
|
||||
sleep 5
|
||||
done
|
||||
{{- if .Values.ollama.models.pull }}
|
||||
{{- range .Values.ollama.models.pull }}
|
||||
/bin/ollama pull {{ternary "--insecure" "" $.Values.ollama.insecure | toString }} {{ . }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
|
||||
{{- if .Values.ollama.models.create }}
|
||||
{{- range .Values.ollama.models.create }}
|
||||
{{- if .template }}
|
||||
cat <<EOF > {{ include "ollama.modelsMountPath" $ }}/{{ .name }}
|
||||
{{- .template | nindent 20 }}
|
||||
EOF
|
||||
/bin/ollama create {{ .name }} -f {{ include "ollama.modelsMountPath" . }}/{{ .name }}
|
||||
{{- end }}
|
||||
{{- if .configMapRef }}
|
||||
/bin/ollama create {{ .name }} -f /models/{{ .name }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
|
||||
{{- if .Values.ollama.models.run }}
|
||||
{{- range .Values.ollama.models.run }}
|
||||
/bin/ollama run {{ . }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
volumes:
|
||||
- name: ollama-data
|
||||
{{- if .Values.persistentVolume.enabled }}
|
||||
persistentVolumeClaim:
|
||||
claimName: {{ .Values.persistentVolume.existingClaim | default (printf "%s" (include "ollama.fullname" .)) }}
|
||||
{{- else }}
|
||||
emptyDir: { }
|
||||
{{- end }}
|
||||
{{- range .Values.ollama.models.create }}
|
||||
{{- if .configMapRef }}
|
||||
- name: {{ .name }}-config-model-volume
|
||||
configMap:
|
||||
name: {{ .configMapRef }}
|
||||
items:
|
||||
- key: {{ .configMapKeyRef }}
|
||||
path: {{ .name }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- with .Values.volumes }}
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- with .Values.nodeSelector }}
|
||||
nodeSelector:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- with .Values.affinity }}
|
||||
affinity:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- with .Values.topologySpreadConstraints }}
|
||||
topologySpreadConstraints:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- if or .Values.ollama.gpu.enabled .Values.tolerations }}
|
||||
tolerations:
|
||||
{{- if and .Values.ollama.gpu.enabled (or (eq .Values.ollama.gpu.type "nvidia") (not .Values.ollama.gpu.type)) }}
|
||||
- key: "{{(.Values.ollama.gpu.nvidiaResource | default "nvidia.com/gpu")}}"
|
||||
operator: Exists
|
||||
effect: NoSchedule
|
||||
{{- end }}
|
||||
{{- with .Values.tolerations }}
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
33
charts/open-webui/charts/ollama/templates/pvc.yaml
Normal file
33
charts/open-webui/charts/ollama/templates/pvc.yaml
Normal file
@ -0,0 +1,33 @@
|
||||
{{- if (and .Values.persistentVolume.enabled (not .Values.persistentVolume.existingClaim)) -}}
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: PersistentVolumeClaim
|
||||
metadata:
|
||||
{{- if .Values.persistentVolume.annotations }}
|
||||
annotations:
|
||||
{{ toYaml .Values.persistentVolume.annotations | indent 4 }}
|
||||
{{- end }}
|
||||
labels:
|
||||
{{- include "ollama.labels" . | nindent 4 }}
|
||||
name: {{ template "ollama.fullname" . }}
|
||||
namespace: {{ include "ollama.namespace" . }}
|
||||
spec:
|
||||
accessModes:
|
||||
{{ toYaml .Values.persistentVolume.accessModes | indent 4 }}
|
||||
{{- if .Values.persistentVolume.storageClass }}
|
||||
{{- if (eq "-" .Values.persistentVolume.storageClass) }}
|
||||
storageClassName: ""
|
||||
{{- else }}
|
||||
storageClassName: "{{ .Values.persistentVolume.storageClass }}"
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- if .Values.persistentVolume.volumeMode }}
|
||||
volumeMode: "{{ .Values.persistentVolume.volumeMode }}"
|
||||
{{- end }}
|
||||
{{- if .Values.persistentVolume.volumeName }}
|
||||
volumeName: "{{ .Values.persistentVolume.volumeName }}"
|
||||
{{- end }}
|
||||
resources:
|
||||
requests:
|
||||
storage: "{{ .Values.persistentVolume.size }}"
|
||||
{{- end -}}
|
||||
@ -0,0 +1,19 @@
|
||||
{{- if and .Values.ollama.gpu.enabled .Values.ollama.gpu.draEnabled (not .Values.ollama.gpu.draExistingClaimTemplate) -}}
|
||||
---
|
||||
{{- if semverCompare ">=1.34-0" .Capabilities.KubeVersion.GitVersion }}
|
||||
apiVersion: resource.k8s.io/v1
|
||||
{{- else }}
|
||||
apiVersion: resource.k8s.io/v1beta1
|
||||
{{- end }}
|
||||
kind: ResourceClaimTemplate
|
||||
metadata:
|
||||
name: {{ template "ollama.fullname" . }}
|
||||
namespace: {{ include "ollama.namespace" . }}
|
||||
spec:
|
||||
spec:
|
||||
devices:
|
||||
requests:
|
||||
- name: gpu
|
||||
deviceClassName: {{ .Values.ollama.gpu.draDriverClass }}
|
||||
count: {{(.Values.ollama.gpu.number | default 1)}}
|
||||
{{- end -}}
|
||||
32
charts/open-webui/charts/ollama/templates/service.yaml
Normal file
32
charts/open-webui/charts/ollama/templates/service.yaml
Normal file
@ -0,0 +1,32 @@
|
||||
---
|
||||
{{- if not .Values.knative.enabled }}
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: {{ include "ollama.fullname" . }}
|
||||
namespace: {{ include "ollama.namespace" . }}
|
||||
labels:
|
||||
{{- include "ollama.labels" . | nindent 4 }}
|
||||
{{- with .Values.service.labels }}
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
{{- with .Values.service.annotations }}
|
||||
annotations:
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
spec:
|
||||
type: {{ .Values.service.type }}
|
||||
ports:
|
||||
- port: {{ .Values.service.port }}
|
||||
targetPort: http
|
||||
protocol: TCP
|
||||
name: http
|
||||
{{- if contains "NodePort" .Values.service.type }}
|
||||
nodePort: {{ .Values.service.nodePort }}
|
||||
{{- end }}
|
||||
{{- if .Values.service.loadBalancerIP }}
|
||||
loadBalancerIP: {{ .Values.service.loadBalancerIP | quote }}
|
||||
{{- end }}
|
||||
selector:
|
||||
{{- include "ollama.selectorLabels" . | nindent 4 }}
|
||||
{{- end }}
|
||||
@ -0,0 +1,15 @@
|
||||
{{- if .Values.serviceAccount.create -}}
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: ServiceAccount
|
||||
metadata:
|
||||
name: {{ include "ollama.serviceAccountName" . }}
|
||||
namespace: {{ include "ollama.namespace" . }}
|
||||
labels:
|
||||
{{- include "ollama.labels" . | nindent 4 }}
|
||||
{{- with .Values.serviceAccount.annotations }}
|
||||
annotations:
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
automountServiceAccountToken: {{ .Values.serviceAccount.automount }}
|
||||
{{- end }}
|
||||
@ -0,0 +1,25 @@
|
||||
---
|
||||
{{- if .Values.tests.enabled }}
|
||||
apiVersion: v1
|
||||
kind: Pod
|
||||
metadata:
|
||||
name: "{{ include "ollama.fullname" . }}-test-connection"
|
||||
namespace: {{ include "ollama.namespace" . }}
|
||||
labels:
|
||||
{{- include "ollama.labels" . | nindent 4 }}
|
||||
{{- with .Values.tests.labels }}
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
annotations:
|
||||
"helm.sh/hook": test
|
||||
{{- with .Values.tests.annotations }}
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
spec:
|
||||
containers:
|
||||
- name: wget
|
||||
image: busybox
|
||||
command: ['wget']
|
||||
args: ['{{ include "ollama.fullname" . }}:{{ .Values.service.port }}']
|
||||
restartPolicy: Never
|
||||
{{ end }}
|
||||
440
charts/open-webui/charts/ollama/values.yaml
Normal file
440
charts/open-webui/charts/ollama/values.yaml
Normal file
@ -0,0 +1,440 @@
|
||||
# Default values for ollama-helm.
|
||||
# This is a YAML-formatted file.
|
||||
# Declare variables to be passed into your templates.
|
||||
|
||||
# -- Number of replicas
|
||||
replicaCount: 1
|
||||
|
||||
# Knative configuration
|
||||
knative:
|
||||
# -- Enable Knative integration
|
||||
enabled: false
|
||||
# -- Knative service container concurrency
|
||||
containerConcurrency: 0
|
||||
# -- Knative service timeout seconds
|
||||
timeoutSeconds: 300
|
||||
# -- Knative service response start timeout seconds
|
||||
responseStartTimeoutSeconds: 300
|
||||
# -- Knative service idle timeout seconds
|
||||
idleTimeoutSeconds: 300
|
||||
# -- Knative service annotations
|
||||
annotations: {}
|
||||
|
||||
# Docker image
|
||||
image:
|
||||
# -- Docker image registry
|
||||
repository: ollama/ollama
|
||||
|
||||
# -- Docker pull policy
|
||||
pullPolicy: IfNotPresent
|
||||
|
||||
# -- Docker image tag, overrides the image tag whose default is the chart appVersion.
|
||||
tag: ""
|
||||
|
||||
# -- Docker registry secret names as an array
|
||||
imagePullSecrets: []
|
||||
|
||||
# -- String to partially override template (will maintain the release name)
|
||||
nameOverride: ""
|
||||
|
||||
# -- String to fully override template
|
||||
fullnameOverride: ""
|
||||
|
||||
# -- String to fully override namespace
|
||||
namespaceOverride: ""
|
||||
|
||||
# Ollama parameters
|
||||
ollama:
|
||||
# Port Ollama is listening on
|
||||
port: 11434
|
||||
|
||||
gpu:
|
||||
# -- Enable GPU integration
|
||||
enabled: false
|
||||
|
||||
# -- Enable DRA GPU integration
|
||||
# If enabled, it will use DRA instead of Device Driver Plugin and create a ResourceClaim and GpuClaimParameters
|
||||
draEnabled: false
|
||||
|
||||
# -- DRA GPU DriverClass
|
||||
draDriverClass: "gpu.nvidia.com"
|
||||
|
||||
# -- Existing DRA GPU ResourceClaim Template
|
||||
draExistingClaimTemplate: ""
|
||||
|
||||
# -- GPU type: 'nvidia' or 'amd'
|
||||
# If 'ollama.gpu.enabled', default value is nvidia
|
||||
# If set to 'amd', this will add 'rocm' suffix to image tag if 'image.tag' is not override
|
||||
# This is due cause AMD and CPU/CUDA are different images
|
||||
type: 'nvidia'
|
||||
|
||||
# -- Specify the number of GPU
|
||||
# If you use MIG section below then this parameter is ignored
|
||||
number: 1
|
||||
|
||||
# -- only for nvidia cards; change to (example) 'nvidia.com/mig-1g.10gb' to use MIG slice
|
||||
nvidiaResource: "nvidia.com/gpu"
|
||||
# nvidiaResource: "nvidia.com/mig-1g.10gb" # example
|
||||
# If you want to use more than one NVIDIA MIG you can use the following syntax (then nvidiaResource is ignored and only the configuration in the following MIG section is used)
|
||||
|
||||
mig:
|
||||
# -- Enable multiple mig devices
|
||||
# If enabled you will have to specify the mig devices
|
||||
# If enabled is set to false this section is ignored
|
||||
enabled: false
|
||||
|
||||
# -- Specify the mig devices and the corresponding number
|
||||
devices: {}
|
||||
# 1g.10gb: 1
|
||||
# 3g.40gb: 1
|
||||
|
||||
models:
|
||||
# -- List of models to pull at container startup
|
||||
# The more you add, the longer the container will take to start if models are not present
|
||||
# pull:
|
||||
# - llama2
|
||||
# - mistral
|
||||
pull: []
|
||||
|
||||
# -- List of models to load in memory at container startup
|
||||
# run:
|
||||
# - llama2
|
||||
# - mistral
|
||||
run: []
|
||||
|
||||
# -- List of models to create at container startup, there are two options
|
||||
# 1. Create a raw model
|
||||
# 2. Load a model from configMaps, configMaps must be created before and are loaded as volume in "/models" directory.
|
||||
# create:
|
||||
# - name: llama3.1-ctx32768
|
||||
# configMapRef: my-configmap
|
||||
# configMapKeyRef: configmap-key
|
||||
# - name: llama3.1-ctx32768
|
||||
# template: |
|
||||
# FROM llama3.1
|
||||
# PARAMETER num_ctx 32768
|
||||
create: []
|
||||
|
||||
# -- Automatically remove models present on the disk but not specified in the values file
|
||||
clean: false
|
||||
|
||||
# -- Add insecure flag for pulling at container startup
|
||||
insecure: false
|
||||
|
||||
# -- Override ollama-data volume mount path, default: "/root/.ollama"
|
||||
mountPath: ""
|
||||
|
||||
# Service account
|
||||
# ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/
|
||||
serviceAccount:
|
||||
# -- Specifies whether a service account should be created
|
||||
create: true
|
||||
|
||||
# -- Automatically mount a ServiceAccount's API credentials?
|
||||
automount: true
|
||||
|
||||
# -- Annotations to add to the service account
|
||||
annotations: {}
|
||||
|
||||
# -- The name of the service account to use.
|
||||
# If not set and create is true, a name is generated using the fullname template
|
||||
name: ""
|
||||
|
||||
# -- Map of annotations to add to the pods
|
||||
podAnnotations: {}
|
||||
|
||||
# -- Map of labels to add to the pods
|
||||
podLabels: {}
|
||||
|
||||
# -- Pod Security Context
|
||||
podSecurityContext: {}
|
||||
# fsGroup: 2000
|
||||
|
||||
# -- Priority Class Name
|
||||
priorityClassName: ""
|
||||
|
||||
# -- Container Security Context
|
||||
securityContext: {}
|
||||
# capabilities:
|
||||
# drop:
|
||||
# - ALL
|
||||
# readOnlyRootFilesystem: true
|
||||
# runAsNonRoot: true
|
||||
# runAsUser: 1000
|
||||
|
||||
# -- Specify runtime class
|
||||
runtimeClassName: ""
|
||||
|
||||
# Configure Service
|
||||
service:
|
||||
|
||||
# -- Service type
|
||||
type: ClusterIP
|
||||
|
||||
# -- Service port
|
||||
port: 11434
|
||||
|
||||
# -- Service node port when service type is 'NodePort'
|
||||
nodePort: 31434
|
||||
|
||||
# -- Load Balancer IP address
|
||||
loadBalancerIP:
|
||||
|
||||
# -- Annotations to add to the service
|
||||
annotations: {}
|
||||
|
||||
# -- Labels to add to the service
|
||||
labels: {}
|
||||
|
||||
# Configure Deployment
|
||||
deployment:
|
||||
|
||||
# -- Labels to add to the deployment
|
||||
labels: {}
|
||||
|
||||
# Configure the ingress resource that allows you to access the
|
||||
ingress:
|
||||
# -- Enable ingress controller resource
|
||||
enabled: false
|
||||
|
||||
# -- IngressClass that will be used to implement the Ingress (Kubernetes 1.18+)
|
||||
className: ""
|
||||
|
||||
# -- Additional annotations for the Ingress resource.
|
||||
annotations: {}
|
||||
# kubernetes.io/ingress.class: traefik
|
||||
# kubernetes.io/ingress.class: nginx
|
||||
# kubernetes.io/tls-acme: "true"
|
||||
|
||||
# The list of hostnames to be covered with this ingress record.
|
||||
hosts:
|
||||
- host: ollama.local
|
||||
paths:
|
||||
- path: /
|
||||
pathType: Prefix
|
||||
|
||||
# -- The tls configuration for hostnames to be covered with this ingress record.
|
||||
tls: []
|
||||
# - secretName: chart-example-tls
|
||||
# hosts:
|
||||
# - chart-example.local
|
||||
|
||||
# Configure resource requests and limits
|
||||
# ref: http://kubernetes.io/docs/user-guide/compute-resources/
|
||||
resources:
|
||||
# -- Pod requests
|
||||
requests: {}
|
||||
# Memory request
|
||||
# memory: 4096Mi
|
||||
|
||||
# CPU request
|
||||
# cpu: 2000m
|
||||
|
||||
# -- Pod limit
|
||||
limits: {}
|
||||
# Memory limit
|
||||
# memory: 8192Mi
|
||||
|
||||
# CPU limit
|
||||
# cpu: 4000m
|
||||
|
||||
# Configure extra options for liveness probe
|
||||
# ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes
|
||||
livenessProbe:
|
||||
# -- Enable livenessProbe
|
||||
enabled: true
|
||||
|
||||
# -- Request path for livenessProbe
|
||||
path: /
|
||||
|
||||
# -- Initial delay seconds for livenessProbe
|
||||
initialDelaySeconds: 60
|
||||
|
||||
# -- Period seconds for livenessProbe
|
||||
periodSeconds: 10
|
||||
|
||||
# -- Timeout seconds for livenessProbe
|
||||
timeoutSeconds: 5
|
||||
|
||||
# -- Failure threshold for livenessProbe
|
||||
failureThreshold: 6
|
||||
|
||||
# -- Success threshold for livenessProbe
|
||||
successThreshold: 1
|
||||
|
||||
# Configure extra options for readiness probe
|
||||
# ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes
|
||||
readinessProbe:
|
||||
# -- Enable readinessProbe
|
||||
enabled: true
|
||||
|
||||
# -- Request path for readinessProbe
|
||||
path: /
|
||||
|
||||
# -- Initial delay seconds for readinessProbe
|
||||
initialDelaySeconds: 30
|
||||
|
||||
# -- Period seconds for readinessProbe
|
||||
periodSeconds: 5
|
||||
|
||||
# -- Timeout seconds for readinessProbe
|
||||
timeoutSeconds: 3
|
||||
|
||||
# -- Failure threshold for readinessProbe
|
||||
failureThreshold: 6
|
||||
|
||||
# -- Success threshold for readinessProbe
|
||||
successThreshold: 1
|
||||
|
||||
# Configure autoscaling
|
||||
autoscaling:
|
||||
# -- Enable autoscaling
|
||||
enabled: false
|
||||
|
||||
# -- Number of minimum replicas
|
||||
minReplicas: 1
|
||||
|
||||
# -- Number of maximum replicas
|
||||
maxReplicas: 100
|
||||
|
||||
# -- CPU usage to target replica
|
||||
targetCPUUtilizationPercentage: 80
|
||||
|
||||
# -- targetMemoryUtilizationPercentage: 80
|
||||
|
||||
# -- Additional volumes on the output Deployment definition.
|
||||
volumes: []
|
||||
# -- - name: foo
|
||||
# secret:
|
||||
# secretName: mysecret
|
||||
# optional: false
|
||||
|
||||
# -- Additional volumeMounts on the output Deployment definition.
|
||||
volumeMounts: []
|
||||
# -- - name: foo
|
||||
# mountPath: "/etc/foo"
|
||||
# readOnly: true
|
||||
|
||||
# -- Additional arguments on the output Deployment definition.
|
||||
extraArgs: []
|
||||
|
||||
# -- Additional environments variables on the output Deployment definition.
|
||||
# For extra OLLAMA env, please refer to https://github.com/ollama/ollama/blob/main/envconfig/config.go
|
||||
extraEnv: []
|
||||
# - name: OLLAMA_DEBUG
|
||||
# value: "1"
|
||||
|
||||
# -- Additionl environment variables from external sources (like ConfigMap)
|
||||
extraEnvFrom: []
|
||||
# - configMapRef:
|
||||
# name: my-env-configmap
|
||||
|
||||
# Enable persistence using Persistent Volume Claims
|
||||
# ref: https://kubernetes.io/docs/concepts/storage/persistent-volumes/
|
||||
persistentVolume:
|
||||
# -- Enable persistence using PVC
|
||||
enabled: false
|
||||
|
||||
# -- Ollama server data Persistent Volume access modes
|
||||
# Must match those of existing PV or dynamic provisioner
|
||||
# Ref: http://kubernetes.io/docs/user-guide/persistent-volumes/
|
||||
accessModes:
|
||||
- ReadWriteOnce
|
||||
|
||||
# -- Ollama server data Persistent Volume annotations
|
||||
annotations: {}
|
||||
|
||||
# -- If you'd like to bring your own PVC for persisting Ollama state, pass the name of the
|
||||
# created + ready PVC here. If set, this Chart will not create the default PVC.
|
||||
# Requires server.persistentVolume.enabled: true
|
||||
existingClaim: ""
|
||||
|
||||
# -- Ollama server data Persistent Volume size
|
||||
size: 30Gi
|
||||
|
||||
# -- Ollama server data Persistent Volume Storage Class
|
||||
# If defined, storageClassName: <storageClass>
|
||||
# If set to "-", storageClassName: "", which disables dynamic provisioning
|
||||
# If undefined (the default) or set to null, no storageClassName spec is
|
||||
# set, choosing the default provisioner. (gp2 on AWS, standard on
|
||||
# GKE, AWS & OpenStack)
|
||||
storageClass: ""
|
||||
|
||||
# -- Ollama server data Persistent Volume Binding Mode
|
||||
# If defined, volumeMode: <volumeMode>
|
||||
# If empty (the default) or set to null, no volumeBindingMode spec is
|
||||
# set, choosing the default mode.
|
||||
volumeMode: ""
|
||||
|
||||
# -- Subdirectory of Ollama server data Persistent Volume to mount
|
||||
# Useful if the volume's root directory is not empty
|
||||
subPath: ""
|
||||
|
||||
# -- Pre-existing PV to attach this claim to
|
||||
# Useful if a CSI auto-provisions a PV for you and you want to always
|
||||
# reference the PV moving forward
|
||||
volumeName: ""
|
||||
|
||||
# -- Node labels for pod assignment.
|
||||
nodeSelector: {}
|
||||
|
||||
# -- Tolerations for pod assignment
|
||||
tolerations: []
|
||||
|
||||
# -- Affinity for pod assignment
|
||||
affinity: {}
|
||||
|
||||
# -- Lifecycle for pod assignment (override ollama.models startup pull/run)
|
||||
lifecycle: {}
|
||||
|
||||
# How to replace existing pods
|
||||
updateStrategy:
|
||||
# -- Deployment strategy can be "Recreate" or "RollingUpdate". Default is Recreate
|
||||
type: "Recreate"
|
||||
|
||||
# -- Topology Spread Constraints for pod assignment
|
||||
topologySpreadConstraints: {}
|
||||
|
||||
# -- Wait for a grace period
|
||||
terminationGracePeriodSeconds: 120
|
||||
|
||||
# -- Init containers to add to the pod
|
||||
initContainers: []
|
||||
# - name: startup-tool
|
||||
# image: alpine:3
|
||||
# command: [sh, -c]
|
||||
# args:
|
||||
# - echo init
|
||||
|
||||
# -- Use the host’s ipc namespace.
|
||||
hostIPC: false
|
||||
|
||||
# -- Use the host’s pid namespace
|
||||
hostPID: false
|
||||
|
||||
# -- Use the host's network namespace.
|
||||
hostNetwork: false
|
||||
|
||||
# -- Extra K8s manifests to deploy
|
||||
extraObjects: []
|
||||
# - apiVersion: v1
|
||||
# kind: PersistentVolume
|
||||
# metadata:
|
||||
# name: aws-efs
|
||||
# data:
|
||||
# key: "value"
|
||||
# - apiVersion: scheduling.k8s.io/v1
|
||||
# kind: PriorityClass
|
||||
# metadata:
|
||||
# name: high-priority
|
||||
# value: 1000000
|
||||
# globalDefault: false
|
||||
# description: "This priority class should be used for XYZ service pods only."
|
||||
|
||||
# Test connection pods
|
||||
tests:
|
||||
enabled: true
|
||||
# -- Labels to add to the tests
|
||||
labels: {}
|
||||
# -- Annotations to add to the tests
|
||||
annotations: {}
|
||||
24
charts/open-webui/charts/pipelines/.helmignore
Normal file
24
charts/open-webui/charts/pipelines/.helmignore
Normal file
@ -0,0 +1,24 @@
|
||||
# Patterns to ignore when building packages.
|
||||
# This supports shell glob matching, relative path matching, and
|
||||
# negation (prefixed with !). Only one pattern per line.
|
||||
.DS_Store
|
||||
# Common VCS dirs
|
||||
.git/
|
||||
.gitignore
|
||||
.bzr/
|
||||
.bzrignore
|
||||
.hg/
|
||||
.hgignore
|
||||
.svn/
|
||||
# Common backup files
|
||||
*.swp
|
||||
*.bak
|
||||
*.tmp
|
||||
*.orig
|
||||
*~
|
||||
# Various IDEs
|
||||
.project
|
||||
.idea/
|
||||
.drone.yml
|
||||
*.tmproj
|
||||
.vscode/
|
||||
16
charts/open-webui/charts/pipelines/Chart.yaml
Normal file
16
charts/open-webui/charts/pipelines/Chart.yaml
Normal file
@ -0,0 +1,16 @@
|
||||
annotations:
|
||||
licenses: MIT
|
||||
apiVersion: v2
|
||||
appVersion: alpha
|
||||
description: 'Pipelines: UI-Agnostic OpenAI API Plugin Framework'
|
||||
home: https://github.com/open-webui/pipelines
|
||||
icon: https://github.com/open-webui/pipelines/raw/main/header.png
|
||||
keywords:
|
||||
- llm
|
||||
- chat
|
||||
- web-ui
|
||||
name: pipelines
|
||||
sources:
|
||||
- https://github.com/open-webui/helm-charts
|
||||
- https://github.com/open-webui/pipelines/pkgs/container/pipelines
|
||||
version: 0.10.0
|
||||
87
charts/open-webui/charts/pipelines/README.md
Normal file
87
charts/open-webui/charts/pipelines/README.md
Normal file
@ -0,0 +1,87 @@
|
||||
# pipelines
|
||||
|
||||
 
|
||||
|
||||
Pipelines: UI-Agnostic OpenAI API Plugin Framework
|
||||
|
||||
**Homepage:** <https://github.com/open-webui/pipelines>
|
||||
|
||||
## Source Code
|
||||
|
||||
* <https://github.com/open-webui/helm-charts>
|
||||
* <https://github.com/open-webui/pipelines/pkgs/container/pipelines>
|
||||
|
||||
## Installing
|
||||
|
||||
Before you can install, you need to add the `open-webui` repo to [Helm](https://helm.sh)
|
||||
|
||||
```shell
|
||||
helm repo add open-webui https://helm.openwebui.com/
|
||||
helm repo update
|
||||
```
|
||||
|
||||
Now you can install the chart:
|
||||
|
||||
```shell
|
||||
helm upgrade --install open-webui open-webui/pipelines
|
||||
```
|
||||
|
||||
## Values
|
||||
|
||||
| Key | Type | Default | Description |
|
||||
|-----|------|---------|-------------|
|
||||
| affinity | object | `{}` | Affinity for pod assignment |
|
||||
| annotations | object | `{}` | |
|
||||
| clusterDomain | string | `"cluster.local"` | Value of cluster domain |
|
||||
| commonEnvVars | list | `[]` | Additional environments variables on the output Deployment definition, common across environments. |
|
||||
| containerSecurityContext | object | `{}` | Configure container security context ref: <https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-containe> |
|
||||
| extraEnvVars | list | `[{"name":"PIPELINES_URLS","value":"https://github.com/open-webui/pipelines/blob/main/examples/filters/detoxify_filter_pipeline.py"}]` | Additional environments variables on the output Deployment definition. These are used to pull initial Pipeline files, and help configure Pipelines with required values (e.g. Langfuse API keys) |
|
||||
| extraEnvVars[0] | object | `{"name":"PIPELINES_URLS","value":"https://github.com/open-webui/pipelines/blob/main/examples/filters/detoxify_filter_pipeline.py"}` | Example pipeline to pull and load on deployment startup, see current pipelines here: https://github.com/open-webui/pipelines/blob/main/examples |
|
||||
| extraInitContainers | list | `[]` | Additional init containers to add to the deployment ref: <https://kubernetes.io/docs/concepts/workloads/pods/init-containers/> |
|
||||
| extraLabels | object | `{}` | |
|
||||
| extraResources | list | `[]` | Extra resources to deploy with Open WebUI Pipelines |
|
||||
| hostAliases | list | `[]` | HostAliases to be added to hosts-file of each container |
|
||||
| image.pullPolicy | string | `"Always"` | |
|
||||
| image.repository | string | `"ghcr.io/open-webui/pipelines"` | |
|
||||
| image.tag | string | `"main"` | |
|
||||
| imagePullSecrets | list | `[]` | Configure imagePullSecrets to use private registry ref: <https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry> |
|
||||
| ingress.annotations | object | `{}` | Use appropriate annotations for your Ingress controller, e.g., for NGINX: nginx.ingress.kubernetes.io/rewrite-target: / |
|
||||
| ingress.class | string | `""` | |
|
||||
| ingress.enabled | bool | `true` | |
|
||||
| ingress.existingSecret | string | `""` | |
|
||||
| ingress.host | string | `""` | |
|
||||
| ingress.tls | bool | `false` | |
|
||||
| nameOverride | string | `""` | |
|
||||
| namespaceOverride | string | `""` | |
|
||||
| nodeSelector | object | `{}` | Node labels for pod assignment. |
|
||||
| persistence.accessModes | list | `["ReadWriteOnce"]` | If using multiple replicas, you must update accessModes to ReadWriteMany |
|
||||
| persistence.annotations | object | `{}` | |
|
||||
| persistence.enabled | bool | `true` | |
|
||||
| persistence.existingClaim | string | `""` | |
|
||||
| persistence.selector | object | `{}` | |
|
||||
| persistence.size | string | `"2Gi"` | |
|
||||
| persistence.storageClass | string | `""` | |
|
||||
| podAnnotations | object | `{}` | |
|
||||
| podLabels | object | `{}` | |
|
||||
| podSecurityContext | object | `{}` | Configure pod security context ref: <https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-container> |
|
||||
| replicaCount | int | `1` | |
|
||||
| resources | object | `{}` | |
|
||||
| service.annotations | object | `{}` | |
|
||||
| service.containerPort | int | `9099` | |
|
||||
| service.labels | object | `{}` | |
|
||||
| service.loadBalancerClass | string | `""` | |
|
||||
| service.nodePort | string | `""` | |
|
||||
| service.port | int | `9099` | |
|
||||
| service.type | string | `"ClusterIP"` | |
|
||||
| serviceAccount.automountServiceAccountToken | bool | `false` | |
|
||||
| serviceAccount.create | bool | `true` | |
|
||||
| serviceAccount.enable | bool | `true` | |
|
||||
| serviceAccount.name | string | `""` | |
|
||||
| strategy | object | `{}` | Strategy for updating the deployment |
|
||||
| tolerations | list | `[]` | Tolerations for pod assignment |
|
||||
| volumeMounts | list | `[]` | Configure container volume mounts ref: <https://kubernetes.io/docs/tasks/configure-pod-container/configure-volume-storage/> |
|
||||
| volumes | list | `[]` | Configure pod volumes ref: <https://kubernetes.io/docs/tasks/configure-pod-container/configure-volume-storage/> |
|
||||
|
||||
----------------------------------------------
|
||||
|
||||
Autogenerated from chart metadata using [helm-docs](https://github.com/norwoodj/helm-docs/).
|
||||
36
charts/open-webui/charts/pipelines/README.md.gotmpl
Normal file
36
charts/open-webui/charts/pipelines/README.md.gotmpl
Normal file
@ -0,0 +1,36 @@
|
||||
{{ template "chart.header" . }}
|
||||
|
||||
{{ template "chart.deprecationWarning" . }}
|
||||
|
||||
{{ template "chart.badgesSection" . }}
|
||||
|
||||
{{ template "chart.description" . }}
|
||||
|
||||
{{ template "chart.homepageLine" . }}
|
||||
|
||||
{{ template "chart.maintainersSection" . }}
|
||||
|
||||
{{ template "chart.sourcesSection" . }}
|
||||
|
||||
## Installing
|
||||
|
||||
Before you can install, you need to add the `open-webui` repo to [Helm](https://helm.sh)
|
||||
|
||||
```shell
|
||||
helm repo add open-webui https://helm.openwebui.com/
|
||||
helm repo update
|
||||
```
|
||||
|
||||
Now you can install the chart:
|
||||
|
||||
```shell
|
||||
helm upgrade --install open-webui open-webui/pipelines
|
||||
```
|
||||
|
||||
{{ template "chart.requirementsSection" . }}
|
||||
|
||||
{{ template "chart.valuesSection" . }}
|
||||
|
||||
----------------------------------------------
|
||||
|
||||
Autogenerated from chart metadata using [helm-docs](https://github.com/norwoodj/helm-docs/).
|
||||
72
charts/open-webui/charts/pipelines/templates/_helpers.tpl
Normal file
72
charts/open-webui/charts/pipelines/templates/_helpers.tpl
Normal file
@ -0,0 +1,72 @@
|
||||
{{/*
|
||||
Allow the release namespace to be overridden for multi-namespace deployments in combined charts
|
||||
*/}}
|
||||
{{- define "pipelines.namespace" -}}
|
||||
{{- if .Values.namespaceOverride -}}
|
||||
{{- .Values.namespaceOverride -}}
|
||||
{{- else -}}
|
||||
{{- .Release.Namespace -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
|
||||
{{/*
|
||||
Set the name of the Pipelines resources
|
||||
*/}}
|
||||
{{- define "pipelines.name" -}}
|
||||
{{- default .Release.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }}
|
||||
{{- end -}}
|
||||
|
||||
{{/*
|
||||
Create the chart name and version for the chart label
|
||||
*/}}
|
||||
{{- define "chart.name" -}}
|
||||
{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Create the base labels to include on chart resources
|
||||
*/}}
|
||||
{{- define "base.labels" -}}
|
||||
helm.sh/chart: {{ include "chart.name" . }}
|
||||
{{- if .Chart.AppVersion }}
|
||||
app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
|
||||
{{- end }}
|
||||
app.kubernetes.io/managed-by: {{ .Release.Service }}
|
||||
app.kubernetes.io/name: {{ include "pipelines.name" . }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Create selector labels to include on all resources
|
||||
*/}}
|
||||
{{- define "base.selectorLabels" -}}
|
||||
app.kubernetes.io/instance: {{ .Release.Name }}
|
||||
{{- end -}}
|
||||
|
||||
{{/*
|
||||
Create selector labels to include on all Pipelines resources
|
||||
*/}}
|
||||
{{- define "pipelines.selectorLabels" -}}
|
||||
{{ include "base.selectorLabels" . }}
|
||||
app.kubernetes.io/component: {{ .Chart.Name }}
|
||||
{{- end }}
|
||||
|
||||
{{- define "pipelines.extraLabels" -}}
|
||||
{{- with .Values.extraLabels }}
|
||||
{{- toYaml . }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Create labels to include on all Pipelines resources
|
||||
*/}}
|
||||
{{- define "pipelines.labels" -}}
|
||||
{{ include "base.labels" . }}
|
||||
{{ include "pipelines.selectorLabels" . }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Create the default port to use on the service if none is defined in values
|
||||
*/}}
|
||||
{{- define "pipelines.servicePort" -}}
|
||||
{{- .Values.service.port | default 9099 }}
|
||||
{{- end }}
|
||||
112
charts/open-webui/charts/pipelines/templates/deployment.yaml
Normal file
112
charts/open-webui/charts/pipelines/templates/deployment.yaml
Normal file
@ -0,0 +1,112 @@
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: {{ include "pipelines.name" . }}
|
||||
namespace: {{ include "pipelines.namespace" . }}
|
||||
labels:
|
||||
{{- include "pipelines.labels" . | nindent 4 }}
|
||||
{{- include "pipelines.extraLabels" . | nindent 4 }}
|
||||
{{- with .Values.annotations }}
|
||||
annotations:
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
spec:
|
||||
replicas: {{ .Values.replicaCount }}
|
||||
selector:
|
||||
matchLabels:
|
||||
{{- include "pipelines.selectorLabels" . | nindent 6 }}
|
||||
{{- with .Values.strategy }}
|
||||
strategy:
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
{{- include "pipelines.labels" . | nindent 8 }}
|
||||
{{- with .Values.podLabels }}
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- with .Values.podAnnotations }}
|
||||
annotations:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
spec:
|
||||
{{- with .Values.imagePullSecrets }}
|
||||
imagePullSecrets:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- with .Values.extraInitContainers }}
|
||||
initContainers:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
enableServiceLinks: false
|
||||
automountServiceAccountToken: {{ .Values.serviceAccount.automountServiceAccountToken | default false }}
|
||||
{{- if .Values.serviceAccount.enable }}
|
||||
serviceAccountName: {{ .Values.serviceAccount.name | default (include "pipelines.name" .) }}
|
||||
{{- end }}
|
||||
{{- with .Values.podSecurityContext }}
|
||||
securityContext:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
containers:
|
||||
- name: {{ .Chart.Name }}
|
||||
{{- with .Values.image }}
|
||||
image: {{ .repository }}:{{ .tag | default $.Chart.AppVersion }}
|
||||
imagePullPolicy: {{ .pullPolicy }}
|
||||
{{- end }}
|
||||
ports:
|
||||
- name: http
|
||||
containerPort: {{ .Values.service.containerPort }}
|
||||
{{- with .Values.resources }}
|
||||
resources: {{- toYaml . | nindent 10 }}
|
||||
{{- end }}
|
||||
{{- with .Values.containerSecurityContext }}
|
||||
securityContext:
|
||||
{{- toYaml . | nindent 10 }}
|
||||
{{- end }}
|
||||
volumeMounts:
|
||||
- name: data
|
||||
mountPath: /app/pipelines
|
||||
{{- with .Values.volumeMounts }}
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
env:
|
||||
{{- if .Values.extraEnvVars }}
|
||||
{{- toYaml .Values.extraEnvVars | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- if .Values.commonEnvVars }}
|
||||
{{- toYaml .Values.commonEnvVars | nindent 8 }}
|
||||
{{- end }}
|
||||
tty: true
|
||||
{{- with .Values.nodeSelector }}
|
||||
nodeSelector:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- with .Values.tolerations }}
|
||||
tolerations:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- with .Values.affinity }}
|
||||
affinity:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- with .Values.hostAliases }}
|
||||
hostAliases:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
volumes:
|
||||
{{- if and .Values.persistence.enabled .Values.persistence.existingClaim }}
|
||||
- name: data
|
||||
persistentVolumeClaim:
|
||||
claimName: {{ .Values.persistence.existingClaim }}
|
||||
{{- else if not .Values.persistence.enabled }}
|
||||
- name: data
|
||||
emptyDir: {}
|
||||
{{- else if and .Values.persistence.enabled (not .Values.persistence.existingClaim) }}
|
||||
- name: data
|
||||
persistentVolumeClaim:
|
||||
claimName: {{ include "pipelines.name" . }}
|
||||
{{- end }}
|
||||
{{- with .Values.volumes }}
|
||||
{{- toYaml . | nindent 6 }}
|
||||
{{- end }}
|
||||
@ -0,0 +1,6 @@
|
||||
{{- if .Values.extraResources }}
|
||||
{{- range .Values.extraResources }}
|
||||
---
|
||||
{{ toYaml . | nindent 0 }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
28
charts/open-webui/charts/pipelines/templates/pvc.yaml
Normal file
28
charts/open-webui/charts/pipelines/templates/pvc.yaml
Normal file
@ -0,0 +1,28 @@
|
||||
{{- if and .Values.persistence.enabled (not .Values.persistence.existingClaim) }}
|
||||
apiVersion: v1
|
||||
kind: PersistentVolumeClaim
|
||||
metadata:
|
||||
name: {{ include "pipelines.name" . }}
|
||||
namespace: {{ include "pipelines.namespace" . }}
|
||||
labels:
|
||||
{{- include "pipelines.selectorLabels" . | nindent 4 }}
|
||||
{{- with .Values.persistence.annotations }}
|
||||
annotations:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
spec:
|
||||
accessModes:
|
||||
{{- range .Values.persistence.accessModes }}
|
||||
- {{ . | quote }}
|
||||
{{- end }}
|
||||
resources:
|
||||
requests:
|
||||
storage: {{ .Values.persistence.size }}
|
||||
{{- if .Values.persistence.storageClass }}
|
||||
storageClassName: {{ .Values.persistence.storageClass }}
|
||||
{{- end }}
|
||||
{{- with .Values.persistence.selector }}
|
||||
selector:
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
@ -0,0 +1,13 @@
|
||||
{{- if and .Values.serviceAccount.enable .Values.serviceAccount.create }}
|
||||
apiVersion: v1
|
||||
kind: ServiceAccount
|
||||
metadata:
|
||||
name: {{ .Values.serviceAccount.name | default (include "pipelines.name" .) }}
|
||||
namespace: {{ include "pipelines.namespace" . }}
|
||||
labels:
|
||||
{{- include "pipelines.labels" . | nindent 4 }}
|
||||
{{- with .Values.serviceAccount.annotations }}
|
||||
annotations:
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
30
charts/open-webui/charts/pipelines/templates/service.yaml
Normal file
30
charts/open-webui/charts/pipelines/templates/service.yaml
Normal file
@ -0,0 +1,30 @@
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: {{ include "pipelines.name" . }}
|
||||
namespace: {{ include "pipelines.namespace" . }}
|
||||
labels:
|
||||
{{- include "pipelines.labels" . | nindent 4 }}
|
||||
{{- with .Values.service.labels }}
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
{{- with .Values.service.annotations }}
|
||||
annotations:
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
spec:
|
||||
selector:
|
||||
{{- include "pipelines.selectorLabels" . | nindent 4 }}
|
||||
type: {{ .Values.service.type | default "ClusterIP" }}
|
||||
ports:
|
||||
- protocol: TCP
|
||||
name: http
|
||||
port: {{ .Values.service.port }}
|
||||
targetPort: http
|
||||
{{- if .Values.service.nodePort }}
|
||||
nodePort: {{ .Values.service.nodePort | int }}
|
||||
{{- end }}
|
||||
{{- if .Values.service.loadBalancerClass }}
|
||||
loadBalancerClass: {{ .Values.service.loadBalancerClass | quote }}
|
||||
{{- end }}
|
||||
|
||||
162
charts/open-webui/charts/pipelines/values.yaml
Normal file
162
charts/open-webui/charts/pipelines/values.yaml
Normal file
@ -0,0 +1,162 @@
|
||||
nameOverride: ""
|
||||
namespaceOverride: ""
|
||||
|
||||
# -- Value of cluster domain
|
||||
clusterDomain: cluster.local
|
||||
extraLabels: {}
|
||||
annotations: {}
|
||||
podAnnotations: {}
|
||||
podLabels: {}
|
||||
replicaCount: 1
|
||||
# -- Strategy for updating the deployment
|
||||
strategy: {}
|
||||
image:
|
||||
repository: ghcr.io/open-webui/pipelines
|
||||
tag: main
|
||||
pullPolicy: Always
|
||||
|
||||
# -- Configure imagePullSecrets to use private registry
|
||||
# ref: <https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry>
|
||||
imagePullSecrets: []
|
||||
# imagePullSecrets:
|
||||
# - name: myRegistryKeySecretName
|
||||
|
||||
resources: {}
|
||||
ingress:
|
||||
enabled: true
|
||||
class: ""
|
||||
# -- Use appropriate annotations for your Ingress controller, e.g., for NGINX:
|
||||
# nginx.ingress.kubernetes.io/rewrite-target: /
|
||||
annotations: {}
|
||||
host: ""
|
||||
tls: false
|
||||
existingSecret: ""
|
||||
persistence:
|
||||
enabled: true
|
||||
size: 2Gi
|
||||
existingClaim: ""
|
||||
# -- If using multiple replicas, you must update accessModes to ReadWriteMany
|
||||
accessModes:
|
||||
- ReadWriteOnce
|
||||
storageClass: ""
|
||||
selector: {}
|
||||
annotations: {}
|
||||
|
||||
serviceAccount:
|
||||
enable: true
|
||||
create: true
|
||||
name: ""
|
||||
automountServiceAccountToken: false
|
||||
|
||||
# -- Configure pod security context
|
||||
# ref: <https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-container>
|
||||
podSecurityContext:
|
||||
{}
|
||||
# fsGroupChangePolicy: Always
|
||||
# sysctls: []
|
||||
# supplementalGroups: []
|
||||
# fsGroup: 1001
|
||||
|
||||
# -- Configure container security context
|
||||
# ref: <https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-containe>
|
||||
containerSecurityContext:
|
||||
{}
|
||||
# runAsUser: 1001
|
||||
# runAsGroup: 1001
|
||||
# runAsNonRoot: true
|
||||
# privileged: false
|
||||
# allowPrivilegeEscalation: false
|
||||
# readOnlyRootFilesystem: false
|
||||
# capabilities:
|
||||
# drop:
|
||||
# - ALL
|
||||
# seccompProfile:
|
||||
# type: "RuntimeDefault"
|
||||
|
||||
# -- Node labels for pod assignment.
|
||||
nodeSelector: {}
|
||||
|
||||
# -- Tolerations for pod assignment
|
||||
tolerations: []
|
||||
|
||||
# -- Affinity for pod assignment
|
||||
affinity: {}
|
||||
|
||||
# -- HostAliases to be added to hosts-file of each container
|
||||
hostAliases: []
|
||||
|
||||
service:
|
||||
type: ClusterIP
|
||||
annotations: {}
|
||||
port: 9099
|
||||
containerPort: 9099
|
||||
nodePort: ""
|
||||
labels: {}
|
||||
loadBalancerClass: ""
|
||||
|
||||
# -- Additional environments variables on the output Deployment definition. These are used to pull initial Pipeline files, and help configure Pipelines with required values (e.g. Langfuse API keys)
|
||||
extraEnvVars:
|
||||
# -- Example pipeline to pull and load on deployment startup, see current pipelines here: https://github.com/open-webui/pipelines/blob/main/examples
|
||||
- name: PIPELINES_URLS
|
||||
value: "https://github.com/open-webui/pipelines/blob/main/examples/filters/detoxify_filter_pipeline.py"
|
||||
# - name: PIPELINES_API_KEY
|
||||
# valueFrom:
|
||||
# secretKeyRef:
|
||||
# name: pipelines-keys
|
||||
# key: pipelines-api-key
|
||||
# -- Langfuse example, including values used in Langfuse filter to connect
|
||||
# - name: PIPELINES_URLS
|
||||
# value: "https://github.com/open-webui/pipelines/blob/main/examples/filters/langfuse_filter_pipeline.py"
|
||||
# - name: LANGFUSE_PUBLIC_KEY
|
||||
# valueFrom:
|
||||
# secretKeyRef:
|
||||
# name: langfuse-keys
|
||||
# key: public-key
|
||||
# - name: LANGFUSE_SECRET_KEY
|
||||
# valueFrom:
|
||||
# secretKeyRef:
|
||||
# name: langfuse-keys
|
||||
# key: secret-key
|
||||
# - name: LANGFUSE_HOST
|
||||
# value: https://us.cloud.langfuse.com
|
||||
|
||||
# -- Additional environments variables on the output Deployment definition, common across environments.
|
||||
commonEnvVars: []
|
||||
|
||||
# -- Configure container volume mounts
|
||||
# ref: <https://kubernetes.io/docs/tasks/configure-pod-container/configure-volume-storage/>
|
||||
volumeMounts: []
|
||||
# - name: ""
|
||||
# mountPath: ""
|
||||
|
||||
# -- Additional init containers to add to the deployment
|
||||
# ref: <https://kubernetes.io/docs/concepts/workloads/pods/init-containers/>
|
||||
extraInitContainers: []
|
||||
# - name: custom-init
|
||||
# image: busybox:latest
|
||||
# command: ['sh', '-c', 'echo "Custom init container running"']
|
||||
# volumeMounts:
|
||||
# - name: data
|
||||
# mountPath: /data
|
||||
|
||||
# -- Configure pod volumes
|
||||
# ref: <https://kubernetes.io/docs/tasks/configure-pod-container/configure-volume-storage/>
|
||||
volumes: []
|
||||
# - name: ""
|
||||
# configMap:
|
||||
# name: ""
|
||||
# - name: ""
|
||||
# secret:
|
||||
# name: ""
|
||||
# - name: ""
|
||||
# emptyDir: {}
|
||||
|
||||
# -- Extra resources to deploy with Open WebUI Pipelines
|
||||
extraResources:
|
||||
[]
|
||||
# - apiVersion: v1
|
||||
# kind: ConfigMap
|
||||
# metadata:
|
||||
# name: example-configmap
|
||||
# data:
|
||||
# example-key: example-value
|
||||
26
charts/open-webui/charts/tika/.asf.yaml
Normal file
26
charts/open-webui/charts/tika/.asf.yaml
Normal file
@ -0,0 +1,26 @@
|
||||
# Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
# contributor license agreements. See the NOTICE file distributed with
|
||||
# this work for additional information regarding copyright ownership.
|
||||
# The ASF licenses this file to You under the Apache License, Version 2.0
|
||||
# the License. You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
github:
|
||||
description: "A Helm chart to deploy Apache Tika on Kubernetes."
|
||||
homepage: https://tika.apache.org/
|
||||
labels:
|
||||
- helm
|
||||
- chart
|
||||
- tika
|
||||
|
||||
notifications:
|
||||
commits: commits@tika.apache.org
|
||||
issues: dev@tika.apache.org
|
||||
pullrequests: dev@tika.apache.org
|
||||
jira_options: link label comment
|
||||
83
charts/open-webui/charts/tika/.github/workflows/lint-test.yaml
vendored
Normal file
83
charts/open-webui/charts/tika/.github/workflows/lint-test.yaml
vendored
Normal file
@ -0,0 +1,83 @@
|
||||
# Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
# contributor license agreements. See the NOTICE file distributed with
|
||||
# this work for additional information regarding copyright ownership.
|
||||
# The ASF licenses this file to You under the Apache License, Version 2.0
|
||||
# (the "License"); you may not use this file except in compliance with
|
||||
# the License. You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
|
||||
name: Lint and Test Charts
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ main ]
|
||||
pull_request:
|
||||
branches: [ main ]
|
||||
types: [opened, synchronize, reopened]
|
||||
|
||||
jobs:
|
||||
lint-test:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4.1.5
|
||||
with:
|
||||
fetch-depth: 0
|
||||
- name: Set up Helm
|
||||
uses: azure/setup-helm@v4.2.0
|
||||
- uses: actions/setup-python@v5.1.0
|
||||
with:
|
||||
python-version: '3.x'
|
||||
check-latest: true
|
||||
- name: Set up chart-testing
|
||||
uses: helm/chart-testing-action@v2.6.1
|
||||
- name: Run chart-testing (list-changed)
|
||||
id: list-changed
|
||||
run: |
|
||||
changed=$(ct list-changed --target-branch ${{ github.event.repository.default_branch }})
|
||||
if [[ -n "$changed" ]]; then
|
||||
echo "::set-output name=changed::true"
|
||||
fi
|
||||
shell: bash
|
||||
- name: Run chart-testing (lint)
|
||||
run: ct lint --target-branch ${{ github.event.repository.default_branch }} --charts .
|
||||
shell: bash
|
||||
- name: Create kind cluster
|
||||
uses: helm/kind-action@v1.10.0
|
||||
if: steps.list-changed.outputs.changed == 'true'
|
||||
- name: Uninstall helm-unittest if present
|
||||
run: |
|
||||
helm plugin uninstall unittest >/dev/null 2>/dev/null \
|
||||
|| echo "Failed to uninstall plugin, assuming it's not present."
|
||||
shell: bash
|
||||
- name: Install latest helm-unittest
|
||||
run: |
|
||||
echo "Installing latest version of helm-unittest"
|
||||
helm plugin install https://github.com/helm-unittest/helm-unittest >/dev/null 2>/dev/null
|
||||
shell: bash
|
||||
- name: Assemble list of chart directories to test
|
||||
run: |
|
||||
tr ' ' '\n' <<< . | grep -v '^$' > charts-to-test || true
|
||||
find . -type f -name 'Chart.yaml' -exec dirname {} \; > all-charts
|
||||
[ -z . ] && mv all-charts charts-to-test || true
|
||||
shell: bash
|
||||
- name: Fetch chart dependencies
|
||||
run: |
|
||||
for chart in $(cat charts-to-test); do
|
||||
helm dependency update "$chart" >/dev/null
|
||||
done
|
||||
shell: bash
|
||||
- name: Run unit tests
|
||||
run: helm unittest --color $(cat charts-to-test)
|
||||
shell: bash
|
||||
- name: Run chart-testing (install)
|
||||
if: steps.list-changed.outputs.changed == 'true'
|
||||
run: ct install --target-branch ${{ github.event.repository.default_branch }} --charts .
|
||||
shell: bash
|
||||
44
charts/open-webui/charts/tika/.github/workflows/pluto.yaml
vendored
Normal file
44
charts/open-webui/charts/tika/.github/workflows/pluto.yaml
vendored
Normal file
@ -0,0 +1,44 @@
|
||||
# Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
# contributor license agreements. See the NOTICE file distributed with
|
||||
# this work for additional information regarding copyright ownership.
|
||||
# The ASF licenses this file to You under the Apache License, Version 2.0
|
||||
# (the "License"); you may not use this file except in compliance with
|
||||
# the License. You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
|
||||
name: Use Pluto to check helm chart for resources using deprecated k8s APIs
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ main ]
|
||||
pull_request:
|
||||
branches: [ main ]
|
||||
types: [opened, synchronize, reopened]
|
||||
|
||||
jobs:
|
||||
pluto_detect:
|
||||
runs-on: ubuntu-latest
|
||||
env:
|
||||
PLUTO_VERSION: 5.19.1
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4.1.5
|
||||
- name: Download Pluto
|
||||
run: |
|
||||
wget https://github.com/FairwindsOps/pluto/releases/download/v${{ env.PLUTO_VERSION }}/pluto_${{ env.PLUTO_VERSION }}_linux_amd64.tar.gz -O - | tar -xz
|
||||
mv pluto /usr/local/bin/pluto
|
||||
chmod +x /usr/local/bin/pluto
|
||||
shell: bash
|
||||
- name: Set up Helm
|
||||
uses: azure/setup-helm@v4.2.0
|
||||
- name: verify helm chart
|
||||
run: |
|
||||
helm template . | pluto detect -omarkdown - >> $GITHUB_STEP_SUMMARY
|
||||
shell: bash
|
||||
24
charts/open-webui/charts/tika/.helmignore
Normal file
24
charts/open-webui/charts/tika/.helmignore
Normal file
@ -0,0 +1,24 @@
|
||||
# Patterns to ignore when building packages.
|
||||
# This supports shell glob matching, relative path matching, and
|
||||
# negation (prefixed with !). Only one pattern per line.
|
||||
.DS_Store
|
||||
# Common VCS dirs
|
||||
.git/
|
||||
.gitignore
|
||||
.bzr/
|
||||
.bzrignore
|
||||
.hg/
|
||||
.hgignore
|
||||
.svn/
|
||||
# Common backup files
|
||||
*.swp
|
||||
*.bak
|
||||
*.tmp
|
||||
*.orig
|
||||
*~
|
||||
# Various IDEs
|
||||
.project
|
||||
.idea/
|
||||
*.tmproj
|
||||
.vscode/
|
||||
tests
|
||||
52
charts/open-webui/charts/tika/Chart.yaml
Normal file
52
charts/open-webui/charts/tika/Chart.yaml
Normal file
@ -0,0 +1,52 @@
|
||||
annotations:
|
||||
artifacthub.io/category: integration-delivery
|
||||
artifacthub.io/containsSecurityUpdates: "false"
|
||||
artifacthub.io/license: Apache-2.0
|
||||
artifacthub.io/links: |
|
||||
- name: support
|
||||
url: https://issues.apache.org/jira/browse/TIKA
|
||||
artifacthub.io/prerelease: "false"
|
||||
artifacthub.io/recommendations: |
|
||||
- url: https://artifacthub.io/packages/helm/apache-solr/solr
|
||||
- url: https://artifacthub.io/packages/helm/apache-airflow/airflow
|
||||
apiVersion: v2
|
||||
appVersion: 3.2.2.0-full
|
||||
description: The official Helm chart for Apache Tika
|
||||
home: https://tika.apache.org
|
||||
icon: https://tika.apache.org/tika.png
|
||||
keywords:
|
||||
- apache
|
||||
- tika
|
||||
- apache-tika
|
||||
- tika-helm
|
||||
maintainers:
|
||||
- email: lewismc@apache.org
|
||||
name: lewismc
|
||||
url: https://github.com/lewismc
|
||||
- name: stijnbrouwers
|
||||
url: https://github.com/stijnbrouwers
|
||||
- name: philipsoutham
|
||||
url: https://github.com/philipsoutham
|
||||
- name: frascu
|
||||
url: https://github.com/frascu
|
||||
- name: euven
|
||||
url: https://github.com/euven
|
||||
- name: ps0uth
|
||||
url: https://github.com/ps0uth
|
||||
- name: ahilmathew
|
||||
url: https://github.com/ahilmathew
|
||||
- name: aidanthewiz
|
||||
url: https://github.com/aidanthewiz
|
||||
- name: bartek
|
||||
url: https://github.com/bartek
|
||||
- name: CiraciNicolo
|
||||
url: https://github.com/CiraciNicolo
|
||||
- name: amalucelli
|
||||
url: https://github.com/amalucelli
|
||||
- name: thatmlopsguy
|
||||
url: https://github.com/thatmlopsguy
|
||||
name: tika
|
||||
sources:
|
||||
- https://github.com/apache/tika-helm
|
||||
type: application
|
||||
version: 3.2.2
|
||||
5737
charts/open-webui/charts/tika/LICENSE.txt
Normal file
5737
charts/open-webui/charts/tika/LICENSE.txt
Normal file
File diff suppressed because it is too large
Load Diff
159
charts/open-webui/charts/tika/README.md
Normal file
159
charts/open-webui/charts/tika/README.md
Normal file
@ -0,0 +1,159 @@
|
||||
tika-helm
|
||||
=========
|
||||
|
||||
[](https://artifacthub.io/packages/search?repo=apache-tika)
|
||||
|
||||
<div class="artifacthub-widget" data-url="https://artifacthub.io/packages/helm/apache-tika/tika" data-theme="light" data-header="true" data-stars="true" data-responsive="false"><blockquote><p lang="en" dir="ltr"><b>tika</b>: The official Helm chart to deploy Apache Tika on Kubernetes</p>— Open in <a href="https://artifacthub.io/packages/helm/apache-tika/tika">Artifact Hub</a></blockquote></div><script async src="https://artifacthub.io/artifacthub-widget.js"></script>
|
||||
|
||||
A [Helm chart][] to deploy [Apache Tika][] on [Kubernetes][].
|
||||
|
||||
<img src="https://tika.apache.org/tika.png" width="300" />
|
||||
|
||||
This Helm chart is a lightweight way to configure and run the official [apache/tika][] Docker image.
|
||||
|
||||
We recommend that the Helm chart version is aligned to the version Tika (and subsequently the
|
||||
version of the [Tika Docker image][]) you want to deploy.
|
||||
This will ensure that you using a chart version that has been tested against the corresponding
|
||||
production version. This will also ensure that the documentation and examples for the chart
|
||||
will work with the version of Tika you are installing.
|
||||
|
||||
<!-- development warning placeholder -->
|
||||
**Warning**: This branch is used for development, please use the [latest release][] for released version.
|
||||
|
||||
<!-- START doctoc generated TOC please keep comment here to allow auto update -->
|
||||
<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->
|
||||
|
||||
- [tika-helm](#tika-helm)
|
||||
- [Requirements](#requirements)
|
||||
- [Installing](#installing)
|
||||
- [Install released version using Helm repository](#install-released-version-using-helm-repository)
|
||||
- [Install development version using master branch](#install-development-version-using-master-branch)
|
||||
- [Custom configuration for tika](#custom-configuration-for-tika)
|
||||
- [Upgrading](#upgrading)
|
||||
- [Configuration](#configuration)
|
||||
- [Deprecated](#deprecated)
|
||||
- [Contributing](#contributing)
|
||||
- [More Information](#more-information)
|
||||
- [Authors](#authors)
|
||||
- [License](#license)
|
||||
|
||||
<!-- END doctoc generated TOC please keep comment here to allow auto update -->
|
||||
<!-- Use this to update TOC: -->
|
||||
<!-- docker run --rm -it -v $(pwd):/usr/src jorgeandrada/doctoc --github -->
|
||||
|
||||
## Requirements
|
||||
|
||||
* Kubernetes >= 1.14
|
||||
* [Helm][] >= v3.4.2
|
||||
|
||||
## Installing
|
||||
|
||||
### Install released version using Helm repository
|
||||
|
||||
**N.B.** You may or may not need/wish to install the chart into a specific **namespace**,
|
||||
in which case you may need to augment the commands below.
|
||||
|
||||
* Add the Tika Helm charts repo:
|
||||
`helm repo add tika https://apache.jfrog.io/artifactory/tika`
|
||||
|
||||
* Install it:
|
||||
- with Helm 3: `helm install tika tika/tika --set image.tag=${release.version} -n tika-test`, you will see something like
|
||||
```
|
||||
helm install tika tika/tika --set image.tag=latest-full -n tika-test
|
||||
|
||||
...
|
||||
NAME: tika
|
||||
LAST DEPLOYED: Mon Jan 24 13:38:01 2022
|
||||
NAMESPACE: tika-test
|
||||
STATUS: deployed
|
||||
REVISION: 1
|
||||
NOTES:
|
||||
1. Get the application URL by running these commands:
|
||||
export POD_NAME=$(kubectl get pods --namespace tika-test -l "app.kubernetes.io/name=tika,app.kubernetes.io/instance=tika" -o jsonpath="{.items[0].metadata.name}")
|
||||
export CONTAINER_PORT=$(kubectl get pod --namespace tika-test $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}")
|
||||
echo "Visit http://127.0.0.1:9998 to use your application"
|
||||
kubectl --namespace tika-test port-forward $POD_NAME 9998:$CONTAINER_PORT
|
||||
```
|
||||
You may notice that the _kubectl port forwarding_ experiences a _timeout issue_ which ultimately kills the app. In this case you can run port formarding in a loop
|
||||
```
|
||||
while true; do kubectl --namespace tika-test port-forward $POD_NAME 9998:$CONTAINER_PORT ; done
|
||||
```
|
||||
... this should keep `kubectl` reconnecting on connection lost.
|
||||
|
||||
### Install development version using master branch
|
||||
|
||||
* Clone the git repo: `git clone git@github.com:apache/tika-helm.git`
|
||||
|
||||
* Install it:
|
||||
- with Helm 3: `helm install tika . --set image.tag=latest-full`
|
||||
|
||||
### Custom configuration for tika
|
||||
|
||||
To use custom [configuration]( https://tika.apache.org/2.9.1/configuring.html) values for apache tika, use the `tikaConfig` key in the `values.yaml`.
|
||||
Example:
|
||||
```
|
||||
tikaConfig: |
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<properties>
|
||||
<parsers>
|
||||
<!-- Default Parser for most things, except for 2 mime types -->
|
||||
<parser class="org.apache.tika.parser.DefaultParser">
|
||||
<mime-exclude>image/jpeg</mime-exclude>
|
||||
<mime-exclude>application/pdf</mime-exclude>
|
||||
</parser>
|
||||
</parsers>
|
||||
</properties>
|
||||
```
|
||||
## Upgrading
|
||||
|
||||
Please check `artifacthub.io/changes` in `Chart.yaml` before upgrading.
|
||||
|
||||
## Configuration
|
||||
|
||||
| Parameter | Description | Default |
|
||||
| --------- | ----------- | ------- |
|
||||
| `...` | ... | ... |
|
||||
|
||||
## Testing
|
||||
|
||||
```
|
||||
helm plugin install https://github.com/helm-unittest/helm-unittest.git
|
||||
helm unittest .
|
||||
```
|
||||
|
||||
See [helm-unittest][] for canonical documentation.
|
||||
|
||||
## Contributing
|
||||
|
||||
Please check [CONTRIBUTING][] before any contribution or for any questions
|
||||
about our development and testing process.
|
||||
|
||||
## More Information
|
||||
|
||||
For more infomation on Apache Tika Server, go to the [Apache Tika Server documentation][].
|
||||
|
||||
For more information on Apache Tika, go to the official [Apache Tika][] project website.
|
||||
|
||||
For more information on the Apache Software Foundation, go to the [Apache Software Foundation][] website.
|
||||
|
||||
## Authors
|
||||
|
||||
Apache Tika Dev Team (dev@tika.apache.org)
|
||||
|
||||
# License
|
||||
The code is licensed permissively under the [Apache License v2.0][].
|
||||
|
||||
[Apache License v2.0]: https://www.apache.org/licenses/LICENSE-2.0.html
|
||||
[Apache Software Foundation]: http://apache.org
|
||||
[Apache Tika]: https://tika.apache.org
|
||||
[Apache Tika Server documentation]: https://cwiki.apache.org/confluence/display/TIKA/TikaServer
|
||||
[BREAKING_CHANGES.md]: https://github.com/apache/tika-helm/blob/master/BREAKING_CHANGES.md
|
||||
[CHANGELOG.md]: https://github.com/apache/tika-helm/blob/master/CHANGELOG.md
|
||||
[CONTRIBUTING]: https://github.com/apache/tika#contributing-via-github
|
||||
[apache/tika]: https://github.com/apache/tika-docker
|
||||
[helm-unittest]: https://github.com/helm-unittest/helm-unittest
|
||||
[Helm chart]: https://helm.sh/docs/topics/charts/
|
||||
[Kubernetes]: https://kubernetes.io/
|
||||
[Tika Docker image]: https://hub.docker.com/r/apache/tika/tags?page=1&ordering=last_updated
|
||||
[helm]: https://helm.sh
|
||||
[latest release]: https://github.com/apache/tika-helm/releases
|
||||
32
charts/open-webui/charts/tika/artifacthub-repo.yml
Normal file
32
charts/open-webui/charts/tika/artifacthub-repo.yml
Normal file
@ -0,0 +1,32 @@
|
||||
# Licensed to the Apache Software Foundation (ASF) under one
|
||||
# or more contributor license agreements. See the NOTICE file
|
||||
# distributed with this work for additional information
|
||||
# regarding copyright ownership. The ASF licenses this file
|
||||
# to you under the Apache License, Version 2.0 (the
|
||||
# "License"); you may not use this file except in compliance
|
||||
# with the License. You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing,
|
||||
# software distributed under the License is distributed on an
|
||||
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
# KIND, either express or implied. See the License for the
|
||||
# specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
# Artifact Hub repository metadata file
|
||||
#
|
||||
# Some settings like the verified publisher flag or the ignored packages won't
|
||||
# be applied until the next time the repository is processed. Please keep in
|
||||
# mind that the repository won't be processed if it has not changed since the
|
||||
# last time it was processed. Depending on the repository kind, this is checked
|
||||
# in a different way. For Helm http based repositories, we consider it has
|
||||
# changed if the `index.yaml` file changes. For git based repositories, it does
|
||||
# when the hash of the last commit in the branch you set up changes. This does
|
||||
# NOT apply to ownership claim operations, which are processed immediately.
|
||||
#
|
||||
repositoryID: 01c1e88b-cba6-4430-9e05-05f02d3f805b
|
||||
owners:
|
||||
- name: Apache Tika Committers
|
||||
email: dev@tika.apache.org
|
||||
22
charts/open-webui/charts/tika/templates/NOTES.txt
Normal file
22
charts/open-webui/charts/tika/templates/NOTES.txt
Normal file
@ -0,0 +1,22 @@
|
||||
1. Get the application URL by running these commands:
|
||||
{{- if .Values.ingress.enabled }}
|
||||
{{- range $host := .Values.ingress.hosts }}
|
||||
{{- range .paths }}
|
||||
http{{ if $.Values.ingress.tls }}s{{ end }}://{{ $host.host }}{{ .path }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- else if contains "NodePort" .Values.service.type }}
|
||||
export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "tika-helm.fullname" . }})
|
||||
export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}")
|
||||
echo http://$NODE_IP:$NODE_PORT
|
||||
{{- else if contains "LoadBalancer" .Values.service.type }}
|
||||
NOTE: It may take a few minutes for the LoadBalancer IP to be available.
|
||||
You can watch the status of by running 'kubectl get --namespace {{ .Release.Namespace }} svc -w {{ include "tika-helm.fullname" . }}'
|
||||
export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ include "tika-helm.fullname" . }} --template "{{"{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}"}}")
|
||||
echo http://$SERVICE_IP:{{ .Values.service.port }}
|
||||
{{- else if contains "ClusterIP" .Values.service.type }}
|
||||
export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app.kubernetes.io/name={{ include "tika-helm.name" . }},app.kubernetes.io/instance={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}")
|
||||
export CONTAINER_PORT=$(kubectl get pod --namespace {{ .Release.Namespace }} $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}")
|
||||
echo "Visit http://127.0.0.1:9998 to use your application"
|
||||
kubectl --namespace {{ .Release.Namespace }} port-forward $POD_NAME 9998:$CONTAINER_PORT
|
||||
{{- end }}
|
||||
74
charts/open-webui/charts/tika/templates/_helpers.tpl
Normal file
74
charts/open-webui/charts/tika/templates/_helpers.tpl
Normal file
@ -0,0 +1,74 @@
|
||||
{{/*
|
||||
Allow the release namespace to be overridden for multi-namespace deployments in combined charts
|
||||
*/}}
|
||||
{{- define "tika-helm.namespace" -}}
|
||||
{{- if .Values.namespaceOverride -}}
|
||||
{{- .Values.namespaceOverride -}}
|
||||
{{- else -}}
|
||||
{{- .Release.Namespace -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
|
||||
|
||||
{{/*
|
||||
Expand the name of the chart.
|
||||
*/}}
|
||||
{{- define "tika-helm.name" -}}
|
||||
{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Create a default fully qualified app name.
|
||||
We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
|
||||
If release name contains chart name it will be used as a full name.
|
||||
*/}}
|
||||
{{- define "tika-helm.fullname" -}}
|
||||
{{- if .Values.fullnameOverride }}
|
||||
{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }}
|
||||
{{- else }}
|
||||
{{- $name := default .Chart.Name .Values.nameOverride }}
|
||||
{{- if contains $name .Release.Name }}
|
||||
{{- .Release.Name | trunc 63 | trimSuffix "-" }}
|
||||
{{- else }}
|
||||
{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Create chart name and version as used by the chart label.
|
||||
*/}}
|
||||
{{- define "tika-helm.chart" -}}
|
||||
{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Common labels
|
||||
*/}}
|
||||
{{- define "tika-helm.labels" -}}
|
||||
helm.sh/chart: {{ include "tika-helm.chart" . }}
|
||||
{{ include "tika-helm.selectorLabels" . }}
|
||||
{{- if .Chart.AppVersion }}
|
||||
app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
|
||||
{{- end }}
|
||||
app.kubernetes.io/managed-by: {{ .Release.Service }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Selector labels
|
||||
*/}}
|
||||
{{- define "tika-helm.selectorLabels" -}}
|
||||
app.kubernetes.io/name: {{ include "tika-helm.name" . }}
|
||||
app.kubernetes.io/instance: {{ .Release.Name }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Create the name of the service account to use
|
||||
*/}}
|
||||
{{- define "tika-helm.serviceAccountName" -}}
|
||||
{{- if .Values.serviceAccount.create }}
|
||||
{{- default (include "tika-helm.fullname" .) .Values.serviceAccount.name }}
|
||||
{{- else }}
|
||||
{{- default "default" .Values.serviceAccount.name }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
28
charts/open-webui/charts/tika/templates/configmap.yaml
Normal file
28
charts/open-webui/charts/tika/templates/configmap.yaml
Normal file
@ -0,0 +1,28 @@
|
||||
# Licensed to the Apache Software Foundation (ASF) under one
|
||||
# or more contributor license agreements. See the NOTICE file
|
||||
# distributed with this work for additional information
|
||||
# regarding copyright ownership. The ASF licenses this file
|
||||
# to you under the Apache License, Version 2.0 (the
|
||||
# "License"); you may not use this file except in compliance
|
||||
# with the License. You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing,
|
||||
# software distributed under the License is distributed on an
|
||||
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
# KIND, either express or implied. See the License for the
|
||||
# specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
---
|
||||
{{- if .Values.tikaConfig }}
|
||||
apiVersion: v1
|
||||
kind: ConfigMap
|
||||
metadata:
|
||||
name: {{ .Chart.Name }}-config
|
||||
namespace: {{ include "tika-helm.namespace" . }}
|
||||
data:
|
||||
tika-config.xml: |-
|
||||
{{ .Values.tikaConfig | indent 4 }}
|
||||
{{- end }}
|
||||
127
charts/open-webui/charts/tika/templates/deployment.yaml
Normal file
127
charts/open-webui/charts/tika/templates/deployment.yaml
Normal file
@ -0,0 +1,127 @@
|
||||
# Licensed to the Apache Software Foundation (ASF) under one
|
||||
# or more contributor license agreements. See the NOTICE file
|
||||
# distributed with this work for additional information
|
||||
# regarding copyright ownership. The ASF licenses this file
|
||||
# to you under the Apache License, Version 2.0 (the
|
||||
# "License"); you may not use this file except in compliance
|
||||
# with the License. You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing,
|
||||
# software distributed under the License is distributed on an
|
||||
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
# KIND, either express or implied. See the License for the
|
||||
# specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
---
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: {{ include "tika-helm.fullname" . }}
|
||||
namespace: {{ include "tika-helm.namespace" . }}
|
||||
labels:
|
||||
{{- include "tika-helm.labels" . | nindent 4 }}
|
||||
spec:
|
||||
{{- if not .Values.autoscaling.enabled }}
|
||||
replicas: {{ .Values.replicaCount }}
|
||||
{{- end }}
|
||||
selector:
|
||||
matchLabels:
|
||||
{{- include "tika-helm.selectorLabels" . | nindent 6 }}
|
||||
template:
|
||||
metadata:
|
||||
{{- with .Values.podAnnotations }}
|
||||
annotations:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
labels:
|
||||
{{- include "tika-helm.selectorLabels" . | nindent 8 }}
|
||||
spec:
|
||||
{{- with .Values.imagePullSecrets }}
|
||||
imagePullSecrets:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
serviceAccountName: {{ include "tika-helm.serviceAccountName" . }}
|
||||
securityContext:
|
||||
{{- toYaml .Values.podSecurityContext | nindent 8 }}
|
||||
volumes:
|
||||
- name: sec-ctx-vol
|
||||
emptyDir: {}
|
||||
{{- if .Values.tikaConfig }}
|
||||
- name: tika-config
|
||||
configMap:
|
||||
name: {{ .Chart.Name }}-config
|
||||
defaultMode: 0777
|
||||
{{- end }}
|
||||
containers:
|
||||
- name: {{ .Chart.Name }}
|
||||
{{- if .Values.tikaConfig }}
|
||||
args: ["-c" , "/tika-config/tika-config.xml"]
|
||||
{{- end }}
|
||||
{{- with .Values.env }}
|
||||
env:
|
||||
{{- toYaml . | nindent 12 }}
|
||||
{{- end }}
|
||||
securityContext:
|
||||
{{- toYaml .Values.securityContext | nindent 12 }}
|
||||
image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
|
||||
imagePullPolicy: {{ .Values.image.pullPolicy }}
|
||||
volumeMounts:
|
||||
- name: sec-ctx-vol
|
||||
mountPath: /tmp
|
||||
{{- if .Values.tikaConfig }}
|
||||
- name: tika-config
|
||||
mountPath: /tika-config
|
||||
{{- end }}
|
||||
ports:
|
||||
- name: http
|
||||
containerPort: {{ .Values.service.port }}
|
||||
protocol: TCP
|
||||
livenessProbe:
|
||||
{{- if eq (lower .Values.livenessProbe.scheme) "tcp" }}
|
||||
tcpSocket:
|
||||
port: {{ .Values.service.port }}
|
||||
{{- else }}
|
||||
httpGet:
|
||||
path: {{if .Values.config.base_url }}{{- with urlParse (tpl .Values.config.base_url .) }}{{ .path }}{{end}}{{else}}/{{end}}
|
||||
port: {{ .Values.service.port }}
|
||||
scheme: {{ .Values.livenessProbe.scheme | default "http" }}
|
||||
{{- end }}
|
||||
initialDelaySeconds: {{ .Values.livenessProbe.initialDelaySeconds | default 15 }}
|
||||
timeoutSeconds: {{ .Values.livenessProbe.timeoutSeconds | default 30 }}
|
||||
failureThreshold: {{ .Values.livenessProbe.failureThreshold | default 20 }}
|
||||
periodSeconds: {{ .Values.livenessProbe.periodSeconds | default 5 }}
|
||||
readinessProbe:
|
||||
{{- if eq (lower .Values.readinessProbe.scheme) "tcp" }}
|
||||
tcpSocket:
|
||||
port: {{ .Values.service.port }}
|
||||
{{- else }}
|
||||
httpGet:
|
||||
path: {{if .Values.config.base_url }}{{- with urlParse (tpl .Values.config.base_url .) }}{{ .path }}{{end}}{{else}}/{{end}}
|
||||
port: {{ .Values.service.port }}
|
||||
scheme: {{ .Values.readinessProbe.scheme | default "http" }}
|
||||
{{- end }}
|
||||
initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds | default 15 }}
|
||||
timeoutSeconds: {{ .Values.readinessProbe.timeoutSeconds | default 30 }}
|
||||
failureThreshold: {{ .Values.readinessProbe.failureThreshold | default 20 }}
|
||||
periodSeconds: {{ .Values.readinessProbe.periodSeconds | default 5 }}
|
||||
resources:
|
||||
{{- toYaml .Values.resources | nindent 12 }}
|
||||
{{- with .Values.nodeSelector }}
|
||||
nodeSelector:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- with .Values.affinity }}
|
||||
affinity:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- with .Values.tolerations }}
|
||||
tolerations:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- with .Values.topologySpreadConstraints }}
|
||||
topologySpreadConstraints:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
66
charts/open-webui/charts/tika/templates/hpa.yaml
Normal file
66
charts/open-webui/charts/tika/templates/hpa.yaml
Normal file
@ -0,0 +1,66 @@
|
||||
# Licensed to the Apache Software Foundation (ASF) under one
|
||||
# or more contributor license agreements. See the NOTICE file
|
||||
# distributed with this work for additional information
|
||||
# regarding copyright ownership. The ASF licenses this file
|
||||
# to you under the Apache License, Version 2.0 (the
|
||||
# "License"); you may not use this file except in compliance
|
||||
# with the License. You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing,
|
||||
# software distributed under the License is distributed on an
|
||||
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
# KIND, either express or implied. See the License for the
|
||||
# specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
---
|
||||
{{- if .Values.autoscaling.enabled }}
|
||||
apiVersion: {{ .Values.autoscaling.apiVersion }}
|
||||
kind: HorizontalPodAutoscaler
|
||||
metadata:
|
||||
name: {{ include "tika-helm.fullname" . }}
|
||||
namespace: {{ include "tika-helm.namespace" . }}
|
||||
labels:
|
||||
{{- include "tika-helm.labels" . | nindent 4 }}
|
||||
spec:
|
||||
scaleTargetRef:
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
name: {{ include "tika-helm.fullname" . }}
|
||||
minReplicas: {{ .Values.autoscaling.minReplicas }}
|
||||
maxReplicas: {{ .Values.autoscaling.maxReplicas }}
|
||||
metrics:
|
||||
{{- if eq .Values.autoscaling.apiVersion "autoscaling/v2" }}
|
||||
{{- if .Values.autoscaling.targetMemoryUtilizationPercentage }}
|
||||
- type: Resource
|
||||
resource:
|
||||
name: memory
|
||||
target:
|
||||
type: Utilization
|
||||
averageUtilization: {{ .Values.autoscaling.targetMemoryUtilizationPercentage }}
|
||||
{{- end }}
|
||||
{{- if .Values.autoscaling.targetCPUUtilizationPercentage }}
|
||||
- type: Resource
|
||||
resource:
|
||||
name: cpu
|
||||
target:
|
||||
type: Utilization
|
||||
averageUtilization: {{ .Values.autoscaling.targetCPUUtilizationPercentage }}
|
||||
{{- end }}
|
||||
{{- else }}
|
||||
{{- if .Values.autoscaling.targetMemoryUtilizationPercentage }}
|
||||
- type: Resource
|
||||
resource:
|
||||
name: memory
|
||||
targetAverageUtilization: {{ .Values.autoscaling.targetMemoryUtilizationPercentage }}
|
||||
{{- end }}
|
||||
{{- if .Values.autoscaling.targetCPUUtilizationPercentage }}
|
||||
- type: Resource
|
||||
resource:
|
||||
name: cpu
|
||||
targetAverageUtilization: {{ .Values.autoscaling.targetCPUUtilizationPercentage }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
80
charts/open-webui/charts/tika/templates/ingress.yaml
Normal file
80
charts/open-webui/charts/tika/templates/ingress.yaml
Normal file
@ -0,0 +1,80 @@
|
||||
# Licensed to the Apache Software Foundation (ASF) under one
|
||||
# or more contributor license agreements. See the NOTICE file
|
||||
# distributed with this work for additional information
|
||||
# regarding copyright ownership. The ASF licenses this file
|
||||
# to you under the Apache License, Version 2.0 (the
|
||||
# "License"); you may not use this file except in compliance
|
||||
# with the License. You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing,
|
||||
# software distributed under the License is distributed on an
|
||||
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
# KIND, either express or implied. See the License for the
|
||||
# specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
---
|
||||
{{- if .Values.ingress.enabled -}}
|
||||
{{- $fullName := include "tika-helm.fullname" . -}}
|
||||
{{- $svcPort := .Values.service.port -}}
|
||||
{{- if and .Values.ingress.className (not (semverCompare ">=1.18-0" .Capabilities.KubeVersion.GitVersion)) }}
|
||||
{{- if not (hasKey .Values.ingress.annotations "kubernetes.io/ingress.class") }}
|
||||
{{- $_ := set .Values.ingress.annotations "kubernetes.io/ingress.class" .Values.ingress.className}}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- if semverCompare ">=1.19-0" .Capabilities.KubeVersion.GitVersion -}}
|
||||
apiVersion: networking.k8s.io/v1
|
||||
{{- else if semverCompare ">=1.14-0" .Capabilities.KubeVersion.GitVersion -}}
|
||||
apiVersion: networking.k8s.io/v1beta1
|
||||
{{- else -}}
|
||||
apiVersion: extensions/v1beta1
|
||||
{{- end }}
|
||||
kind: Ingress
|
||||
metadata:
|
||||
name: {{ $fullName }}
|
||||
namespace: {{ include "tika-helm.namespace" . }}
|
||||
labels:
|
||||
{{- include "tika-helm.labels" . | nindent 4 }}
|
||||
{{- with .Values.ingress.annotations }}
|
||||
annotations:
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
spec:
|
||||
{{- if and .Values.ingress.className (semverCompare ">=1.18-0" .Capabilities.KubeVersion.GitVersion) }}
|
||||
ingressClassName: {{ .Values.ingress.className }}
|
||||
{{- end }}
|
||||
{{- if .Values.ingress.tls }}
|
||||
tls:
|
||||
{{- range .Values.ingress.tls }}
|
||||
- hosts:
|
||||
{{- range .hosts }}
|
||||
- {{ . | quote }}
|
||||
{{- end }}
|
||||
secretName: {{ .secretName }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
rules:
|
||||
{{- range .Values.ingress.hosts }}
|
||||
- host: {{ .host | quote }}
|
||||
http:
|
||||
paths:
|
||||
{{- range .paths }}
|
||||
- path: {{ .path }}
|
||||
{{- if and .pathType (semverCompare ">=1.18-0" $.Capabilities.KubeVersion.GitVersion) }}
|
||||
pathType: {{ .pathType }}
|
||||
{{- end }}
|
||||
backend:
|
||||
{{- if semverCompare ">=1.19-0" $.Capabilities.KubeVersion.GitVersion }}
|
||||
service:
|
||||
name: {{ $fullName }}
|
||||
port:
|
||||
number: {{ $svcPort }}
|
||||
{{- else }}
|
||||
serviceName: {{ $fullName }}
|
||||
servicePort: {{ $svcPort }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
42
charts/open-webui/charts/tika/templates/networkpolicy.yaml
Normal file
42
charts/open-webui/charts/tika/templates/networkpolicy.yaml
Normal file
@ -0,0 +1,42 @@
|
||||
# Licensed to the Apache Software Foundation (ASF) under one
|
||||
# or more contributor license agreements. See the NOTICE file
|
||||
# distributed with this work for additional information
|
||||
# regarding copyright ownership. The ASF licenses this file
|
||||
# to you under the Apache License, Version 2.0 (the
|
||||
# "License"); you may not use this file except in compliance
|
||||
# with the License. You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing,
|
||||
# software distributed under the License is distributed on an
|
||||
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
# KIND, either express or implied. See the License for the
|
||||
# specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
---
|
||||
{{- if .Values.networkPolicy.enabled }}
|
||||
apiVersion: networking.k8s.io/v1
|
||||
kind: NetworkPolicy
|
||||
metadata:
|
||||
name: {{ template "tika-helm.fullname" . }}
|
||||
namespace: {{ include "tika-helm.namespace" . }}
|
||||
labels:
|
||||
{{- include "tika-helm.labels" . | nindent 4 }}
|
||||
spec:
|
||||
podSelector:
|
||||
matchLabels:
|
||||
{{- include "tika-helm.selectorLabels" . | nindent 6 }}
|
||||
egress:
|
||||
- {}
|
||||
ingress:
|
||||
- ports:
|
||||
- port: {{ .Values.service.port }}
|
||||
{{- if not .Values.networkPolicy.allowExternal }}
|
||||
from:
|
||||
- podSelector:
|
||||
matchLabels:
|
||||
{{ template "tika-helm.fullname" . }}-client: "true"
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
38
charts/open-webui/charts/tika/templates/service.yaml
Normal file
38
charts/open-webui/charts/tika/templates/service.yaml
Normal file
@ -0,0 +1,38 @@
|
||||
# Licensed to the Apache Software Foundation (ASF) under one
|
||||
# or more contributor license agreements. See the NOTICE file
|
||||
# distributed with this work for additional information
|
||||
# regarding copyright ownership. The ASF licenses this file
|
||||
# to you under the Apache License, Version 2.0 (the
|
||||
# "License"); you may not use this file except in compliance
|
||||
# with the License. You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing,
|
||||
# software distributed under the License is distributed on an
|
||||
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
# KIND, either express or implied. See the License for the
|
||||
# specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: {{ include "tika-helm.fullname" . }}
|
||||
namespace: {{ include "tika-helm.namespace" . }}
|
||||
labels:
|
||||
{{- include "tika-helm.labels" . | nindent 4 }}
|
||||
annotations:
|
||||
{{- with .Values.service.annotations }}
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
spec:
|
||||
type: {{ .Values.service.type }}
|
||||
ports:
|
||||
- port: {{ .Values.service.port }}
|
||||
targetPort: http
|
||||
protocol: TCP
|
||||
name: http
|
||||
selector:
|
||||
{{- include "tika-helm.selectorLabels" . | nindent 4 }}
|
||||
31
charts/open-webui/charts/tika/templates/serviceaccount.yaml
Normal file
31
charts/open-webui/charts/tika/templates/serviceaccount.yaml
Normal file
@ -0,0 +1,31 @@
|
||||
# Licensed to the Apache Software Foundation (ASF) under one
|
||||
# or more contributor license agreements. See the NOTICE file
|
||||
# distributed with this work for additional information
|
||||
# regarding copyright ownership. The ASF licenses this file
|
||||
# to you under the Apache License, Version 2.0 (the
|
||||
# "License"); you may not use this file except in compliance
|
||||
# with the License. You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing,
|
||||
# software distributed under the License is distributed on an
|
||||
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
# KIND, either express or implied. See the License for the
|
||||
# specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
---
|
||||
{{- if .Values.serviceAccount.create }}
|
||||
apiVersion: v1
|
||||
kind: ServiceAccount
|
||||
metadata:
|
||||
name: {{ include "tika-helm.serviceAccountName" . }}
|
||||
namespace: {{ include "tika-helm.namespace" . }}
|
||||
labels:
|
||||
{{- include "tika-helm.labels" . | nindent 4 }}
|
||||
{{- with .Values.serviceAccount.annotations }}
|
||||
annotations:
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
69
charts/open-webui/charts/tika/values.yaml
Normal file
69
charts/open-webui/charts/tika/values.yaml
Normal file
@ -0,0 +1,69 @@
|
||||
affinity: {}
|
||||
autoscaling:
|
||||
apiVersion: autoscaling/v2
|
||||
enabled: false
|
||||
maxReplicas: 100
|
||||
minReplicas: 1
|
||||
targetCPUUtilizationPercentage: 80
|
||||
targetMemoryUtilizationPercentage: 80
|
||||
config:
|
||||
base_url: http://localhost/
|
||||
fullnameOverride: ""
|
||||
image:
|
||||
pullPolicy: IfNotPresent
|
||||
repository: apache/tika
|
||||
tag: 3.2.2.0-full
|
||||
imagePullSecrets: []
|
||||
ingress:
|
||||
annotations: {}
|
||||
enabled: false
|
||||
hosts:
|
||||
- host: chart-example.local
|
||||
paths: []
|
||||
tls: []
|
||||
livenessProbe:
|
||||
failureThreshold: 20
|
||||
initialDelaySeconds: 15
|
||||
periodSeconds: 5
|
||||
scheme: HTTP
|
||||
timeoutSeconds: 30
|
||||
nameOverride: ""
|
||||
namespaceOverride: ""
|
||||
networkPolicy:
|
||||
allowExternal: false
|
||||
enabled: false
|
||||
nodeSelector: {}
|
||||
podAnnotations: {}
|
||||
podSecurityContext: {}
|
||||
readinessProbe:
|
||||
failureThreshold: 20
|
||||
initialDelaySeconds: 15
|
||||
periodSeconds: 5
|
||||
scheme: HTTP
|
||||
timeoutSeconds: 30
|
||||
replicaCount: 1
|
||||
resources:
|
||||
limits:
|
||||
cpu: "2"
|
||||
memory: 2000Mi
|
||||
requests:
|
||||
cpu: "1"
|
||||
memory: 1500Mi
|
||||
securityContext:
|
||||
allowPrivilegeEscalation: true
|
||||
capabilities:
|
||||
drop:
|
||||
- ALL
|
||||
readOnlyRootFilesystem: true
|
||||
runAsGroup: 35002
|
||||
runAsNonRoot: true
|
||||
runAsUser: 35002
|
||||
service:
|
||||
port: 9998
|
||||
type: ClusterIP
|
||||
serviceAccount:
|
||||
annotations: {}
|
||||
create: true
|
||||
name: ""
|
||||
tolerations: []
|
||||
topologySpreadConstraints: []
|
||||
77
charts/open-webui/templates/NOTES.txt
Normal file
77
charts/open-webui/templates/NOTES.txt
Normal file
@ -0,0 +1,77 @@
|
||||
{{- `
|
||||
🎉 Welcome to Open WebUI!!
|
||||
██████╗ ██████╗ ███████╗███╗ ██╗ ██╗ ██╗███████╗██████╗ ██╗ ██╗██╗
|
||||
██╔═══██╗██╔══██╗██╔════╝████╗ ██║ ██║ ██║██╔════╝██╔══██╗██║ ██║██║
|
||||
██║ ██║██████╔╝█████╗ ██╔██╗ ██║ ██║ █╗ ██║█████╗ ██████╔╝██║ ██║██║
|
||||
██║ ██║██╔═══╝ ██╔══╝ ██║╚██╗██║ ██║███╗██║██╔══╝ ██╔══██╗██║ ██║██║
|
||||
╚██████╔╝██║ ███████╗██║ ╚████║ ╚███╔███╔╝███████╗██████╔╝╚██████╔╝██║
|
||||
╚═════╝ ╚═╝ ╚══════╝╚═╝ ╚═══╝ ╚══╝╚══╝ ╚══════╝╚═════╝ ╚═════╝ ╚═╝
|
||||
` }}
|
||||
v{{ .Chart.AppVersion }} - building the best open-source AI user interface.
|
||||
- Chart Version: v{{ .Chart.Version }}
|
||||
- Project URL 1: {{ .Chart.Home }}
|
||||
- Project URL 2: https://github.com/open-webui/open-webui
|
||||
- Documentation: https://docs.openwebui.com/
|
||||
- Chart URL: https://github.com/open-webui/helm-charts
|
||||
|
||||
Open WebUI is a web-based user interface that works with Ollama, OpenAI, Claude 3, Gemini and more.
|
||||
This interface allows you to easily interact with local AI models.
|
||||
|
||||
1. Deployment Information:
|
||||
- Chart Name: {{ .Chart.Name }}
|
||||
- Release Name: {{ .Release.Name }}
|
||||
- Namespace: {{ .Release.Namespace }}
|
||||
|
||||
2. Access the Application:
|
||||
{{- if contains "ClusterIP" .Values.service.type }}
|
||||
Access via ClusterIP service:
|
||||
|
||||
export LOCAL_PORT=8080
|
||||
export POD_NAME=$(kubectl get pods -n {{ .Release.Namespace }} -l "app.kubernetes.io/component={{ include "open-webui.name" . }}" -o jsonpath="{.items[0].metadata.name}")
|
||||
export CONTAINER_PORT=$(kubectl get pod -n {{ .Release.Namespace }} $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}")
|
||||
kubectl -n {{ .Release.Namespace }} port-forward $POD_NAME $LOCAL_PORT:$CONTAINER_PORT
|
||||
echo "Visit http://127.0.0.1:$LOCAL_PORT to use your application"
|
||||
|
||||
Then, access the application at: http://127.0.0.1:$LOCAL_PORT or http://localhost:8080
|
||||
|
||||
{{- else if contains "NodePort" .Values.service.type }}
|
||||
Access via NodePort service:
|
||||
export NODE_PORT=$(kubectl get -n {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "open-webui.name" . }})
|
||||
export NODE_IP=$(kubectl get nodes -o jsonpath="{.items[0].status.addresses[0].address}")
|
||||
echo http://$NODE_IP:$NODE_PORT
|
||||
|
||||
{{- else if contains "LoadBalancer" .Values.service.type }}
|
||||
Access via LoadBalancer service:
|
||||
NOTE: It may take a few minutes for the LoadBalancer IP to be available.
|
||||
NOTE: The external address format depends on your cloud provider:
|
||||
- AWS: Will return a hostname (e.g., xxx.elb.amazonaws.com)
|
||||
- GCP/Azure: Will return an IP address
|
||||
You can watch the status by running:
|
||||
|
||||
kubectl get -n {{ .Release.Namespace }} svc {{ include "open-webui.name" . }} --watch
|
||||
export EXTERNAL_IP=$(kubectl get -n {{ .Release.Namespace }} svc {{ include "open-webui.name" . }} -o jsonpath="{.status.loadBalancer.ingress[0].hostname:-.status.loadBalancer.ingress[0].ip}")
|
||||
echo http://$EXTERNAL_IP:{{ .Values.service.port }}
|
||||
{{- end }}
|
||||
|
||||
{{- if .Values.ingress.enabled }}
|
||||
|
||||
Ingress is enabled. Access the application at: http{{ if .Values.ingress.tls }}s{{ end }}://{{ .Values.ingress.host }}
|
||||
{{- end }}
|
||||
|
||||
3. Useful Commands:
|
||||
- Check deployment status:
|
||||
helm status {{ .Release.Name }} -n {{ .Release.Namespace }}
|
||||
|
||||
- Get detailed information:
|
||||
helm get all {{ .Release.Name }} -n {{ .Release.Namespace }}
|
||||
|
||||
- View logs:
|
||||
{{- if .Values.persistence.enabled }}
|
||||
kubectl logs -f statefulset/{{ include "open-webui.name" . }} -n {{ .Release.Namespace }}
|
||||
{{- else }}
|
||||
kubectl logs -f deployment/{{ include "open-webui.name" . }} -n {{ .Release.Namespace }}
|
||||
{{- end }}
|
||||
|
||||
4. Cleanup:
|
||||
- Uninstall the deployment:
|
||||
helm uninstall {{ .Release.Name }} -n {{ .Release.Namespace }}
|
||||
311
charts/open-webui/templates/_helpers.tpl
Normal file
311
charts/open-webui/templates/_helpers.tpl
Normal file
@ -0,0 +1,311 @@
|
||||
{{/*
|
||||
Allow the release namespace to be overridden for multi-namespace deployments in combined charts
|
||||
*/}}
|
||||
{{- define "open-webui.namespace" -}}
|
||||
{{- if .Values.namespaceOverride -}}
|
||||
{{- .Values.namespaceOverride -}}
|
||||
{{- else -}}
|
||||
{{- .Release.Namespace -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
|
||||
{{/*
|
||||
Set the name of the Open WebUI resources
|
||||
*/}}
|
||||
{{- define "open-webui.name" -}}
|
||||
{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }}
|
||||
{{- end -}}
|
||||
|
||||
{{/*
|
||||
Set the name of the integrated Ollama resources
|
||||
*/}}
|
||||
{{- define "ollama.name" -}}
|
||||
open-webui-ollama
|
||||
{{- end -}}
|
||||
|
||||
{{/*
|
||||
Set the name of the integrated Pipelines resources
|
||||
*/}}
|
||||
{{- define "pipelines.name" -}}
|
||||
open-webui-pipelines
|
||||
{{- end -}}
|
||||
|
||||
{{/*
|
||||
Constructs a semicolon-separated string of Ollama API endpoint URLs from the ollamaUrls list
|
||||
defined in the values.yaml file
|
||||
*/}}
|
||||
{{- define "ollamaUrls" -}}
|
||||
{{- if .Values.ollamaUrls }}
|
||||
{{- join ";" .Values.ollamaUrls | trimSuffix "/" }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Generates the URL for accessing the Ollama service within the Kubernetes cluster when the
|
||||
ollama.enabled value is set to true, which means that the Ollama Helm chart is being installed
|
||||
as a dependency of the Open WebUI chart
|
||||
*/}}
|
||||
{{- define "ollamaLocalUrl" -}}
|
||||
{{- if .Values.ollama.enabled -}}
|
||||
{{- $clusterDomain := .Values.clusterDomain }}
|
||||
{{- $ollamaServicePort := .Values.ollama.service.port | toString }}
|
||||
{{- printf "http://%s.%s.svc.%s:%s" (default .Values.ollama.name .Values.ollama.fullnameOverride) (.Release.Namespace) $clusterDomain $ollamaServicePort }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Constructs a string containing the URLs of the Ollama API endpoints that the Open WebUI
|
||||
application should use based on which values are set for Ollama/ whether the Ollama
|
||||
subchart is in use
|
||||
*/}}
|
||||
{{- define "ollamaBaseUrls" -}}
|
||||
{{- $ollamaLocalUrl := include "ollamaLocalUrl" . }}
|
||||
{{- $ollamaUrls := include "ollamaUrls" . }}
|
||||
{{- if and .Values.ollama.enabled .Values.ollamaUrls }}
|
||||
{{- printf "%s;%s" $ollamaUrls $ollamaLocalUrl }}
|
||||
{{- else if .Values.ollama.enabled }}
|
||||
{{- printf "%s" $ollamaLocalUrl }}
|
||||
{{- else if .Values.ollamaUrls }}
|
||||
{{- printf "%s" $ollamaUrls }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Create the chart name and version for the chart label
|
||||
*/}}
|
||||
{{- define "chart.name" -}}
|
||||
{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Create the base labels to include on chart resources
|
||||
*/}}
|
||||
{{- define "base.labels" -}}
|
||||
helm.sh/chart: {{ include "chart.name" . }}
|
||||
{{- if .Chart.AppVersion }}
|
||||
app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
|
||||
{{- end }}
|
||||
app.kubernetes.io/managed-by: {{ .Release.Service }}
|
||||
app.kubernetes.io/name: {{ include "open-webui.name" . }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Create selector labels to include on all resources
|
||||
*/}}
|
||||
{{- define "base.selectorLabels" -}}
|
||||
app.kubernetes.io/instance: {{ .Release.Name }}
|
||||
{{- end -}}
|
||||
|
||||
{{/*
|
||||
Create selector labels to include on all Open WebUI resources
|
||||
*/}}
|
||||
{{- define "open-webui.selectorLabels" -}}
|
||||
{{ include "base.selectorLabels" . }}
|
||||
app.kubernetes.io/component: {{ .Chart.Name }}
|
||||
{{- end }}
|
||||
|
||||
{{- define "open-webui.extraLabels" -}}
|
||||
{{- with .Values.extraLabels }}
|
||||
{{- toYaml . }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Create labels to include on chart all Open WebUI resources
|
||||
*/}}
|
||||
{{- define "open-webui.labels" -}}
|
||||
{{ include "base.labels" . }}
|
||||
{{ include "open-webui.selectorLabels" . }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Create selector labels to include on chart all Ollama resources
|
||||
*/}}
|
||||
{{- define "ollama.selectorLabels" -}}
|
||||
{{ include "base.selectorLabels" . }}
|
||||
app.kubernetes.io/component: {{ include "ollama.name" . }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Create labels to include on chart all Ollama resources
|
||||
*/}}
|
||||
{{- define "ollama.labels" -}}
|
||||
{{ include "base.labels" . }}
|
||||
{{ include "ollama.selectorLabels" . }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Create selector labels to include on chart all Pipelines resources
|
||||
*/}}
|
||||
{{- define "pipelines.selectorLabels" -}}
|
||||
{{ include "base.selectorLabels" . }}
|
||||
app.kubernetes.io/component: {{ include "pipelines.name" . }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Create labels to include on chart all Pipelines resources
|
||||
*/}}
|
||||
{{- define "pipelines.labels" -}}
|
||||
{{ include "base.labels" . }}
|
||||
{{ include "pipelines.selectorLabels" . }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Create the service endpoint to use for Pipelines if the subchart is used
|
||||
*/}}
|
||||
{{- define "pipelines.serviceEndpoint" -}}
|
||||
{{- if .Values.pipelines.enabled -}}
|
||||
{{- $clusterDomain := .Values.clusterDomain }}
|
||||
{{- $pipelinesServicePort := .Values.pipelines.service.port | toString }}
|
||||
{{- printf "http://%s.%s.svc.%s:%s" (include "pipelines.name" .) (.Release.Namespace) $clusterDomain $pipelinesServicePort }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Create selector labels to include on chart all websocket resources
|
||||
*/}}
|
||||
{{- define "websocket.redis.selectorLabels" -}}
|
||||
{{ include "base.selectorLabels" . }}
|
||||
app.kubernetes.io/component: {{ .Values.websocket.redis.name }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Create labels to include on chart all websocket resources
|
||||
*/}}
|
||||
{{- define "websocket.redis.labels" -}}
|
||||
{{ include "base.labels" . }}
|
||||
{{ include "websocket.redis.selectorLabels" . }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Validate SSO ClientSecret to be set literally or via Secret
|
||||
*/}}
|
||||
{{- define "sso.validateClientSecret" -}}
|
||||
{{- $provider := .provider }}
|
||||
{{- $values := .values }}
|
||||
{{- if and (empty (index $values $provider "clientSecret")) (empty (index $values $provider "clientExistingSecret")) }}
|
||||
{{- fail (printf "You must provide either .Values.sso.%s.clientSecret or .Values.sso.%s.clientExistingSecret" $provider $provider) }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
|
||||
{{- /*
|
||||
Fail template rendering if invalid log component
|
||||
*/ -}}
|
||||
{{- define "logging.isValidComponent" -}}
|
||||
{{- $component := . | lower -}}
|
||||
{{- $validComponents := dict
|
||||
"audio" true
|
||||
"comfyui" true
|
||||
"config" true
|
||||
"db" true
|
||||
"images" true
|
||||
"main" true
|
||||
"models" true
|
||||
"ollama" true
|
||||
"openai" true
|
||||
"rag" true
|
||||
"webhook" true
|
||||
-}}
|
||||
{{- hasKey $validComponents $component -}}
|
||||
{{- end }}
|
||||
|
||||
|
||||
{{- define "logging.assertValidComponent" -}}
|
||||
{{- $component := lower . -}}
|
||||
{{- $res := include "logging.isValidComponent" $component }}
|
||||
{{- if ne $res "true" }}
|
||||
{{- fail (printf "Invalid logging component name: '%s'. Valid names: audio, comfyui, config, db, images, main, models, ollama, openai, rag, webhook" $component) }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
|
||||
{{- /*
|
||||
Fail template rendering if invalid log level
|
||||
*/ -}}
|
||||
{{- define "logging.assertValidLevel" -}}
|
||||
{{- $level := lower . }}
|
||||
{{- $validLevels := dict "notset" true "debug" true "info" true "warning" true "error" true "critical" true }}
|
||||
{{- if not (hasKey $validLevels $level) }}
|
||||
{{- fail (printf "Invalid log level: '%s'. Valid values are: notset, debug, info, warning, error, critical" $level) }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
|
||||
{{- /*
|
||||
Render a logging env var for a component, validating value
|
||||
*/ -}}
|
||||
{{- define "logging.componentEnvVar" -}}
|
||||
{{- $name := .componentName }}
|
||||
{{- $level := .logLevel }}
|
||||
{{- include "logging.assertValidComponent" $name -}}
|
||||
{{- include "logging.assertValidLevel" $level }}
|
||||
- name: {{ printf "%s_LOG_LEVEL" (upper $name) | quote }}
|
||||
value: {{ $level | quote | trim }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Return true if the user has defined a custom WEBUI_URL in extraEnvVars.
|
||||
Supports either a map or a list of maps.
|
||||
Usage: {{ include "open-webui.hasCustomWebUIUrl" . }}
|
||||
*/}}
|
||||
{{- define "open-webui.hasCustomWebUIUrl" -}}
|
||||
{{- $found := false -}}
|
||||
{{- $extra := .Values.extraEnvVars -}}
|
||||
{{- if kindIs "map" $extra }}
|
||||
{{- if hasKey $extra "WEBUI_URL" -}}
|
||||
{{- $found = true -}}
|
||||
{{- end -}}
|
||||
{{- else if kindIs "slice" $extra }}
|
||||
{{- range $extra }}
|
||||
{{- if eq .name "WEBUI_URL" }}
|
||||
{{- $found = true -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
{{- end -}}
|
||||
{{- if $found }}true{{- end -}}
|
||||
{{- end -}}
|
||||
|
||||
{{- /*
|
||||
Constructs a string containing the URLs of the Open WebUI based on the ingress configuration
|
||||
used to populate the variable WEBUI_URL
|
||||
*/ -}}
|
||||
{{- define "open-webui.url" -}}
|
||||
{{- $proto := "http" -}}
|
||||
{{- if .Values.ingress.tls }}
|
||||
{{- $proto = "https" -}}
|
||||
{{- end }}
|
||||
{{- printf "%s://%s" $proto .Values.ingress.host }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Convert a map of environment variables to Kubernetes env var format
|
||||
*/}}
|
||||
{{- define "open-webui.env" -}}
|
||||
{{- if kindIs "map" . }}
|
||||
{{- range $key, $val := . }}
|
||||
- name: {{ $key }}
|
||||
{{- if kindIs "map" $val }}
|
||||
{{- toYaml $val | nindent 2 }}
|
||||
{{- else }}
|
||||
value: {{ $val | quote }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- else }}
|
||||
{{- toYaml . }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
|
||||
{{- /*
|
||||
Define a docker tag that should use for the deployment
|
||||
*/ -}}
|
||||
{{- define "open-webui.tag" -}}
|
||||
{{- $image := .Values.image }}
|
||||
{{- if $image.tag }}
|
||||
{{- /* If user provided an explicit image.tag, use it */ -}}
|
||||
{{- $image.tag -}}
|
||||
{{- else if $image.useSlim }}
|
||||
{{- /* If useSlim is true and no explicit tag, use Chart.AppVersion-slim */ -}}
|
||||
{{- printf "%s-slim" .Chart.AppVersion -}}
|
||||
{{- else }}
|
||||
{{- /* Fallback to Chart.AppVersion */ -}}
|
||||
{{- .Chart.AppVersion -}}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
6
charts/open-webui/templates/extra-resources.yaml
Normal file
6
charts/open-webui/templates/extra-resources.yaml
Normal file
@ -0,0 +1,6 @@
|
||||
{{- if .Values.extraResources }}
|
||||
{{- range .Values.extraResources }}
|
||||
---
|
||||
{{ toYaml . | nindent 0 }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
52
charts/open-webui/templates/ingress.yaml
Normal file
52
charts/open-webui/templates/ingress.yaml
Normal file
@ -0,0 +1,52 @@
|
||||
{{- if .Values.ingress.enabled }}
|
||||
apiVersion: networking.k8s.io/v1
|
||||
kind: Ingress
|
||||
metadata:
|
||||
name: {{ include "open-webui.name" . }}
|
||||
namespace: {{ include "open-webui.namespace" . }}
|
||||
labels:
|
||||
{{- include "open-webui.labels" . | nindent 4 }}
|
||||
{{- with .Values.ingress.extraLabels }}
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
{{- if .Values.ingress.annotations }}
|
||||
annotations:
|
||||
{{- tpl (toYaml .Values.ingress.annotations | nindent 4) . }}
|
||||
{{- end }}
|
||||
spec:
|
||||
{{- with .Values.ingress.class }}
|
||||
ingressClassName: {{ . }}
|
||||
{{- end }}
|
||||
{{- if .Values.ingress.tls }}
|
||||
tls:
|
||||
- hosts:
|
||||
- {{ .Values.ingress.host | quote }}
|
||||
{{- range .Values.ingress.additionalHosts }}
|
||||
- {{ . | quote }}
|
||||
{{- end }}
|
||||
secretName: {{ default (printf "%s-tls" .Release.Name) .Values.ingress.existingSecret }}
|
||||
{{- end }}
|
||||
rules:
|
||||
- host: {{ .Values.ingress.host }}
|
||||
http:
|
||||
paths:
|
||||
- path: /
|
||||
pathType: Prefix
|
||||
backend:
|
||||
service:
|
||||
name: {{ include "open-webui.name" . }}
|
||||
port:
|
||||
name: http
|
||||
{{- range .Values.ingress.additionalHosts }}
|
||||
- host: {{ . | quote }}
|
||||
http:
|
||||
paths:
|
||||
- path: /
|
||||
pathType: Prefix
|
||||
backend:
|
||||
service:
|
||||
name: {{ include "open-webui.name" $ }}
|
||||
port:
|
||||
name: http
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
11
charts/open-webui/templates/managed-cert.yaml
Normal file
11
charts/open-webui/templates/managed-cert.yaml
Normal file
@ -0,0 +1,11 @@
|
||||
{{- if .Values.managedCertificate.enabled }}
|
||||
apiVersion: networking.gke.io/v1
|
||||
kind: ManagedCertificate
|
||||
metadata:
|
||||
name: {{ .Values.managedCertificate.name | default "mydomain-cert" }}
|
||||
spec:
|
||||
domains:
|
||||
{{- range .Values.managedCertificate.domains }}
|
||||
- {{ . | quote }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
28
charts/open-webui/templates/pvc.yaml
Normal file
28
charts/open-webui/templates/pvc.yaml
Normal file
@ -0,0 +1,28 @@
|
||||
{{- if and .Values.persistence.enabled (not .Values.persistence.existingClaim) (eq .Values.persistence.provider "local") }}
|
||||
apiVersion: v1
|
||||
kind: PersistentVolumeClaim
|
||||
metadata:
|
||||
name: {{ include "open-webui.name" . }}
|
||||
namespace: {{ include "open-webui.namespace" . }}
|
||||
labels:
|
||||
{{- include "open-webui.selectorLabels" . | nindent 4 }}
|
||||
{{- with .Values.persistence.annotations }}
|
||||
annotations:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
spec:
|
||||
accessModes:
|
||||
{{- range .Values.persistence.accessModes }}
|
||||
- {{ . | quote }}
|
||||
{{- end }}
|
||||
resources:
|
||||
requests:
|
||||
storage: {{ .Values.persistence.size }}
|
||||
{{- if .Values.persistence.storageClass }}
|
||||
storageClassName: {{ .Values.persistence.storageClass }}
|
||||
{{- end }}
|
||||
{{- with .Values.persistence.selector }}
|
||||
selector:
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
14
charts/open-webui/templates/service-account.yaml
Normal file
14
charts/open-webui/templates/service-account.yaml
Normal file
@ -0,0 +1,14 @@
|
||||
{{- if and .Values.serviceAccount.enable .Values.serviceAccount.create }}
|
||||
apiVersion: v1
|
||||
kind: ServiceAccount
|
||||
metadata:
|
||||
name: {{ .Values.serviceAccount.name | default (include "open-webui.name" .) }}
|
||||
namespace: {{ include "open-webui.namespace" . }}
|
||||
labels:
|
||||
{{- include "open-webui.labels" . | nindent 4 }}
|
||||
{{- with .Values.serviceAccount.annotations }}
|
||||
annotations:
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
automountServiceAccountToken: {{ .Values.serviceAccount.automountServiceAccountToken }}
|
||||
{{- end }}
|
||||
36
charts/open-webui/templates/service.yaml
Normal file
36
charts/open-webui/templates/service.yaml
Normal file
@ -0,0 +1,36 @@
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: {{ include "open-webui.name" . }}
|
||||
namespace: {{ include "open-webui.namespace" . }}
|
||||
labels:
|
||||
{{- include "open-webui.labels" . | nindent 4 }}
|
||||
{{- with .Values.service.labels }}
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
{{- with .Values.service.annotations }}
|
||||
annotations:
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
spec:
|
||||
selector:
|
||||
{{- include "open-webui.selectorLabels" . | nindent 4 }}
|
||||
type: {{ .Values.service.type | default "ClusterIP" }}
|
||||
ports:
|
||||
- protocol: TCP
|
||||
name: http
|
||||
port: {{ .Values.service.port }}
|
||||
targetPort: http
|
||||
{{- if .Values.service.nodePort }}
|
||||
nodePort: {{ .Values.service.nodePort | int }}
|
||||
{{- end }}
|
||||
{{- if .Values.service.loadBalancerClass }}
|
||||
loadBalancerClass: {{ .Values.service.loadBalancerClass | quote }}
|
||||
{{- end }}
|
||||
{{- if and (eq .Values.service.type "ClusterIP") (.Values.service.clusterIP) }}
|
||||
clusterIP: {{ .Values.service.clusterIP }}
|
||||
{{- end }}
|
||||
{{- if and (eq .Values.service.type "LoadBalancer") (.Values.service.loadBalancerIP) }}
|
||||
loadBalancerIP: {{ .Values.service.loadBalancerIP }}
|
||||
{{- end }}
|
||||
|
||||
112
charts/open-webui/templates/websocket-redis.yaml
Normal file
112
charts/open-webui/templates/websocket-redis.yaml
Normal file
@ -0,0 +1,112 @@
|
||||
{{- if and .Values.websocket.enabled .Values.websocket.redis.enabled }}
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: {{ .Values.websocket.redis.name }}
|
||||
namespace: {{ include "open-webui.namespace" . }}
|
||||
labels:
|
||||
{{- include "websocket.redis.labels" . | nindent 4 }}
|
||||
{{- with .Values.websocket.redis.labels }}
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
annotations:
|
||||
{{- with .Values.websocket.redis.annotations }}
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
spec:
|
||||
selector:
|
||||
matchLabels:
|
||||
{{- include "websocket.redis.selectorLabels" . | nindent 6 }}
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
{{- include "websocket.redis.labels" . | nindent 8 }}
|
||||
{{- with .Values.websocket.redis.pods.labels }}
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
annotations:
|
||||
{{- with .Values.websocket.redis.pods.annotations }}
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
spec:
|
||||
{{- if .Values.websocket.redis.image.pullSecretName }}
|
||||
imagePullSecrets:
|
||||
- name: {{ .Values.websocket.redis.image.pullSecretName }}
|
||||
{{- end }}
|
||||
containers:
|
||||
- name: {{ .Values.websocket.redis.name }}
|
||||
image: "{{ .Values.websocket.redis.image.repository }}:{{ .Values.websocket.redis.image.tag }}"
|
||||
imagePullPolicy: {{ .Values.websocket.redis.image.pullPolicy }}
|
||||
{{- with .Values.websocket.redis.command }}
|
||||
command:
|
||||
{{- toYaml . | nindent 10 }}
|
||||
{{- end }}
|
||||
{{- with .Values.websocket.redis.args }}
|
||||
args:
|
||||
{{- toYaml . | nindent 10 }}
|
||||
{{- end }}
|
||||
ports:
|
||||
- name: http
|
||||
containerPort: {{ .Values.websocket.redis.service.containerPort }}
|
||||
{{- with .Values.websocket.redis.resources }}
|
||||
resources:
|
||||
{{- toYaml . | nindent 10 }}
|
||||
{{- end }}
|
||||
{{- with .Values.websocket.redis.containerSecurityContext }}
|
||||
securityContext:
|
||||
{{- toYaml . | nindent 10 }}
|
||||
{{- end }}
|
||||
{{- if and (hasKey .Values.websocket.redis.containerSecurityContext "readOnlyRootFilesystem") .Values.websocket.redis.containerSecurityContext.readOnlyRootFilesystem }}
|
||||
volumeMounts:
|
||||
- name: data
|
||||
mountPath: "/data"
|
||||
{{- end }}
|
||||
{{- with .Values.websocket.redis.tolerations }}
|
||||
tolerations:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- with .Values.websocket.redis.affinity }}
|
||||
affinity:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- with .Values.websocket.redis.podSecurityContext }}
|
||||
securityContext:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- with .Values.websocket.nodeSelector }}
|
||||
nodeSelector:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- if and (hasKey .Values.websocket.redis.containerSecurityContext "readOnlyRootFilesystem") .Values.websocket.redis.containerSecurityContext.readOnlyRootFilesystem }}
|
||||
volumes:
|
||||
- name: data
|
||||
emptyDir: {}
|
||||
{{- end }}
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: {{ .Values.websocket.redis.name }}
|
||||
namespace: {{ include "open-webui.namespace" . }}
|
||||
labels:
|
||||
{{- include "websocket.redis.labels" . | nindent 4 }}
|
||||
{{- with .Values.websocket.redis.labels }}
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
annotations:
|
||||
{{- with .Values.websocket.redis.service.annotations }}
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
spec:
|
||||
selector:
|
||||
{{- include "websocket.redis.selectorLabels" . | nindent 4 }}
|
||||
type: {{ .Values.websocket.redis.service.type | default "ClusterIP" }}
|
||||
ports:
|
||||
- protocol: TCP
|
||||
name: {{ .Values.websocket.redis.service.portName | default "http" }}
|
||||
port: {{ .Values.websocket.redis.service.port }}
|
||||
targetPort: http
|
||||
{{- if .Values.websocket.redis.service.nodePort }}
|
||||
nodePort: {{ .Values.websocket.redis.service.nodePort | int }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
430
charts/open-webui/templates/workload-manager.yaml
Normal file
430
charts/open-webui/templates/workload-manager.yaml
Normal file
@ -0,0 +1,430 @@
|
||||
{{- /* Validate workload.kind if set */ -}}
|
||||
{{- if and .Values.workload.kind (not (or (eq .Values.workload.kind "Deployment") (eq .Values.workload.kind "StatefulSet"))) -}}
|
||||
{{- fail "workload.kind must be \"Deployment\" or \"StatefulSet\" (or empty)" -}}
|
||||
{{- end -}}
|
||||
{{- /* Determine the actual workload kind */ -}}
|
||||
{{- $kind := .Values.workload.kind | default (ternary "StatefulSet" "Deployment" (and .Values.persistence.enabled (eq .Values.persistence.provider "local"))) -}}
|
||||
apiVersion: apps/v1
|
||||
kind: {{ $kind }}
|
||||
metadata:
|
||||
name: {{ include "open-webui.name" . }}
|
||||
namespace: {{ include "open-webui.namespace" . }}
|
||||
labels:
|
||||
{{- include "open-webui.labels" . | nindent 4 }}
|
||||
{{- include "open-webui.extraLabels" . | nindent 4 }}
|
||||
{{- with .Values.annotations }}
|
||||
annotations:
|
||||
{{- toYaml . | nindent 4 }}
|
||||
{{- end }}
|
||||
spec:
|
||||
replicas: {{ .Values.replicaCount }}
|
||||
{{- if eq $kind "Deployment" }}
|
||||
revisionHistoryLimit: {{ .Values.revisionHistoryLimit }}
|
||||
{{- end }}
|
||||
{{- if eq $kind "StatefulSet" }}
|
||||
serviceName: {{ include "open-webui.name" . }}
|
||||
{{- end }}
|
||||
selector:
|
||||
matchLabels:
|
||||
{{- include "open-webui.selectorLabels" . | nindent 6 }}
|
||||
{{- if .Values.strategy }}
|
||||
{{- if eq $kind "StatefulSet" }}
|
||||
updateStrategy:
|
||||
{{- toYaml .Values.strategy | nindent 4 }}
|
||||
{{- else }}
|
||||
strategy:
|
||||
{{- toYaml .Values.strategy | nindent 4 }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
{{- include "open-webui.labels" . | nindent 8 }}
|
||||
{{- with .Values.podLabels }}
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- with .Values.podAnnotations }}
|
||||
annotations:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
spec:
|
||||
{{- with .Values.imagePullSecrets }}
|
||||
imagePullSecrets:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- with .Values.priorityClassName }}
|
||||
priorityClassName: {{ . }}
|
||||
{{- end }}
|
||||
initContainers:
|
||||
- name: copy-app-data
|
||||
{{- with .Values.image }}
|
||||
image: {{ .repository }}:{{ include "open-webui.tag" $ }}
|
||||
imagePullPolicy: {{ .pullPolicy }}
|
||||
{{- end }}
|
||||
command:
|
||||
{{- toYaml (.Values.copyAppData.command | default (list "sh" "-c" "cp -R -n /app/backend/data/* /tmp/app-data/")) | nindent 10 }}
|
||||
{{- with .Values.copyAppData.args }}
|
||||
args:
|
||||
{{- toYaml . | nindent 10 }}
|
||||
{{- end }}
|
||||
{{- with .Values.containerSecurityContext }}
|
||||
securityContext:
|
||||
{{- toYaml . | nindent 10 }}
|
||||
{{- end }}
|
||||
{{- with .Values.copyAppData.resources }}
|
||||
resources: {{- toYaml . | nindent 10 }}
|
||||
{{- end }}
|
||||
volumeMounts:
|
||||
- name: data
|
||||
mountPath: /tmp/app-data
|
||||
{{- if .Values.persistence.subPath }}
|
||||
subPath: {{ .Values.persistence.subPath }}
|
||||
{{- end }}
|
||||
{{- with .Values.volumeMounts.initContainer }}
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- with .Values.extraInitContainers }}
|
||||
{{- toYaml . | nindent 6 }}
|
||||
{{- end }}
|
||||
enableServiceLinks: false
|
||||
automountServiceAccountToken: {{ .Values.serviceAccount.automountServiceAccountToken }}
|
||||
{{- if .Values.runtimeClassName }}
|
||||
runtimeClassName: {{ .Values.runtimeClassName | quote }}
|
||||
{{- end }}
|
||||
{{- if .Values.serviceAccount.enable }}
|
||||
serviceAccountName: {{ .Values.serviceAccount.name | default (include "open-webui.name" .) }}
|
||||
{{- end }}
|
||||
{{- with .Values.podSecurityContext }}
|
||||
securityContext:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
containers:
|
||||
- name: {{ .Chart.Name }}
|
||||
{{- with .Values.image }}
|
||||
image: {{ .repository }}:{{ include "open-webui.tag" $ }}
|
||||
imagePullPolicy: {{ .pullPolicy }}
|
||||
{{- end }}
|
||||
{{- with .Values.command }}
|
||||
command:
|
||||
{{- toYaml . | nindent 10 }}
|
||||
{{- end }}
|
||||
{{- with .Values.args }}
|
||||
args:
|
||||
{{- toYaml . | nindent 10 }}
|
||||
{{- end }}
|
||||
ports:
|
||||
- name: http
|
||||
containerPort: {{ .Values.service.containerPort }}
|
||||
{{- with .Values.livenessProbe }}
|
||||
livenessProbe: {{- toYaml . | nindent 10 }}
|
||||
{{- end }}
|
||||
{{- with .Values.readinessProbe }}
|
||||
readinessProbe: {{- toYaml . | nindent 10 }}
|
||||
{{- end }}
|
||||
{{- with .Values.startupProbe }}
|
||||
startupProbe: {{- toYaml . | nindent 10 }}
|
||||
{{- end }}
|
||||
{{- with .Values.resources }}
|
||||
resources: {{- toYaml . | nindent 10 }}
|
||||
{{- end }}
|
||||
{{- with .Values.containerSecurityContext }}
|
||||
securityContext:
|
||||
{{- toYaml . | nindent 10 }}
|
||||
{{- end }}
|
||||
volumeMounts:
|
||||
- name: data
|
||||
mountPath: /app/backend/data
|
||||
{{- if .Values.persistence.subPath }}
|
||||
subPath: {{ .Values.persistence.subPath }}
|
||||
{{- end }}
|
||||
{{- with .Values.volumeMounts.container }}
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
env:
|
||||
{{- if and .Values.ingress.enabled (not (include "open-webui.hasCustomWebUIUrl" .)) }}
|
||||
- name: WEBUI_URL
|
||||
value: {{ include "open-webui.url" . | quote }}
|
||||
{{- end }}
|
||||
{{- if .Values.ollamaUrlsFromExtraEnv}}
|
||||
{{- else if or .Values.ollamaUrls .Values.ollama.enabled }}
|
||||
- name: "OLLAMA_BASE_URLS"
|
||||
value: {{ include "ollamaBaseUrls" . | quote }}
|
||||
{{- else }}
|
||||
- name: "ENABLE_OLLAMA_API"
|
||||
value: "False"
|
||||
{{- end }}
|
||||
{{- if and .Values.enableOpenaiApi .Values.openaiBaseApiUrl (not .Values.openaiBaseApiUrls) (not .Values.pipelines.enabled) }}
|
||||
# If only an OpenAI API value is set, set it to OPENAI_API_BASE_URL
|
||||
- name: "OPENAI_API_BASE_URL"
|
||||
value: {{ .Values.openaiBaseApiUrl | quote }}
|
||||
{{- if .Values.openaiApiKey }}
|
||||
- name: "OPENAI_API_KEY"
|
||||
value: {{ .Values.openaiApiKey | quote }}
|
||||
{{- end }}
|
||||
{{- else if and .Values.enableOpenaiApi .Values.openaiBaseApiUrl .Values.pipelines.enabled (not .Values.openaiBaseApiUrls) }}
|
||||
# If Pipelines is enabled and OpenAI API value is set, use OPENAI_API_BASE_URLS with combined values
|
||||
- name: "OPENAI_API_BASE_URLS"
|
||||
value: "{{ include "pipelines.serviceEndpoint" . }};{{ .Values.openaiBaseApiUrl }}"
|
||||
{{- if .Values.openaiApiKeys }}
|
||||
- name: "OPENAI_API_KEYS"
|
||||
value: {{ .Values.openaiApiKeys | join ";" | quote }}
|
||||
{{- end }}
|
||||
{{- else if and .Values.enableOpenaiApi .Values.pipelines.enabled (not .Values.openaiBaseApiUrl) (not .Values.openaiBaseApiUrls) }}
|
||||
# If Pipelines is enabled and no OpenAI API values are set, set OPENAI_API_BASE_URL to the Pipelines server endpoint
|
||||
- name: "OPENAI_API_BASE_URL"
|
||||
value: {{ include "pipelines.serviceEndpoint" . | quote }}
|
||||
{{- if .Values.openaiApiKey }}
|
||||
- name: "OPENAI_API_KEY"
|
||||
value: {{ .Values.openaiApiKey | quote }}
|
||||
{{- end }}
|
||||
{{- else if and .Values.enableOpenaiApi .Values.openaiBaseApiUrls .Values.pipelines.enabled }}
|
||||
# If OpenAI API value(s) set and Pipelines is enabled, use OPENAI_API_BASE_URLS to support all the endpoints in the chart
|
||||
- name: "OPENAI_API_BASE_URLS"
|
||||
value: "{{ include "pipelines.serviceEndpoint" . }};{{ join ";" .Values.openaiBaseApiUrls }}"
|
||||
{{- if .Values.openaiApiKeys }}
|
||||
- name: "OPENAI_API_KEYS"
|
||||
value: {{ .Values.openaiApiKeys | join ";" | quote }}
|
||||
{{- end }}
|
||||
{{- else if not .Values.enableOpenaiApi }}
|
||||
- name: "ENABLE_OPENAI_API"
|
||||
value: "False"
|
||||
{{- end }}
|
||||
{{- if .Values.tika.enabled }}
|
||||
- name: "CONTENT_EXTRACTION_ENGINE"
|
||||
value: "Tika"
|
||||
- name: "TIKA_SERVER_URL"
|
||||
value: http://{{ .Chart.Name }}-tika:9998
|
||||
{{- end }}
|
||||
{{- if eq .Values.persistence.provider "s3" }}
|
||||
- name: "STORAGE_PROVIDER"
|
||||
value: {{ .Values.persistence.provider }}
|
||||
- name: "S3_ACCESS_KEY_ID"
|
||||
{{- if .Values.persistence.s3.accessKeyExistingSecret }}
|
||||
valueFrom:
|
||||
secretKeyRef:
|
||||
name: {{ .Values.persistence.s3.accessKeyExistingSecret }}
|
||||
key: {{ .Values.persistence.s3.accessKeyExistingAccessKey }}
|
||||
{{- else }}
|
||||
value: {{ .Values.persistence.s3.accessKey }}
|
||||
{{- end }}
|
||||
- name: "S3_SECRET_ACCESS_KEY"
|
||||
{{- if .Values.persistence.s3.secretKeyExistingSecret }}
|
||||
valueFrom:
|
||||
secretKeyRef:
|
||||
name: {{ .Values.persistence.s3.secretKeyExistingSecret }}
|
||||
key: {{ .Values.persistence.s3.secretKeyExistingSecretKey }}
|
||||
{{- else }}
|
||||
value: {{ .Values.persistence.s3.secretKey }}
|
||||
{{- end }}
|
||||
- name: "S3_ENDPOINT_URL"
|
||||
value: {{ .Values.persistence.s3.endpointUrl }}
|
||||
- name: "S3_BUCKET_NAME"
|
||||
value: {{ .Values.persistence.s3.bucket }}
|
||||
- name: "S3_REGION_NAME"
|
||||
value: {{ .Values.persistence.s3.region }}
|
||||
- name: "S3_KEY_PREFIX"
|
||||
value: {{ .Values.persistence.s3.keyPrefix }}
|
||||
{{- else if eq .Values.persistence.provider "gcs" }}
|
||||
- name: "STORAGE_PROVIDER"
|
||||
value: {{ .Values.persistence.provider }}
|
||||
- name: "GOOGLE_APPLICATION_CREDENTIALS_JSON"
|
||||
{{- if .Values.persistence.gcs.appCredentialsJsonExistingSecret }}
|
||||
valueFrom:
|
||||
secretKeyRef:
|
||||
name: {{ .Values.persistence.gcs.appCredentialsJsonExistingSecret }}
|
||||
key: {{ .Values.persistence.gcs.appCredentialsJsonExistingSecretKey }}
|
||||
{{- else }}
|
||||
value: {{ .Values.persistence.gcs.appCredentialsJson }}
|
||||
{{- end }}
|
||||
- name: "GCS_BUCKET_NAME"
|
||||
value: {{ .Values.persistence.gcs.bucket }}
|
||||
{{- else if eq .Values.persistence.provider "azure" }}
|
||||
- name: "STORAGE_PROVIDER"
|
||||
value: {{ .Values.persistence.provider }}
|
||||
- name: "AZURE_STORAGE_ENDPOINT"
|
||||
value: {{ .Values.persistence.azure.endpointUrl }}
|
||||
- name: "AZURE_STORAGE_CONTAINER_NAME"
|
||||
value: {{ .Values.persistence.azure.container }}
|
||||
- name: "AZURE_STORAGE_KEY"
|
||||
{{- if .Values.persistence.azure.keyExistingSecret }}
|
||||
valueFrom:
|
||||
secretKeyRef:
|
||||
name: {{ .Values.persistence.azure.keyExistingSecret }}
|
||||
key: {{ .Values.persistence.azure.keyExistingSecretKey }}
|
||||
{{- else }}
|
||||
value: {{ .Values.persistence.azure.key }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- if .Values.websocket.enabled }}
|
||||
- name: "ENABLE_WEBSOCKET_SUPPORT"
|
||||
value: "True"
|
||||
- name: "WEBSOCKET_MANAGER"
|
||||
value: {{ .Values.websocket.manager | default "redis" | quote }}
|
||||
- name: "WEBSOCKET_REDIS_URL"
|
||||
value: {{ .Values.websocket.url | quote }}
|
||||
{{- end }}
|
||||
{{- if .Values.databaseUrl }}
|
||||
- name: "DATABASE_URL"
|
||||
value: {{ .Values.databaseUrl | quote }}
|
||||
{{- end }}
|
||||
{{- if .Values.sso.enabled }}
|
||||
{{- if .Values.sso.enableSignup }}
|
||||
- name: "ENABLE_OAUTH_SIGNUP"
|
||||
value: "True"
|
||||
{{- end }}
|
||||
{{- if .Values.sso.mergeAccountsByEmail }}
|
||||
- name: "OAUTH_MERGE_ACCOUNTS_BY_EMAIL"
|
||||
value: "True"
|
||||
{{- end }}
|
||||
{{- if .Values.sso.google.enabled }}
|
||||
- name: "GOOGLE_CLIENT_ID"
|
||||
value: {{ .Values.sso.google.clientId | quote }}
|
||||
{{- include "sso.validateClientSecret" (dict "provider" "google" "values" .Values.sso) }}
|
||||
- name: "GOOGLE_CLIENT_SECRET"
|
||||
{{- if .Values.sso.google.clientExistingSecret }}
|
||||
valueFrom:
|
||||
secretKeyRef:
|
||||
name: {{ .Values.sso.google.clientExistingSecret | quote }}
|
||||
key: {{ .Values.sso.google.clientExistingSecretKey | quote }}
|
||||
{{- else }}
|
||||
value: {{ .Values.sso.google.clientSecret | quote }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- if .Values.sso.microsoft.enabled }}
|
||||
- name: "MICROSOFT_CLIENT_ID"
|
||||
value: {{ .Values.sso.microsoft.clientId | quote }}
|
||||
{{- include "sso.validateClientSecret" (dict "provider" "microsoft" "values" .Values.sso) }}
|
||||
- name: "MICROSOFT_CLIENT_SECRET"
|
||||
{{- if .Values.sso.microsoft.clientExistingSecret }}
|
||||
valueFrom:
|
||||
secretKeyRef:
|
||||
name: {{ .Values.sso.microsoft.clientExistingSecret | quote }}
|
||||
key: {{ .Values.sso.microsoft.clientExistingSecretKey | quote }}
|
||||
{{- else }}
|
||||
value: {{ .Values.sso.microsoft.clientSecret | quote }}
|
||||
{{- end }}
|
||||
- name: "MICROSOFT_CLIENT_TENANT_ID"
|
||||
value: {{ .Values.sso.microsoft.tenantId | quote }}
|
||||
{{- end }}
|
||||
{{- if .Values.sso.github.enabled }}
|
||||
- name: "GITHUB_CLIENT_ID"
|
||||
value: {{ .Values.sso.github.clientId | quote }}
|
||||
{{- include "sso.validateClientSecret" (dict "provider" "github" "values" .Values.sso) }}
|
||||
- name: "GITHUB_CLIENT_SECRET"
|
||||
{{- if .Values.sso.github.clientExistingSecret }}
|
||||
valueFrom:
|
||||
secretKeyRef:
|
||||
name: {{ .Values.sso.github.clientExistingSecret | quote }}
|
||||
key: {{ .Values.sso.github.clientExistingSecretKey | quote }}
|
||||
{{- else }}
|
||||
value: {{ .Values.sso.github.clientSecret | quote }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- if .Values.sso.oidc.enabled }}
|
||||
- name: "OAUTH_CLIENT_ID"
|
||||
value: {{ .Values.sso.oidc.clientId | quote }}
|
||||
{{- include "sso.validateClientSecret" (dict "provider" "oidc" "values" .Values.sso) }}
|
||||
- name: "OAUTH_CLIENT_SECRET"
|
||||
{{- if .Values.sso.oidc.clientExistingSecret }}
|
||||
valueFrom:
|
||||
secretKeyRef:
|
||||
name: {{ .Values.sso.oidc.clientExistingSecret | quote }}
|
||||
key: {{ .Values.sso.oidc.clientExistingSecretKey | quote }}
|
||||
{{- else }}
|
||||
value: {{ .Values.sso.oidc.clientSecret | quote }}
|
||||
{{- end }}
|
||||
- name: "OPENID_PROVIDER_URL"
|
||||
value: {{ .Values.sso.oidc.providerUrl | quote }}
|
||||
- name: "OAUTH_PROVIDER_NAME"
|
||||
value: {{ .Values.sso.oidc.providerName | quote }}
|
||||
- name: "OAUTH_SCOPES"
|
||||
value: {{ .Values.sso.oidc.scopes | quote }}
|
||||
{{- end }}
|
||||
{{- if .Values.sso.enableRoleManagement }}
|
||||
- name: "ENABLE_OAUTH_ROLE_MANAGEMENT"
|
||||
value: "True"
|
||||
- name: "OAUTH_ROLES_CLAIM"
|
||||
value: {{ .Values.sso.roleManagement.rolesClaim | quote }}
|
||||
{{- if .Values.sso.roleManagement.allowedRoles }}
|
||||
- name: "OAUTH_ALLOWED_ROLES"
|
||||
value: {{ .Values.sso.roleManagement.allowedRoles | quote }}
|
||||
{{- end }}
|
||||
{{- if .Values.sso.roleManagement.adminRoles }}
|
||||
- name: "OAUTH_ADMIN_ROLES"
|
||||
value: {{ .Values.sso.roleManagement.adminRoles | quote }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- if .Values.sso.enableGroupManagement }}
|
||||
- name: "ENABLE_OAUTH_GROUP_MANAGEMENT"
|
||||
value: "True"
|
||||
- name: "OAUTH_GROUP_CLAIM"
|
||||
value: {{ .Values.sso.groupManagement.groupsClaim | quote }}
|
||||
{{- end }}
|
||||
{{- if .Values.sso.trustedHeader.enabled }}
|
||||
- name: "WEBUI_AUTH_TRUSTED_EMAIL_HEADER"
|
||||
value: {{ .Values.sso.trustedHeader.emailHeader | quote }}
|
||||
{{- if .Values.sso.trustedHeader.nameHeader }}
|
||||
- name: "WEBUI_AUTH_TRUSTED_NAME_HEADER"
|
||||
value: {{ .Values.sso.trustedHeader.nameHeader | quote }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- if .Values.logging.level }}
|
||||
{{- include "logging.assertValidLevel" .Values.logging.level }}
|
||||
- name: "GLOBAL_LOG_LEVEL"
|
||||
value: {{ .Values.logging.level | quote }}
|
||||
{{- end }}
|
||||
{{- if .Values.logging.components }}
|
||||
{{- range $name, $level := .Values.logging.components }}
|
||||
{{- if $level }}
|
||||
{{- include "logging.componentEnvVar" (dict "componentName" $name "logLevel" $level) | indent 8 }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- if .Values.extraEnvVars }}
|
||||
{{- include "open-webui.env" .Values.extraEnvVars | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- if .Values.commonEnvVars }}
|
||||
{{- toYaml .Values.commonEnvVars | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- if .Values.extraEnvFrom }}
|
||||
envFrom:
|
||||
{{- toYaml .Values.extraEnvFrom | nindent 8 }}
|
||||
{{- end }}
|
||||
tty: true
|
||||
{{- with .Values.nodeSelector }}
|
||||
nodeSelector:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- with .Values.tolerations }}
|
||||
tolerations:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- with .Values.affinity }}
|
||||
affinity:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- with .Values.topologySpreadConstraints }}
|
||||
topologySpreadConstraints:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- with .Values.hostAliases }}
|
||||
hostAliases:
|
||||
{{- toYaml . | nindent 8 }}
|
||||
{{- end }}
|
||||
volumes:
|
||||
{{- if and .Values.persistence.enabled .Values.persistence.existingClaim }}
|
||||
- name: data
|
||||
persistentVolumeClaim:
|
||||
claimName: {{ .Values.persistence.existingClaim }}
|
||||
{{- else if or (not .Values.persistence.enabled) (not (eq .Values.persistence.provider "local")) }}
|
||||
- name: data
|
||||
emptyDir: {}
|
||||
{{- else if and .Values.persistence.enabled (not .Values.persistence.existingClaim) }}
|
||||
- name: data
|
||||
persistentVolumeClaim:
|
||||
claimName: {{ include "open-webui.name" . }}
|
||||
{{- end }}
|
||||
{{- with .Values.volumes }}
|
||||
{{- toYaml . | nindent 6 }}
|
||||
{{- end }}
|
||||
276
charts/open-webui/values-gke-min.yaml
Normal file
276
charts/open-webui/values-gke-min.yaml
Normal file
@ -0,0 +1,276 @@
|
||||
nameOverride: ""
|
||||
namespaceOverride: ""
|
||||
|
||||
ollama:
|
||||
# -- Automatically install Ollama Helm chart from https://otwld.github.io/ollama-helm/. Use [Helm Values](https://github.com/otwld/ollama-helm/#helm-values) to configure
|
||||
enabled: false
|
||||
# -- If enabling embedded Ollama, update fullnameOverride to your desired Ollama name value, or else it will use the default ollama.name value from the Ollama chart
|
||||
fullnameOverride: "open-webui-ollama"
|
||||
# -- Example Ollama configuration with nvidia GPU enabled, automatically downloading a model, and deploying a PVC for model persistence
|
||||
# ollama:
|
||||
# gpu:
|
||||
# enabled: true
|
||||
# type: 'nvidia'
|
||||
# number: 1
|
||||
# models:
|
||||
# - llama3
|
||||
# runtimeClassName: nvidia
|
||||
# persistentVolume:
|
||||
# enabled: true
|
||||
# volumeName: "example-pre-existing-pv-created-by-smb-csi"
|
||||
|
||||
pipelines:
|
||||
# -- Automatically install Pipelines chart to extend Open WebUI functionality using Pipelines: https://github.com/open-webui/pipelines
|
||||
enabled: false
|
||||
# -- This section can be used to pass required environment variables to your pipelines (e.g. Langfuse hostname)
|
||||
extraEnvVars: []
|
||||
|
||||
tika:
|
||||
# -- Automatically install Apache Tika to extend Open WebUI
|
||||
enabled: false
|
||||
|
||||
# -- A list of Ollama API endpoints. These can be added in lieu of automatically installing the Ollama Helm chart, or in addition to it.
|
||||
ollamaUrls: []
|
||||
|
||||
websocket:
|
||||
# -- Enables websocket support in Open WebUI with env `ENABLE_WEBSOCKET_SUPPORT`
|
||||
enabled: false
|
||||
# -- Specifies the websocket manager to use with env `WEBSOCKET_MANAGER`: redis (default)
|
||||
manager: redis
|
||||
# -- Specifies the URL of the Redis instance for websocket communication. Template with `redis://[:<password>@]<hostname>:<port>/<db>`
|
||||
url: redis://open-webui-redis:6379/0
|
||||
# -- Deploys a redis
|
||||
redis:
|
||||
# -- Enable redis installation
|
||||
enabled: true
|
||||
# -- Redis name
|
||||
name: open-webui-redis
|
||||
# -- Redis labels
|
||||
labels: {}
|
||||
# -- Redis annotations
|
||||
annotations: {}
|
||||
# -- Redis image
|
||||
image:
|
||||
repository: redis
|
||||
tag: 7.4.2-alpine3.21
|
||||
pullPolicy: IfNotPresent
|
||||
# -- Redis command (overrides default)
|
||||
command: []
|
||||
# -- Redis arguments (overrides default)
|
||||
args: []
|
||||
# -- Redis resources
|
||||
resources: {}
|
||||
# -- Redis service
|
||||
service:
|
||||
# -- Redis container/target port
|
||||
containerPort: 6379
|
||||
# -- Redis service type
|
||||
type: ClusterIP
|
||||
# -- Redis service labels
|
||||
labels: {}
|
||||
# -- Redis service annotations
|
||||
annotations: {}
|
||||
# -- Redis service port name. Istio needs this to be something like `tcp-redis`
|
||||
portName: http
|
||||
# -- Redis service port
|
||||
port: 6379
|
||||
# -- Redis service node port. Valid only when type is `NodePort`
|
||||
nodePort: ""
|
||||
|
||||
# -- Value of cluster domain
|
||||
clusterDomain: cluster.local
|
||||
extraLabels: {}
|
||||
annotations: {}
|
||||
podAnnotations: {}
|
||||
podLabels: {}
|
||||
replicaCount: 1
|
||||
# -- Strategy for updating the workload manager: deployment or statefulset
|
||||
strategy: {}
|
||||
# -- Open WebUI image tags can be found here: https://github.com/open-webui/open-webui
|
||||
image:
|
||||
repository: ghcr.io/open-webui/open-webui
|
||||
tag: ""
|
||||
pullPolicy: "IfNotPresent"
|
||||
|
||||
serviceAccount:
|
||||
enable: true
|
||||
name: ""
|
||||
annotations: {}
|
||||
automountServiceAccountToken: false
|
||||
|
||||
# -- Configure imagePullSecrets to use private registry
|
||||
# ref: <https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry>
|
||||
imagePullSecrets: []
|
||||
# imagePullSecrets:
|
||||
# - name: myRegistryKeySecretName
|
||||
|
||||
# -- Probe for liveness of the Open WebUI container
|
||||
# ref: <https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes>
|
||||
livenessProbe: {}
|
||||
# livenessProbe:
|
||||
# httpGet:
|
||||
# path: /health
|
||||
# port: http
|
||||
# failureThreshold: 1
|
||||
# periodSeconds: 10
|
||||
|
||||
# -- Probe for readiness of the Open WebUI container
|
||||
# ref: <https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes>
|
||||
readinessProbe: {}
|
||||
# readinessProbe:
|
||||
# httpGet:
|
||||
# path: /health/db
|
||||
# port: http
|
||||
# failureThreshold: 1
|
||||
# periodSeconds: 10
|
||||
|
||||
# -- Probe for startup of the Open WebUI container
|
||||
# ref: <https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes>
|
||||
startupProbe: {}
|
||||
# startupProbe:
|
||||
# httpGet:
|
||||
# path: /health
|
||||
# port: http
|
||||
# initialDelaySeconds: 30
|
||||
# periodSeconds: 5
|
||||
# failureThreshold: 20
|
||||
|
||||
resources: {}
|
||||
|
||||
copyAppData:
|
||||
resources: {}
|
||||
|
||||
managedCertificate:
|
||||
enabled: true
|
||||
name: "mydomain-chat-cert" # You can override this name if needed
|
||||
domains:
|
||||
- chat.example.com # update to your real domain
|
||||
|
||||
ingress:
|
||||
enabled: true
|
||||
class: ""
|
||||
# -- Use appropriate annotations for your Ingress controller, e.g., for NGINX:
|
||||
annotations:
|
||||
# Example for GKE Ingress
|
||||
kubernetes.io/ingress.class: "gce"
|
||||
kubernetes.io/ingress.global-static-ip-name: "open-webui-external-ip" # you need to create this address in GCP console
|
||||
# Force HTTP to redirect to HTTPS
|
||||
nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
|
||||
nginx.ingress.kubernetes.io/ssl-redirect: "true"
|
||||
nginx.ingress.kubernetes.io/permanent-redirect: "https://chat.example.com"
|
||||
networking.gke.io/managed-certificates: "mydomain-chat-cert"
|
||||
# nginx.ingress.kubernetes.io/rewrite-target: /
|
||||
host: "chat.example.com" # update to your real domain
|
||||
additionalHosts: []
|
||||
tls: false
|
||||
existingSecret: ""
|
||||
persistence:
|
||||
enabled: true
|
||||
size: 2Gi
|
||||
# -- Use existingClaim if you want to re-use an existing Open WebUI PVC instead of creating a new one
|
||||
existingClaim: ""
|
||||
# -- Subdirectory of Open WebUI PVC to mount. Useful if root directory is not empty.
|
||||
subPath: ""
|
||||
# -- If using multiple replicas, you must update accessModes to ReadWriteMany
|
||||
accessModes:
|
||||
- ReadWriteOnce
|
||||
storageClass: ""
|
||||
selector: {}
|
||||
annotations: {}
|
||||
|
||||
# -- Node labels for pod assignment.
|
||||
nodeSelector: {}
|
||||
|
||||
# -- Tolerations for pod assignment
|
||||
tolerations: []
|
||||
|
||||
# -- Affinity for pod assignment
|
||||
affinity: {}
|
||||
|
||||
# -- Topology Spread Constraints for pod assignment
|
||||
topologySpreadConstraints: []
|
||||
|
||||
# -- Service values to expose Open WebUI pods to cluster
|
||||
service:
|
||||
type: LoadBalancer # changed from ClusterIP to LoadBalancer for external access on GKE
|
||||
annotations: {}
|
||||
port: 80
|
||||
containerPort: 8080
|
||||
nodePort: ""
|
||||
labels: {}
|
||||
loadBalancerClass: ""
|
||||
|
||||
# -- OpenAI base API URL to use. Defaults to the Pipelines service endpoint when Pipelines are enabled, and "https://api.openai.com/v1" if Pipelines are not enabled and this value is blank
|
||||
openaiBaseApiUrl: ""
|
||||
|
||||
# -- Env vars added to the Open WebUI deployment. Most up-to-date environment variables can be found here: https://docs.openwebui.com/getting-started/env-configuration/
|
||||
extraEnvVars:
|
||||
# -- Default API key value for Pipelines. Should be updated in a production deployment, or be changed to the required API key if not using Pipelines
|
||||
- name: OPENAI_API_KEY
|
||||
value: "0p3n-w3bu!"
|
||||
# valueFrom:
|
||||
# secretKeyRef:
|
||||
# name: pipelines-api-key
|
||||
# key: api-key
|
||||
# - name: OPENAI_API_KEY
|
||||
# valueFrom:
|
||||
# secretKeyRef:
|
||||
# name: openai-api-key
|
||||
# key: api-key
|
||||
# - name: OLLAMA_DEBUG
|
||||
# value: "1"
|
||||
|
||||
# -- Configure container volume mounts
|
||||
# ref: <https://kubernetes.io/docs/tasks/configure-pod-container/configure-volume-storage/>
|
||||
volumeMounts:
|
||||
initContainer: []
|
||||
# - name: ""
|
||||
# mountPath: ""
|
||||
container: []
|
||||
# - name: ""
|
||||
# mountPath: ""
|
||||
|
||||
# -- Configure pod volumes
|
||||
# ref: <https://kubernetes.io/docs/tasks/configure-pod-container/configure-volume-storage/>
|
||||
volumes: []
|
||||
# - name: ""
|
||||
# configMap:
|
||||
# name: ""
|
||||
# - name: ""
|
||||
# emptyDir: {}
|
||||
|
||||
# -- Configure pod security context
|
||||
# ref: <https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-containe>
|
||||
podSecurityContext:
|
||||
{}
|
||||
# fsGroupChangePolicy: Always
|
||||
# sysctls: []
|
||||
# supplementalGroups: []
|
||||
# fsGroup: 1001
|
||||
|
||||
|
||||
# -- Configure container security context
|
||||
# ref: <https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-containe>
|
||||
containerSecurityContext:
|
||||
{}
|
||||
# runAsUser: 1001
|
||||
# runAsGroup: 1001
|
||||
# runAsNonRoot: true
|
||||
# privileged: false
|
||||
# allowPrivilegeEscalation: false
|
||||
# readOnlyRootFilesystem: false
|
||||
# capabilities:
|
||||
# drop:
|
||||
# - ALL
|
||||
# seccompProfile:
|
||||
# type: "RuntimeDefault"
|
||||
|
||||
# -- Extra resources to deploy with Open WebUI
|
||||
extraResources:
|
||||
[]
|
||||
# - apiVersion: v1
|
||||
# kind: ConfigMap
|
||||
# metadata:
|
||||
# name: example-configmap
|
||||
# data:
|
||||
# example-key: example-value
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user