chore: sync

Signed-off-by: mertmit <mertmit99@gmail.com>
This commit is contained in:
mertmit committed 2026-06-20 11:14:59 +03:00
1 parent c6be55deb0
commit 5a2dd41817
53 files changed
+1640 -64

No files matched your search

+7
View File
@@ -0,0 +1,7 @@
.git/
.github/
/ci/
/tests/
*_test.yaml
.vscode/
*.tmp
+19
View File
@@ -0,0 +1,19 @@
apiVersion: v2
name: nocodb
description: NocoDB — A Free & Self-hostable Airtable Alternative. Production-ready chart for external Postgres and Redis.
type: application
version: 1.0.0
appVersion: "2026.06.1"
home: https://nocodb.com
icon: https://github.com/nocodb/nocodb/raw/develop/packages/nc-gui/assets/img/icons/512x512.png
sources:
- https://github.com/nocodb/nocodb
keywords:
- nocodb
- airtable
- database
- no-code
maintainers:
- name: NocoDB
url: https://github.com/nocodb/nocodb
dependencies: []
+253
View File
@@ -0,0 +1,253 @@
# NocoDB Helm Chart
Production-ready Helm chart for [NocoDB](https://nocodb.com) on Kubernetes, designed for
externally-managed Postgres and Redis. Object storage for attachments is configured from the
NocoDB admin panel after install.
## TL;DR
```bash
helm install nocodb oci://ghcr.io/nocodb/charts/nocodb --version 1.0.0 \
--set externalDatabase.existingSecret=nocodb-secrets \
--set externalRedis.existingSecret=nocodb-secrets
```
## Prerequisites
- Kubernetes 1.23+
- Helm 3.8+ (OCI support)
- External PostgreSQL and Redis (and an S3-compatible bucket for attachments, configured in-app after install)
- An ingress controller (and optionally cert-manager) for external access
## Secret key contract
Create one Secret and reference it from each `*.existingSecret`:
| Key | Purpose | Example |
|---|---|---|
| `DATABASE_URL` | Postgres URL | `postgresql://user:pass@host:5432/nocodb?sslmode=require` |
| `NC_REDIS_URL` | Redis URL | `rediss://:pass@host:6379` |
| `NC_AUTH_JWT_SECRET` | JWT secret (optional; auto-generated) | random ≥32 chars |
| `NC_CONNECTION_ENCRYPT_KEY` | Datasource encryption key (optional; auto-generated, never rotate) | random ≥32 chars |
<!-- markdownlint-disable -->
## Parameters
### Common
| Name | Description | Value |
|------|-------------|-------|
| `nameOverride` | Override the chart name | `""` |
| `fullnameOverride` | Override the fully qualified release name | `""` |
| `commonLabels` | Labels added to all resources | `{}` |
| `commonAnnotations` | Annotations added to all resources | `{}` |
### Service account
| Name | Description | Value |
|------|-------------|-------|
| `serviceAccount.create` | Create a ServiceAccount | `true` |
| `serviceAccount.name` | Name of the ServiceAccount (defaults to fullname) | `""` |
| `serviceAccount.annotations` | Annotations for the ServiceAccount (e.g. IRSA / Workload Identity) | `{}` |
| `serviceAccount.automountServiceAccountToken` | Auto-mount the SA token | `false` |
### Global
| Name | Description | Value |
|------|-------------|-------|
| `global.imageRegistry` | Global image registry override | `""` |
| `global.imagePullSecrets` | Global image pull secrets | `[]` |
| `global.storageClass` | Global storage class for PVCs | `""` |
### Image
| Name | Description | Value |
|------|-------------|-------|
| `image.registry` | NocoDB image registry | `docker.io` |
| `image.repository` | NocoDB image repository | `nocodb/nocodb` |
| `image.digest` | Image digest (takes precedence over tag), e.g. sha256:... | `""` |
| `image.pullPolicy` | Image pull policy | `IfNotPresent` |
| `image.pullSecrets` | Image pull secrets | `[]` |
### App workload
| Name | Description | Value |
|------|-------------|-------|
| `replicaCount` | Number of app replicas (>=2 requires Redis) | `2` |
| `updateStrategy` | Deployment update strategy (ordered rollout for migration safety) | `RollingUpdate maxSurge:1 maxUnavailable:0` |
| `resources` | App container resources (2Gi memory recommended, 1Gi minimum) | `requests: {cpu: "1", memory: 2Gi}` |
| `podAnnotations` | Extra annotations for app pods | `{}` |
| `podLabels` | Extra labels for app pods | `{}` |
| `podSecurityContext` | App pod security context | `fsGroup: 1000` |
| `containerSecurityContext` | App container security context | See values.yaml |
| `livenessProbe` | App liveness probe (httpGet /api/v1/health) | See values.yaml |
| `readinessProbe` | App readiness probe | See values.yaml |
| `startupProbe` | App startup probe (generous to cover first-boot migrations) | See values.yaml |
| `customLivenessProbe` | Replaces the generated liveness probe when set | `{}` |
| `customReadinessProbe` | Replaces the generated readiness probe when set | `{}` |
| `customStartupProbe` | Replaces the generated startup probe when set | `{}` |
| `lifecycle` | Container lifecycle hooks (default preStop drains the LB) | See values.yaml |
| `terminationGracePeriodSeconds` | Grace period for in-flight request drain | `60` |
### App config (non-secret)
| Name | Description | Value |
|------|-------------|-------|
| `nocodb.publicUrl` | NC_SITE_URL. If empty, derived from the first ingress host when TLS is set | `""` |
| `nocodb.dashboardUrl` | NC_DASHBOARD_URL | `""` |
| `nocodb.disableMux` | Set NC_DISABLE_MUX=true (recommended for self-hosted) | `true` |
| `nocodb.disableTelemetry` | Set NC_DISABLE_TELE=true | `false` |
| `nocodb.licenseKey` | NC_LICENSE_KEY (enterprise) | `""` |
| `nocodb.extraEnvVars` | Extra raw env vars for the app (list of name/value or valueFrom) | `[]` |
### Worker workload
| Name | Description | Value |
|------|-------------|-------|
| `worker.enabled` | Deploy a dedicated background worker (requires Redis) | `true` |
| `worker.replicaCount` | Worker replicas | `2` |
| `worker.concurrency` | NC_WORKER_CONCURRENCY (empty = NocoDB default) | `""` |
| `worker.resources` | Worker container resources (2Gi memory recommended, 1Gi minimum) | `requests: {cpu: "1", memory: 2Gi}` |
| `worker.podAnnotations` | Extra annotations for worker pods | `{}` |
| `worker.nodeSelector` | Worker node selector | `{}` |
| `worker.tolerations` | Worker tolerations | `[]` |
| `worker.affinity` | Worker affinity (overrides the default anti-affinity preset) | `{}` |
| `worker.terminationGracePeriodSeconds` | Grace period for the worker to drain in-flight Bull jobs on shutdown | `120` |
| `worker.autoscaling.enabled` | Enable HPA for the worker | `false` |
| `worker.autoscaling.minReplicas` | Minimum worker replicas | `2` |
| `worker.autoscaling.maxReplicas` | Maximum worker replicas | `5` |
| `worker.autoscaling.targetCPU` | Target CPU utilisation percentage for worker HPA | `80` |
| `worker.autoscaling.targetMemory` | Target memory utilisation percentage for worker HPA (empty to disable) | `""` |
| `worker.extraEnvVars` | Extra raw env vars for the worker | `[]` |
### External Postgres (required)
| Name | Description | Value |
|------|-------------|-------|
| `externalDatabase.host` | Postgres host (eval/inline path) | `""` |
| `externalDatabase.port` | Postgres port | `5432` |
| `externalDatabase.database` | Database name | `nocodb` |
| `externalDatabase.username` | Database user | `nocodb` |
| `externalDatabase.password` | Database password (eval only; use existingSecret in prod) | `""` |
| `externalDatabase.sslMode` | sslmode appended to the assembled URL | `prefer` |
| `externalDatabase.urlEnvVar` | Env var name for the connection URL (DATABASE_URL or NC_DB) | `DATABASE_URL` |
| `externalDatabase.existingSecret` | Secret holding the full connection URL | `""` |
| `externalDatabase.existingSecretUrlKey` | Key in existingSecret holding the URL | `DATABASE_URL` |
### External Redis (required for HA / worker)
| Name | Description | Value |
|------|-------------|-------|
| `externalRedis.host` | Redis host | `""` |
| `externalRedis.port` | Redis port | `6379` |
| `externalRedis.password` | Redis password (eval only) | `""` |
| `externalRedis.tls` | Use rediss:// scheme | `false` |
| `externalRedis.existingSecret` | Secret holding the full NC_REDIS_URL | `""` |
| `externalRedis.existingSecretUrlKey` | Key in existingSecret holding NC_REDIS_URL | `NC_REDIS_URL` |
### SMTP (optional)
| Name | Description | Value |
|------|-------------|-------|
| `smtp.enabled` | Configure SMTP email | `false` |
| `smtp.host` | SMTP host | `""` |
| `smtp.port` | SMTP port | `587` |
| `smtp.from` | From address | `""` |
| `smtp.username` | SMTP username | `""` |
| `smtp.password` | SMTP password (eval only) | `""` |
| `smtp.secure` | NC_SMTP_SECURE | `false` |
| `smtp.existingSecret` | Secret holding the SMTP password | `""` |
| `smtp.passwordKey` | Key in existingSecret for the SMTP password | `NC_SMTP_PASSWORD` |
### SSO (optional)
| Name | Description | Value |
|------|-------------|-------|
| `sso.oidc.enabled` | Enable OIDC (sets NC_SSO=oidc) | `false` |
| `sso.oidc.providerName` | Display name for the OIDC provider | `OpenID Connect` |
| `sso.saml.enabled` | Enable SAML (sets NC_SSO=saml) | `false` |
| `sso.saml.providerName` | Display name for the SAML provider | `SAML` |
### Auth keys
| Name | Description | Value |
|------|-------------|-------|
| `auth.jwtSecret` | NC_AUTH_JWT_SECRET (auto-generated+persisted if empty) | `""` |
| `auth.encryptionKey` | NC_CONNECTION_ENCRYPT_KEY (auto-generated+persisted if empty; never rotated) | `""` |
| `auth.existingSecret` | Secret holding both keys | `""` |
| `auth.jwtSecretKey` | Key in existingSecret for the JWT secret | `NC_AUTH_JWT_SECRET` |
| `auth.encryptionKeyKey` | Key in existingSecret for the encryption key | `NC_CONNECTION_ENCRYPT_KEY` |
### Scaling & scheduling
| Name | Description | Value |
|------|-------------|-------|
| `autoscaling.enabled` | App HPA | `false` |
| `autoscaling.minReplicas` | Minimum app replicas for HPA | `2` |
| `autoscaling.maxReplicas` | Maximum app replicas for HPA | `10` |
| `autoscaling.targetCPU` | Target CPU utilisation percentage for app HPA | `80` |
| `autoscaling.targetMemory` | Target memory utilisation percentage for app HPA (empty to disable) | `""` |
| `pdb.create` | Create PodDisruptionBudgets for the app and worker | `false` |
| `pdb.minAvailable` | Minimum available pods for PDB (integer or percentage) | `1` |
| `pdb.maxUnavailable` | Maximum unavailable pods for PDB (integer or percentage; empty if minAvailable is set) | `""` |
| `podAntiAffinityPreset` | Default app pod anti-affinity (soft\|hard\|"") | `soft` |
| `topologySpreadConstraints` | App topology spread constraints | `[]` |
| `affinity` | App affinity (overrides podAntiAffinityPreset) | `{}` |
| `nodeSelector` | App node selector | `{}` |
| `tolerations` | App tolerations | `[]` |
| `priorityClassName` | App priority class | `""` |
### Networking
| Name | Description | Value |
|------|-------------|-------|
| `service.type` | Service type | `ClusterIP` |
| `service.port` | Service port | `8080` |
| `service.annotations` | Service annotations | `{}` |
| `ingress.enabled` | Create an Ingress | `false` |
| `ingress.className` | Ingress class name | `""` |
| `ingress.annotations` | Ingress annotations (cert-manager cluster-issuer here) | `{}` |
| `ingress.hosts` | Ingress hosts | See values.yaml |
| `ingress.tls` | Ingress TLS entries | `[]` |
| `networkPolicy.enabled` | Create a NetworkPolicy | `false` |
| `networkPolicy.allowExternal` | Allow ingress from anywhere | `true` |
| `networkPolicy.extraIngress` | Extra ingress rules | `[]` |
| `networkPolicy.extraEgress` | Extra egress rules | `[]` |
### Persistence (local attachment storage)
| Name | Description | Value |
|------|-------------|-------|
| `persistence.enabled` | Mount a PVC at /usr/app/data instead of emptyDir | `false` |
| `persistence.storageClass` | StorageClass for the PVC (empty uses cluster default) | `""` |
| `persistence.accessModes` | PVC access modes | `["ReadWriteOnce"]` |
| `persistence.size` | PVC size | `10Gi` |
| `persistence.existingClaim` | Existing PVC name (skips PVC creation) | `""` |
### Observability
| Name | Description | Value |
|------|-------------|-------|
| `monitoring.sentry.enabled` | Set NC_SENTRY_DSN | `false` |
| `monitoring.sentry.dsn` | Sentry DSN (eval; use existingSecret in prod) | `""` |
| `monitoring.sentry.existingSecret` | Secret holding the Sentry DSN | `""` |
| `monitoring.sentry.dsnKey` | Key in existingSecret for the DSN | `NC_SENTRY_DSN` |
### Escape hatches
| Name | Description | Value |
|------|-------------|-------|
| `extraEnvVars` | Extra env vars applied to app and worker | `[]` |
| `extraEnvVarsCM` | Name of a ConfigMap with extra env vars | `""` |
| `extraEnvVarsSecret` | Name of a Secret with extra env vars | `""` |
| `extraVolumes` | Extra volumes | `[]` |
| `extraVolumeMounts` | Extra volume mounts | `[]` |
| `initContainers` | Extra init containers | `[]` |
| `sidecars` | Extra sidecar containers | `[]` |
| `command` | Override container command | `[]` |
| `args` | Override container args | `[]` |
| `lifecycleHooks` | Override container lifecycle hooks (takes precedence over lifecycle) | `{}` |
| `extraDeploy` | Extra raw manifests (tpl-rendered) | `[]` |
<!-- markdownlint-enable -->
@@ -0,0 +1,22 @@
# Values used by chart-testing (ct install) in CI. The CI job provisions throwaway
# in-cluster Postgres and Redis and injects connection strings via a pre-created Secret.
replicaCount: 1
worker:
enabled: true
replicaCount: 1
resources:
requests:
cpu: 100m
memory: 256Mi
externalDatabase:
existingSecret: nocodb-ci
externalRedis:
existingSecret: nocodb-ci
auth:
existingSecret: nocodb-ci
resources:
requests:
cpu: 100m
memory: 256Mi
startupProbe:
failureThreshold: 60
+26
View File
@@ -0,0 +1,26 @@
NocoDB has been deployed as release "{{ .Release.Name }}" in namespace "{{ .Release.Namespace }}".
{{- if not (include "nocodb.redisConfigured" .) }}
WARNING: Redis is not configured. This deployment is limited to a single replica.
Set externalRedis.host (or externalRedis.existingSecret) before scaling.
{{- end }}
{{- if or (gt (int .Values.replicaCount) 1) .Values.autoscaling.enabled }}
NOTE: Configure object storage (S3-compatible) for attachments from the NocoDB
admin panel (App Store > Storage) after install. Until you do, attachments are
written to local pod storage and will NOT be consistent across replicas.
{{- end }}
Access:
{{- if .Values.ingress.enabled }}
{{- range .Values.ingress.hosts }}
{{ ternary "https" "http" (gt (len $.Values.ingress.tls) 0) }}://{{ .host }}
{{- end }}
{{- else }}
kubectl -n {{ .Release.Namespace }} port-forward svc/{{ include "nocodb.fullname" . }} 8080:{{ .Values.service.port }}
Then open http://localhost:8080
{{- end }}
Verify health:
kubectl -n {{ .Release.Namespace }} exec deploy/{{ include "nocodb.fullname" . }} -- wget -qO- http://localhost:8080/api/v1/health
+217
View File
@@ -0,0 +1,217 @@
{{/* Chart name */}}
{{- define "nocodb.name" -}}
{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}}
{{- end -}}
{{/* Fully qualified app name */}}
{{- define "nocodb.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 -}}
{{- define "nocodb.chart" -}}
{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}}
{{- end -}}
{{- define "nocodb.selectorLabels" -}}
app.kubernetes.io/name: {{ include "nocodb.name" . }}
app.kubernetes.io/instance: {{ .Release.Name }}
{{- end -}}
{{- define "nocodb.labels" -}}
helm.sh/chart: {{ include "nocodb.chart" . }}
{{ include "nocodb.selectorLabels" . }}
{{- if .Chart.AppVersion }}
app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
{{- end }}
app.kubernetes.io/managed-by: {{ .Release.Service }}
{{- with .Values.commonLabels }}
{{ toYaml . }}
{{- end }}
{{- end -}}
{{/* Merge commonAnnotations with per-resource annotations (resource-specific win on key collision) */}}
{{- define "nocodb.annotations" -}}
{{- $merged := merge (deepCopy (.extraAnnotations | default dict)) .context.Values.commonAnnotations -}}
{{- if $merged }}
{{- toYaml $merged }}
{{- end }}
{{- end -}}
{{- define "nocodb.serviceAccountName" -}}
{{- if .Values.serviceAccount.create -}}
{{- default (include "nocodb.fullname" .) .Values.serviceAccount.name -}}
{{- else -}}
{{- default "default" .Values.serviceAccount.name -}}
{{- end -}}
{{- end -}}
{{- define "nocodb.image" -}}
{{- $registry := default .Values.image.registry .Values.global.imageRegistry -}}
{{- $repository := .Values.image.repository -}}
{{- if .Values.image.digest -}}
{{- if $registry -}}{{- printf "%s/%s@%s" $registry $repository .Values.image.digest -}}
{{- else -}}{{- printf "%s@%s" $repository .Values.image.digest -}}{{- end -}}
{{- else -}}
{{- $tag := default .Chart.AppVersion .Values.image.tag -}}
{{- if $registry -}}{{- printf "%s/%s:%s" $registry $repository $tag -}}
{{- else -}}{{- printf "%s:%s" $repository $tag -}}{{- end -}}
{{- end -}}
{{- end -}}
{{- define "nocodb.imagePullSecrets" -}}
{{- $secrets := concat .Values.global.imagePullSecrets .Values.image.pullSecrets | uniq -}}
{{- if $secrets }}
imagePullSecrets:
{{- range $secrets }}
{{- if kindIs "string" . }}
- name: {{ . }}
{{- else }}
- {{ toYaml . | nindent 4 | trim }}
{{- end }}
{{- end }}
{{- end }}
{{- end -}}
{{- define "nocodb.secretName" -}}
{{- include "nocodb.fullname" . -}}
{{- end -}}
{{/* Render a value as a template (string or object) */}}
{{- define "nocodb.tplvalues.render" -}}
{{- if typeIs "string" .value }}
{{- tpl .value .context }}
{{- else }}
{{- tpl (.value | toYaml) .context }}
{{- end }}
{{- end -}}
{{/* true when Redis is configured by any means */}}
{{- define "nocodb.redisConfigured" -}}
{{- if or .Values.externalRedis.host .Values.externalRedis.existingSecret -}}true{{- end -}}
{{- end -}}
{{/* Fail fast when HA is requested without Redis */}}
{{- define "nocodb.validateRedis" -}}
{{- $ha := or (gt (int .Values.replicaCount) 1) .Values.worker.enabled .Values.autoscaling.enabled -}}
{{- if and $ha (not (include "nocodb.redisConfigured" .)) -}}
{{- fail "NocoDB requires Redis for multi-replica or worker deployments. Set externalRedis.host (or externalRedis.existingSecret), or set replicaCount=1, autoscaling.enabled=false, and worker.enabled=false." -}}
{{- end -}}
{{- end -}}
{{/* Assemble the DATABASE_URL (standard postgres URL form) from inline fields */}}
{{- define "nocodb.dbUrl" -}}
{{- $d := .Values.externalDatabase -}}
{{- $base := printf "postgresql://%s:%s@%s:%v/%s" (urlquery $d.username) (urlquery $d.password) $d.host (toString $d.port) $d.database -}}
{{- if $d.sslMode -}}{{- printf "%s?sslmode=%s" $base $d.sslMode -}}{{- else -}}{{- $base -}}{{- end -}}
{{- end -}}
{{/* Assemble NC_REDIS_URL from inline fields */}}
{{- define "nocodb.redisUrl" -}}
{{- $r := .Values.externalRedis -}}
{{- $scheme := ternary "rediss" "redis" $r.tls -}}
{{- if $r.password -}}{{- printf "%s://:%s@%s:%v" $scheme (urlquery $r.password) $r.host (toString $r.port) -}}
{{- else -}}{{- printf "%s://%s:%v" $scheme $r.host (toString $r.port) -}}{{- end -}}
{{- end -}}
{{/* Auto-generate+persist JWT secret: reuse the existing cluster value on upgrade */}}
{{- define "nocodb.jwtSecret" -}}
{{- $existing := lookup "v1" "Secret" .Release.Namespace (include "nocodb.secretName" .) -}}
{{- if and $existing $existing.data (index $existing.data "NC_AUTH_JWT_SECRET") -}}
{{- index $existing.data "NC_AUTH_JWT_SECRET" | b64dec -}}
{{- else if .Values.auth.jwtSecret -}}
{{- .Values.auth.jwtSecret -}}
{{- else -}}
{{- randAlphaNum 64 -}}
{{- end -}}
{{- end -}}
{{/* Auto-generate+persist encryption key (never rotated) */}}
{{- define "nocodb.encryptionKey" -}}
{{- $existing := lookup "v1" "Secret" .Release.Namespace (include "nocodb.secretName" .) -}}
{{- if and $existing $existing.data (index $existing.data "NC_CONNECTION_ENCRYPT_KEY") -}}
{{- index $existing.data "NC_CONNECTION_ENCRYPT_KEY" | b64dec -}}
{{- else if .Values.auth.encryptionKey -}}
{{- .Values.auth.encryptionKey -}}
{{- else -}}
{{- randAlphaNum 64 -}}
{{- end -}}
{{- end -}}
{{/* Secret env block: every secret env var via valueFrom.secretKeyRef (existingSecret or chart-managed) */}}
{{- define "nocodb.secretEnv" -}}
- name: {{ .Values.externalDatabase.urlEnvVar | default "DATABASE_URL" }}
valueFrom:
secretKeyRef:
{{- if .Values.externalDatabase.existingSecret }}
name: {{ .Values.externalDatabase.existingSecret }}
key: {{ .Values.externalDatabase.existingSecretUrlKey | default "DATABASE_URL" }}
{{- else }}
name: {{ include "nocodb.secretName" . }}
key: DATABASE_URL
{{- end }}
{{- if include "nocodb.redisConfigured" . }}
- name: NC_REDIS_URL
valueFrom:
secretKeyRef:
{{- if .Values.externalRedis.existingSecret }}
name: {{ .Values.externalRedis.existingSecret }}
key: {{ .Values.externalRedis.existingSecretUrlKey | default "NC_REDIS_URL" }}
{{- else }}
name: {{ include "nocodb.secretName" . }}
key: NC_REDIS_URL
{{- end }}
{{- end }}
- name: NC_AUTH_JWT_SECRET
valueFrom:
secretKeyRef:
{{- if .Values.auth.existingSecret }}
name: {{ .Values.auth.existingSecret }}
key: {{ .Values.auth.jwtSecretKey | default "NC_AUTH_JWT_SECRET" }}
{{- else }}
name: {{ include "nocodb.secretName" . }}
key: NC_AUTH_JWT_SECRET
{{- end }}
- name: NC_CONNECTION_ENCRYPT_KEY
valueFrom:
secretKeyRef:
{{- if .Values.auth.existingSecret }}
name: {{ .Values.auth.existingSecret }}
key: {{ .Values.auth.encryptionKeyKey | default "NC_CONNECTION_ENCRYPT_KEY" }}
{{- else }}
name: {{ include "nocodb.secretName" . }}
key: NC_CONNECTION_ENCRYPT_KEY
{{- end }}
{{- if .Values.smtp.enabled }}
- name: NC_SMTP_PASSWORD
valueFrom:
secretKeyRef:
{{- if .Values.smtp.existingSecret }}
name: {{ .Values.smtp.existingSecret }}
key: {{ .Values.smtp.passwordKey | default "NC_SMTP_PASSWORD" }}
{{- else }}
name: {{ include "nocodb.secretName" . }}
key: NC_SMTP_PASSWORD
{{- end }}
{{- end }}
{{- if .Values.monitoring.sentry.enabled }}
- name: NC_SENTRY_DSN
valueFrom:
secretKeyRef:
{{- if .Values.monitoring.sentry.existingSecret }}
name: {{ .Values.monitoring.sentry.existingSecret }}
key: {{ .Values.monitoring.sentry.dsnKey | default "NC_SENTRY_DSN" }}
{{- else }}
name: {{ include "nocodb.secretName" . }}
key: NC_SENTRY_DSN
{{- end }}
{{- end }}
{{- end -}}
+44
View File
@@ -0,0 +1,44 @@
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ include "nocodb.fullname" . }}-env
namespace: {{ .Release.Namespace }}
labels:
{{- include "nocodb.labels" . | nindent 4 }}
{{- with include "nocodb.annotations" (dict "context" . "extraAnnotations" dict) }}
annotations:
{{- . | nindent 4 }}
{{- end }}
data:
PORT: "8080"
NC_DISABLE_MUX: {{ .Values.nocodb.disableMux | quote }}
{{- if .Values.nocodb.disableTelemetry }}
NC_DISABLE_TELE: "true"
{{- end }}
{{- if .Values.nocodb.publicUrl }}
NC_SITE_URL: {{ .Values.nocodb.publicUrl | quote }}
{{- else if and .Values.ingress.enabled .Values.ingress.hosts }}
NC_SITE_URL: {{ printf "%s://%s" (ternary "https" "http" (gt (len .Values.ingress.tls) 0)) (first .Values.ingress.hosts).host | quote }}
{{- end }}
{{- with .Values.nocodb.dashboardUrl }}
NC_DASHBOARD_URL: {{ . | quote }}
{{- end }}
{{- with .Values.nocodb.licenseKey }}
NC_LICENSE_KEY: {{ . | quote }}
{{- end }}
{{- if .Values.smtp.enabled }}
NC_SMTP_HOST: {{ .Values.smtp.host | quote }}
NC_SMTP_PORT: {{ .Values.smtp.port | quote }}
NC_SMTP_FROM: {{ .Values.smtp.from | quote }}
{{- with .Values.smtp.username }}
NC_SMTP_USERNAME: {{ . | quote }}
{{- end }}
NC_SMTP_SECURE: {{ .Values.smtp.secure | quote }}
{{- end }}
{{- if .Values.sso.oidc.enabled }}
NC_SSO: "oidc"
NC_OIDC_PROVIDER_NAME: {{ .Values.sso.oidc.providerName | quote }}
{{- else if .Values.sso.saml.enabled }}
NC_SSO: "saml"
NC_SSO_SAML_PROVIDER_NAME: {{ .Values.sso.saml.providerName | quote }}
{{- end }}
+188
View File
@@ -0,0 +1,188 @@
{{- include "nocodb.validateRedis" . -}}
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ include "nocodb.fullname" . }}
namespace: {{ .Release.Namespace }}
labels:
{{- include "nocodb.labels" . | nindent 4 }}
app.kubernetes.io/component: app
{{- with include "nocodb.annotations" (dict "context" . "extraAnnotations" dict) }}
annotations:
{{- . | nindent 4 }}
{{- end }}
spec:
{{- if not .Values.autoscaling.enabled }}
replicas: {{ .Values.replicaCount }}
{{- end }}
strategy:
{{- toYaml .Values.updateStrategy | nindent 4 }}
selector:
matchLabels:
{{- include "nocodb.selectorLabels" . | nindent 6 }}
app.kubernetes.io/component: app
template:
metadata:
labels:
{{- include "nocodb.selectorLabels" . | nindent 8 }}
app.kubernetes.io/component: app
{{- with .Values.podLabels }}
{{- toYaml . | nindent 8 }}
{{- end }}
annotations:
checksum/config: {{ toYaml (dict "nocodb" .Values.nocodb "smtp" .Values.smtp "sso" .Values.sso "ingress" .Values.ingress "externalDatabase" .Values.externalDatabase "externalRedis" .Values.externalRedis "auth" .Values.auth) | sha256sum }}
{{- with .Values.podAnnotations }}
{{- toYaml . | nindent 8 }}
{{- end }}
spec:
{{- include "nocodb.imagePullSecrets" . | nindent 6 }}
serviceAccountName: {{ include "nocodb.serviceAccountName" . }}
automountServiceAccountToken: {{ .Values.serviceAccount.automountServiceAccountToken }}
{{- with .Values.priorityClassName }}
priorityClassName: {{ . }}
{{- end }}
securityContext:
{{- toYaml .Values.podSecurityContext | nindent 8 }}
terminationGracePeriodSeconds: {{ .Values.terminationGracePeriodSeconds }}
{{- with .Values.initContainers }}
initContainers:
{{- toYaml . | nindent 8 }}
{{- end }}
containers:
- name: nocodb
image: {{ include "nocodb.image" . }}
imagePullPolicy: {{ .Values.image.pullPolicy }}
securityContext:
{{- toYaml .Values.containerSecurityContext | nindent 12 }}
{{- with .Values.command }}
command: {{- toYaml . | nindent 12 }}
{{- end }}
{{- with .Values.args }}
args: {{- toYaml . | nindent 12 }}
{{- end }}
ports:
- name: http
containerPort: 8080
protocol: TCP
envFrom:
- configMapRef:
name: {{ include "nocodb.fullname" . }}-env
{{- with .Values.extraEnvVarsCM }}
- configMapRef:
name: {{ . }}
{{- end }}
{{- with .Values.extraEnvVarsSecret }}
- secretRef:
name: {{ . }}
{{- end }}
env:
{{- include "nocodb.secretEnv" . | nindent 12 }}
{{- with .Values.nocodb.extraEnvVars }}
{{- toYaml . | nindent 12 }}
{{- end }}
{{- with .Values.extraEnvVars }}
{{- toYaml . | nindent 12 }}
{{- end }}
{{- if .Values.customLivenessProbe }}
livenessProbe: {{- toYaml .Values.customLivenessProbe | nindent 12 }}
{{- else if .Values.livenessProbe.enabled }}
livenessProbe:
httpGet:
path: /api/v1/health
port: http
initialDelaySeconds: {{ .Values.livenessProbe.initialDelaySeconds }}
periodSeconds: {{ .Values.livenessProbe.periodSeconds }}
timeoutSeconds: {{ .Values.livenessProbe.timeoutSeconds }}
failureThreshold: {{ .Values.livenessProbe.failureThreshold }}
successThreshold: {{ .Values.livenessProbe.successThreshold }}
{{- end }}
{{- if .Values.customReadinessProbe }}
readinessProbe: {{- toYaml .Values.customReadinessProbe | nindent 12 }}
{{- else if .Values.readinessProbe.enabled }}
readinessProbe:
httpGet:
path: /api/v1/health
port: http
initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }}
periodSeconds: {{ .Values.readinessProbe.periodSeconds }}
timeoutSeconds: {{ .Values.readinessProbe.timeoutSeconds }}
failureThreshold: {{ .Values.readinessProbe.failureThreshold }}
successThreshold: {{ .Values.readinessProbe.successThreshold }}
{{- end }}
{{- if .Values.customStartupProbe }}
startupProbe: {{- toYaml .Values.customStartupProbe | nindent 12 }}
{{- else if .Values.startupProbe.enabled }}
startupProbe:
httpGet:
path: /api/v1/health
port: http
initialDelaySeconds: {{ .Values.startupProbe.initialDelaySeconds }}
periodSeconds: {{ .Values.startupProbe.periodSeconds }}
timeoutSeconds: {{ .Values.startupProbe.timeoutSeconds }}
failureThreshold: {{ .Values.startupProbe.failureThreshold }}
successThreshold: {{ .Values.startupProbe.successThreshold }}
{{- end }}
{{- if .Values.lifecycleHooks }}
lifecycle: {{- toYaml .Values.lifecycleHooks | nindent 12 }}
{{- else if .Values.lifecycle }}
lifecycle: {{- toYaml .Values.lifecycle | nindent 12 }}
{{- end }}
{{- with .Values.resources }}
resources: {{- toYaml . | nindent 12 }}
{{- end }}
volumeMounts:
- name: data
mountPath: /usr/app/data
{{- with .Values.extraVolumeMounts }}
{{- toYaml . | nindent 12 }}
{{- end }}
{{- with .Values.sidecars }}
{{- toYaml . | nindent 8 }}
{{- end }}
volumes:
- name: data
{{- if .Values.persistence.enabled }}
persistentVolumeClaim:
claimName: {{ .Values.persistence.existingClaim | default (printf "%s-data" (include "nocodb.fullname" .)) }}
{{- else }}
emptyDir: {}
{{- end }}
{{- with .Values.extraVolumes }}
{{- toYaml . | nindent 8 }}
{{- end }}
{{- if .Values.affinity }}
affinity:
{{- toYaml .Values.affinity | nindent 8 }}
{{- else if eq .Values.podAntiAffinityPreset "soft" }}
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchLabels:
{{- include "nocodb.selectorLabels" . | nindent 20 }}
app.kubernetes.io/component: app
topologyKey: kubernetes.io/hostname
{{- else if eq .Values.podAntiAffinityPreset "hard" }}
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchLabels:
{{- include "nocodb.selectorLabels" . | nindent 18 }}
app.kubernetes.io/component: app
topologyKey: kubernetes.io/hostname
{{- end }}
{{- with .Values.topologySpreadConstraints }}
topologySpreadConstraints:
{{- toYaml . | nindent 8 }}
{{- end }}
{{- with .Values.nodeSelector }}
nodeSelector:
{{- toYaml . | nindent 8 }}
{{- end }}
{{- with .Values.tolerations }}
tolerations:
{{- toYaml . | nindent 8 }}
{{- end }}
@@ -0,0 +1,110 @@
{{- if .Values.worker.enabled -}}
{{- include "nocodb.validateRedis" . -}}
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ include "nocodb.fullname" . }}-worker
namespace: {{ .Release.Namespace }}
labels:
{{- include "nocodb.labels" . | nindent 4 }}
app.kubernetes.io/component: worker
{{- with include "nocodb.annotations" (dict "context" . "extraAnnotations" dict) }}
annotations:
{{- . | nindent 4 }}
{{- end }}
spec:
{{- if not .Values.worker.autoscaling.enabled }}
replicas: {{ .Values.worker.replicaCount }}
{{- end }}
selector:
matchLabels:
{{- include "nocodb.selectorLabels" . | nindent 6 }}
app.kubernetes.io/component: worker
template:
metadata:
labels:
{{- include "nocodb.selectorLabels" . | nindent 8 }}
app.kubernetes.io/component: worker
annotations:
checksum/config: {{ toYaml (dict "nocodb" .Values.nocodb "smtp" .Values.smtp "sso" .Values.sso "ingress" .Values.ingress "externalDatabase" .Values.externalDatabase "externalRedis" .Values.externalRedis "auth" .Values.auth) | sha256sum }}
{{- with .Values.worker.podAnnotations }}
{{- toYaml . | nindent 8 }}
{{- end }}
spec:
{{- include "nocodb.imagePullSecrets" . | nindent 6 }}
serviceAccountName: {{ include "nocodb.serviceAccountName" . }}
automountServiceAccountToken: {{ .Values.serviceAccount.automountServiceAccountToken }}
securityContext:
{{- toYaml .Values.podSecurityContext | nindent 8 }}
terminationGracePeriodSeconds: {{ .Values.worker.terminationGracePeriodSeconds | default .Values.terminationGracePeriodSeconds }}
containers:
- name: nocodb-worker
image: {{ include "nocodb.image" . }}
imagePullPolicy: {{ .Values.image.pullPolicy }}
securityContext:
{{- toYaml .Values.containerSecurityContext | nindent 12 }}
envFrom:
- configMapRef:
name: {{ include "nocodb.fullname" . }}-env
{{- with .Values.extraEnvVarsCM }}
- configMapRef:
name: {{ . }}
{{- end }}
{{- with .Values.extraEnvVarsSecret }}
- secretRef:
name: {{ . }}
{{- end }}
env:
- name: NC_WORKER_CONTAINER
value: "true"
{{- with .Values.worker.concurrency }}
- name: NC_WORKER_CONCURRENCY
value: {{ . | quote }}
{{- end }}
{{- include "nocodb.secretEnv" . | nindent 12 }}
{{- with .Values.extraEnvVars }}
{{- toYaml . | nindent 12 }}
{{- end }}
{{- with .Values.worker.extraEnvVars }}
{{- toYaml . | nindent 12 }}
{{- end }}
livenessProbe:
tcpSocket:
port: 8080
initialDelaySeconds: 30
periodSeconds: 30
timeoutSeconds: 5
failureThreshold: 5
{{- with .Values.worker.resources }}
resources: {{- toYaml . | nindent 12 }}
{{- end }}
volumeMounts:
- name: data
mountPath: /usr/app/data
volumes:
- name: data
emptyDir: {}
{{- if .Values.worker.affinity }}
affinity:
{{- toYaml .Values.worker.affinity | nindent 8 }}
{{- else if eq .Values.podAntiAffinityPreset "soft" }}
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchLabels:
{{- include "nocodb.selectorLabels" . | nindent 20 }}
app.kubernetes.io/component: worker
topologyKey: kubernetes.io/hostname
{{- end }}
{{- with .Values.worker.nodeSelector }}
nodeSelector:
{{- toYaml . | nindent 8 }}
{{- end }}
{{- with .Values.worker.tolerations }}
tolerations:
{{- toYaml . | nindent 8 }}
{{- end }}
{{- end }}
+4
View File
@@ -0,0 +1,4 @@
{{- range .Values.extraDeploy }}
---
{{ include "nocodb.tplvalues.render" (dict "value" . "context" $) }}
{{- end }}
+37
View File
@@ -0,0 +1,37 @@
{{- if .Values.autoscaling.enabled -}}
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: {{ include "nocodb.fullname" . }}
namespace: {{ .Release.Namespace }}
labels:
{{- include "nocodb.labels" . | nindent 4 }}
{{- with include "nocodb.annotations" (dict "context" . "extraAnnotations" dict) }}
annotations:
{{- . | nindent 4 }}
{{- end }}
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: {{ include "nocodb.fullname" . }}
minReplicas: {{ .Values.autoscaling.minReplicas }}
maxReplicas: {{ .Values.autoscaling.maxReplicas }}
metrics:
{{- if .Values.autoscaling.targetCPU }}
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: {{ .Values.autoscaling.targetCPU }}
{{- end }}
{{- if .Values.autoscaling.targetMemory }}
- type: Resource
resource:
name: memory
target:
type: Utilization
averageUtilization: {{ .Values.autoscaling.targetMemory }}
{{- end }}
{{- end }}
+38
View File
@@ -0,0 +1,38 @@
{{- if and .Values.worker.enabled .Values.worker.autoscaling.enabled -}}
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: {{ include "nocodb.fullname" . }}-worker
namespace: {{ .Release.Namespace }}
labels:
{{- include "nocodb.labels" . | nindent 4 }}
app.kubernetes.io/component: worker
{{- with include "nocodb.annotations" (dict "context" . "extraAnnotations" dict) }}
annotations:
{{- . | nindent 4 }}
{{- end }}
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: {{ include "nocodb.fullname" . }}-worker
minReplicas: {{ .Values.worker.autoscaling.minReplicas }}
maxReplicas: {{ .Values.worker.autoscaling.maxReplicas }}
metrics:
{{- if .Values.worker.autoscaling.targetCPU }}
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: {{ .Values.worker.autoscaling.targetCPU }}
{{- end }}
{{- if .Values.worker.autoscaling.targetMemory }}
- type: Resource
resource:
name: memory
target:
type: Utilization
averageUtilization: {{ .Values.worker.autoscaling.targetMemory }}
{{- end }}
{{- end }}
+36
View File
@@ -0,0 +1,36 @@
{{- if .Values.ingress.enabled -}}
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: {{ include "nocodb.fullname" . }}
namespace: {{ .Release.Namespace }}
labels:
{{- include "nocodb.labels" . | nindent 4 }}
{{- with include "nocodb.annotations" (dict "context" . "extraAnnotations" .Values.ingress.annotations) }}
annotations:
{{- . | nindent 4 }}
{{- end }}
spec:
{{- with .Values.ingress.className }}
ingressClassName: {{ . }}
{{- end }}
{{- with .Values.ingress.tls }}
tls:
{{- toYaml . | nindent 4 }}
{{- end }}
rules:
{{- range .Values.ingress.hosts }}
- host: {{ .host | quote }}
http:
paths:
{{- range .paths }}
- path: {{ .path }}
pathType: {{ .pathType }}
backend:
service:
name: {{ include "nocodb.fullname" $ }}
port:
number: {{ $.Values.service.port }}
{{- end }}
{{- end }}
{{- end }}
@@ -0,0 +1,35 @@
{{- if .Values.networkPolicy.enabled -}}
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: {{ include "nocodb.fullname" . }}
namespace: {{ .Release.Namespace }}
labels:
{{- include "nocodb.labels" . | nindent 4 }}
{{- with include "nocodb.annotations" (dict "context" . "extraAnnotations" dict) }}
annotations:
{{- . | nindent 4 }}
{{- end }}
spec:
podSelector:
matchLabels:
{{- include "nocodb.selectorLabels" . | nindent 6 }}
policyTypes:
- Ingress
- Egress
ingress:
- ports:
- port: 8080
{{- if not .Values.networkPolicy.allowExternal }}
from:
- podSelector: {}
{{- end }}
{{- with .Values.networkPolicy.extraIngress }}
{{- toYaml . | nindent 4 }}
{{- end }}
egress:
- {}
{{- with .Values.networkPolicy.extraEgress }}
{{- toYaml . | nindent 4 }}
{{- end }}
{{- end }}
+48
View File
@@ -0,0 +1,48 @@
{{- if .Values.pdb.create -}}
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
name: {{ include "nocodb.fullname" . }}
namespace: {{ .Release.Namespace }}
labels:
{{- include "nocodb.labels" . | nindent 4 }}
{{- with include "nocodb.annotations" (dict "context" . "extraAnnotations" dict) }}
annotations:
{{- . | nindent 4 }}
{{- end }}
spec:
{{- if .Values.pdb.maxUnavailable }}
maxUnavailable: {{ .Values.pdb.maxUnavailable }}
{{- else }}
minAvailable: {{ .Values.pdb.minAvailable }}
{{- end }}
selector:
matchLabels:
{{- include "nocodb.selectorLabels" . | nindent 6 }}
app.kubernetes.io/component: app
{{- if .Values.worker.enabled }}
---
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
name: {{ include "nocodb.fullname" . }}-worker
namespace: {{ .Release.Namespace }}
labels:
{{- include "nocodb.labels" . | nindent 4 }}
app.kubernetes.io/component: worker
{{- with include "nocodb.annotations" (dict "context" . "extraAnnotations" dict) }}
annotations:
{{- . | nindent 4 }}
{{- end }}
spec:
{{- if .Values.pdb.maxUnavailable }}
maxUnavailable: {{ .Values.pdb.maxUnavailable }}
{{- else }}
minAvailable: {{ .Values.pdb.minAvailable }}
{{- end }}
selector:
matchLabels:
{{- include "nocodb.selectorLabels" . | nindent 6 }}
app.kubernetes.io/component: worker
{{- end }}
{{- end }}
+23
View File
@@ -0,0 +1,23 @@
{{- if and .Values.persistence.enabled (not .Values.persistence.existingClaim) -}}
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: {{ include "nocodb.fullname" . }}-data
namespace: {{ .Release.Namespace }}
labels:
{{- include "nocodb.labels" . | nindent 4 }}
{{- with include "nocodb.annotations" (dict "context" . "extraAnnotations" dict) }}
annotations:
{{- . | nindent 4 }}
{{- end }}
spec:
accessModes:
{{- toYaml .Values.persistence.accessModes | nindent 4 }}
resources:
requests:
storage: {{ .Values.persistence.size }}
{{- $sc := .Values.persistence.storageClass | default .Values.global.storageClass }}
{{- if $sc }}
storageClassName: {{ $sc }}
{{- end }}
{{- end }}
+34
View File
@@ -0,0 +1,34 @@
{{- $manageDb := not .Values.externalDatabase.existingSecret -}}
{{- $manageRedis := and (include "nocodb.redisConfigured" .) (not .Values.externalRedis.existingSecret) -}}
{{- $manageAuth := not .Values.auth.existingSecret -}}
{{- $manageSmtp := and .Values.smtp.enabled .Values.smtp.password (not .Values.smtp.existingSecret) -}}
{{- $manageSentry := and .Values.monitoring.sentry.enabled .Values.monitoring.sentry.dsn (not .Values.monitoring.sentry.existingSecret) -}}
{{- if or $manageDb $manageRedis $manageAuth $manageSmtp $manageSentry -}}
apiVersion: v1
kind: Secret
metadata:
name: {{ include "nocodb.secretName" . }}
namespace: {{ .Release.Namespace }}
labels:
{{- include "nocodb.labels" . | nindent 4 }}
annotations:
{{- include "nocodb.annotations" (dict "context" . "extraAnnotations" (dict "helm.sh/resource-policy" "keep")) | nindent 4 }}
type: Opaque
data:
{{- if $manageDb }}
DATABASE_URL: {{ include "nocodb.dbUrl" . | b64enc | quote }}
{{- end }}
{{- if $manageRedis }}
NC_REDIS_URL: {{ include "nocodb.redisUrl" . | b64enc | quote }}
{{- end }}
{{- if $manageAuth }}
NC_AUTH_JWT_SECRET: {{ include "nocodb.jwtSecret" . | b64enc | quote }}
NC_CONNECTION_ENCRYPT_KEY: {{ include "nocodb.encryptionKey" . | b64enc | quote }}
{{- end }}
{{- if $manageSmtp }}
NC_SMTP_PASSWORD: {{ .Values.smtp.password | b64enc | quote }}
{{- end }}
{{- if $manageSentry }}
NC_SENTRY_DSN: {{ .Values.monitoring.sentry.dsn | b64enc | quote }}
{{- end }}
{{- end }}
+21
View File
@@ -0,0 +1,21 @@
apiVersion: v1
kind: Service
metadata:
name: {{ include "nocodb.fullname" . }}
namespace: {{ .Release.Namespace }}
labels:
{{- include "nocodb.labels" . | nindent 4 }}
{{- with include "nocodb.annotations" (dict "context" . "extraAnnotations" .Values.service.annotations) }}
annotations:
{{- . | nindent 4 }}
{{- end }}
spec:
type: {{ .Values.service.type }}
ports:
- port: {{ .Values.service.port }}
targetPort: http
protocol: TCP
name: http
selector:
{{- include "nocodb.selectorLabels" . | nindent 4 }}
app.kubernetes.io/component: app
@@ -0,0 +1,14 @@
{{- if .Values.serviceAccount.create -}}
apiVersion: v1
kind: ServiceAccount
metadata:
name: {{ include "nocodb.serviceAccountName" . }}
namespace: {{ .Release.Namespace }}
labels:
{{- include "nocodb.labels" . | nindent 4 }}
{{- with include "nocodb.annotations" (dict "context" . "extraAnnotations" .Values.serviceAccount.annotations) }}
annotations:
{{- . | nindent 4 }}
{{- end }}
automountServiceAccountToken: {{ .Values.serviceAccount.automountServiceAccountToken }}
{{- end }}
+38
View File
@@ -0,0 +1,38 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"type": "object",
"properties": {
"replicaCount": { "type": "integer", "minimum": 1 },
"image": {
"type": "object",
"properties": {
"registry": { "type": "string" },
"repository": { "type": "string" },
"tag": { "type": "string" },
"digest": { "type": "string" },
"pullPolicy": { "type": "string", "enum": ["Always", "IfNotPresent", "Never"] }
},
"required": ["repository"]
},
"worker": {
"type": "object",
"properties": { "enabled": { "type": "boolean" } }
},
"externalDatabase": {
"type": "object",
"properties": {
"host": { "type": "string" },
"port": { "type": ["integer", "string"] },
"existingSecret": { "type": "string" }
}
},
"externalRedis": {
"type": "object",
"properties": {
"host": { "type": "string" },
"existingSecret": { "type": "string" }
}
},
"podAntiAffinityPreset": { "type": "string", "enum": ["", "soft", "hard"] }
}
}
+362
View File
@@ -0,0 +1,362 @@
## @section Common
## @param nameOverride Override the chart name
nameOverride: ""
## @param fullnameOverride Override the fully qualified release name
fullnameOverride: ""
## @param commonLabels Labels added to all resources
commonLabels: {}
## @param commonAnnotations Annotations added to all resources
commonAnnotations: {}
## @section Service account
## @param serviceAccount.create Create a ServiceAccount
## @param serviceAccount.name Name of the ServiceAccount (defaults to fullname)
## @param serviceAccount.annotations Annotations for the ServiceAccount (e.g. IRSA / Workload Identity)
## @param serviceAccount.automountServiceAccountToken Auto-mount the SA token
serviceAccount:
create: true
name: ""
annotations: {}
automountServiceAccountToken: false
## @section Global
global:
## @param global.imageRegistry Global image registry override
imageRegistry: ""
## @param global.imagePullSecrets Global image pull secrets
imagePullSecrets: []
## @param global.storageClass Global storage class for PVCs
storageClass: ""
## @section Image
image:
## @param image.registry NocoDB image registry
registry: docker.io
## @param image.repository NocoDB image repository
repository: nocodb/nocodb
## @skip image.tag Image tag (defaults to chart appVersion; immutable tags recommended)
tag: ""
## @param image.digest Image digest (takes precedence over tag), e.g. sha256:...
digest: ""
## @param image.pullPolicy Image pull policy
pullPolicy: IfNotPresent
## @param image.pullSecrets Image pull secrets
pullSecrets: []
## @section App workload
## @param replicaCount Number of app replicas (>=2 requires Redis)
replicaCount: 2
## @param updateStrategy Deployment update strategy (ordered rollout for migration safety)
updateStrategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
## @param resources App container resources. Default requests reserve a full node vCPU; 2Gi memory recommended, 1Gi minimum
resources:
requests:
cpu: "1"
memory: 2Gi
## @param podAnnotations Extra annotations for app pods
podAnnotations: {}
## @param podLabels Extra labels for app pods
podLabels: {}
## @param podSecurityContext App pod security context
podSecurityContext:
fsGroup: 1000
## @param containerSecurityContext App container security context
containerSecurityContext:
runAsNonRoot: true
runAsUser: 1000
allowPrivilegeEscalation: false
readOnlyRootFilesystem: false
capabilities:
drop: ["ALL"]
seccompProfile:
type: RuntimeDefault
## @param livenessProbe App liveness probe (httpGet /api/v1/health)
livenessProbe:
enabled: true
initialDelaySeconds: 30
periodSeconds: 30
timeoutSeconds: 5
failureThreshold: 5
successThreshold: 1
## @param readinessProbe App readiness probe
readinessProbe:
enabled: true
initialDelaySeconds: 15
periodSeconds: 10
timeoutSeconds: 5
failureThreshold: 3
successThreshold: 1
## @param startupProbe App startup probe (generous to cover first-boot migrations)
startupProbe:
enabled: true
initialDelaySeconds: 15
periodSeconds: 10
timeoutSeconds: 5
failureThreshold: 30
successThreshold: 1
## @param customLivenessProbe Replaces the generated liveness probe when set
customLivenessProbe: {}
## @param customReadinessProbe Replaces the generated readiness probe when set
customReadinessProbe: {}
## @param customStartupProbe Replaces the generated startup probe when set
customStartupProbe: {}
## @param lifecycle Container lifecycle hooks (default preStop drains the LB)
lifecycle:
preStop:
exec:
command: ["/bin/sh", "-c", "sleep 5"]
## @param terminationGracePeriodSeconds Grace period for in-flight request drain
terminationGracePeriodSeconds: 60
## @section App config (non-secret)
nocodb:
## @param nocodb.publicUrl NC_SITE_URL. If empty, derived from the first ingress host when TLS is set
publicUrl: ""
## @param nocodb.dashboardUrl NC_DASHBOARD_URL
dashboardUrl: ""
## @param nocodb.disableMux Set NC_DISABLE_MUX=true (recommended for self-hosted)
disableMux: true
## @param nocodb.disableTelemetry Set NC_DISABLE_TELE=true
disableTelemetry: false
## @param nocodb.licenseKey NC_LICENSE_KEY (enterprise)
licenseKey: ""
## @param nocodb.extraEnvVars Extra raw env vars for the app (list of name/value or valueFrom)
extraEnvVars: []
## @section Worker workload
worker:
## @param worker.enabled Deploy a dedicated background worker (requires Redis)
enabled: true
## @param worker.replicaCount Worker replicas
replicaCount: 2
## @param worker.concurrency NC_WORKER_CONCURRENCY (empty = NocoDB default)
concurrency: ""
## @param worker.terminationGracePeriodSeconds Grace period for the worker to drain in-flight Bull jobs on shutdown (raise above your longest job)
terminationGracePeriodSeconds: 120
## @param worker.resources Worker container resources. Default requests reserve a full node vCPU; 2Gi memory recommended, 1Gi minimum
resources:
requests:
cpu: "1"
memory: 2Gi
## @param worker.podAnnotations Extra annotations for worker pods
podAnnotations: {}
## @param worker.nodeSelector Worker node selector
nodeSelector: {}
## @param worker.tolerations Worker tolerations
tolerations: []
## @param worker.affinity Worker affinity (overrides the default anti-affinity preset)
affinity: {}
## @param worker.autoscaling.enabled Enable HPA for the worker
## @param worker.autoscaling.minReplicas Minimum worker replicas
## @param worker.autoscaling.maxReplicas Maximum worker replicas
## @param worker.autoscaling.targetCPU Target CPU utilisation percentage for worker HPA
## @param worker.autoscaling.targetMemory Target memory utilisation percentage for worker HPA (empty to disable)
autoscaling:
enabled: false
minReplicas: 2
maxReplicas: 5
targetCPU: 80
targetMemory: ""
## @param worker.extraEnvVars Extra raw env vars for the worker
extraEnvVars: []
## @section External Postgres (required)
externalDatabase:
## @param externalDatabase.host Postgres host (eval/inline path)
host: ""
## @param externalDatabase.port Postgres port
port: 5432
## @param externalDatabase.database Database name
database: nocodb
## @param externalDatabase.username Database user
username: nocodb
## @param externalDatabase.password Database password (eval only; use existingSecret in prod)
password: ""
## @param externalDatabase.sslMode sslmode appended to the assembled URL
sslMode: prefer
## @param externalDatabase.urlEnvVar Env var name for the connection URL (DATABASE_URL or NC_DB)
urlEnvVar: DATABASE_URL
## @param externalDatabase.existingSecret Secret holding the full connection URL
existingSecret: ""
## @param externalDatabase.existingSecretUrlKey Key in existingSecret holding the URL
existingSecretUrlKey: DATABASE_URL
## @section External Redis (required for HA / worker)
externalRedis:
## @param externalRedis.host Redis host
host: ""
## @param externalRedis.port Redis port
port: 6379
## @param externalRedis.password Redis password (eval only)
password: ""
## @param externalRedis.tls Use rediss:// scheme
tls: false
## @param externalRedis.existingSecret Secret holding the full NC_REDIS_URL
existingSecret: ""
## @param externalRedis.existingSecretUrlKey Key in existingSecret holding NC_REDIS_URL
existingSecretUrlKey: NC_REDIS_URL
## @section SMTP (optional)
smtp:
## @param smtp.enabled Configure SMTP email
enabled: false
## @param smtp.host SMTP host
host: ""
## @param smtp.port SMTP port
port: 587
## @param smtp.from From address
from: ""
## @param smtp.username SMTP username
username: ""
## @param smtp.password SMTP password (eval only)
password: ""
## @param smtp.secure NC_SMTP_SECURE
secure: false
## @param smtp.existingSecret Secret holding the SMTP password
existingSecret: ""
## @param smtp.passwordKey Key in existingSecret for the SMTP password
passwordKey: NC_SMTP_PASSWORD
## @section SSO (optional)
sso:
## @param sso.oidc.enabled Enable OIDC (sets NC_SSO=oidc)
## @param sso.oidc.providerName Display name for the OIDC provider
oidc:
enabled: false
providerName: OpenID Connect
## @param sso.saml.enabled Enable SAML (sets NC_SSO=saml)
## @param sso.saml.providerName Display name for the SAML provider
saml:
enabled: false
providerName: SAML
## @section Auth keys
auth:
## @param auth.jwtSecret NC_AUTH_JWT_SECRET (auto-generated+persisted if empty)
jwtSecret: ""
## @param auth.encryptionKey NC_CONNECTION_ENCRYPT_KEY (auto-generated+persisted if empty; never rotated)
encryptionKey: ""
## @param auth.existingSecret Secret holding both keys
existingSecret: ""
## @param auth.jwtSecretKey Key in existingSecret for the JWT secret
jwtSecretKey: NC_AUTH_JWT_SECRET
## @param auth.encryptionKeyKey Key in existingSecret for the encryption key
encryptionKeyKey: NC_CONNECTION_ENCRYPT_KEY
## @section Scaling & scheduling
autoscaling:
## @param autoscaling.enabled App HPA
enabled: false
## @param autoscaling.minReplicas Minimum app replicas for HPA
minReplicas: 2
## @param autoscaling.maxReplicas Maximum app replicas for HPA
maxReplicas: 10
## @param autoscaling.targetCPU Target CPU utilisation percentage for app HPA
targetCPU: 80
## @param autoscaling.targetMemory Target memory utilisation percentage for app HPA (empty to disable)
targetMemory: ""
## @param pdb.create Create a PodDisruptionBudget for the app
pdb:
create: false
## @param pdb.minAvailable Minimum available pods for PDB (integer or percentage)
minAvailable: 1
## @param pdb.maxUnavailable Maximum unavailable pods for PDB (integer or percentage; empty if minAvailable is set)
maxUnavailable: ""
## @param podAntiAffinityPreset Default app pod anti-affinity (soft|hard|"")
podAntiAffinityPreset: soft
## @param topologySpreadConstraints App topology spread constraints
topologySpreadConstraints: []
## @param affinity App affinity (overrides podAntiAffinityPreset)
affinity: {}
## @param nodeSelector App node selector
nodeSelector: {}
## @param tolerations App tolerations
tolerations: []
## @param priorityClassName App priority class
priorityClassName: ""
## @section Networking
service:
## @param service.type Service type
type: ClusterIP
## @param service.port Service port
port: 8080
## @param service.annotations Service annotations
annotations: {}
ingress:
## @param ingress.enabled Create an Ingress
enabled: false
## @param ingress.className Ingress class name
className: ""
## @param ingress.annotations Ingress annotations (cert-manager cluster-issuer here)
annotations: {}
## @param ingress.hosts Ingress hosts
hosts:
- host: nocodb.example.com
paths:
- path: /
pathType: Prefix
## @param ingress.tls Ingress TLS entries
tls: []
networkPolicy:
## @param networkPolicy.enabled Create a NetworkPolicy
enabled: false
## @param networkPolicy.allowExternal Allow ingress from anywhere
allowExternal: true
## @param networkPolicy.extraIngress Extra ingress rules
extraIngress: []
## @param networkPolicy.extraEgress Extra egress rules
extraEgress: []
## @section Persistence (local attachment storage)
persistence:
## @param persistence.enabled Mount a PVC at /usr/app/data instead of emptyDir
enabled: false
## @param persistence.storageClass StorageClass for the PVC (empty uses cluster default)
storageClass: ""
## @param persistence.accessModes PVC access modes
accessModes: ["ReadWriteOnce"]
## @param persistence.size PVC size
size: 10Gi
## @param persistence.existingClaim Existing PVC name (skips PVC creation)
existingClaim: ""
## @section Observability
monitoring:
## @param monitoring.sentry.enabled Set NC_SENTRY_DSN
## @param monitoring.sentry.dsn Sentry DSN (eval; use existingSecret in prod)
## @param monitoring.sentry.existingSecret Secret holding the Sentry DSN
## @param monitoring.sentry.dsnKey Key in existingSecret for the DSN
sentry:
enabled: false
dsn: ""
existingSecret: ""
dsnKey: NC_SENTRY_DSN
## @section Escape hatches
## @param extraEnvVars Extra env vars applied to app and worker
extraEnvVars: []
## @param extraEnvVarsCM Name of a ConfigMap with extra env vars
extraEnvVarsCM: ""
## @param extraEnvVarsSecret Name of a Secret with extra env vars
extraEnvVarsSecret: ""
## @param extraVolumes Extra volumes
extraVolumes: []
## @param extraVolumeMounts Extra volume mounts
extraVolumeMounts: []
## @param initContainers Extra init containers
initContainers: []
## @param sidecars Extra sidecar containers
sidecars: []
## @param command Override container command
command: []
## @param args Override container args
args: []
## @param lifecycleHooks Override container lifecycle hooks (takes precedence over lifecycle)
lifecycleHooks: {}
## @param extraDeploy Extra raw manifests (tpl-rendered)
extraDeploy: []
+1 -1
View File
@@ -134,7 +134,7 @@ Toegang tot dashboard met behulp van : [http://localhost:8080/dashboard](http://
# Production Setup
NOCODB vereist een database om metadata van spreadsheets weergaven en externe databases op te slaan. En verbindingsparamumenten voor deze database kunnen worden opgegeven in de variabele NC_DB-omgeving.
NocoDB vereist een database om metadata van spreadsheets weergaven en externe databases op te slaan. En verbindingsparamumenten voor deze database kunnen worden opgegeven in de variabele NC_DB-omgeving.
## Docker
+1 -1
View File
@@ -138,7 +138,7 @@ Accedi al Pannello di Controllo visitando: [http://localhost:8080/dashboard](htt
# Impostazione in produzione
NOCODB richiede un database per memorizzare i metadati delle viste dei fogli di calcolo e dei database esterni. I parametri di connessione per questo database possono essere specificati nella variabile di ambiente NC_DB.
NocoDB richiede un database per memorizzare i metadati delle viste dei fogli di calcolo e dei database esterni. I parametri di connessione per questo database possono essere specificati nella variabile di ambiente NC_DB.
## Docker
+3 -3
View File
@@ -2,7 +2,7 @@
<b>
<a href="https://www.nocodb.com">NocoDB </a><br>
</b>
✨ La alternativa open-source de Airtable ✨ <br>
✨ La alternativa fair-code de Airtable ✨ <br>
</h1>
<p align="center">
@@ -135,7 +135,7 @@ Proveemos las siguientes maneras para dejar que los usuarios puedan invocar acci
# Configruación para Entorno de Producción:
Nocodb requiere una base de datos para almacenar metadatos de vistas a las hojas de cálculo y bases de datos externas. Y los parámetros de conexión para esta base de datos se pueden especificar en la variable de entorno NC_DB.
NocoDB requiere una base de datos para almacenar metadatos de vistas a las hojas de cálculo y bases de datos externas. Y los parámetros de conexión para esta base de datos se pueden especificar en la variable de entorno NC_DB.
## Docker
@@ -178,4 +178,4 @@ La mayoría de las empresas de Internet emplean una hoja de cálculo o una base
# Nuestra misión
Nuestra misión es proporcionar la interfaz sin-código más potente para bases de datos, la cual es open-source para negocios de Internet en el mundo. Esto no solo democratizaría el acceso a una poderosa herramienta de computación, sino que también producirá a miles de millones de personas o más con habilidades radicales de perfección y construcción en Internet.
Nuestra misión es proporcionar la interfaz sin-código más potente para bases de datos, la cual es fair-code para negocios de Internet en el mundo. Esto no solo democratizaría el acceso a una poderosa herramienta de computación, sino que también producirá a miles de millones de personas o más con habilidades radicales de perfección y construcción en Internet.
+1 -1
View File
@@ -10,7 +10,7 @@
</h1>
<p align="center">
Nocodb перетворює будь-яку базу даних MySQL, PostgreSQL, SQL Server, SQLite та MariaDB в розумну електронну таблицю.
NocoDB перетворює будь-яку базу даних MySQL, PostgreSQL, SQL Server, SQLite та MariaDB в розумну електронну таблицю.
</p>
<div align="center">
@@ -2036,7 +2036,7 @@ const { message: templatedMessage } = useTemplatedMessage(
<div v-if="!parseProp(formViewData?.meta).hide_branding" class="px-8 lg:px-12">
<a-divider class="!my-8" />
<!-- Nocodb Branding -->
<!-- NocoDB Branding -->
<div class="inline-block">
<GeneralFormBranding @click.stop />
</div>
+1 -1
View File
@@ -3858,7 +3858,7 @@
"header": "আপনি আমাদের সাহায্য করতে পারেন!",
"message": "আমরা নোকোডিবিকে ওপেন সোর্স করার জন্য পুরো সময় কাজ করছি এমন একটি ক্ষুদ্র দল। আমরা বিশ্বাস করি যে নোকোডিবির মতো একটি সরঞ্জাম ইন্টারনেটে প্রতিটি সমস্যা সমাধানকারীকে অবাধে উপলব্ধ হওয়া উচিত।"
},
"loginMsg": "Nocodb এ লগ ইন করুন",
"loginMsg": "NocoDB এ লগ ইন করুন",
"passwordRecovery": {
"message_1": "আপনি সাইন আপ করার সময় দয়া করে আপনি যে ইমেল ঠিকানাটি ব্যবহার করেছেন তা সরবরাহ করুন।",
"message_2": "আমরা আপনার পাসওয়ার্ডটি পুনরায় সেট করতে একটি লিঙ্ক সহ একটি ইমেল প্রেরণ করব।",
+1 -1
View File
@@ -3856,7 +3856,7 @@
},
"sponsor": {
"header": "Můžete nám pomoci!",
"message": "Jsme malý tým, který na plný úvazek pracuje na tom, aby NocoDB byla open-source. Věříme, že nástroj jako NocoDB by měl být volně dostupný každému řešiteli problémů na internetu."
"message": "Jsme malý tým, který na plný úvazek pracuje na tom, aby NocoDB byla fair-code. Věříme, že nástroj jako NocoDB by měl být volně dostupný každému řešiteli problémů na internetu."
},
"loginMsg": "Přihlášení k NocoDB",
"passwordRecovery": {
+5 -5
View File
@@ -1229,8 +1229,8 @@
"sqlMigrations": "SQL Migrations.",
"dbCredentials": "Database legitimationsoplysninger.",
"advancedParameters": "SSL & Avancerede parametre",
"headCreateProject": "Opret projekt | Nocodb.",
"headLogin": "Log ind | Nocodb.",
"headCreateProject": "Opret projekt | NocoDB.",
"headLogin": "Log ind | NocoDB.",
"resetPassword": "Nulstil din adgangskode",
"teamAndSettings": "Hold og indstillinger",
"apiDocs": "API-dokumenter",
@@ -3845,7 +3845,7 @@
"staticRoleInfo": "Systemdefinerede roller kan ikke redigeres",
"exportZip": "Eksporter Project Meta til ZIP-fil og download.",
"importZip": "Import Project Meta Zip-fil og genstart.",
"importText": "Import Nocodb-projekt ved at uploade Metadata Zip-filen",
"importText": "Import NocoDB-projekt ved at uploade Metadata Zip-filen",
"metaNoChange": "Ingen ændring identificeret",
"sqlMigration": "Schema Migrations vil blive oprettet automatisk. Opret et bord og opdater denne side.",
"dbConnectionStatus": "Miljø valideret",
@@ -3856,9 +3856,9 @@
},
"sponsor": {
"header": "Du kan hjælpe os!",
"message": "Vi er et lille team, der arbejder på fuld tid for at lave NOCODB OPEN-SOURCE. Vi mener, at et værktøj som Nocodb skal være tilgængeligt frit til alle problemløser på internettet."
"message": "Vi er et lille team, der arbejder på fuld tid for at lave NocoDB fair-code. Vi mener, at et værktøj som NocoDB skal være tilgængeligt frit til alle problemløser på internettet."
},
"loginMsg": "Log ind på NOCODB",
"loginMsg": "Log ind på NocoDB",
"passwordRecovery": {
"message_1": "Angiv venligst den e-mail-adresse, du brugte, når du tilmeldte dig.",
"message_2": "Vi sender dig en email med et link for at nulstille dit kodeord.",
+1 -1
View File
@@ -3856,7 +3856,7 @@
},
"sponsor": {
"header": "Sie können uns helfen!",
"message": "Wir sind ein kleines Team, das Vollzeit daran arbeitet, NocoDB Open-Source zu machen. Wir sind der Meinung, dass ein Tool wie NocoDB für jeden Problemlöser im Internet frei verfügbar sein sollte."
"message": "Wir sind ein kleines Team, das Vollzeit daran arbeitet, NocoDB fair-code zu machen. Wir sind der Meinung, dass ein Tool wie NocoDB für jeden Problemlöser im Internet frei verfügbar sein sollte."
},
"loginMsg": "In NocoDB einloggen",
"passwordRecovery": {
+1 -1
View File
@@ -4068,7 +4068,7 @@
},
"sponsor": {
"header": "You can help us!",
"message": "We are a tiny team working full time to make NocoDB Open-source. We believe a tool like NocoDB should be available freely to every problem solver on Internet."
"message": "We are a tiny team working full time to make NocoDB fair-code. We believe a tool like NocoDB should be available freely to every problem solver on Internet."
},
"loginMsg": "Log In To NocoDB",
"passwordRecovery": {
+1 -1
View File
@@ -3856,7 +3856,7 @@
},
"sponsor": {
"header": "¡Puedes ayudarnos!",
"message": "Somos un pequeño equipo que trabaja a tiempo completo para hacer que Nocodb Open-Source. Creemos que una herramienta como Nocodb debería estar disponible libremente a cada solucionador de problemas en Internet."
"message": "Somos un pequeño equipo que trabaja a tiempo completo para hacer que NocoDB fair-code. Creemos que una herramienta como NocoDB debería estar disponible libremente a cada solucionador de problemas en Internet."
},
"loginMsg": "Acceder a NocoDB",
"passwordRecovery": {
+2 -2
View File
@@ -2495,7 +2495,7 @@
"bookDemo": "رزرو دموی رایگان",
"getAnswered": "پاسخ سوالات خود را دریافت کنید",
"joinDiscord": "به Discord بپیوندید",
"joinCommunity": "ملحق شدن به انجمن Nocodb",
"joinCommunity": "ملحق شدن به انجمن NocoDB",
"joinReddit": "به NocoDB بپیوندید",
"followNocodb": "NocoDB را دنبال کنید",
"communityTranslated": "(ترجمه انجمن/هوش مصنوعی)"
@@ -3856,7 +3856,7 @@
},
"sponsor": {
"header": "شما می‌توانید از ما حمایت کنید!",
"message": "ما گروه کوچکی هستیم که تمام وقت کار می‌کنیم تا NocoDB یک ابزار Open-Source باشد؛ ما معتقدیم ابزاری مانند NocoDB باید به صورت رایگان برای هر حل کننده مساله ای روی اینترنت در دسترس باشد."
"message": "ما گروه کوچکی هستیم که تمام وقت کار می‌کنیم تا NocoDB یک ابزار fair-code باشد؛ ما معتقدیم ابزاری مانند NocoDB باید به صورت رایگان برای هر حل کننده مساله ای روی اینترنت در دسترس باشد."
},
"loginMsg": "ورود به NocoDB",
"passwordRecovery": {
+2 -2
View File
@@ -3856,9 +3856,9 @@
},
"sponsor": {
"header": "Voit auttaa meitä!",
"message": "Olemme pieni joukkue, joka työskentelee kokopäiväisesti NOCODB Open-lähteen tekemiseen. Uskomme, että työkalu kuten NOCODB: n pitäisi olla saatavilla vapaasti jokaiseen ongelmanratkaisuun internetissä."
"message": "Olemme pieni joukkue, joka työskentelee kokopäiväisesti NocoDB Open-lähteen tekemiseen. Uskomme, että työkalu kuten NocoDB: n pitäisi olla saatavilla vapaasti jokaiseen ongelmanratkaisuun internetissä."
},
"loginMsg": "Kirjaudu sisään NOCODB",
"loginMsg": "Kirjaudu sisään NocoDB",
"passwordRecovery": {
"message_1": "Anna sähköpostiosoite, jota käytit, kun olet rekisteröitynyt.",
"message_2": "Lähetämme sinulle sähköpostiviestin, jossa on linkki salasanan palauttamiseksi.",
+2 -2
View File
@@ -1229,7 +1229,7 @@
"sqlMigrations": "Migrations SQL",
"dbCredentials": "Identifiants de la base de données",
"advancedParameters": "SSL et paramètres avancés",
"headCreateProject": "Créer un projet | Nocodb",
"headCreateProject": "Créer un projet | NocoDB",
"headLogin": "Connexion | NocoDB",
"resetPassword": "Réinitialiser le mot de passe",
"teamAndSettings": "Équipe et paramètres",
@@ -3856,7 +3856,7 @@
},
"sponsor": {
"header": "Vous pouvez nous aider !",
"message": "Nous sommes une petite équipe travaillant à plein temps pour rendre NocoDB open-Source. Nous croyons qu'un outil comme NocoDB devrait être disponible librement à chaque solutionneur de problème sur Internet."
"message": "Nous sommes une petite équipe travaillant à plein temps pour rendre NocoDB fair-code. Nous croyons qu'un outil comme NocoDB devrait être disponible librement à chaque solutionneur de problème sur Internet."
},
"loginMsg": "Se connecter à NocoDB",
"passwordRecovery": {
+2 -2
View File
@@ -3845,7 +3845,7 @@
"staticRoleInfo": "הרגלי המערכת לא ניתן לשינוי",
"exportZip": "ייצוא מטא של פרויקט לקובץ zip ולהוריד.",
"importZip": "ייבוא ​​מטא של פרויקט מקובץ zip ולהפעיל מחדש.",
"importText": "ייבוא ​​פרויקט Nocodb על ידי העלאת קובץ Metadata Zip",
"importText": "ייבוא ​​פרויקט NocoDB על ידי העלאת קובץ Metadata Zip",
"metaNoChange": "אין שינויים מזוהים",
"sqlMigration": "מחילת הגשר סכימה יווצרו באופן אוטומטי. צור טבלה ורענן דף זה.",
"dbConnectionStatus": "מצב חיבור למסד נתונים",
@@ -3856,7 +3856,7 @@
},
"sponsor": {
"header": "אתה יכול לעזור לנו!",
"message": "אנחנו צוות קטן עובד במשרה מלאה כדי להפוך את Nocodb לקוד פתוח. אנו מאמינים כי כלי כמו Nocodb צריך להיות זמין בחינם לכל עקרונות פתרון ברחבי האינטרנט."
"message": "אנחנו צוות קטן עובד במשרה מלאה כדי להפוך את NocoDB לקוד פתוח. אנו מאמינים כי כלי כמו NocoDB צריך להיות זמין בחינם לכל עקרונות פתרון ברחבי האינטרנט."
},
"loginMsg": "היכנס ל- nocodb",
"passwordRecovery": {
+4 -4
View File
@@ -1229,8 +1229,8 @@
"sqlMigrations": "SQL migracije",
"dbCredentials": "Vjerodajnice baze podataka",
"advancedParameters": "SSL i napredni parametri",
"headCreateProject": "Stvoriti projekt | Nocodb",
"headLogin": "Prijavite se | Nocodb",
"headCreateProject": "Stvoriti projekt | NocoDB",
"headLogin": "Prijavite se | NocoDB",
"resetPassword": "Vraćanje izvorne lozinke",
"teamAndSettings": "Tim i Postavke",
"apiDocs": "API Dokumentacija",
@@ -3856,9 +3856,9 @@
},
"sponsor": {
"header": "Možete nam pomoći!",
"message": "Mi smo mali tim radi puno radno vrijeme kako bismo napravili Nocodb Open-Source. Vjerujemo da bi alat kao što je Nocodb trebao biti slobodno dostupan na svaki rješivač problema na internetu."
"message": "Mi smo mali tim radi puno radno vrijeme kako bismo napravili NocoDB fair-code. Vjerujemo da bi alat kao što je NocoDB trebao biti slobodno dostupan na svaki rješivač problema na internetu."
},
"loginMsg": "Prijavite se u Nocodb",
"loginMsg": "Prijavite se u NocoDB",
"passwordRecovery": {
"message_1": "Navedite adresu e-pošte koju ste koristili kada ste se prijavili.",
"message_2": "Poslat ćemo vam poruku e-pošte s linkom za resetiranje zaporke.",
+1 -1
View File
@@ -3856,7 +3856,7 @@
},
"sponsor": {
"header": "Segíthet nekünk!",
"message": "Kis csapatként dolgozunk teljes időben, hogy a NocoDB open-source maradjon. Hiszünk benne, hogy egy NocoDB-hez hasonló eszköz szabadon elérhető kell legyen minden problémamegoldó számára az interneten."
"message": "Kis csapatként dolgozunk teljes időben, hogy a NocoDB fair-code maradjon. Hiszünk benne, hogy egy NocoDB-hez hasonló eszköz szabadon elérhető kell legyen minden problémamegoldó számára az interneten."
},
"loginMsg": "Bejelentkezés a NocoDB-be",
"passwordRecovery": {
+4 -4
View File
@@ -1229,8 +1229,8 @@
"sqlMigrations": "Migrasi SQL.",
"dbCredentials": "Kredensial basis data",
"advancedParameters": "SSL & Parameter Lanjutan",
"headCreateProject": "Buat Proyek | Nocodb.",
"headLogin": "Masuk | Nocodb.",
"headCreateProject": "Buat Proyek | NocoDB.",
"headLogin": "Masuk | NocoDB.",
"resetPassword": "Mereset password Anda",
"teamAndSettings": "Tim & Pengaturan",
"apiDocs": "Dokumen API",
@@ -3845,7 +3845,7 @@
"staticRoleInfo": "Peran yang ditentukan sistem tidak dapat diedit",
"exportZip": "Meta proyek ekspor ke file zip dan unduh.",
"importZip": "Impor file meta zip file dan restart.",
"importText": "Impor proyek NOCODB dengan mengunggah file zip metadata",
"importText": "Impor proyek NocoDB dengan mengunggah file zip metadata",
"metaNoChange": "Tidak ada perubahan yang diidentifikasi",
"sqlMigration": "Migrasi skema akan dibuat secara otomatis. Buat tabel dan segarkan halaman ini.",
"dbConnectionStatus": "Lingkungan divalidasi",
@@ -3856,7 +3856,7 @@
},
"sponsor": {
"header": "Anda dapat membantu kami!",
"message": "Kami adalah tim kecil yang bekerja penuh waktu untuk membuat nocodb open-source. Kami percaya alat seperti NOCODB harus tersedia secara bebas ke setiap pemecah masalah di internet."
"message": "Kami adalah tim kecil yang bekerja penuh waktu untuk membuat nocodb fair-code. Kami percaya alat seperti NocoDB harus tersedia secara bebas ke setiap pemecah masalah di internet."
},
"loginMsg": "Masuk ke nocodb",
"passwordRecovery": {
+1 -1
View File
@@ -3856,7 +3856,7 @@
},
"sponsor": {
"header": "Puoi aiutarci!",
"message": "Siamo un piccolo team che lavora a tempo pieno per rendere NocoDB open-source. Crediamo che uno strumento come NocoDB dovrebbe essere disponibile liberamente per problem-solver su Internet."
"message": "Siamo un piccolo team che lavora a tempo pieno per rendere NocoDB fair-code. Crediamo che uno strumento come NocoDB dovrebbe essere disponibile liberamente per problem-solver su Internet."
},
"loginMsg": "Accedi a NocoDB",
"passwordRecovery": {
+3 -3
View File
@@ -1229,8 +1229,8 @@
"sqlMigrations": "SQL-Migraties",
"dbCredentials": "Database-inloggegevens",
"advancedParameters": "SSL & Geavanceerde Parameters",
"headCreateProject": "Project maken | Nocodb",
"headLogin": "Log in | Nocodb",
"headCreateProject": "Project maken | NocoDB",
"headLogin": "Log in | NocoDB",
"resetPassword": "Stel je wachtwoord opnieuw in",
"teamAndSettings": "Team & Instellingen",
"apiDocs": "API-documenten",
@@ -3856,7 +3856,7 @@
},
"sponsor": {
"header": "Je kunt ons helpen!",
"message": "Wij zijn een klein team dat fulltime werkt om de open-source van NocoDB te maken. Wij geloven dat een tool zoals NocoDB vrijelijk beschikbaar zou zijn op elke probleemoplosser op internet."
"message": "Wij zijn een klein team dat fulltime werkt om de fair-code van NocoDB te maken. Wij geloven dat een tool zoals NocoDB vrijelijk beschikbaar zou zijn op elke probleemoplosser op internet."
},
"loginMsg": "Log in bij NocoDB",
"passwordRecovery": {
+1 -1
View File
@@ -3856,7 +3856,7 @@
},
"sponsor": {
"header": "Du kan hjelpe oss!",
"message": "Vi er et lite lag som jobber heltid for å gjøre Nocodb åpen kildekode. Vi tror et verktøy som Nocodb bør være tilgjengelig fritt til alle problemløser på internett."
"message": "Vi er et lite lag som jobber heltid for å gjøre NocoDB åpen kildekode. Vi tror et verktøy som NocoDB bør være tilgjengelig fritt til alle problemløser på internett."
},
"loginMsg": "Logg inn i NocoDB",
"passwordRecovery": {
+5 -5
View File
@@ -1229,8 +1229,8 @@
"sqlMigrations": "Migracje SQL",
"dbCredentials": "Poświadczenia bazy danych",
"advancedParameters": "Zaawansowane parametry",
"headCreateProject": "Utwórz projekt | Nocodb",
"headLogin": "Logowanie | Nocodb",
"headCreateProject": "Utwórz projekt | NocoDB",
"headLogin": "Logowanie | NocoDB",
"resetPassword": "Resetuj hasło",
"teamAndSettings": "Zespół i ustawienia",
"apiDocs": "Dokumentacja API",
@@ -3845,7 +3845,7 @@
"staticRoleInfo": "Zdefiniowane systemowe role nie można edytować",
"exportZip": "Eksportuj projekt Meta do pliku zip i pobierz.",
"importZip": "Importuj projekt Meta Zip i uruchom ponownie.",
"importText": "Importuj projekt NOCODB, przesyłając plik zip metadanych",
"importText": "Importuj projekt NocoDB, przesyłając plik zip metadanych",
"metaNoChange": "Brak zidentyfikowanych zmian",
"sqlMigration": "Migracje schematu zostaną utworzone automatycznie. Utwórz tabelę i odśwież tę stronę.",
"dbConnectionStatus": "Zatwierdzone środowisko",
@@ -3856,9 +3856,9 @@
},
"sponsor": {
"header": "Możesz nam pomóc!",
"message": "Jesteśmy maleńką drużyną pracującą w pełnym wymiarze godzin, aby stworzyć otwartoźródłowy NOCODB. Wierzymy, że narzędzie takie jak NOCODB powinno być swobodnie dostępne dla każdego rozwiązania problemu w Internecie."
"message": "Jesteśmy maleńką drużyną pracującą w pełnym wymiarze godzin, aby stworzyć otwartoźródłowy NocoDB. Wierzymy, że narzędzie takie jak NocoDB powinno być swobodnie dostępne dla każdego rozwiązania problemu w Internecie."
},
"loginMsg": "Zaloguj się do NOCODB",
"loginMsg": "Zaloguj się do NocoDB",
"passwordRecovery": {
"message_1": "Podaj adres e-mail użyty podczas rejestracji.",
"message_2": "Wyślemy Ci wiadomość e-mail z linkiem do zresetowania hasła.",
+1 -1
View File
@@ -3856,7 +3856,7 @@
},
"sponsor": {
"header": "Você pode nos ajudar!",
"message": "Somos uma pequena equipe trabalhando em tempo integral para fazer o Nocodb Open-Source. Acreditamos que uma ferramenta como o Nocodb deve estar disponível livremente para cada solucionador de problemas na Internet."
"message": "Somos uma pequena equipe trabalhando em tempo integral para fazer o NocoDB fair-code. Acreditamos que uma ferramenta como o NocoDB deve estar disponível livremente para cada solucionador de problemas na Internet."
},
"loginMsg": "Autentique-se no Noco",
"passwordRecovery": {
+1 -1
View File
@@ -3856,7 +3856,7 @@
},
"sponsor": {
"header": "Você pode nos ajudar!",
"message": "Somos uma pequena equipe trabalhando em tempo integral para fazer o Nocodb Open-Source. Acreditamos que uma ferramenta como o Nocodb deve estar disponível livremente para cada solucionador de problemas na Internet."
"message": "Somos uma pequena equipe trabalhando em tempo integral para fazer o NocoDB fair-code. Acreditamos que uma ferramenta como o NocoDB deve estar disponível livremente para cada solucionador de problemas na Internet."
},
"loginMsg": "Autentique-se no Noco",
"passwordRecovery": {
+1 -1
View File
@@ -3856,7 +3856,7 @@
},
"sponsor": {
"header": "Ne puteți ajuta!",
"message": "Suntem o mică echipă care lucrează cu normă întreagă pentru a face NocoDB Open-source. Credem că un instrument ca NocoDB ar trebui să fie disponibil gratuit fiecărui solver de probleme de pe Internet."
"message": "Suntem o mică echipă care lucrează cu normă întreagă pentru a face NocoDB fair-code. Credem că un instrument ca NocoDB ar trebui să fie disponibil gratuit fiecărui solver de probleme de pe Internet."
},
"loginMsg": "Autentificați-vă în NocoDB",
"passwordRecovery": {
+1 -1
View File
@@ -3856,7 +3856,7 @@
},
"sponsor": {
"header": "Môžete nám pomôcť!",
"message": "Sme malý tím, ktorý na plný úväzok pracuje na tom, aby sa NocoDB stala open-source. Veríme, že nástroj ako NocoDB by mal byť voľne dostupný každému riešiteľovi problémov na internete."
"message": "Sme malý tím, ktorý na plný úväzok pracuje na tom, aby sa NocoDB stala fair-code. Veríme, že nástroj ako NocoDB by mal byť voľne dostupný každému riešiteľovi problémov na internete."
},
"loginMsg": "Prihlásenie do databázy NocoDB",
"passwordRecovery": {
+3 -3
View File
@@ -1230,7 +1230,7 @@
"dbCredentials": "Poverilnice baze podatkov",
"advancedParameters": "SSL in napredni parametri",
"headCreateProject": "Ustvari projekt | NocoDB.",
"headLogin": "Prijava | Nocodb.",
"headLogin": "Prijava | NocoDB.",
"resetPassword": "Ponastavi geslo",
"teamAndSettings": "Ekipa in nastavitve",
"apiDocs": "Dokumenti API",
@@ -3856,9 +3856,9 @@
},
"sponsor": {
"header": "Lahko nam pomagate!",
"message": "Smo majhna ekipa, ki dela s polnim delovnim časom, da naredimo odprtokod NOCODB. Verjamemo, da bi moralo biti orodje, kot je NoCoDB, na voljo na vsakem reševanju problemov na internetu."
"message": "Smo majhna ekipa, ki dela s polnim delovnim časom, da naredimo odprtokod NocoDB. Verjamemo, da bi moralo biti orodje, kot je NoCoDB, na voljo na vsakem reševanju problemov na internetu."
},
"loginMsg": "Prijavite se v Nocodb",
"loginMsg": "Prijavite se v NocoDB",
"passwordRecovery": {
"message_1": "Navedite e-poštni naslov, ki ste ga uporabili, ko ste se prijavili.",
"message_2": "Poslali vam bomo e-pošto s povezavo za ponastavitev gesla.",
+3 -3
View File
@@ -1229,7 +1229,7 @@
"sqlMigrations": "SQL-migreringar",
"dbCredentials": "Databasuppgifter",
"advancedParameters": "SSL och avancerade parametrar",
"headCreateProject": "Skapa projekt | Nocodb",
"headCreateProject": "Skapa projekt | NocoDB",
"headLogin": "Logga in | NocoDB",
"resetPassword": "Återställ ditt lösenord",
"teamAndSettings": "Team och inställningar",
@@ -3845,7 +3845,7 @@
"staticRoleInfo": "Systemdefinierade roller kan inte redigeras",
"exportZip": "Exportera projekt Meta till ZIP-fil och nedladdning.",
"importZip": "Importera projekt Meta Zip-fil och starta om.",
"importText": "Importera NOCODB-projektet genom att ladda upp metadata zip-filen",
"importText": "Importera NocoDB-projektet genom att ladda upp metadata zip-filen",
"metaNoChange": "Ingen ändring identifierad",
"sqlMigration": "Schema migreringar kommer att skapas automatiskt. Skapa ett bord och uppdatera den här sidan.",
"dbConnectionStatus": "Miljö Validerad",
@@ -3856,7 +3856,7 @@
},
"sponsor": {
"header": "Du kan hjälpa oss!",
"message": "Vi är ett litet lag som arbetar heltid för att göra NOCODB Open-Source. Vi tror att ett verktyg som NOCODB ska vara tillgängligt fritt till alla problemlösare på Internet."
"message": "Vi är ett litet lag som arbetar heltid för att göra NocoDB fair-code. Vi tror att ett verktyg som NocoDB ska vara tillgängligt fritt till alla problemlösare på Internet."
},
"loginMsg": "Logga in på NocoDB",
"passwordRecovery": {
+3 -3
View File
@@ -3845,7 +3845,7 @@
"staticRoleInfo": "สามารถแก้ไขบทบาทที่กำหนดระบบได้",
"exportZip": "ส่งออกโครงการเมตาเป็นไฟล์ซิปและดาวน์โหลด",
"importZip": "นำเข้าโครงการ Meta Zip ของโครงการและรีสตาร์ท",
"importText": "นำเข้าโครงการ NOCODB โดยการอัพโหลดไฟล์ zip ข้อมูลเมตา",
"importText": "นำเข้าโครงการ NocoDB โดยการอัพโหลดไฟล์ zip ข้อมูลเมตา",
"metaNoChange": "ไม่มีการเปลี่ยนแปลงที่ระบุ",
"sqlMigration": "การโยกย้าย Schema จะถูกสร้างขึ้นโดยอัตโนมัติ สร้างตารางและรีเฟรชหน้านี้",
"dbConnectionStatus": "สภาพแวดล้อมที่ผ่านการตรวจสอบ",
@@ -3856,9 +3856,9 @@
},
"sponsor": {
"header": "คุณสามารถช่วยเราได้!",
"message": "เราเป็นทีมเล็ก ๆ ที่ทำงานเต็มเวลาในการทำให้ NOCODB โอเพ่นซอร์ส เราเชื่อว่าเครื่องมือเช่น NOCODB ควรให้บริการอย่างอิสระในการแก้ปัญหาทุกเครื่องบนอินเทอร์เน็ต"
"message": "เราเป็นทีมเล็ก ๆ ที่ทำงานเต็มเวลาในการทำให้ NocoDB โอเพ่นซอร์ส เราเชื่อว่าเครื่องมือเช่น NocoDB ควรให้บริการอย่างอิสระในการแก้ปัญหาทุกเครื่องบนอินเทอร์เน็ต"
},
"loginMsg": "เข้าสู่ระบบ NOCODB",
"loginMsg": "เข้าสู่ระบบ NocoDB",
"passwordRecovery": {
"message_1": "โปรดระบุที่อยู่อีเมลที่คุณใช้เมื่อคุณสมัครใช้งาน",
"message_2": "เราจะส่งอีเมลพร้อมลิงค์เพื่อรีเซ็ตรหัสผ่านของคุณ",
+5 -5
View File
@@ -1229,8 +1229,8 @@
"sqlMigrations": "Di chuyển SQL.",
"dbCredentials": "Thông tin cơ sở dữ liệu",
"advancedParameters": "SSL & Tham số nâng cao",
"headCreateProject": "Tạo dự án |. NOCODB.",
"headLogin": "Đăng nhập |. NOCODB.",
"headCreateProject": "Tạo dự án |. NocoDB.",
"headLogin": "Đăng nhập |. NocoDB.",
"resetPassword": "Đặt lại mật khẩu của bạn",
"teamAndSettings": "Cài đặt nhóm",
"apiDocs": "Văn bản API",
@@ -3845,7 +3845,7 @@
"staticRoleInfo": "Vai trò xác định hệ thống không thể được chỉnh sửa",
"exportZip": "Xuất meta dự án sang tệp zip và tải xuống.",
"importZip": "Nhập tệp Meta Zip dự án và khởi động lại.",
"importText": "Nhập dự án NOCODB bằng cách tải lên tập tin zip siêu dữ liệu",
"importText": "Nhập dự án NocoDB bằng cách tải lên tập tin zip siêu dữ liệu",
"metaNoChange": "Không có thay đổi được xác định",
"sqlMigration": "Lược đồ di chuyển sẽ được tạo tự động. Tạo một bảng và làm mới trang này.",
"dbConnectionStatus": "Môi trường xác nhận",
@@ -3856,9 +3856,9 @@
},
"sponsor": {
"header": "Bạn có thể giúp chúng tôi!",
"message": "Chúng tôi là một đội nhỏ làm việc toàn thời gian để tạo nguồn mở NOCODB. Chúng tôi tin rằng một công cụ như NOCODB nên có sẵn một cách tự do cho mọi người giải quyết vấn đề trên internet."
"message": "Chúng tôi là một đội nhỏ làm việc toàn thời gian để tạo nguồn mở NocoDB. Chúng tôi tin rằng một công cụ như NocoDB nên có sẵn một cách tự do cho mọi người giải quyết vấn đề trên internet."
},
"loginMsg": "Đăng nhập vào NOCODB",
"loginMsg": "Đăng nhập vào NocoDB",
"passwordRecovery": {
"message_1": "Vui lòng cung cấp địa chỉ email bạn đã sử dụng khi bạn đăng ký.",
"message_2": "Chúng tôi sẽ gửi cho bạn một email với một liên kết để đặt lại mật khẩu của bạn.",
+1 -1
View File
@@ -97,7 +97,7 @@ export const getNocoConfig = async (
process.env.DATABASE_URL_FILE,
});
// create NocoConfig using utility method which works similar to Nocodb NcConfig with only meta db config
// create NocoConfig using utility method which works similar to NocoDB NcConfig with only meta db config
return NcConfig.create({
meta: {
metaUrl: process.env.NC_DB || options.ncDb,
+1 -1
View File
@@ -1,7 +1,7 @@
import type { Request } from 'express';
/**
* CE stub — white-label is an EE feature, so the open-source build serves the
* CE stub — white-label is an EE feature, so the community build serves the
* SPA shell unchanged. The EE override (`src/ee/helpers/brandingHtml.ts`)
* rewrites the document <head> (title, og:*, twitter:*, theme-color, favicon)
* from the instance white-label config so link unfurlers / crawlers — which