> ## Documentation Index
> Fetch the complete documentation index at: https://docs.casebender.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Armazenamento OpenShift ODF e Ceph RGW

> Conecte o CaseBender a armazenamento OBC ou Ceph RGW independente gerenciado pelo cliente

Este perfil conecta o CaseBender a OpenShift Data
Foundation (ODF) ou Ceph RGW existente, gerenciado pelo cliente. O CaseBender é um cliente S3; ele não instala,
atualiza, faz backup, monitora nem administra ODF, Ceph, RGW, usuários ou buckets.

<Warning>
  A certificação live atual está pendente de credenciais do cliente e de evidência de
  versão exata. O overlay está configurado e pronto para qualificação, não certificado.
</Warning>

## Layout de armazenamento

Provisione três buckets externos independentes:

| Perfil de propósito | Comportamento exigido                                                                     |
| ------------------- | ----------------------------------------------------------------------------------------- |
| `quarantine`        | Uploads iniciais do usuário; caminho de promoção exclusivo do scanner; sem acesso público |
| `records`           | Anexos/evidências/exportações duráveis; versionamento e controles WORM exigidos           |
| `ephemeral`         | Canários profundos e exportações de curta duração; política de ciclo de vida limitada     |

Os três devem existir antes da inicialização. O adaptador de runtime nunca cria um bucket.
O overlay usa HTTPS, endereçamento S3 path-style, confiança verificada de CA privada,
solicitações de criptografia no servidor AES-256 e integridade SHA-256 da aplicação.

## Opção A: OBCs externos gerenciados

Identifique o StorageClass de bucket RGW aprovado pelo cliente:

```bash theme={null}
oc get storageclass \
  -o custom-columns=NAME:.metadata.name,PROVISIONER:.provisioner
oc api-resources | rg -i objectbucketclaim
```

Copie
`k8s/overlays/openshift-odf-rgw/object-bucket-claims.example.yaml`
para o repositório do ambiente do cliente, substitua o placeholder do StorageClass
e aplique-o separadamente do CaseBender. O ciclo de vida do bucket permanece de propriedade do
operador de armazenamento.

```bash theme={null}
oc apply -f '<customer-obc-manifest.yaml>'
oc -n casebender wait --for=jsonpath='{.status.phase}'=Bound \
  objectbucketclaim/casebender-quarantine \
  objectbucketclaim/casebender-records \
  objectbucketclaim/casebender-ephemeral \
  --timeout=10m
```

Confirme, sem imprimir valores, que cada ConfigMap gerado fornece
`BUCKET_HOST`, `BUCKET_PORT`, `BUCKET_NAME` e `BUCKET_REGION`, e cada
Secret fornece `AWS_ACCESS_KEY_ID` e `AWS_SECRET_ACCESS_KEY`. Se o operador
OBC usar outras chaves, faça patch de `valueFrom`; nunca copie credenciais para um
ConfigMap ou arquivo Kustomize.

## Opção B: RGW externo independente

Use
`k8s/overlays/openshift-odf-rgw/standalone-rgw-resources.example.yaml`
como exemplo de mapeamento. Substitua todos os placeholders de endpoint `.invalid` e de bucket
no overlay do cliente. Use o controlador de external-secret instalado ou
outro injetor de segredos aprovado. Mantenha endpoints e nomes de bucket em
ConfigMaps, credenciais em Secrets e todos os valores reais fora deste repositório.

O init container restrito lê esses recursos e grava um
`STORAGE_CONFIG_FILE` restrito em um `emptyDir` backed por memória com modo `0400`. Web e
worker o montam somente leitura.

## CA privada

Crie um ConfigMap de CA contendo apenas a cadeia emissora:

```bash theme={null}
oc -n casebender create configmap casebender-rgw-ca \
  --from-file=ca.crt='<customer-rgw-ca-chain.pem>' \
  --dry-run=client -o yaml | oc apply -f -
```

O certificado deve cobrir o hostname exato do RGW. A verificação TLS permanece
habilitada. Nunca use um endereço IP não listado, um endpoint HTTP, `--insecure` ou uma
opção de bypass de certificado.

## Egresso

