# ISO do Appliance NVR

Esta pasta prepara uma ISO de instalacao Linux que carrega o pacote final do NVR e agenda a instalacao automatica no primeiro boot do sistema instalado.

O perfil versionado e um instalador appliance automatico para disco vazio e bloqueante para disco com dados: `autoinstall/user-data` usa storage `direct`, mas primeiro executa um guard de disco em `early-commands`. Use somente em VM, PC ou disco dedicado ao NVR.

## Arquivos principais

- `build-nvr-iso.sh`: injeta autoinstall/cloud-init, pacote NVR e servico de primeiro boot na ISO base.
- `check-iso-bundle.sh`: valida entradas obrigatorias e confirma que a ISO final contem os arquivos esperados.
- `autoinstall/user-data`: configuracao Ubuntu Subiquity/Cloud-init em modo seguro/manual por padrao.
- `first-boot-nvr-install.sh`: extrai o pacote NVR e chama `scripts/appliance/install-nvr-appliance.sh`.
- `nvr-first-boot-install.service`: unidade systemd que executa a instalacao uma unica vez.
- `nvr-wifi-configure.sh`: tela local simples para configurar Wi-Fi com DHCP ou IPv4 fixo.
- `nvr-support-unlock.sh`: libera suporte SSH temporario por chave publica e agenda fechamento automatico.
- `nvr-appliance.env.example`: parametros do appliance.

## Geracao rapida

```bash
sudo apt-get update
sudo apt-get install -y xorriso python3

bash scripts/appliance/iso/build-nvr-iso.sh \
  ~/isos/ubuntu-24.04-live-server-amd64.iso \
  ../nvr_monorepo_complete_final.zip \
  ./nvr-appliance-installer.iso
```

A geracao cria arquivos auxiliares ao lado da ISO:

- `nvr-appliance-installer.iso.sha256`: hash SHA-256 da ISO final.
- `nvr-appliance-installer.iso.build.log`: log da geracao e da validacao chamada pela geracao.
- `nvr-appliance-installer.iso.check.log`: log da validacao.

Os caminhos podem ser sobrescritos com `SHA256_FILE`, `BUILD_LOG` e `CHECK_LOG`.

Valide:

```bash
bash scripts/appliance/iso/check-iso-bundle.sh \
  ~/isos/ubuntu-24.04-live-server-amd64.iso \
  ../nvr_monorepo_complete_final.zip \
  ./nvr-appliance-installer.iso
```

O modo padrao instala automaticamente apenas quando o disco alvo esta vazio e sem ambiguidade. SSH por senha permanece desativado. Para homologacao ou administracao controlada, injete uma chave publica na geracao:

```bash
ISO_SSH_AUTHORIZED_KEY="$(cat ~/.ssh/nvr_iso_test.pub)" \
bash scripts/appliance/iso/build-nvr-iso.sh ISO_BASE nvr_monorepo_complete_final.zip nvr-appliance-installer.iso
```

Tambem e possivel apontar para um arquivo de chave publica, evitando quoting de shell em automacoes:

```bash
ISO_SSH_AUTHORIZED_KEY_FILE=~/.ssh/nvr_iso_test.pub \
bash scripts/appliance/iso/build-nvr-iso.sh ISO_BASE nvr_monorepo_complete_final.zip nvr-appliance-installer.iso
```

A chave publica e gravada em `/home/nvr-setup/.ssh/authorized_keys` no sistema instalado. Quando uma chave e injetada, o instalador tambem cria uma regra sudo local para essa conta administrativa, permitindo auditoria e manutencao sem publicar senha. Nao publique chave privada nem senha local na ISO.

## Rede cabeada e primeiro boot

A ISO grava configuracao persistente de rede cabeada no sistema instalado:

- `/etc/netplan/01-nvr-wired-dhcp.yaml` cobre interfaces `en*`, incluindo `enp2s0` em placas Realtek;
- `/etc/systemd/network/20-nvr-wired.network` habilita DHCP para `en*` e `eth*`;
- `systemd-networkd-wait-online` fica limitado a 20 segundos e usa `--any`;
- se nao houver cabo, DHCP ou internet, o boot segue em modo local e informa que a ativacao do serial exigira internet.

No console local:

```bash
sudo nvr-status-local
sudo nvr-wifi-configure
sudo NVR_SUPPORT_AUTHORIZED_KEY='ssh-ed25519 ...' nvr-support-unlock
cat /etc/nvr-appliance/STATUS_REDE.txt
cat /etc/nvr-appliance/ACESSO_LOCAL.txt
```

O Wi-Fi usa NetworkManager com `en*` e `eth*` marcadas como nao gerenciadas, preservando a rede cabeada controlada por `systemd-networkd`. O perfil Wi-Fi persistente fica em `/etc/NetworkManager/system-connections/` com permissao `0600 root:root`; a senha nao deve ser coletada em evidencias.

## Instalacao offline

O pacote ZIP do NVR e embutido na ISO, e a extracao e feita por Python, sem depender de `unzip` no autoinstall. Os pacotes do appliance ficam em `/nvr-appliance/offline-apt` dentro da ISO e sao copiados para `/opt/nvr-appliance-installer/offline-apt` no sistema instalado.

