# Redis

Redis nativo, um por VPS, com usuário ACL próprio, persistência RDB, TLS e acesso externo limitado por lista de IP.

Fonte: https://ardumaker.com/pt/docs/redis/

- Categoria: Servidores e infraestrutura
- Estado: Disponível
- Requisitos: Um VPS ativo com a função `redis` disponível; Se já houver um Redis: versão 6.0 ou superior
- Ferramentas MCP (Só leem): `ver_catalogo_apps`, `ver_preflight_app`, `ver_app`, `ver_acceso_app`, `ver_operacion_app`
- Ferramentas MCP (Escrevem ou modificam): `instalar_app`, `revelar_credencial_app`, `cambiar_lista_ip_app`, `controlar_app`, `reintentar_operacion_app`
- Ferramentas MCP (Destrutivas): `revocar_acceso_app`, `desinstalar_app`

## O que permite fazer?

O Redis é um único motor nativo por VPS e o app é o próprio motor. A ArduMaker o instala (ou adota o que já roda), cria um usuário ACL próprio e, se pedido, o publica com TLS para certos IPs.

- Usá-lo como cache ou fila pelos apps do VPS (`127.0.0.1:6379`).
- Iniciá-lo, pará-lo ou reiniciá-lo.
- Revelar usuário, senha e URI `rediss://`.
- Pela aba Redis do VPS: estatísticas, memória, chaves, tamanho por banco, último salvamento, persistência, configuração e esvaziamento.

## Quando convém usar?

- Cache, sessões ou filas de tarefas de um app publicado no mesmo VPS.
- Um serviço externo que precisa de um Redis com TLS a partir de IPs conhecidos.