A política incluída permite que web e worker alcancem TCP 443 em pods rotulados
`app=rook-ceph-rgw` em `openshift-storage`. Verifique o namespace real, os rótulos,
a porta e o comportamento do CNI.

Para RGW externo, copie e adapte
`external-rgw-network-policy.example.yaml` com CIDRs aprovados e estáveis, ou roteie
por um proxy de egresso controlado pelo operador. O NetworkPolicy do Kubernetes não pode
selecionar FQDNs. Não restaure egresso curinga `0.0.0.0/0` ou `::/0`.

Adicione políticas separadas de menor privilégio para PostgreSQL, Redis, identidade, scanner
e integrações aprovadas.

## Pré-requisito do scanner

Uploads de usuário em produção exigem `clamd` externo. O patch do worker fornecido
espera `casebender-malware-scanner` (`host`, `port`) e
`casebender-malware-scanner-ca` (`ca.crt`) e habilita TLS. Um scanner no mesmo pod
pode, em vez disso, usar `CLAMD_SOCKET_PATH`. Se o scanner estiver indisponível, os objetos
permanecem em quarentena e as retentativas podem eventualmente ir para dead-letter; os downloads não
falham em aberto.

## Renderizar e validar

```bash theme={null}
kubectl kustomize k8s/overlays/openshift-odf-rgw \
  > /tmp/casebender-openshift-odf-rgw.yaml
./scripts/openshift/validate.sh \
  /tmp/casebender-openshift-odf-rgw.yaml
oc apply --server-side --dry-run=server \
  -f /tmp/casebender-openshift-odf-rgw.yaml
oc apply --server-side \
  -f /tmp/casebender-openshift-odf-rgw.yaml
oc -n casebender rollout status deployment/webapp deployment/worker \
  --timeout=10m
```

Em seguida, execute a qualificação live a partir da rede do workload e do contexto de confiança:

```bash theme={null}
STORAGE_TEST_ENDPOINT='https://<rgw-host>' \
STORAGE_TEST_BUCKET='<dedicated-test-bucket>' \
AWS_REGION='<rgw-region>' \
STORAGE_TEST_CA_BUNDLE='<private-ca-file>' \
STORAGE_TEST_ODF_VERSION='<exact-odf-version>' \
STORAGE_TEST_CEPH_VERSION='<exact-ceph-version>' \
STORAGE_TEST_CAP_VERSIONING='<true-or-false>' \
STORAGE_TEST_CAP_DELETE_MARKERS='<true-or-false>' \
STORAGE_TEST_CAP_OBJECT_LOCK='<true-or-false>' \
./scripts/storage/validate-ceph-rgw.sh
```

Forneça credenciais pela cadeia de credenciais da AWS, com escopo limitado ao
bucket/prefixo de teste dedicado. Conclua e assine
`apps/docs/en/deployment/odf-ceph-rgw-validation-evidence.md`. Uma renderização,
teste de emulador ou transcrição não assinada não é certificação live.

## Rotação de credenciais

1. Rotacione pelo procedimento suportado de ODF/Ceph; não edite manualmente um
   Secret de OBC de propriedade do operador.
2. Permita uma sobreposição limitada enquanto o Secret gerado ou o ExternalSecret
   é atualizado.
3. Reinicie web e worker para que o init container regenere o arquivo montado.
4. Exija que `/api/health/ready` e a validação de contrato live sejam aprovados.
5. Revogue a credencial antiga e verifique métricas/logs de autenticação sanitizados.

## Rotação de CA

1. Publique um bundle temporário de CA contendo as CAs emissoras antiga e nova.
2. Reinicie e valide web e worker.
3. Rotacione o certificado de serviço do RGW.
4. Publique o bundle de CA somente com a nova, reinicie e valide novamente.
5. Registre as versões de recurso do ConfigMap, hashes SHA-256 da CA, versões exatas de
   ODF/Ceph e evidência — nunca valores de credenciais.

Consulte [Saúde e solução de problemas do armazenamento](/pt-BR/deployment/storage-health-troubleshooting)
e o
`k8s/overlays/openshift-odf-rgw/README.md` no repositório para detalhes do overlay.
