# Portal principal com produto NVR integrado

Este pacote final deve ser lido como **portal oficial + produto NVR integrado**, e não como um NVR avulso competindo pela entrada HTTP.

## Estrutura

- `portal/` — camada oficial de entrada: autenticação, catálogo, cobrança, contexto do cliente, políticas de acesso e launch controlado.
- `platform/` — runtime interno do produto **NVR**, publicado pelo portal em `/nvr`.
- `gateway/` — appliance local: descoberta, gravacao, catalogo, snapshot, preview, remoto mediado e verificacoes de saude.
- `docs/` e `platform/docs/` — documentação operacional e arquitetural.

## Regra arquitetural desta entrega

- o **portal real** empacotado aqui é a porta de entrada canônica do produto;
- o NVR é publicado sob **`/public/nvr`** e consumido por **launch controlado**;
- o usuário final não deve tratar `platform/` como um portal paralelo;
- autenticação, catálogo, cobrança, navegação principal, entitlement e assinatura permanecem centralizados no portal;
- o runtime interno do NVR mantém apenas o domínio do produto: monitoramento, gravações, remoto, gateway, licenças e operação;
- o banco central oficial permanece **MariaDB/MySQL**;
- apenas o `/gateway` pode continuar com SQLite local para metadados operacionais.

## Entrada de desenvolvimento

- portal + NVR integrado: `http://localhost:8080/nvr/`
- portal raiz: `http://localhost:8080/`
- gateway web local: `http://localhost:9080/`
- Mailpit: `http://localhost:8025/`
- MariaDB/MySQL: `localhost:3306`
- Redis: `localhost:6379`

## Baseline operacional do runtime oficial

- banco central oficial do portal + NVR: **MariaDB/MySQL**;
- `DB_CONNECTION=mysql` é o contrato canônico do runtime central;
- o `gateway` continua autorizado a usar **SQLite local** para metadados operacionais;
- a imagem PHP compartilhada do pacote instala `pdo_mysql`, `pdo_sqlite`, `sqlite3`, `redis`, `mbstring`, `pcntl`, `opcache`, cliente `mysql`, `mysqldump`, `ffmpeg` e o binário `composer`;
- o bridge HTTP segue canônico em `/nvr`, sem recolocar o NVR como aplicação principal fora do portal.

## Fluxo esperado

1. o usuário entra pelo **portal real**;
2. o portal resolve conta, licença, entitlement, contexto e política de launch;
3. o portal publica o produto em `/nvr` e emite o handoff assinado;
4. o runtime do NVR consome o contexto e abre somente as telas do domínio NVR.

## Validação básica

```bash
bash scripts/test.sh
bash scripts/test-regression.sh
php scripts/check-real-portal-package.php
php scripts/check-preview-regression.php
php gateway/bin/gateway health:check
```

## Prova extraída estrita com MariaDB/MySQL real

A prova canônica do bundle extraído agora é:

```bash
PROOF_REAL_STACK_MODE=auto bash scripts/prove-extracted-real-stack.sh
```

Para validar diretamente a partir do ZIP entregue:

```bash
PROOF_REAL_STACK_MODE=auto bash scripts/verify-final-package-real-stack.sh /caminho/pacote.zip
```

Essa prova sobe o stack oficial do próprio pacote com Docker Compose, exige `pdo_mysql`, MariaDB/MySQL real e Redis real, executa os comandos de console no `/platform`, roda os gates do root e grava evidências em `storage/proof/final-real-stack/`.

## Empacotamento

```bash
bash scripts/build-final.sh
```

A geracao final agora monta um **stage limpo e deterministico** antes de gerar o zip e reabre o proprio artefato gerado para validacao objetiva. O pacote consolidado passa por:

- sincronização do portal real sem runtime transitório;
- saneamento de logs, sessões, caches, temporários e artefatos incrementais antigos;
- validação estrutural do portal real;
- validação objetiva de higiene do pacote;
- geração de `BUILD_MANIFEST.sha256` com a árvore final ordenada;
- extração do ZIP gerado em diretório temporário e revalidação de `php artisan about`, `scripts/test.sh` e `scripts/test-regression.sh` no próprio bundle entregue.

## Referências desta rodada

- `docs/PORTAL_ENTRADA_OFICIAL_NVR_A15.md`
- `docs/MODULO_13_PORTAL_REAL_PACOTE_FINAL.md`
- `docs/MODULO_14_BRIDGE_PUBLIC_NVR_TOPOLOGIA.md`
- `docs/MODULO_17_HIGIENE_BUILD_FINAL.md`
- `docs/MODULO_19_FECHAMENTO_VISUAL_NVR.md`
- `docs/MODULO_20_PREVIEWS_REAIS_REGRESSAO_FINAL.md`
- `docs/MODULO_20_VALIDACAO_FINAL.md`
- `platform/docs/ESCOPO_NVR_INTEGRADO_A15.md`
- `docs/MODULO_18_CONTRATO_MARIADB_MYSQL.md`

## Serviços compartilhados do compose

- `shared-web` — serve o **portal real** e o bridge público `/nvr`.
- `php` — executa o portal e o runtime HTTP do NVR via bridge público.
- `platform-queue` — processa filas centrais e jobs de integração do NVR.
- `platform-scheduler` — executa heartbeats, limpeza e tarefas recorrentes do NVR.
- `gateway-daemon` — opera o ciclo local do gateway, captura, heartbeat, sincronização, reconciliação de preview e geração de previews sem disputar a entrada HTTP do portal.
- `gateway-web` — mantém a interface local do gateway separada do daemon.

- `docs/MODULO_26_EMPACOTAMENTO_REPRODUZIVEL_LIMPEZA_FINAL.md`


No modo estrito de prova real, o bundle exporta `PLATFORM_REQUIRE_REAL_MYSQL=1`, `QUEUE_RUNTIME_STRICT=1`, `QUEUE_RUNTIME_REQUIRE_EXTERNAL_REDIS=1`, `PLATFORM_TEST_STRICT_REAL_STACK=1` e `PLATFORM_TEST_FAIL_ON_SKIP=1`. Qualquer `SKIP` no `/platform` reprova a prova.