> **INFO:** O stack Docker do [n8n](https://ardumaker.com/pt/docs/n8n) traz seu próprio Redis (`n8n-redis`), diferente deste.

## Como funciona na ArduMaker?

1. Motor: se não existir, é instalado uma vez; se já roda, é adotado sem reinstalar nem mudar versão ou senha. Uma versão anterior à 6.0 falha `redis_no_soportado` sem tocar nada.
2. Credencial `app<id>_<hex>` com senha aleatória, guardada criptografada antes de tocar o VPS.
3. `ACL SETUSER <usuário> reset on ~* &* +@all -@admin -@dangerous` com a senha, por stdin; a senha administrativa viaja em `REDISCLI_AUTH`, nunca em `-a`. O usuário `default` não é tocado.
4. É persistido com `ACL SAVE` (se houver `aclfile`) ou `CONFIG REWRITE`.
5. Saúde como o usuário do app: `PING`, `SET` de uma chave temporária própria com `EX 60`, `GET` e `DEL`. Nunca lista nem lê chaves do cliente.

Em `config` só se aceita `external_access`: os bancos numéricos do Redis não isolam e não são oferecidos. Um segundo pedido no mesmo VPS responde `app_ya_existe` com o id do existente.

`config.external_access` decide se o banco sai para a internet: `{"ips": [...]}` abre só para esses IPs; `{"local": true}` (ou `false`) o deixa só dentro do VPS. Se não for informado, pelo painel usa-se o IP de quem instala; via MCP o IP do agente não conta, então sem `ips` o banco fica local em vez de falhar.

## O que muda realmente?

| Ajuste do 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 (se houver acesso externo) | `tls-port 6380`, certificado próprio, `tls-auth-clients no` |

> **PRECAUCION:** Com `allkeys-lru` e 256 MB, quando a memória enche o Redis descarta as chaves menos usadas. Serve para cache; para dados que não podem ser perdidos é preciso levar isso em conta ou ajustar a configuração.

## Acesso pela internet e lista de IP

Por padrão o motor escuta só dentro do VPS (6380 em `127.0.0.1`). Para usar o banco de fora, a ArduMaker publica um endpoint próprio do motor: `db-<id do VPS>` dentro da zona da plataforma (registro DNS direto, sem proxy), em uma porta reservada entre 61000 e 64999. No host, um proxy leva essa porta ao 6380 do VPS e o firewall só deixa entrar os IPs da lista.

Para o Redis o proxy aponta para a `tls-port` 6380 com o certificado próprio do nome `db-<id>`; a 6379 sem TLS nunca é publicada. Ativar o TLS pela primeira vez reinicia o Redis: é feito sozinho só se o Apps o instalou; em um adotado fica pendente de confirmação.

| Regra da lista | Detalhe |
| --- | --- |
| Formato | IPv4 ou IPv6, com ou sem prefixo; um IP solto é /32 ou /128. Nada de nomes, loopback, link-local nem multicast |
| Amplitude | Prefixo mínimo /24 em IPv4 e /48 em IPv6 por padrão; `0.0.0.0/0` e `::/0` são recusados na lista |
| Tamanho | Até 20 entradas; vazia = fechado para todos |
| Nomes de host | Até 5 (`allowed_hosts`), com até 8 IPs públicos cada; são resolvidos de novo a cada 5 minutos e uma falha de DNS mantém o último conhecido |
| Aberto a todos | Só com `allow_any` e `confirm_open` juntos; a resposta informa em `open_to_any` |

A lista é do motor, não de cada banco: alterá-la a partir de qualquer banco Redis muda o acesso de todos os bancos desse motor nesse VPS (a resposta indica com `shared_with_engine` e `affected_apps`).

1. As regras de firewall que faltam são adicionadas, uma por CIDR (`ufw allow from <cidr> to any port <porta> proto tcp`).
2. Depois as que sobram são removidas e suas conexões abertas são cortadas.
3. Só então o listener é criado e verificado: regras iguais à lista, nenhuma regra aberta a qualquer um, listener presente e handshake TLS com o nome correto.

> **INFO:** Adicionar antes de remover faz com que o estado intermediário seja sempre a união de duas listas válidas: nunca há um instante aberto a todos. Se a verificação falhar, o listener é removido.

> **PRECAUCION:** Outro VPS do mesmo host não chega pelo IP público mesmo estando na lista: a conexão estoura o tempo. A resposta avisa em `warnings` (`mismo_host`); entre dois VPS assim usa-se um túnel SSH (`configurar_tunel_entre_vps`).

## Desinstalar, persistência e cópias

- Sem `delete_data` (o normal): o acesso externo próprio é fechado e o app deixa de aparecer como instalado, mas o banco, seu usuário e seus dados ficam no VPS. A próxima reconciliação o mostra como detectado. Nada se perde.
- No Redis a desinstalação sempre remove o usuário ACL criado pelo Apps (é um acesso, não um dado). Com `delete_data` também esvazia todas as chaves (`FLUSHALL`), salvo se esse Redis salvar a fila de um n8n. O motor continua instalado.
- O motor nunca é desinstalado pelo Apps: fica instalado mesmo sem bancos.
- Se o VPS ou o motor não responderem, `desinstalar_app` com `forzar=true` tenta cada passo uma vez, remove o app e lista em `not_cleaned` o que ficou no servidor.
- Os dados vivem no disco do VPS e viajam na sua cópia semanal, feita com o VPS ligado. Para uma cópia consistente de um banco específico convém também um dump próprio pelo [gerenciador de bancos de dados](https://ardumaker.com/pt/docs/gestor-de-bases-de-datos) (exportar) ou com as ferramentas do motor.

> **PELIGRO:** Com `delete_data` a desinstalação é irreversível.

## Esquema

**Conexões ao Redis**

```text
App no mesmo VPS (`127.0.0.1:6379`)
  ↓
Cliente externo (`rediss://` para `db-<id>:<porta>`)
  ↓
Firewall e proxy do host (só IPs da lista → 6380 do VPS)
  ↓
redis-server (TLS na 6380; a 6379 sem TLS nunca é publicada)
```

## Resultado esperado

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

A URI `rediss://<usuário>@<host>:<porta>/0` aparece sem senha quando o acesso está pronto; nomeia o banco 0 (não é atribuído um banco numérico por app).

## Erros e resolução

| Erro | Causa | Tentar de novo? |
| --- | --- | --- |
| `redis_no_soportado` | Redis anterior à 6.0 (sem ACL nem `tls-port`) | Não |
| `redis_usuario_no_creado` / `redis_salud_fallida` | Falhou o `ACL SETUSER`, sua persistência ou o teste de saúde | Sim |
| `redis_usado_por_n8n` | Esse Redis guarda a fila de um n8n via npm: não é publicado (o app fica instalado) | Não |
| `requiere_reinicio` | O primeiro TLS reinicia o Redis; em um Redis adotado uma pessoa precisa confirmar | Após confirmar |
| `redis_control_fallido` | `start`, `stop` ou `restart` não terminou bem | Pedir a ação de novo |
| `app_ya_existe` | Já existe um Redis nesse VPS | Não |

## Relação com MCP

Todo o ciclo do banco é operado via MCP com as permissões da pessoa que autorizou o agente. Referência em [/mcp/docs](https://ardumaker.com/pt/mcp/docs) e [/mcp/bases-de-datos](https://ardumaker.com/pt/mcp/bases-de-datos).

- Leitura: `ver_catalogo_apps`, `ver_preflight_app`, `listar_apps_empresa`, `ver_app`, `ver_acceso_app` (host, porta, TLS e lista de IP, sem segredos), `ver_operacion_app`.
- Modificam: `instalar_app` com `app_type: redis` (exige `idempotency_key`), `cambiar_lista_ip_app` (só se o dono for admin; os IPs são informados explicitamente: o IP do agente não é o da pessoa), `reintentar_operacion_app`, `refrescar_apps`.
- Sensível: `revelar_credencial_app` (só admin, não aceita `idempotency_key`; a resposta vem marcada `sensible: true` e a auditoria registra que foi revelado, nunca o valor).
- Destrutivas: `revocar_acceso_app` (fecha o acesso externo de todo o motor) e `desinstalar_app` (com `delete_data` apaga os dados; exige `confirm_delete_data`).

Para ler e escrever dados dentro do banco, o agente usa as ferramentas do [gerenciador de bancos de dados](https://ardumaker.com/pt/docs/gestor-de-bases-de-datos). Um agente autorizado como somente leitura não vê as ferramentas que modificam nem pode revelar credenciais.

Além disso, `controlar_app` aceita `start`, `stop` e `restart` sobre o app Redis. As chaves e a configuração do motor são vistas pela aba Redis do painel: não têm ferramenta MCP.

## Funcionalidades relacionadas

- [PostgreSQL](https://ardumaker.com/pt/docs/postgresql/)
- [n8n](https://ardumaker.com/pt/docs/n8n/)
- [Firewall e portas](https://ardumaker.com/pt/docs/firewall-y-puertos/)
- [Túneis SSH](https://ardumaker.com/pt/docs/tuneles-ssh/)
- [Cópias de segurança](https://ardumaker.com/pt/docs/backups/)
