# Fase 1 — Fundação (painel + banco)

**Status:** concluída neste ambiente de desenvolvimento  
**Data:** 2026-08-19  
**URL:** https://vms.restor.app.br

## Objetivo

Esqueleto instalável do VMS: Laravel + PostgreSQL + auth + CRUD de câmera/disco, **sem gravação**.

## O que foi entregue

- Laravel 13 (PHP 8.3) em `apps/panel`
- PostgreSQL 16, banco `ipcam`, usuário `ipcam`
- Schema genérico multi-fabricante (sem tabelas `hikvision_*`):
  - `manufacturers`, `camera_models`, `camera_groups`
  - `cameras`, `camera_protocols`, `camera_streams`, `camera_capabilities`
  - `storage_disks` (discos independentes)
  - `users.role` (`admin` | `operator` | `auditor`)
- Login (Breeze Blade); cadastro público **desabilitado**
- CRUD câmeras e discos
- Credenciais de câmera e URL RTSP com cast `encrypted`
- Config por ambiente: `deploy/env/.env.{development,staging,production}.example`
- Paths de storage via `IPCAM_STORAGE_ROOT` (não hardcoded de produção)
- Dois discos simulados: `storage/disk01` e `storage/disk02`
- HTTPS Let's Encrypt já existente apontando para `apps/panel/public`

## Princípio mantido

Reiniciar o painel Laravel **não** pode interromper gravações. O Recorder ainda não existe nesta fase; quando existir, será systemd separado.

## Critério de aceite da Fase 1

| Critério | Resultado |
|---|---|
| App sobe com `.env` de desenvolvimento | OK (`/up` = 200) |
| Login | OK |
| CRUD câmera | OK |
| CRUD disco | OK |
| Discos simulados registrados | OK (`disk01`, `disk02`) |
| Sem lógica `if fabricante == ...` | OK |

## Fora desta fase (próximas)

- Protocol Layer ONVIF (Fase 2)
- Storage Manager (Fase 3)
- Recorder / FFmpeg (Fase 4)
- Live view, timeline, export, reciclagem

## Nota de rede (Fase 0 ainda aberta)

Câmeras `192.168.20.10` / `.11` **não são alcançáveis** deste host (`10.10.15.74`). Inventário autenticado continua pendente até haver rota/firewall ou host que enxergue as câmeras.
