From 751817ed619ce2d6d84fb36afadde87ca8592944 Mon Sep 17 00:00:00 2001 From: Cristian Felipe Cruz Buitron Date: Wed, 26 Aug 2026 15:01:04 -0500 Subject: [PATCH] Fase 1 ADR 0006 Etapa 2: infra de Meilisearch (StatefulSet+Service) Motor de busqueda self-hosted, sin que Medusa lo conozca todavia (eso es Fase 2). Mismo patron que redis/postgres/minio en este mismo namespace: StatefulSet + PVC via volumeClaimTemplates en local-path, nunca Deployment ni emptyDir -- el indice de Meilisearch necesita sobrevivir a un reinicio del pod para no reindexar todo desde cero. Imagen getmeili/meilisearch:v1.53.1 (ultimo release estable no-RC, verificado contra la API de GitHub, no memoria de entrenamiento). Recursos exactos del ADR (request 100m/256Mi, limit 500m/768Mi). Sin securityContext explicito -- verificado en vivo que la imagen no trae un usuario no-root (Alpine minimo, /etc/passwd sin usuario dedicado), misma convencion que redis.yaml/minio.yaml en este repo, que tampoco fuerzan runAsNonRoot. MEILISEARCH_HOST (no secreto) va al ConfigMap commerce-config. MEILI_MASTER_KEY/MEILISEARCH_API_KEY (mismo valor, dos nombres de env var -- uno para el servidor, otro para el futuro plugin de Medusa en Fase 2) documentados en secrets.template.yaml; el valor real ya se aplico al Secret commerce-secrets en el cluster antes de este merge (patch puntual, no via create-commerce-secrets.sh completo -- ese script regenera TODAS las credenciales en cada corrida y hubiera rotado postgres/redis/minio ya en uso). --- workloads/ecommerce/commerce/configmap.yaml | 5 ++ .../ecommerce/commerce/kustomization.yaml | 1 + workloads/ecommerce/commerce/meilisearch.yaml | 86 +++++++++++++++++++ .../ecommerce/commerce/secrets.template.yaml | 8 ++ 4 files changed, 100 insertions(+) create mode 100644 workloads/ecommerce/commerce/meilisearch.yaml diff --git a/workloads/ecommerce/commerce/configmap.yaml b/workloads/ecommerce/commerce/configmap.yaml index 1395e41..c390dc7 100644 --- a/workloads/ecommerce/commerce/configmap.yaml +++ b/workloads/ecommerce/commerce/configmap.yaml @@ -19,3 +19,8 @@ data: S3_ENDPOINT: http://minio-svc:9000 S3_REGION: us-east-1 S3_BUCKET: ari-products + + # Leido por el plugin @rokmohar/medusa-plugin-meilisearch (nombre de + # env var del plugin, no del servidor Meilisearch en si -- ver + # MEILI_MASTER_KEY en secrets.template.yaml). + MEILISEARCH_HOST: http://meilisearch-svc:7700 diff --git a/workloads/ecommerce/commerce/kustomization.yaml b/workloads/ecommerce/commerce/kustomization.yaml index 145d729..f1f14ee 100644 --- a/workloads/ecommerce/commerce/kustomization.yaml +++ b/workloads/ecommerce/commerce/kustomization.yaml @@ -7,6 +7,7 @@ resources: - redis.yaml - minio.yaml - minio-bootstrap-job.yaml + - meilisearch.yaml - medusa/ - ingress-commerce.yaml - middleware-commerce-redirect.yaml diff --git a/workloads/ecommerce/commerce/meilisearch.yaml b/workloads/ecommerce/commerce/meilisearch.yaml new file mode 100644 index 0000000..4bee596 --- /dev/null +++ b/workloads/ecommerce/commerce/meilisearch.yaml @@ -0,0 +1,86 @@ +apiVersion: v1 +kind: Service +metadata: + name: meilisearch-svc +spec: + selector: + app: commerce-meilisearch + ports: + - name: http + port: 7700 + targetPort: 7700 +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: commerce-meilisearch +spec: + serviceName: meilisearch-svc + replicas: 1 + selector: + matchLabels: + app: commerce-meilisearch + template: + metadata: + labels: + app: commerce-meilisearch + spec: + terminationGracePeriodSeconds: 30 + containers: + - name: meilisearch + image: getmeili/meilisearch:v1.53.1 + imagePullPolicy: IfNotPresent + env: + - name: MEILI_MASTER_KEY + valueFrom: + secretKeyRef: + name: commerce-secrets + key: MEILI_MASTER_KEY + - name: MEILI_ENV + value: production + # Sin telemetria a un tercero por defecto (misma postura del + # resto del namespace: nada de egress no explicado). + - name: MEILI_NO_ANALYTICS + value: "true" + ports: + - name: http + containerPort: 7700 + # /health no requiere auth (confirmado en vivo) -- sirve tal + # cual para las dos probes, igual que minio usa sus propios + # endpoints /minio/health/*. + readinessProbe: + httpGet: + path: /health + port: http + initialDelaySeconds: 5 + periodSeconds: 10 + timeoutSeconds: 5 + failureThreshold: 6 + livenessProbe: + httpGet: + path: /health + port: http + initialDelaySeconds: 15 + periodSeconds: 20 + timeoutSeconds: 5 + failureThreshold: 6 + resources: + requests: + cpu: 100m + memory: 256Mi + limits: + cpu: 500m + memory: 768Mi + volumeMounts: + - name: meilisearch-data + mountPath: /meili_data + volumeClaimTemplates: + - metadata: + name: meilisearch-data + spec: + accessModes: + - ReadWriteOnce + storageClassName: local-path + resources: + requests: + storage: 5Gi diff --git a/workloads/ecommerce/commerce/secrets.template.yaml b/workloads/ecommerce/commerce/secrets.template.yaml index ba0789a..77cda00 100644 --- a/workloads/ecommerce/commerce/secrets.template.yaml +++ b/workloads/ecommerce/commerce/secrets.template.yaml @@ -23,6 +23,14 @@ stringData: JWT_SECRET: CAMBIAR COOKIE_SECRET: CAMBIAR + # Master key del servidor Meilisearch (StatefulSet commerce-meilisearch, + # env MEILI_MASTER_KEY del propio contenedor getmeili/meilisearch) Y + # credencial que usa el plugin de Medusa para autenticarse contra el + # -- MISMO valor, dos nombres de secret porque cada lado (servidor vs. + # plugin cliente) usa su propia convencion de nombre de env var. + MEILI_MASTER_KEY: CAMBIAR + MEILISEARCH_API_KEY: CAMBIAR + # Debe ser el MISMO valor que REVALIDATE_SECRET en el Secret # commerce-storefront: el subscriber de Medusa lo envĂ­a como header # x-revalidate-secret al invocar POST /api/revalidate en el storefront.