# Redis

Redis nativo, uno por VPS, con usuario ACL propio, persistencia RDB, TLS y acceso externo limitado por lista de IP.

Fuente: https://ardumaker.com/docs/redis/

- Categoría: Servidores e infraestructura
- Estado: Disponible
- Requisitos: Un VPS activo con la función `redis` disponible; Si ya hay un Redis: versión 6.0 o superior
- Herramientas MCP (Solo leen): `ver_catalogo_apps`, `ver_preflight_app`, `ver_app`, `ver_acceso_app`, `ver_operacion_app`
- Herramientas MCP (Escriben o modifican): `instalar_app`, `revelar_credencial_app`, `cambiar_lista_ip_app`, `controlar_app`, `reintentar_operacion_app`
- Herramientas MCP (Destructivas): `revocar_acceso_app`, `desinstalar_app`

## ¿Qué permite hacer?

Redis es un solo motor nativo por VPS y la app es el propio motor. ArduMaker lo instala (o adopta el que ya corre), le crea un usuario ACL propio y, si se pide, lo publica con TLS para ciertas IP.

- Usarlo como caché o cola desde las apps del VPS (`127.0.0.1:6379`).
- Iniciarlo, detenerlo o reiniciarlo.
- Revelar usuario, contraseña y URI `rediss://`.
- Desde la pestaña Redis del VPS: estadísticas, memoria, claves, tamaño por base, último guardado, persistencia, configuración y vaciado.

## ¿Cuándo conviene usarlo?

- Caché, sesiones o colas de trabajos de una app desplegada en el mismo VPS.
- Un servicio externo que necesita un Redis con TLS desde IP conocidas.