No primeiro boot, o instalador configura:

```text
deb [trusted=yes] file:/opt/nvr-appliance-installer/offline-apt ./
```

As fontes HTTP/HTTPS do sistema alvo sao desabilitadas quando esse repositorio offline existe. Assim, pacote obrigatorio ausente falha de forma clara, sem tentar baixar da internet.

## Usuario tecnico local

A conta local de console e:

```text
Usuario: nvr-setup
Senha inicial temporaria: Nvr-Setup-2026!
```

A senha precisa ser trocada no primeiro login local. SSH por senha permanece desativado (`allow-pw: false`); a senha e para console fisico. Use chave SSH injetada somente em homologacao controlada.

## Seguranca de disco

Antes do particionamento, a ISO registra `/var/log/installer/nvr-storage-decision.log` e aplica estas regras:

- disco interno unico e vazio: prossegue automaticamente;
- disco com particoes, assinaturas, Windows, Linux ou dados: exige `nvr_wipe_confirm=APAGAR`;
- multiplos discos internos: exige selecao explicita por `nvr_install_disk=/dev/...` ou `nvr_install_disk_serial=...`;
- a decisao final e copiada para `/var/log/nvr/storage-decision.log`.

Exemplo avancado para um disco ja usado:

```text
nvr_wipe_confirm=APAGAR nvr_install_disk_serial=SERIAL_DO_DISCO
```

O iniciador Windows em `scripts/windows/Start-NvrApplianceInstall.ps1` prepara esse fluxo em um USB/ISO gravavel, exige selecionar disco e digitar `APAGAR`, mas nao formata nada dentro do Windows ativo.

## Variaveis e permissoes

`/etc/nvr-appliance/nvr-appliance.env` e copiado no install, forca `root:root` e `0600`, e e validado novamente pelo primeiro boot antes de ser carregado. O log do primeiro boot fica em `/var/log/nvr/first-boot-install.log` com `0600 root:root`.

Variaveis validadas no primeiro boot:

- `INSTALL_ROOT` e `RECORDINGS_ROOT`: caminhos absolutos Linux.
- `HTTP_PORT` e `LOCAL_WEB_PORT`: portas TCP de 1 a 65535 e diferentes entre si.
- `PUBLIC_SCHEME`: `http` ou `https`.
- `PUBLIC_BASE_URL`: vazio ou URL iniciada por `http://`/`https://`.
- `LOCAL_WEB_EXPOSE_LAN`, `LOCAL_WEB_ADMIN_EXPOSE_LAN`, `ENABLE_DEV_SEEDS`, `CREATE_INITIAL_ADMIN`, `ALLOW_TECHNICAL_INITIAL_ADMIN`, `ENABLE_HDMI_KIOSK`, `ALLOW_PARTIAL_INSTALL`, `REBOOT_AFTER_FIRST_BOOT`: `0` ou `1`.
- `LOCAL_WEB_ALLOWED_CIDRS` e `LOCAL_WEB_ADMIN_ALLOWED_CIDRS`: listas simples de CIDRs.

No fluxo ISO de producao, `ALLOW_PARTIAL_INSTALL=1` aborta. Se `LOCAL_WEB_ADMIN_EXPOSE_LAN=1`, defina `LOCAL_WEB_ADMIN_TOKEN` forte fora da ISO.

`CREATE_INITIAL_ADMIN=0` e o padrao de producao. `CREATE_INITIAL_ADMIN=1` so e aceito como contingencia tecnica explicita quando acompanhado de `ALLOW_TECHNICAL_INITIAL_ADMIN=1`; isso nao substitui ativacao por serial/licenca no fluxo normal.

## Primeiro boot e reinicializacao

A unidade `nvr-first-boot-install.service` roda uma vez, condicionada a ausencia de `/var/lib/nvr/FIRST_BOOT_DONE`. Apos instalar e passar na verificacao de saude, o script grava o marcador, desabilita a unidade e, por padrao, agenda reinicializacao (`REBOOT_AFTER_FIRST_BOOT=1`) para concluir a primeira inicializacao com os servicos finais.

Use `REBOOT_AFTER_FIRST_BOOT=0` somente para diagnostico controlado.

## Validacao apos reinicializacao

```bash
sudo journalctl -u nvr-first-boot-install.service --no-pager
sudo tail -n 200 /var/log/nvr/first-boot-install.log
test -f /var/lib/nvr/FIRST_BOOT_DONE
sudo REQUIRE_FIRST_BOOT_MARKER=1 bash /opt/nvr/scripts/appliance/healthcheck.sh
systemctl is-enabled nvr-stack.target platform-scheduler.timer nvr-log-rotate.timer
systemctl status nvr-stack.target nvr-platform.target nvr-gateway.target platform-queue gateway-bootstrap gateway-daemon gateway-local-web --no-pager
systemctl status platform-scheduler.timer nvr-log-rotate.timer --no-pager
sudo find /var/lib/nvr/secrets -maxdepth 1 -type f -exec stat -c '%a %U:%G %n' {} +
sudo stat -c '%a %U:%G %n' /etc/nvr-appliance/nvr-appliance.env /var/log/nvr/first-boot-install.log
```
