# IPCAM — VMS genérico multi-fabricante

Sistema próprio de gravação e gerenciamento de câmeras IP (substituição do iVMS-4000).

## Princípio crítico — Recorder independente do painel

O **Recorder Service** é um processo de sistema (systemd) separado do Laravel.

- Gravação continua mesmo se o painel/API for reiniciado, atualizado ou ficar indisponível.
- Laravel **não** mantém processos FFmpeg vivos.
- Reiniciar `php-fpm`, Nginx/Apache ou o código do painel **não pode** interromper gravações em andamento.

Detalhes: [`docs/PRINCIPIOS.md`](docs/PRINCIPIOS.md)

## Fase atual

**Fase 13 — Cutover + rollback** runbooks e checker prontos neste lab; **cutover não executado** (sem Windows/iVMS/HDD/VLAN).

- Painel: https://vms.restor.app.br
- Checker: `php artisan ipcam:cutover-check` (não liga gravação)
- Runbooks: [`docs/CUTOVER.md`](docs/CUTOVER.md) · [`docs/ROLLBACK.md`](docs/ROLLBACK.md)
- Resultados: [`docs/FASE-13-RESULTADOS.md`](docs/FASE-13-RESULTADOS.md)

## Estrutura

```text
ipcam/
  apps/panel/                # Laravel (API + painel)
  deploy/systemd/            # units (ipcam-recorder, ipcam-monitor, ipcam-live)
  deploy/env/                # exemplos .env por ambiente
  docs/
  services/recorder/         # entrypoint systemd (independente do Apache)
  services/monitor/          # saúde composta (independente do Recorder)
  services/retention/        # reciclagem
  services/events/           # poller ONVIF PullPoint (não grava)
  tools/cutover/             # ipcam:cutover-check (não executa cutover)
  tools/loadsim/             # carga lavfi (não é 60 FFmpeg neste host)
  tools/env-baseline/
  tools/camera-inventory/
  storage/disk01|disk02      # discos simulados (dev)
  results/
```

## Ambientes

Configuração específica fica em `apps/panel/.env` (nunca no código). Exemplos:

- `deploy/env/.env.development.example`
- `deploy/env/.env.staging.example`
- `deploy/env/.env.production.example`