> **INFO:** El stack Docker de [n8n](https://ardumaker.com/docs/n8n) trae su propio Redis (`n8n-redis`), distinto de este.

## ¿Cómo funciona en ArduMaker?

1. Motor: si no está, se instala una vez; si ya corre, se adopta sin reinstalar ni cambiar versión ni contraseña. Una versión anterior a 6.0 falla `redis_no_soportado` sin tocar nada.
2. Credencial `app<id>_<hex>` con contraseña aleatoria, guardada cifrada antes de tocar el VPS.
3. `ACL SETUSER <usuario> reset on ~* &* +@all -@admin -@dangerous` con la contraseña, por stdin; la clave administrativa viaja en `REDISCLI_AUTH`, nunca en `-a`. El usuario `default` no se toca.
4. Se persiste con `ACL SAVE` (si hay `aclfile`) o `CONFIG REWRITE`.
5. Salud como el usuario de la app: `PING`, `SET` de una clave temporal propia con `EX 60`, `GET` y `DEL`. Nunca lista ni lee claves del cliente.

En `config` solo se acepta `external_access`: las bases numéricas de Redis no aíslan y no se ofrecen. Un segundo pedido en el mismo VPS responde `app_ya_existe` con el id del que ya está.

`config.external_access` decide si la base sale a internet: `{"ips": [...]}` abre solo a esas IP; `{"local": true}` (o `false`) la deja solo adentro del VPS. Si no se indica, desde el panel se toma la IP de quien instala; por MCP la IP del agente no cuenta, así que sin `ips` la base queda local en vez de fallar.

## ¿Qué cambia realmente?

| Ajuste del instalador | Valor |
| --- | --- |
| `bind` | `127.0.0.1` |
| `port` | `6379` |
| `maxmemory` | `256mb` |
| `maxmemory-policy` | `allkeys-lru` |
| `save` | `900 1`, `300 10`, `60 10000` (RDB) |
| `appendonly` | `no` |
| TLS (si hay acceso externo) | `tls-port 6380`, certificado propio, `tls-auth-clients no` |

> **PRECAUCION:** Con `allkeys-lru` y 256 MB, cuando la memoria se llena Redis descarta las claves menos usadas. Sirve para caché; para datos que no se pueden perder hay que tenerlo en cuenta o ajustar la configuración.

## Acceso desde internet y lista de IP

Por defecto el motor escucha solo dentro del VPS (6380 en `127.0.0.1`). Para usar la base desde afuera, ArduMaker publica un endpoint propio del motor: `db-<id del VPS>` dentro de la zona de la plataforma (registro DNS directo, sin proxy), en un puerto reservado entre 61000 y 64999. En el host, un proxy lleva ese puerto al 6380 del VPS y el firewall deja entrar solo las IP de la lista.

Para Redis el proxy apunta al `tls-port` 6380 con el certificado propio del nombre `db-<id>`; el 6379 sin TLS nunca se publica. Activar TLS la primera vez reinicia Redis: se hace solo si lo instaló Apps; en uno adoptado queda pendiente de confirmación.

| Regla de la lista | Detalle |
| --- | --- |
| Formato | IPv4 o IPv6, con o sin prefijo; una IP suelta es /32 o /128. Nada de nombres, loopback, link-local ni multicast |
| Amplitud | Prefijo mínimo /24 en IPv4 y /48 en IPv6 por defecto; `0.0.0.0/0` y `::/0` se rechazan en la lista |
| Tamaño | Hasta 20 entradas; vacía = cerrado para todos |
| Nombres de host | Hasta 5 (`allowed_hosts`), con hasta 8 IP públicas cada uno; se vuelven a resolver cada 5 minutos y una falla de DNS conserva lo último conocido |
| Abierto a todos | Solo con `allow_any` y `confirm_open` juntos; la respuesta lo dice en `open_to_any` |

La lista es del motor, no de cada base: cambiarla desde cualquier base de Redis cambia el acceso de todas las bases de ese motor en ese VPS (la respuesta lo indica con `shared_with_engine` y `affected_apps`).

1. Se agregan las reglas de firewall que faltan, una por CIDR (`ufw allow from <cidr> to any port <puerto> proto tcp`).
2. Después se quitan las que sobran y se cortan sus conexiones abiertas.
3. Recién entonces se crea el listener y se verifica: reglas iguales a la lista, ninguna regla abierta a cualquiera, listener presente y handshake TLS con el nombre correcto.

> **INFO:** Agregar antes de quitar hace que el estado intermedio sea siempre la unión de dos listas válidas: nunca hay un instante abierto a todos. Si la verificación falla, se borra el listener.

> **PRECAUCION:** Otro VPS del mismo host no llega por la IP pública aunque esté en la lista: la conexión se corta por tiempo. La respuesta avisa con `warnings` (`mismo_host`); entre dos VPS así se usa un túnel SSH (`configurar_tunel_entre_vps`).

## Desinstalar, persistencia y copias

- Sin `delete_data` (lo normal): se cierra el acceso externo propio y la app deja de figurar como instalada, pero la base, su usuario y sus datos quedan en el VPS. La siguiente reconciliación la muestra como detectada. No se pierde nada.
- En Redis la baja siempre quita el usuario ACL que creó Apps (es un acceso, no un dato). Con `delete_data` además vacía todas las claves (`FLUSHALL`), salvo que ese Redis guarde la cola de un n8n. El motor queda instalado.
- El motor nunca se desinstala desde Apps: queda instalado aunque no tenga bases.
- Si el VPS o el motor no responden, `desinstalar_app` con `forzar=true` intenta cada paso una vez, da de baja la app y lista en `not_cleaned` lo que quedó en el servidor.
- Los datos viven en el disco del VPS y viajan en su copia semanal, que se toma con el VPS andando. Para una copia consistente de una base concreta conviene además un volcado propio desde el [gestor de bases de datos](https://ardumaker.com/docs/gestor-de-bases-de-datos) (exportar) o con las herramientas del motor.

> **PELIGRO:** Con `delete_data` la baja es irreversible.

## Esquema

**Conexiones a Redis**

```text
App en el mismo VPS (`127.0.0.1:6379`)
  ↓
Cliente externo (`rediss://` a `db-<id>:<puerto>`)
  ↓
Firewall y proxy del host (solo IP de la lista → 6380 del VPS)
  ↓
redis-server (TLS en 6380; el 6379 plano nunca se publica)
```

## Resultado esperado

```text
rediss://app<id>_<hex>@db-<vps>.<zona>:<puerto>/0
```

La URI `rediss://<usuario>@<host>:<puerto>/0` aparece sin contraseña cuando el acceso está listo; nombra la base 0 (no se asigna una base numérica por app).

## Errores y resolución

| Error | Causa | ¿Reintentar? |
| --- | --- | --- |
| `redis_no_soportado` | Redis anterior a 6.0 (sin ACL ni `tls-port`) | No |
| `redis_usuario_no_creado` / `redis_salud_fallida` | Falló el `ACL SETUSER`, su persistencia o la prueba de salud | Sí |
| `redis_usado_por_n8n` | Ese Redis guarda la cola de un n8n por npm: no se publica (la app queda instalada) | No |
| `requiere_reinicio` | El primer TLS reinicia Redis; en un Redis adoptado lo tiene que confirmar una persona | Tras confirmar |
| `redis_control_fallido` | `start`, `stop` o `restart` no terminó bien | Pedir la acción otra vez |
| `app_ya_existe` | Ya hay un Redis en ese VPS | No |

## Relación con MCP

Todo el ciclo de la base se opera por MCP con los permisos de la persona que autorizó al agente. Referencia en [/mcp/docs](https://ardumaker.com/mcp/docs) y [/mcp/bases-de-datos](https://ardumaker.com/mcp/bases-de-datos).

- Lectura: `ver_catalogo_apps`, `ver_preflight_app`, `listar_apps_empresa`, `ver_app`, `ver_acceso_app` (host, puerto, TLS y lista de IP, sin secretos), `ver_operacion_app`.
- Modifican: `instalar_app` con `app_type: redis` (exige `idempotency_key`), `cambiar_lista_ip_app` (solo si su dueño es admin; las IP se nombran explícitas: la IP del agente no es la de la persona), `reintentar_operacion_app`, `refrescar_apps`.
- Sensible: `revelar_credencial_app` (solo admin, no acepta `idempotency_key`; la respuesta viene marcada `sensible: true` y la auditoría registra que se reveló, nunca el valor).
- Destructivas: `revocar_acceso_app` (cierra el acceso externo de todo el motor) y `desinstalar_app` (con `delete_data` borra los datos; requiere `confirm_delete_data`).

Para leer y escribir datos dentro de la base, el agente usa las herramientas del [gestor de bases de datos](https://ardumaker.com/docs/gestor-de-bases-de-datos). Un agente autorizado solo lectura no ve las herramientas que modifican ni puede revelar credenciales.

Además, `controlar_app` acepta `start`, `stop` y `restart` sobre la app Redis. Las claves y la configuración del motor se ven desde la pestaña Redis del panel: no tienen herramienta MCP.

## Funciones relacionadas

- [PostgreSQL](https://ardumaker.com/docs/postgresql/)
- [n8n](https://ardumaker.com/docs/n8n/)
- [Firewall y puertos](https://ardumaker.com/docs/firewall-y-puertos/)
- [Túneles SSH](https://ardumaker.com/docs/tuneles-ssh/)
- [Copias de seguridad](https://ardumaker.com/docs/backups/)
