feat(F-155): completed feature

This commit is contained in:
chattie
2026-08-21 22:37:03 +02:00
parent ad040ae3a9
commit a225d87645
17 changed files with 377 additions and 17 deletions

View File

@@ -0,0 +1,65 @@
# F-155 — Implementer evidence
## Cambios
### `project/docker-compose.yml`
- PostgreSQL y Redis ahora tienen `restart: unless-stopped`.
- Los volúmenes quedan con nombre explícito para no depender del nombre de proyecto de Docker Compose:
- PostgreSQL: `project_mdv_pg_data`
- Redis: `project_mdv_redis_data`
- Se conservaron los nombres existentes para no apartar/perder la DB activa.
- Redis ahora arranca con persistencia AOF:
- `--appendonly yes`
- `--appendfsync everysec`
- `--save 60 1`
- Redis tiene healthcheck `redis-cli ping`.
### `project/scripts/monolith.sh`
- `start_infrastructure()` ya no hace `docker start` directo de contenedores existentes.
- Ahora siempre usa `docker compose up -d postgres redis`, lo que permite reconciliar cambios de configuración sin perder volúmenes nombrados.
- Espera readiness de PostgreSQL y Redis.
### `project/scripts/check-persistence.mjs`
Nuevo check operacional:
- levanta infraestructura con Compose;
- escribe marcador en `app_meta` de PostgreSQL;
- escribe marcador en Redis;
- reinicia o recrea contenedores manteniendo volúmenes;
- comprueba que ambos marcadores siguen;
- muestra mounts reales y `appendonly` de Redis.
### `project/package.json`
Nuevo script:
```bash
npm run infra:persistence-check
npm run infra:persistence-check -- --recreate
```
## Verificación
```text
npm run infra:persistence-check -- --recreate ✅
npm run infra:persistence-check ✅
docker compose config ✅
monolith prod status ✅ backend/admin/frontend/storefront 200
DB products después de recrear contenedores ✅ 12
DB backoffice users después de recrear ✅ 1
Redis appendonly ✅ yes
npm run build ✅
npm test ✅ 191 passed / 56 skipped
eslint check-persistence.mjs ✅
prettier docker-compose/package/check script ✅
verify.sh ✅
git diff --check ✅
```
## Notas
- No se han cambiado los datos actuales: al usar los nombres existentes `project_mdv_pg_data` y `project_mdv_redis_data`, la DB actual sigue montada.
- Hay imágenes `uploads` untracked preexistentes en frontend/storefront; no pertenecen a F-155 y no se incluyen.

View File

@@ -0,0 +1,21 @@
{
"feature_id": "F-155",
"agent": "leader",
"verdict": "APPROVED",
"summary": "F-155 cerrado: PostgreSQL y Redis usan volúmenes Docker explícitos existentes, Redis tiene AOF/RDB, monolith reconcilia infra con Compose y existe un check reproducible de persistencia.",
"checks": [
"reviewer.json APPROVED",
"security.json APPROVED",
"qa.json APPROVED",
"npm run infra:persistence-check -- --recreate OK",
"npm run infra:persistence-check OK",
"docker compose config OK",
"monolith prod status OK",
"npm run build OK",
"npm test OK",
"verify.sh OK"
],
"commit_message": "fix(F-155): persist PostgreSQL and Redis volumes",
"next_step": "Continue with F-152 email notifications",
"closed_at": "2026-08-21T20:37:10Z"
}

View File

@@ -0,0 +1,16 @@
{
"feature_id": "F-155",
"agent": "qa",
"stage": "qa_gate",
"verdict": "APPROVED",
"summary": "Persistencia probada con restart y con recreación de contenedores. Los datos de PostgreSQL y Redis sobreviven, y la aplicación sigue sirviendo tras la operación.",
"acceptance_traceability": [
{"criterion":"PostgreSQL persiste tras recrear contenedor","ok":true,"evidence":"app_meta infra.persistence_check conserva token tras docker compose rm/up"},
{"criterion":"Redis persiste tras recrear contenedor","ok":true,"evidence":"redis GET infra:persistence_check conserva token tras rm/up; appendonly=yes"},
{"criterion":"Volúmenes correctos","ok":true,"evidence":"PostgreSQL mount project_mdv_pg_data; Redis mount project_mdv_redis_data"},
{"criterion":"Servicios siguen arriba","ok":true,"evidence":"monolith prod status: backend/admin/frontend/storefront HTTP 200"},
{"criterion":"Datos existentes siguen disponibles","ok":true,"evidence":"DB products=12, backoffice_users=1; admin proxy login y catalog products OK"},
{"criterion":"Regression checks","ok":true,"evidence":"docker compose config, npm run build, npm test, eslint/prettier touched files, verify.sh, git diff --check"}
],
"issues": []
}

View File

@@ -0,0 +1,16 @@
{
"feature_id": "F-155",
"agent": "reviewer",
"stage": "review_gate",
"verdict": "APPROVED",
"summary": "La persistencia de PostgreSQL y Redis queda endurecida sin apartar los volúmenes existentes. El check operacional prueba reinicio y recreación de contenedores conservando datos.",
"checks": [
{"item":"No se cambia a un volumen vacío","ok":true,"evidence":"docker-compose fija project_mdv_pg_data y project_mdv_redis_data, que son los mounts actuales"},
{"item":"Redis persistente","ok":true,"evidence":"Redis arranca con appendonly=yes y RDB save 60 1"},
{"item":"Compose reconcilia configuración","ok":true,"evidence":"monolith.sh usa docker compose up -d postgres redis en vez de docker start directo"},
{"item":"Recreación verificada","ok":true,"evidence":"npm run infra:persistence-check -- --recreate mantiene marcadores PG/Redis"},
{"item":"Servicios regresión","ok":true,"evidence":"backend/admin/frontend/storefront 200 tras recrear infra"},
{"item":"Build/test","ok":true,"evidence":"npm run build OK; npm test 191 passed/56 skipped"}
],
"issues": []
}

View File

@@ -0,0 +1,16 @@
{
"feature_id": "F-155",
"agent": "security",
"stage": "security_gate",
"verdict": "APPROVED",
"summary": "El cambio no introduce credenciales nuevas ni exposición externa adicional. Redis y PostgreSQL siguen limitados a la configuración dev existente; la persistencia se limita a volúmenes locales nombrados.",
"checks": [
{"item":"No nuevas credenciales","ok":true,"evidence":"docker-compose mantiene las credenciales dev ya existentes"},
{"item":"Persistencia local controlada","ok":true,"evidence":"volúmenes Docker nombrados, sin bind mounts a rutas sensibles"},
{"item":"Redis AOF sin secretos nuevos","ok":true,"evidence":"solo activa durabilidad appendonly; no cambia auth/red"},
{"item":"Script de check seguro","ok":true,"evidence":"usa app_meta y una clave Redis técnica; no imprime secretos"},
{"item":"No borra volúmenes","ok":true,"evidence":"check --recreate elimina contenedores, no volúmenes"}
],
"issues": [],
"notes": "Los puertos 5432/6379 siguen publicados como antes para dev local. Endurecimiento de red/auth de Redis queda fuera de este fix si se requiere producción real."
}