Saltar al contenido

Core · Helm Chart

Despliegue de RavHub Core con Helm

Cuándo elegir esta opción ​

Usa esta guía si ya operas sobre Kubernetes y quieres gestionar RavHub con Helm.

Prerrequisitos ​

  • cluster Kubernetes disponible
  • Helm operativo
  • una StorageClass o PVC compatible
  • credenciales de pull para registry.ravhub.app si tu registro las requiere

Imagen y selección de edición ​

  • registro: registry.ravhub.app
  • edición Core: ravhub-core
  • tag recomendado en esta guía: 0.1.0
  • edición Core por chart: license.enabled=false

Pasos exactos ​

1. Crear el namespace ​

bash
kubectl create namespace ravhub

2. Añadir el repositorio Helm e inspeccionar los valores por defecto ​

bash
helm repo add ravhub https://repo.ravhub.app/repository/ravhub-charts
helm repo update
helm show values ravhub/ravhub > values.yaml

3. Editar el fichero de values ​

Partiendo del values.yaml que descargaste, edita los campos necesarios para tu despliegue.

Valores que puedes dejar por defecto ​

yaml
license:
  enabled: false
storage:
  type: filesystem
postgresql:
  enabled: true
redis:
  enabled: false
service:
  type: ClusterIP

Valores que deberías revisar siempre ​

CampoDescripción
image.tagVersión a desplegar (ej: 0.1.0)
auth.jwt.secretCambiarlo por un valor secreto
ingress.hosts[].hostTu dominio público
persistence.sizeEspacio para artefactos
api.hostTu dominio público para URLs en la UI

4. Instalar el release ​

bash
helm install ravhub ravhub/ravhub \
  --namespace ravhub \
  -f values-core.yaml

5. Verificar el despliegue ​

bash
helm ls -n ravhub
kubectl get pods -n ravhub
kubectl get ingress -n ravhub

Tabla de values ​

Global ​

CampoTipoDefaultOpcionesUso
global.imageRegistrystring""registro OCISobrescribe el registry de TODAS las imágenes (RavHub + subcharts).
replicaCountinteger11+Número de pods. Si subes de 1, usa Redis y storage compartido.

Edición e imagen ​

CampoTipoDefaultOpcionesUso
image.registrystringregistry.ravhub.appregistry OCIRegistry de las imágenes RavHub.
image.repositorystringravhub-corenombre de repoImagen usada cuando license.enabled=false.
image.enterpriseRepositorystringravhub-enterprisenombre de repoReservado para Enterprise. En Core no se usa.
image.pullPolicystringIfNotPresentIfNotPresent, Always, NeverPolítica de pull de Kubernetes.
image.tagstring0.1.0tag OCIVersión exacta a desplegar.
imagePullSecretsarray[]lista de secretsSecrets de pull si el registro requiere autenticación.
license.enabledbooleanfalsetrue, falseDebe quedarse en false para Core.
license.keystring""clave de licenciaNo se usa en Core.

Service e ingress ​

CampoTipoDefaultOpcionesUso
service.typestringClusterIPClusterIP, NodePort, LoadBalancerTipo de Service principal.
service.portinteger80puerto TCPPuerto HTTP del Service.
service.targetPortinteger80puerto TCPPuerto HTTP del contenedor al que apunta el Service.
service.apiPortinteger3000puerto TCPPuerto de la API interna expuesto por el Service.
service.annotationsmap{}annotations de ServiceÚtil para LB cloud o integración con red.
ingress.enabledbooleantruetrue, falseActiva o desactiva el Ingress.
ingress.classNamestringnginxclase de ingressClase de Ingress Controller.
ingress.annotationsmapvarias de NGINXannotationsIncluye por defecto proxy-body-size: 0 y ajustes para uploads.
ingress.hostsarrayravhub.locallista de hosts/path rulesHost y paths públicos de la UI y API.
ingress.hosts[].paths[].pathstring`/api(/$)(.)y/()(.)`path regex
ingress.hosts[].paths[].pathTypestringImplementationSpecificImplementationSpecific, Prefix, ExactTipo de path en Kubernetes.
ingress.tlsarray[]lista de secretName y hostsEntradas TLS del Ingress. Si está vacío, no se publica TLS desde el chart.

JWT y autenticación ​

CampoTipoDefaultOpcionesUso
auth.jwt.secretstring""textoSi lo dejas vacío, el chart genera uno y lo conserva en el secret del release.
auth.jwt.expiresInstring1hduración JWTCaducidad del access token.
auth.jwt.refreshExpiresInstring7dduración JWTCaducidad del refresh token.

Docker registry embebido ​

CampoTipoDefaultOpcionesUso
docker.ports.enabledbooleantruetrue, falseExpone el rango dinámico para repos Docker.
docker.ports.startPortinteger5001puerto TCPInicio del rango Docker.
docker.ports.endPortinteger5100puerto TCPFin del rango Docker.

Persistencia y storage ​

CampoTipoDefaultOpcionesUso
persistence.enabledbooleantruetrue, falseActiva el PVC de artefactos.
persistence.storageClassstring""nombre de classSi se deja vacío, Kubernetes usa la default.
persistence.accessModestringReadWriteOnceReadWriteOnce, ReadWriteMany, etc.Modo de acceso del PVC.
persistence.sizestring50Gitamaño KubernetesTamaño del volumen de artefactos.
persistence.mountPathstring/data/storageruta absolutaMount path que RavHub usa como STORAGE_PATH.
storage.typestringfilesystemfilesystem, s3, gcs, azureEn Core debe quedarse en filesystem.
storage.filesystem.pathstring/data/storageruta absolutaRuta lógica del backend filesystem.
storage.s3.*objectvacíosvalores S3No válido en Core; requiere Enterprise.
storage.gcs.*objectvacíosvalores GCSNo válido en Core; requiere Enterprise.
storage.azure.*objectvacíosvalores AzureNo válido en Core; requiere Enterprise.

