mirror of
https://github.com/LibreTranslate/LibreTranslate.git
synced 2024-12-18 08:27:03 +02:00
Merge pull request #557 from drivard/main
Removed helm chart directory. It is moved to its own repository. Upda…
This commit is contained in:
commit
c6be02a0c2
12
README.md
12
README.md
@ -225,20 +225,24 @@ You can pass application arguments directly to Gunicorn via:
|
||||
gunicorn --bind 0.0.0.0:5000 'wsgi:app(api_keys=True)'
|
||||
```
|
||||
|
||||
## Run with Kubernetes
|
||||
## Kubernetes Deployment
|
||||
|
||||
See [Medium article by JM Robles](https://jmrobles.medium.com/libretranslate-your-own-translation-service-on-kubernetes-b46c3e1af630) and the improved [k8s.yaml](https://github.com/LibreTranslate/LibreTranslate/blob/main/k8s.yaml) by @rasos.
|
||||
|
||||
|
||||
### Helm Chart
|
||||
|
||||
Based on @rasos work you can now install LibreTranslate on Kubernetes using Helm.
|
||||
A Helm chart is available in the [chart](chart) directory where you can read the [README](chart/README.md) file for more details.
|
||||
|
||||
A Helm chart is now available in the [helm-chart](https://github.com/LibreTranslate/helm-chart/) repository where you can find more details.
|
||||
|
||||
You can quickly install LibreTranslate on Kubernetes using Helm with the following command:
|
||||
|
||||
```bash
|
||||
helm install libretranslate ./chart --namespace libretranslate --create-namespace
|
||||
helm repo add libretranslate https://libretranslate.github.io/helm-chart/
|
||||
helm repo update
|
||||
helm search repo libretranslate
|
||||
|
||||
helm install libretranslate libretranslate/libretranslate --namespace libretranslate --create-namespace
|
||||
```
|
||||
|
||||
## Manage API Keys
|
||||
|
@ -1,4 +0,0 @@
|
||||
apiVersion: v2
|
||||
name: libretranslate
|
||||
description: A Helm chart for Kubernetes to deploy LibreTranslate API
|
||||
version: 0.1.0
|
@ -1,58 +0,0 @@
|
||||
# LibreTranslate Helm Chart
|
||||
|
||||
This Helm chart deploys a LibreTranslate instance on a Kubernetes cluster using the Helm package manager.
|
||||
|
||||
## Prerequisites
|
||||
|
||||
- Kubernetes 1.12+
|
||||
- Helm 3.0+
|
||||
|
||||
## Installing the Chart
|
||||
|
||||
To install the chart with the release name `libretranslate`:
|
||||
|
||||
```bash
|
||||
helm install libretranslate ./chart --namespace libretranslate --create-namespace
|
||||
```
|
||||
|
||||
This command deploys LibreTranslate on the Kubernetes cluster with the default configuration. The [values.yaml](values.yaml) file lists the parameters that can be configured during installation.
|
||||
|
||||
> **Tip**: List all releases using `helm list`
|
||||
|
||||
## Uninstalling the Chart
|
||||
|
||||
To uninstall/delete the `libretranslate` deployment:
|
||||
|
||||
```bash
|
||||
helm delete libretranslate
|
||||
```
|
||||
|
||||
This command removes all the Kubernetes components associated with the chart and deletes the release.
|
||||
|
||||
## Configuration
|
||||
|
||||
See [values.yaml](values.yaml) for the full list of parameters that can be configured. You can specify each parameter using the `--set key=value[,key=value]` argument to `helm install`. For example,
|
||||
|
||||
```bash
|
||||
helm install libretranslate ./chart --namespace libretranslate --create-namespace --set service.port=8080
|
||||
```
|
||||
|
||||
Alternatively, a YAML file that specifies the values for the parameters can be provided while installing the chart. For example,
|
||||
|
||||
```bash
|
||||
helm install libretranslate ./chart --namespace libretranslate --create-namespace -f values.yaml
|
||||
```
|
||||
|
||||
## Upgrade
|
||||
|
||||
Run the following command to upgrade your LibreTranslate installation. This command will use the Helm chart in the ./chart directory, apply the custom values from values.yaml, and deploy the upgrade to the `libretranslate` namespace:
|
||||
|
||||
```bash
|
||||
helm upgrade --install libretranslate ./chart --namespace libretranslate -f values.yaml
|
||||
```
|
||||
|
||||
> **Tip**: You can use the default [values.yaml](values.yaml)
|
||||
|
||||
# References
|
||||
- [https://jmrobles.medium.com/libretranslate-your-own-translation-service-on-kubernetes-b46c3e1af630](https://jmrobles.medium.com/libretranslate-your-own-translation-service-on-kubernetes-b46c3e1af630)
|
||||
- [https://github.com/LibreTranslate/LibreTranslate](https://github.com/LibreTranslate/LibreTranslate)
|
@ -1,45 +0,0 @@
|
||||
1. Get the application URL by running these commands:
|
||||
{{- if .Values.ingress.enabled }}
|
||||
http{{ if .Values.ingress.tls }}s{{ end }}://{{ index .Values.ingress.hosts 0 "host" }}{{ index .Values.ingress.hosts 0 "paths" 0 "path" }}
|
||||
{{- if .name }}
|
||||
- http{{ if .Values.ingress.tls }}s{{ end }}://{{ .name }}{{ .path }}
|
||||
{{- end }}
|
||||
{{- else if contains "NodePort" .Values.service.type }}
|
||||
export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "libretranslate.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 svc -w {{ include "libretranslate.fullname" . }}'
|
||||
export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ include "libretranslate.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 "libretranslate.name" . }},app.kubernetes.io/instance={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}")
|
||||
echo "Visit http://127.0.0.1:8080 to use your application"
|
||||
kubectl --namespace {{ .Release.Namespace }} port-forward $POD_NAME 8080:{{ .Values.service.port }}
|
||||
{{- end }}
|
||||
|
||||
2. Get your admin username and password:
|
||||
|
||||
USER=$(kubectl get secret {{ include "libretranslate.fullname" . }}-auth -o jsonpath="{.data.username}" | base64 --decode)
|
||||
PASSWORD=$(kubectl get secret {{ include "libretranslate.fullname" . }}-auth -o jsonpath="{.data.password}" | base64 --decode)
|
||||
|
||||
echo "Username: $USER"
|
||||
echo "Password: $PASSWORD"
|
||||
|
||||
3. Manage your LibreTranslate API keys:
|
||||
|
||||
If you setted `--api-keys true` to use the api keys in the StatefulSet, you can manage them with the following commands:
|
||||
|
||||
# this will add an api key with a limit of 120 requests per minute
|
||||
kubectl exec -it {{ include "libretranslate.fullname" . }}-0 -c {{ include "libretranslate.fullname" . }} -- /bin/bash -c "source ./venv/bin/activate && ltmanage keys add --key req-limit-120 120"
|
||||
|
||||
# returns a list of all api keys
|
||||
kubectl exec -it {{ include "libretranslate.fullname" . }}-0 -c {{ include "libretranslate.fullname" . }} -- /bin/bash -c "source ./venv/bin/activate && ltmanage keys"
|
||||
|
||||
# remove an api key
|
||||
kubectl exec -it {{ include "libretranslate.fullname" . }}-0 -c {{ include "libretranslate.fullname" . }} -- /bin/bash -c "source ./venv/bin/activate && ltmanage keys remove req-limit-120"
|
||||
|
||||
*** Be aware that the api keys are stored in a sqlite database in the pod. If you scale the pod to multiple replicas, the api keys will not be synced between the pods. You can use a shared storage to sync the api keys between the pods. For example, you can use a NFS storage class with a ReadWriteMany access mode to store the api keys in a shared perspective. ***
|
||||
|
||||
```
|
@ -1,51 +0,0 @@
|
||||
{{/* vim: set filetype=mustache: */}}
|
||||
{{/*
|
||||
Expand the name of the chart.
|
||||
*/}}
|
||||
{{- define "libretranslate.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).
|
||||
*/}}
|
||||
{{- define "libretranslate.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 "libretranslate.chart" -}}
|
||||
{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Common labels
|
||||
*/}}
|
||||
{{- define "libretranslate.labels" -}}
|
||||
helm.sh/chart: {{ include "libretranslate.chart" . }}
|
||||
{{ include "libretranslate.selectorLabels" . }}
|
||||
{{- if .Chart.AppVersion }}
|
||||
app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
|
||||
{{- end }}
|
||||
app.kubernetes.io/managed-by: {{ .Release.Service }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Selector labels
|
||||
*/}}
|
||||
{{- define "libretranslate.selectorLabels" -}}
|
||||
app.kubernetes.io/name: {{ include "libretranslate.name" . }}
|
||||
app.kubernetes.io/instance: {{ .Release.Name }}
|
||||
{{- end }}
|
@ -1,39 +0,0 @@
|
||||
apiVersion: v1
|
||||
kind: ConfigMap
|
||||
metadata:
|
||||
name: libretranslate-config
|
||||
data:
|
||||
host: {{ .Values.appConfig.host | squote }}
|
||||
port: {{ .Values.appConfig.port | squote }}
|
||||
charLimit: {{ .Values.appConfig.charLimit | squote }}
|
||||
reqLimit: {{ .Values.appConfig.reqLimit | squote }}
|
||||
reqLimitStorage: {{ .Values.appConfig.reqLimitStorage | squote }}
|
||||
batchLimit: {{ .Values.appConfig.batchLimit | squote }}
|
||||
gaId: {{ .Values.appConfig.gaId | squote }}
|
||||
frontendLanguageSource: {{ .Values.appConfig.frontendLanguageSource | squote }}
|
||||
frontendLanguageTarget: {{ .Values.appConfig.frontendLanguageTarget | squote }}
|
||||
frontendTimeout: {{ .Values.appConfig.frontendTimeout | squote }}
|
||||
apiKeysDbPath: {{ .Values.appConfig.apiKeysDbPath | squote }}
|
||||
apiKeysRemote: {{ .Values.appConfig.apiKeysRemote | squote }}
|
||||
getApiKeyLink: {{ .Values.appConfig.getApiKeyLink | squote }}
|
||||
sharedStorage: {{ .Values.appConfig.sharedStorage | squote }}
|
||||
loadOnly: {{ .Values.appConfig.loadOnly | squote }}
|
||||
threads: {{ .Values.appConfig.threads | squote }}
|
||||
metricsAuthToken: {{ .Values.appConfig.metricsAuthToken | squote }}
|
||||
urlPrefix: {{ .Values.appConfig.urlPrefix | squote }}
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: ConfigMap
|
||||
metadata:
|
||||
name: libretranslate-appsettings
|
||||
data:
|
||||
debug: {{ .Values.appSettings.debug | squote }}
|
||||
ssl: {{ .Values.appSettings.ssl | squote }}
|
||||
apiKeys: {{ .Values.appSettings.apiKeys | squote }}
|
||||
requireApiKeyOrigin: {{ .Values.appSettings.requireApiKeyOrigin | squote }}
|
||||
requireApiKeySecret: {{ .Values.appSettings.requireApiKeySecret | squote }}
|
||||
suggestions: {{ .Values.appSettings.suggestions | squote }}
|
||||
disableFilesTranslation: {{ .Values.appSettings.disableFilesTranslation | squote }}
|
||||
disableWebUi: {{ .Values.appSettings.disableWebUi | squote }}
|
||||
updateModels: {{ .Values.appSettings.updateModels | squote }}
|
||||
metrics: {{ .Values.appSettings.metrics | squote }}
|
@ -1,40 +0,0 @@
|
||||
{{- if .Values.ingress.enabled -}}
|
||||
apiVersion: networking.k8s.io/v1
|
||||
kind: Ingress
|
||||
metadata:
|
||||
name: {{ include "libretranslate.fullname" . }}
|
||||
labels:
|
||||
{{- include "libretranslate.labels" . | nindent 4 }}
|
||||
annotations:
|
||||
{{- toYaml .Values.ingress.annotations | nindent 4 }}
|
||||
spec:
|
||||
{{- if .Values.ingress.className }}
|
||||
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:
|
||||
{{- $fullName := include "libretranslate.fullname" $ }}
|
||||
{{- range .paths }}
|
||||
- path: {{ .path }}
|
||||
pathType: {{ .pathType }}
|
||||
backend:
|
||||
service:
|
||||
name: {{ include "libretranslate.fullname" $ }}
|
||||
port:
|
||||
number: {{ $.Values.service.port }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
@ -1,36 +0,0 @@
|
||||
{{- if and .Values.persistence.enabled (eq .Values.persistence.db.accessMode "ReadWriteMany") }}
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: PersistentVolumeClaim
|
||||
metadata:
|
||||
name: db-volume
|
||||
labels:
|
||||
app.kubernetes.io/name: {{ include "libretranslate.name" . }}-pv
|
||||
spec:
|
||||
accessModes:
|
||||
- {{ .Values.persistence.db.accessMode }}
|
||||
resources:
|
||||
requests:
|
||||
storage: {{ .Values.persistence.db.size }}
|
||||
{{- if .Values.persistence.db.storageClass }}
|
||||
storageClassName: {{ .Values.persistence.db.storageClass | quote }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- if and .Values.persistence.enabled (eq .Values.persistence.models.accessMode "ReadWriteMany") }}
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: PersistentVolumeClaim
|
||||
metadata:
|
||||
name: models-volume
|
||||
labels:
|
||||
app.kubernetes.io/name: {{ include "libretranslate.name" . }}-pvc
|
||||
spec:
|
||||
accessModes:
|
||||
- {{ .Values.persistence.models.accessMode }}
|
||||
resources:
|
||||
requests:
|
||||
storage: {{ .Values.persistence.models.size }}
|
||||
{{- if .Values.persistence.models.storageClass }}
|
||||
storageClassName: {{ .Values.persistence.models.storageClass | quote }}
|
||||
{{- end }}
|
||||
{{- end }}
|
@ -1,9 +0,0 @@
|
||||
apiVersion: v1
|
||||
kind: Secret
|
||||
metadata:
|
||||
name: {{ include "libretranslate.fullname" . }}-auth
|
||||
type: Opaque
|
||||
data:
|
||||
auth: {{ .Values.adminUser.auth | quote }}
|
||||
username: {{ .Values.adminUser.name | quote }}
|
||||
password: {{ .Values.adminUser.password | quote }}
|
@ -1,15 +0,0 @@
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: {{ include "libretranslate.fullname" . }}
|
||||
labels:
|
||||
{{- include "libretranslate.labels" . | nindent 4 }}
|
||||
spec:
|
||||
type: {{ .Values.service.type }}
|
||||
ports:
|
||||
- port: {{ .Values.service.port }}
|
||||
targetPort: http
|
||||
protocol: TCP
|
||||
name: http
|
||||
selector:
|
||||
{{- include "libretranslate.selectorLabels" . | nindent 4 }}
|
@ -1,344 +0,0 @@
|
||||
apiVersion: apps/v1
|
||||
kind: StatefulSet
|
||||
metadata:
|
||||
name: {{ include "libretranslate.fullname" . }}
|
||||
labels:
|
||||
{{- include "libretranslate.labels" . | nindent 4 }}
|
||||
{{- if .Values.annotations }}
|
||||
annotations:
|
||||
{{- toYaml .Values.annotations | nindent 4 }}
|
||||
{{- end }}
|
||||
spec:
|
||||
replicas: {{ .Values.replicaCount }}
|
||||
selector:
|
||||
matchLabels:
|
||||
{{- include "libretranslate.selectorLabels" . | nindent 6 }}
|
||||
template:
|
||||
metadata:
|
||||
annotations:
|
||||
{{- if .Values.podAnnotations }}
|
||||
{{- toYaml .Values.podAnnotations | nindent 8 }}
|
||||
{{- end }}
|
||||
checksum/config: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum }}
|
||||
checksum/secret: {{ include (print $.Template.BasePath "/secret.yaml") . | sha256sum }}
|
||||
labels:
|
||||
{{- include "libretranslate.selectorLabels" . | nindent 8 }}
|
||||
spec:
|
||||
{{- if .Values.imagePullSecrets }}
|
||||
imagePullSecrets:
|
||||
{{ toYaml .Values.imagePullSecrets | indent 8 }}
|
||||
{{- end }}
|
||||
{{- if .Values.securityContext }}
|
||||
# forces the mount of the volumes to be mounted as libretranslate user and group
|
||||
# and set permissions to libretranslate:libretranslate
|
||||
securityContext:
|
||||
{{- toYaml .Values.securityContext | nindent 8 }}
|
||||
{{- end }}
|
||||
{{- if .Values.persistence.enabled }}
|
||||
initContainers:
|
||||
- name: volume-permissions-and-pre-install-models
|
||||
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
|
||||
command:
|
||||
- /bin/bash
|
||||
- -c
|
||||
- |
|
||||
mkdir -p /home/libretranslate/.local/share/argos-translate/packages
|
||||
chown -R 1032:1032 /home/libretranslate/.local /app/db
|
||||
|
||||
if [ ! "$(ls -A /home/libretranslate/.local/share/argos-translate/packages)" ]; then
|
||||
echo "Installing models... this can take quite a while depending on your internet connection."
|
||||
/app/venv/bin/python /app/scripts/install_models.py --load_only_lang_codes {{ .Values.appConfig.loadOnly | quote }}
|
||||
else
|
||||
echo "The models directory is not empty, skipping model installation."
|
||||
fi
|
||||
volumeMounts:
|
||||
- name: models-volume
|
||||
mountPath: /home/libretranslate/.local/share/argos-translate
|
||||
- name: db-volume
|
||||
mountPath: {{ .Values.appConfig.apiKeysDbPathMount }}
|
||||
{{- if .Values.initContainerSecurityContext }}
|
||||
securityContext:
|
||||
# forces the mount of the volumes to be mounted as libretranslate user and group
|
||||
# and set permissions to libretranslate:libretranslate
|
||||
{{- toYaml .Values.initContainerSecurityContext | nindent 12 }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
containers:
|
||||
- name: {{ .Chart.Name }}
|
||||
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
|
||||
imagePullPolicy: {{ .Values.image.pullPolicy }}
|
||||
ports:
|
||||
- name: http
|
||||
containerPort: {{ .Values.service.port }}
|
||||
protocol: TCP
|
||||
resources:
|
||||
{{- toYaml .Values.resources | nindent 12 }}
|
||||
securityContext:
|
||||
{{- if .Values.podSecurityContext }}
|
||||
# forces the mount of the volumes to be mounted as libretranslate user and group
|
||||
# and set permissions to libretranslate:libretranslate
|
||||
{{- toYaml .Values.podSecurityContext | nindent 12 }}
|
||||
{{- end }}
|
||||
allowPrivilegeEscalation: false
|
||||
readinessProbe:
|
||||
{{- toYaml .Values.readinessProbe | nindent 12 }}
|
||||
livenessProbe:
|
||||
{{- toYaml .Values.livenessProbe | nindent 12 }}
|
||||
env:
|
||||
{{- if and (.Values.appSettings.debug) (ne .Values.appSettings.debug "") }}
|
||||
- name: LT_DEBUG
|
||||
valueFrom:
|
||||
configMapKeyRef:
|
||||
name: libretranslate-appsettings
|
||||
key: debug
|
||||
{{- end }}
|
||||
{{- if and (.Values.appSettings.ssl) (ne .Values.appSettings.ssl "") }}
|
||||
- name: LT_SSL
|
||||
valueFrom:
|
||||
configMapKeyRef:
|
||||
name: libretranslate-appsettings
|
||||
key: ssl
|
||||
{{- end }}
|
||||
{{- if and (.Values.appSettings.apiKeys) (ne .Values.appSettings.apiKeys "") }}
|
||||
- name: LT_API_KEYS
|
||||
valueFrom:
|
||||
configMapKeyRef:
|
||||
name: libretranslate-appsettings
|
||||
key: apiKeys
|
||||
{{- end }}
|
||||
{{- if and (.Values.appSettings.requireApiKeyOrigin) (ne .Values.appSettings.requireApiKeyOrigin "") }}
|
||||
- name: LT_REQUIRE_API_KEY_ORIGIN
|
||||
valueFrom:
|
||||
configMapKeyRef:
|
||||
name: libretranslate-appsettings
|
||||
key: requireApiKeyOrigin
|
||||
{{- end }}
|
||||
{{- if and (.Values.appSettings.requireApiKeySecret) (ne .Values.appSettings.requireApiKeySecret "") }}
|
||||
- name: LT_REQUIRE_API_KEY_SECRET
|
||||
valueFrom:
|
||||
configMapKeyRef:
|
||||
name: libretranslate-appsettings
|
||||
key: requireApiKeySecret
|
||||
{{- end }}
|
||||
{{- if and (.Values.appSettings.suggestions) (ne .Values.appSettings.suggestions "") }}
|
||||
- name: LT_SUGGESTIONS
|
||||
valueFrom:
|
||||
configMapKeyRef:
|
||||
name: libretranslate-appsettings
|
||||
key: suggestions
|
||||
{{- end }}
|
||||
{{- if and (.Values.appSettings.disableFilesTranslation) (ne .Values.appSettings.disableFilesTranslation "") }}
|
||||
- name: LT_DISABLE_FILES_TRANSLATION
|
||||
valueFrom:
|
||||
configMapKeyRef:
|
||||
name: libretranslate-appsettings
|
||||
key: disableFilesTranslation
|
||||
{{- end }}
|
||||
{{- if and (.Values.appSettings.disableWebUi) (ne .Values.appSettings.disableWebUi "") }}
|
||||
- name: LT_DISABLE_WEB_UI
|
||||
valueFrom:
|
||||
configMapKeyRef:
|
||||
name: libretranslate-appsettings
|
||||
key: disableWebUi
|
||||
{{- end }}
|
||||
{{- if and (.Values.appSettings.updateModels) (ne .Values.appSettings.updateModels "") }}
|
||||
- name: LT_UPDATE_MODELS
|
||||
valueFrom:
|
||||
configMapKeyRef:
|
||||
name: libretranslate-appsettings
|
||||
key: updateModels
|
||||
{{- end }}
|
||||
{{- if and (.Values.appSettings.metrics) (ne .Values.appSettings.metrics "") }}
|
||||
- name: LT_METRICS
|
||||
valueFrom:
|
||||
configMapKeyRef:
|
||||
name: libretranslate-appsettings
|
||||
key: metrics
|
||||
{{- end }}
|
||||
{{- if and (.Values.appConfig.host) (ne .Values.appConfig.host "") }}
|
||||
- name: LT_HOST
|
||||
valueFrom:
|
||||
configMapKeyRef:
|
||||
name: libretranslate-config
|
||||
key: host
|
||||
{{- end }}
|
||||
{{- if and (.Values.appSettings.port) (ne .Values.appSettings.port "") }}
|
||||
- name: LT_PORT
|
||||
valueFrom:
|
||||
configMapKeyRef:
|
||||
name: libretranslate-config
|
||||
key: port
|
||||
{{- end }}
|
||||
{{- if and (.Values.appConfig.charLimit) (ne .Values.appConfig.charLimit "") }}
|
||||
- name: LT_CHAR_LIMIT
|
||||
valueFrom:
|
||||
configMapKeyRef:
|
||||
name: libretranslate-config
|
||||
key: charLimit
|
||||
{{- end }}
|
||||
{{- if and (.Values.appConfig.reqLimit) (ne .Values.appConfig.reqLimit "") }}
|
||||
- name: LT_REQ_LIMIT
|
||||
valueFrom:
|
||||
configMapKeyRef:
|
||||
name: libretranslate-config
|
||||
key: reqLimit
|
||||
{{- end }}
|
||||
{{- if and (.Values.appConfig.reqLimitStorage) (ne .Values.appConfig.reqLimitStorage "") }}
|
||||
- name: LT_REQ_LIMIT_STORAGE
|
||||
valueFrom:
|
||||
configMapKeyRef:
|
||||
name: libretranslate-config
|
||||
key: reqLimitStorage
|
||||
{{- end }}
|
||||
{{- if and (.Values.appConfig.batchLimit) (ne .Values.appConfig.batchLimit "") }}
|
||||
- name: LT_BATCH_LIMIT
|
||||
valueFrom:
|
||||
configMapKeyRef:
|
||||
name: libretranslate-config
|
||||
key: batchLimit
|
||||
{{- end }}
|
||||
{{- if and (.Values.appConfig.gaId) (ne .Values.appConfig.gaId "") }}
|
||||
- name: LT_GA_ID
|
||||
valueFrom:
|
||||
configMapKeyRef:
|
||||
name: libretranslate-config
|
||||
key: gaId
|
||||
{{- end }}
|
||||
{{- if and (.Values.appConfig.frontendLanguageSource) (ne .Values.appConfig.frontendLanguageSource "") }}
|
||||
- name: LT_FRONTEND_LANGUAGE_SOURCE
|
||||
valueFrom:
|
||||
configMapKeyRef:
|
||||
name: libretranslate-config
|
||||
key: frontendLanguageSource
|
||||
{{- end }}
|
||||
{{- if and (.Values.appConfig.frontendLanguageTarget) (ne .Values.appConfig.frontendLanguageTarget "") }}
|
||||
- name: LT_FRONTEND_LANGUAGE_TARGET
|
||||
valueFrom:
|
||||
configMapKeyRef:
|
||||
name: libretranslate-config
|
||||
key: frontendLanguageTarget
|
||||
{{- end }}
|
||||
{{- if and (.Values.appConfig.frontendTimeout) (ne .Values.appConfig.frontendTimeout "") }}
|
||||
- name: LT_FRONTEND_TIMEOUT
|
||||
valueFrom:
|
||||
configMapKeyRef:
|
||||
name: libretranslate-config
|
||||
key: frontendTimeout
|
||||
{{- end }}
|
||||
{{- if and (.Values.appSettings.apiKeysDbPath) (ne .Values.appSettings.apiKeysDbPath "") }}
|
||||
- name: LT_API_KEYS_DB_PATH
|
||||
valueFrom:
|
||||
configMapKeyRef:
|
||||
name: libretranslate-config
|
||||
key: apiKeysDbPath
|
||||
{{- end }}
|
||||
{{- if and (.Values.appSettings.apiKeysRemote) (ne .Values.appSettings.apiKeysRemote "") }}
|
||||
- name: LT_API_KEYS_REMOTE
|
||||
valueFrom:
|
||||
configMapKeyRef:
|
||||
name: libretranslate-config
|
||||
key: apiKeysRemote
|
||||
{{- end }}
|
||||
{{- if and (.Values.appConfig.getApiKeyLink) (ne .Values.appConfig.getApiKeyLink "") }}
|
||||
- name: LT_GET_API_KEY_LINK
|
||||
valueFrom:
|
||||
configMapKeyRef:
|
||||
name: libretranslate-config
|
||||
key: getApiKeyLink
|
||||
{{- end }}
|
||||
{{- if and (.Values.appConfig.sharedStorage) (ne .Values.appConfig.sharedStorage "") }}
|
||||
- name: LT_SHARED_STORAGE
|
||||
valueFrom:
|
||||
configMapKeyRef:
|
||||
name: libretranslate-config
|
||||
key: sharedStorage
|
||||
{{- end }}
|
||||
{{- if and (.Values.appConfig.loadOnly) (ne .Values.appConfig.loadOnly "") }}
|
||||
- name: LT_LOAD_ONLY
|
||||
valueFrom:
|
||||
configMapKeyRef:
|
||||
name: libretranslate-config
|
||||
key: loadOnly
|
||||
{{- end }}
|
||||
{{- if and (.Values.appConfig.threads) (ne .Values.appConfig.threads "") }}
|
||||
- name: LT_THREADS
|
||||
valueFrom:
|
||||
configMapKeyRef:
|
||||
name: libretranslate-config
|
||||
key: threads
|
||||
{{- end }}
|
||||
{{- if and (.Values.appSettings.metricsAuthToken) (ne .Values.appSettings.metricsAuthToken "") }}
|
||||
- name: LT_METRICS_AUTH_TOKEN
|
||||
valueFrom:
|
||||
configMapKeyRef:
|
||||
name: libretranslate-config
|
||||
key: metricsAuthToken
|
||||
{{- end }}
|
||||
{{- if and (.Values.appConfig.urlPrefix) (ne .Values.appConfig.urlPrefix "") }}
|
||||
- name: LT_URL_PREFIX
|
||||
valueFrom:
|
||||
configMapKeyRef:
|
||||
name: libretranslate-config
|
||||
key: urlPrefix
|
||||
{{- end }}
|
||||
{{- if .Values.persistence.enabled }}
|
||||
volumeMounts:
|
||||
- name: db-volume
|
||||
mountPath: {{ .Values.appConfig.apiKeysDbPathMount }}
|
||||
- name: models-volume
|
||||
mountPath: /home/libretranslate/.local/share/argos-translate
|
||||
{{- end }}
|
||||
{{- if and .Values.persistence.enabled (or (eq .Values.persistence.models.accessMode "ReadWriteMany") (eq .Values.persistence.db.accessMode "ReadWriteMany")) }}
|
||||
volumes:
|
||||
{{- if eq .Values.persistence.db.accessMode "ReadWriteMany" }}
|
||||
- name: db-volume
|
||||
persistentVolumeClaim:
|
||||
claimName: db-volume
|
||||
{{- end }}
|
||||
{{- if eq .Values.persistence.models.accessMode "ReadWriteMany" }}
|
||||
- name: models-volume
|
||||
persistentVolumeClaim:
|
||||
claimName: models-volume
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- if .Values.tolerations }}
|
||||
tolerations:
|
||||
{{- toYaml .Values.tolerations | nindent 6 }}
|
||||
{{- end }}
|
||||
{{- if and .Values.persistence.enabled (or (eq .Values.persistence.models.accessMode "ReadWriteOnce") (eq .Values.persistence.db.accessMode "ReadWriteOnce")) }}
|
||||
# still in beta, but this will allow us to delete the volumes when the statefulset is scaled down
|
||||
persistentVolumeClaimRetentionPolicy:
|
||||
whenDeleted: Retain
|
||||
whenScaled: Delete
|
||||
volumeClaimTemplates:
|
||||
{{- if eq .Values.persistence.models.accessMode "ReadWriteOnce" }}
|
||||
- metadata:
|
||||
name: models-volume
|
||||
labels:
|
||||
{{- include "libretranslate.labels" . | nindent 8 }}
|
||||
spec:
|
||||
accessModes:
|
||||
- {{ .Values.persistence.models.accessMode }}
|
||||
resources:
|
||||
requests:
|
||||
storage: {{ .Values.persistence.models.size }}
|
||||
{{- if .Values.persistence.models.storageClass }}
|
||||
storageClassName: {{ .Values.persistence.models.storageClass | quote }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- if eq .Values.persistence.db.accessMode "ReadWriteOnce" }}
|
||||
- metadata:
|
||||
name: db-volume
|
||||
labels:
|
||||
{{- include "libretranslate.labels" . | nindent 8 }}
|
||||
spec:
|
||||
accessModes:
|
||||
- {{ .Values.persistence.db.accessMode }}
|
||||
resources:
|
||||
requests:
|
||||
storage: {{ .Values.persistence.db.size }}
|
||||
{{- if .Values.persistence.db.storageClass }}
|
||||
storageClassName: {{ .Values.persistence.db.storageClass | quote }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
@ -1,164 +0,0 @@
|
||||
# values.yaml
|
||||
|
||||
# Number of replicas
|
||||
replicaCount: 1
|
||||
|
||||
# Extra annotations for pods
|
||||
podAnnotations: {}
|
||||
|
||||
# Extra annotations
|
||||
annotations: {}
|
||||
|
||||
# Extra tolerations for pods
|
||||
tolerations: []
|
||||
|
||||
# Chart name override
|
||||
nameOverride: ""
|
||||
|
||||
# Full name of the deployment to override the default one
|
||||
fullnameOverride: ""
|
||||
|
||||
# Image settings
|
||||
image:
|
||||
repository: libretranslate/libretranslate
|
||||
pullPolicy: Always
|
||||
tag: "latest"
|
||||
# Using a Private Registry
|
||||
# If you want to use a custom image from a private registry, you'll need to create an image pull secret with the registry's credentials:
|
||||
# kubectl create secret docker-registry my-registry-secret --docker-server=DOCKER_REGISTRY_SERVER --docker-username=DOCKER_USER --docker-password=DOCKER_PASSWORD --docker-email=DOCKER_EMAIL
|
||||
# imagePullSecrets:
|
||||
# - name: my-registry-secret
|
||||
imagePullSecrets: []
|
||||
|
||||
# Service settings
|
||||
service:
|
||||
type: ClusterIP
|
||||
port: 5000
|
||||
|
||||
# Ingress settings
|
||||
ingress:
|
||||
enabled: false
|
||||
className: "" # set this to the name of the ingress controller class to use like nginx
|
||||
annotations:
|
||||
# cert-manager.io/cluster-issuer: "letsencrypt-prod"
|
||||
nginx.ingress.kubernetes.io/proxy-body-size: 10m
|
||||
# Check for the adminUser key below.
|
||||
# This will enable basic auth for the whole site.
|
||||
# nginx.ingress.kubernetes.io/auth-type: basic
|
||||
# nginx.ingress.kubernetes.io/auth-secret: libretranslate-auth
|
||||
# nginx.ingress.kubernetes.io/auth-realm: 'Authentication Required'
|
||||
hosts:
|
||||
- host: translate.example.com
|
||||
paths:
|
||||
- path: /
|
||||
pathType: Prefix
|
||||
# tls:
|
||||
# - secretName: libretranslate-secret-tls
|
||||
# hosts:
|
||||
# - translate.example.com
|
||||
|
||||
# Security Context
|
||||
securityContext:
|
||||
fsGroup: 1032
|
||||
|
||||
# Security Context for init container
|
||||
initContainerSecurityContext:
|
||||
runAsUser: 0
|
||||
runAsGroup: 0
|
||||
|
||||
# Pod Security Context
|
||||
podSecurityContext:
|
||||
runAsUser: 1032
|
||||
runAsGroup: 1032
|
||||
|
||||
# Persistent settings
|
||||
# if you don't want to download a copy of the models per pod, you can use a shared storage like an nfs storage class
|
||||
# and set it to ReadWriteMany. this way if you scale the pods later on, they will all use the same models and won't
|
||||
# duplicate the space and download requests.
|
||||
persistence:
|
||||
enabled: false
|
||||
db:
|
||||
storageClass: ""
|
||||
accessMode: "ReadWriteOnce"
|
||||
size: "1Gi"
|
||||
models:
|
||||
storageClass: ""
|
||||
accessMode: "ReadWriteOnce"
|
||||
size: "10Gi" # as of August 2023, the models are about 6.6GB in size for all languages
|
||||
|
||||
|
||||
# Resource limits
|
||||
resources:
|
||||
limits:
|
||||
cpu: 1
|
||||
memory: 2Gi
|
||||
requests:
|
||||
cpu: 500m
|
||||
memory: 1Gi
|
||||
|
||||
# Readiness probe for kubernetes
|
||||
readinessProbe:
|
||||
exec:
|
||||
command:
|
||||
- /app/venv/bin/python
|
||||
- /app/scripts/healthcheck.py
|
||||
initialDelaySeconds: 10
|
||||
periodSeconds: 5
|
||||
|
||||
# Liveness probe for kubernetes
|
||||
livenessProbe:
|
||||
exec:
|
||||
command:
|
||||
- /app/venv/bin/python
|
||||
- scripts/healthcheck.py
|
||||
initialDelaySeconds: 10
|
||||
periodSeconds: 5
|
||||
|
||||
# Auth secret for basic authentication
|
||||
# generate base64-user-password-pair with:
|
||||
# htpasswd -nb <username> <password> | base64
|
||||
#
|
||||
# e.g.:
|
||||
#
|
||||
# htpasswd -nb admin mySecretPassword | base64
|
||||
# This is used by the nginx ingress controller to enable basic auth for the whole site.
|
||||
# It will create a secret with the name libretranslate-auth.
|
||||
adminUser:
|
||||
name: "YWRtaW4K" # copy the username in base64 as a reference
|
||||
auth: "YWRtaW46JGFwcjEkYlpydmYvUFYkSHBHSlhqZU1EN0ZON2kyYndsMVRNMQoK" # copy the output from the htpasswd command here as a reference
|
||||
password: "bXlTZWNyZXRQYXNzd29yZAo=" # copy the password as base64 for the admin user here as a reference
|
||||
|
||||
# Settings / Flags
|
||||
appSettings:
|
||||
debug: "false" # Enable debug environment (Default: Disabled)
|
||||
ssl: "false" # Enable SSL (Default: Disabled)
|
||||
apiKeys: "false" # Enable API keys database for per-client rate limits when --req-limit is reached (Default: Don't use API keys)
|
||||
requireApiKeyOrigin: "" # Require use of an API key for programmatic access to the API, unless the request origin matches this domain (Default: No restrictions on domain origin)
|
||||
requireApiKeySecret: "" # Require use of an API key for programmatic access to the API, unless the client also sends a secret match (Default: No secrets required)
|
||||
suggestions: "false" # Allow user suggestions (Default: Disabled)
|
||||
disableFilesTranslation: "false" # Disable files translation (Default: File translation allowed)
|
||||
disableWebUi: "false" # Disable web ui (Default: Web Ui enabled)
|
||||
updateModels: "false" # Update language models at startup (Default: Only on if no models found)
|
||||
metrics: "false" # Enable the /metrics endpoint for exporting Prometheus usage metrics (Default: Disabled)
|
||||
|
||||
# Configuration Parameters
|
||||
appConfig:
|
||||
host: "0.0.0.0" # Set host to bind the server to (Default: 127.0.0.1)
|
||||
port: "5000" # Set port to bind the server to (Default: 5000)
|
||||
charLimit: "null" # Set character limit (Default: No limit)
|
||||
reqLimit: "null" # Set maximum number of requests per minute per client (outside of limits set by api keys) (Default: No limit)
|
||||
reqLimitStorage: "memory://" # Storage URI to use for request limit data storage. See Flask Limiter (Default: memory://)
|
||||
batchLimit: "null" # Set maximum number of texts to translate in a batch request (Default: No limit)
|
||||
gaId: "" # Enable Google Analytics on the API client page by providing an ID (Default: Empty (no tracking))
|
||||
frontendLanguageSource: "auto" # Set frontend default language - source (Default: auto)
|
||||
frontendLanguageTarget: "locale" # Set frontend default language - target (Default: locale (match site's locale))
|
||||
frontendTimeout: "500" # Set frontend translation timeout (Default: 500)
|
||||
apiKeysDbPath: "/app/db/api_keys.db" # Use a specific path inside the container for the local database. Can be absolute or relative (Default: /app/db/api_keys.db)
|
||||
apiKeysDbPathMount: "/app/db" # Use a specific path inside the container for the local database. Must be the same as apiKeysDbPath (Default: /app/db)
|
||||
apiKeysRemote: "" # Use this remote endpoint to query for valid API keys instead of using the local database (Default: Empty (use local db instead))
|
||||
getApiKeyLink: "" # Show a link in the UI where to direct users to get an API key (Default: Empty (no link shown on web ui))
|
||||
sharedStorage: "memory://" # Shared storage URI to use for multi-process data sharing (e.g. when using gunicorn) (Default: memory://)
|
||||
loadOnly: "" # Set available languages (Default: Empty (use all from argostranslate))
|
||||
threads: "4" # Set number of threads (Default: 4)
|
||||
metricsAuthToken: "" # Protect the /metrics endpoint by allowing only clients that have a valid Authorization Bearer token (Default: Empty (no auth required))
|
||||
urlPrefix: "" # Add prefix to URL: example.com:5000/url-prefix/ (Default: /)
|
Loading…
Reference in New Issue
Block a user