feat(docs-portal): pipeline GitOps y manifiestos K8s para el portal MkDocs
Agrega lo que faltaba para desplegar workloads/docs-portal/ (ya existente sin commitear): deployment/service/ingress + kustomization siguiendo el patrón de workloads/nginx, Applications de workload y gobernanza separadas, y el workflow de Gitea Actions (build+push a Gitea Registry, bump de versión en el manifiesto) siguiendo el mismo patrón que build.yaml/build-medusa.yaml.
This commit is contained in:
@@ -0,0 +1,103 @@
|
||||
# Incidente: precios `null` en detalle de producto (Medusa Store API sin `region_id`) (2026-08)
|
||||
|
||||
!!! info "Origen"
|
||||
Migrado desde `apps-registry/docs/playbooks/incidente-medusa-precios-region-id-2026-08.md`.
|
||||
Contenido técnico preservado sin cambios de fondo — solo formato adaptado a MkDocs Material.
|
||||
|
||||
| | |
|
||||
|---|---|
|
||||
| **Ventana del incidente** | 2026-08-12, resuelto el mismo día (commit `60072cf`) |
|
||||
| **Servicio afectado** | `medusa-svc` (Store API), consumido por el frontend Next.js de ARI Shopping |
|
||||
| **Impacto** | En el listado de productos (`/catalog`) los precios se mostraban correctamente, pero en la página de detalle de producto individual varios artículos mostraban "Consultar precio" en vez del monto real |
|
||||
|
||||
## Hipótesis inicial descartada: regiones COP duplicadas
|
||||
|
||||
La primera hipótesis fue que existían regiones "Colombia (COP)"
|
||||
duplicadas en Medusa, causando ambigüedad al resolver el precio. Se
|
||||
descartó con evidencia directa en Postgres, consultando la tabla
|
||||
`region` **incluyendo soft-deletes**:
|
||||
|
||||
```sql
|
||||
SELECT id, name, currency_code, created_at, updated_at, deleted_at FROM region ORDER BY created_at;
|
||||
|
||||
id | name | currency_code | created_at | updated_at | deleted_at
|
||||
----------------------------------+----------+---------------+----------------------------+----------------------------+------------
|
||||
reg_01KZT86WPAH7A7ZZRDSX3350V2 | Colombia | cop | 2026-08-12 05:48:03.151+00 | 2026-08-12 05:48:03.151+00 |
|
||||
(1 row)
|
||||
```
|
||||
|
||||
Una sola fila, creada una sola vez, nunca actualizada, nunca borrada.
|
||||
**No había ni hubo nunca una región duplicada** — la hipótesis de
|
||||
deduplicación quedó descartada con esta consulta.
|
||||
|
||||
## Causa raíz real
|
||||
|
||||
El backend de Medusa **no tenía ninguna región configurada**. El
|
||||
frontend pedía precios al Store API (`/store/products`) usando el
|
||||
parámetro `currency_code=cop`, pero el validador
|
||||
`StoreGetProductsParams` de Medusa v2 (`.strict()`) **no acepta ese
|
||||
campo** — devolvía `400 Unrecognized fields: 'currency_code'` en cada
|
||||
carga de `/catalog`.
|
||||
|
||||
Se probó también `country_code`, que tampoco funcionó — Medusa
|
||||
respondía:
|
||||
|
||||
```text
|
||||
Missing required pricing context to calculate prices - region_id
|
||||
```
|
||||
|
||||
!!! danger "Nota de arquitectura"
|
||||
**Medusa v2 requiere explícitamente un `region_id` válido** para
|
||||
poder calcular precios (`calculated_price`) vía Store API; ni
|
||||
`currency_code` ni `country_code` son parámetros válidos para ese
|
||||
fin.
|
||||
|
||||
## Fix aplicado
|
||||
|
||||
Commit `60072cf` — *"fix: usar region_id en vez de currency_code para
|
||||
precios de Medusa"* (PR #5, mergeado en `04dc6bd`):
|
||||
|
||||
1. Se creó la región "Colombia" (moneda COP) vía Admin API — no
|
||||
existía ninguna región configurada previamente.
|
||||
2. Se modificó el frontend para pedir precios usando `region_id`
|
||||
explícito en vez de `currency_code`, vía una nueva variable de
|
||||
entorno `MEDUSA_REGION_ID`:
|
||||
|
||||
```diff
|
||||
# workloads/ecommerce/frontend.yaml
|
||||
- name: MEDUSA_BACKEND_URL
|
||||
value: http://medusa-svc:9000
|
||||
+ - name: MEDUSA_REGION_ID
|
||||
+ value: reg_01KZT86WPAH7A7ZZRDSX3350V2
|
||||
```
|
||||
|
||||
```diff
|
||||
# workloads/ecommerce/lib/headless/providers/medusa.ts
|
||||
const params = new URLSearchParams({
|
||||
limit: String(limit),
|
||||
- currency_code: "cop",
|
||||
+ // El validador de /store/products no acepta currency_code (400
|
||||
+ // "Unrecognized fields"); el precio calculado solo se resuelve con
|
||||
+ // region_id.
|
||||
+ region_id: regionId(),
|
||||
```
|
||||
|
||||
No hubo migración de precios entre regiones — no existían datos
|
||||
previos que migrar; la región se creó de cero como parte de este mismo
|
||||
fix. `MEDUSA_REGION_ID` no ha cambiado desde el commit original
|
||||
(verificado con `git log -p --follow` sobre `frontend.yaml`), y sigue
|
||||
apuntando a la única región que existe en la base.
|
||||
|
||||
## Lecciones aprendidas
|
||||
|
||||
**Verificar la causa raíz contra el estado real de la base de datos
|
||||
antes de asumir la primera hipótesis**, aun cuando esa hipótesis
|
||||
coincida con la intuición inicial de quien reporta el bug ("puede que
|
||||
haya algo duplicado"). La consulta a `region` incluyendo `deleted_at`
|
||||
tomó segundos y evitó documentar una causa raíz incorrecta en este
|
||||
mismo playbook.
|
||||
|
||||
**Nota de arquitectura:** Medusa v2 Store API (`StoreGetProductsParams`)
|
||||
requiere `region_id` explícito para resolver precios calculados.
|
||||
`currency_code` y `country_code` no son parámetros válidos para ese
|
||||
fin.
|
||||
Reference in New Issue
Block a user