PostgreSQL ​

CampoTipoDefaultOpcionesUso
postgresql.enabledbooleantruetrue, falseDespliega PostgreSQL integrado con subchart Bitnami.
postgresql.primary.persistence.enabledbooleantruetrue, falsePersistencia del PostgreSQL embebido.
postgresql.primary.persistence.sizestring8Gitamaño KubernetesTamaño del volumen del PostgreSQL embebido.
postgresql.auth.usernamestringpostgrestextoUsuario del PostgreSQL embebido.
postgresql.auth.databasestringravhubtextoBase de datos del PostgreSQL embebido.
postgresql.auth.passwordstring""textoSi lo dejas vacío, el subchart o secret resuelve el valor.
externalDatabase.hoststring""hostnameObligatorio cuando postgresql.enabled=false.
externalDatabase.portinteger5432puerto TCPPuerto del PostgreSQL externo.
externalDatabase.userstringpostgrestextoUsuario del PostgreSQL externo.
externalDatabase.databasestringravhubtextoBase de datos del PostgreSQL externo.
externalDatabase.passwordstring""textoObligatorio si no usas existingSecret.
externalDatabase.existingSecretstring""nombre de secretSi lo defines, el chart lee la clave password.

Redis ​

CampoTipoDefaultOpcionesUso
redis.enabledbooleanfalsetrue, falseDespliega Redis embebido.
redis.architecturestringstandalonestandalone, replicationModo del subchart Redis.
redis.auth.enabledbooleantruetrue, falseProtege Redis con password.
redis.auth.passwordstring""textoSi se deja vacío, se genera.
redis.master.persistence.enabledbooleanfalsetrue, falsePersistencia para Redis embebido.
redis.master.persistence.sizestring1Gitamaño KubernetesTamaño del PVC de Redis.
externalRedis.hoststring""hostnameRedis externo si no usas el embebido.
externalRedis.portinteger6379puerto TCPPuerto del Redis externo.
externalRedis.passwordstring""textoPassword del Redis externo.
externalRedis.dbinteger0enteroBase lógica de Redis.
externalRedis.existingSecretstring""nombre de secretSi lo defines, el chart lee la clave password.

API pública (URLs en la UI) ​

CampoTipoDefaultOpcionesUso
api.hoststring""hostnameDominio público para los comandos de instalación en la UI.
api.protocolstringhttpshttp, httpsProtocolo para los comandos de instalación.

Recursos y scheduling ​

CampoTipoDefaultOpcionesUso
env.LOG_FORMATstringjsonjson, otrosFormato de logs de la aplicación.
resources.limits.cpustring2000mCPU KubernetesLímite de CPU.
resources.limits.memorystring2Gimemoria KubernetesLímite de memoria.
resources.requests.cpustring500mCPU KubernetesRequest de CPU.
resources.requests.memorystring1Gimemoria KubernetesRequest de memoria.
serviceAccount.createbooleantruetrue, falseCrea o no un ServiceAccount dedicado.
serviceAccount.annotationsmap{}annotationsMetadata adicional del ServiceAccount.
serviceAccount.namestring""nombreSi se deja vacío, Helm autogenera uno.
podAnnotationsmapmetrics annotationsannotationsAñade annotations al pod, por defecto métricas Prometheus.
autoscaling.enabledbooleanfalsetrue, falseActiva HPA.
autoscaling.minReplicasinteger1enteroRéplicas mínimas del HPA.
autoscaling.maxReplicasinteger100enteroRéplicas máximas del HPA.
autoscaling.targetCPUUtilizationPercentageinteger80porcentajeUmbral de CPU para HPA.
nodeSelectormap{}selector labelsFija nodos destino.
tolerationsarray[]tolerationsPermite scheduling en nodos tainted.
affinitymap{}reglas affinityAfinidad o anti-afinidad de pods.

Reglas y dependencias ​

  • license.enabled=false mantiene la edición Core.
  • Si postgresql.enabled=false, debes definir externalDatabase.host.
  • Si postgresql.enabled=false, debes definir externalDatabase.password o externalDatabase.existingSecret.
  • Si storage.type no es filesystem, el chart falla porque ese backend requiere Enterprise.
  • Si dejas auth.jwt.secret vacío, el chart genera uno y lo guarda en el secret del release.
  • Si subes replicaCount por encima de 1, el propio chart recomienda Redis y storage compartido o cloud.

Cómo validar que funciona ​

  • todos los pods están en Running o Completed
  • el Ingress publica el dominio esperado
  • la UI abre en el host configurado
  • la instalación arranca como Core, no como Enterprise

Errores frecuentes ​

El chart instala pero la UI no abre ​

Revisa ingress.enabled, ingress.className y el host definido en ingress.hosts.

Los pods reinician por autenticación o sesiones inválidas ​

Revisa auth.jwt.secret.

El PVC no se enlaza ​

Revisa persistence.enabled, persistence.size y la StorageClass del cluster.

El release sale como Enterprise ​

Revisa que license.enabled siga en false.

Siguiente paso ​

Continúa con Uso desde clientes.

Documentación base generada para RavHub.