Sobre o projeto
UniPlateTracker é um dashboard privado de auto-hospedagem para rastrear placas de veículos capturadas por câmeras UniFi Protect. Ele recebe eventos de detecção enviados pelo NVR do UniFi via webhooks, os registra em um banco de dados PostgreSQL e os apresenta por meio de uma interface web para visualização, pesquisa e análise da atividade dos veículos. Miniaturas e arquivos de vídeo permanecem no servidor do usuário, com uma consulta opcional ao DVLA do Reino Unido como a única fonte de dados externa descrita.
O que ele faz
- Processamento de eventos em tempo real: as detecções de placas chegam de webhooks do UniFi Protect e são processadas à medida que ocorrem.
- Captura de vídeo sob demanda: um trabalhador Node.js independente grava um curto clipe para cada detecção a partir do stream RTSP da câmera, com buffering pré e pós-evento gerenciado por um processo separado de gerenciamento de buffer.
- Integração opcional com o DVLA (Reino Unido): busca detalhes do veículo, como marca, cor, status de imposto e MOT. Um modo internacional desativa os recursos específicos do Reino Unido, permitindo que o aplicativo seja executado em outras regiões, embora placas não pertencentes ao Reino Unido mostrem "Desconhecido" a menos que ENABLE_INTERNATIONAL_API esteja configurado.
- Painel de administração: uma área de administração protegida com gráficos e estatísticas de uso, além de contas de administração hierárquicas, onde o administrador inicial pode conceder ou revogar acesso a outros administradores; essas ações são escritas em um log de auditoria para revisão.
- Tabela de detecções: densa e classificável, destinada a ser lida rapidamente. A classificação e a filtragem são executadas no banco de dados, de modo que a ordem se aplica a todo o conjunto de resultados, e não apenas à página atual, e a tabela se ajusta a uma lista de cartões em telas estreitas.
- Destaque de status: veículos com imposto pago e MOT válido permanecem visualmente discretos, enquanto veículos com vencimento, sem imposto e SORN são destacados; "sem registro no DVLA" é mostrado como um chip distinto, oco e tracejado, para que informações ausentes nunca sejam lidas como um resultado limpo.
- Acessibilidade: controles rotulados, classificação e paginação operáveis por teclado, aria-sort na tabela e suporte a prefers-reduced-motion. O projeto afirma ter sido auditado com zero violações. O modo claro e escuro segue as preferências do sistema.
Pilha de tecnologia
Next.js 16 (App Router) com TypeScript, React 19, Tailwind CSS v4 e shadcn/ui; rotas de API do Next.js ao lado de um trabalhador/gerenciador de buffer Node.js independente; PostgreSQL para armazenamento; FFmpeg para processamento de vídeo; integrações com webhooks do UniFi Protect e a API do DVLA. Como o Tailwind v4 obtém seu tema do CSS, não há tailwind.config.ts — os tokens de design, as placas e os estilos de status estão no bloco @theme de src/app/globals.css.
Implantação
A linha de base documentada é o Debian 12 com uma câmera UVC-AI-Pro (versão do dispositivo 5.1.57) e UniFi Protect 9.4.19, com a observação de que outras configurações devem funcionar. Dois métodos são descritos:
- Instalação manual: instale Node.js 20+, PostgreSQL e FFmpeg; copie o arquivo de exemplo de ambiente para .env.local e preencha os valores, como POSTGRES_URL e SESSION_SECRET; crie os diretórios de buffer e de captura final se a captura de vídeo estiver habilitada; instale as dependências para o aplicativo e o trabalhador; execute npm run db:init para criar tabelas e registrar o primeiro e-mail de administrador; compile e inicie o aplicativo, mantendo-o persistente com o PM2, se desejar.
- Docker: baixe o arquivo compose e o modelo de ambiente, renomeie-o para .env.local, forneça POSTGRES_URL, SESSION_SECRET e NEXTAUTH_URL (usando o IP de rede do servidor, não localhost), execute um contêiner único para inicializar o banco de dados e criar o primeiro administrador, depois puxe e inicie com o Docker Compose. A interface web é documentada na porta 3000 e o endpoint do webhook na porta 4000.
No UniFi Protect, um alarme é criado em Settings > System > Other Settings > Alarm Manager, acionado por ID > LPR para veículos desconhecidos e conhecidos, com escopo para as câmeras LPR, e apontado para a URL /webhook do aplicativo com miniaturas habilitadas.
Notas de solução de problemas do README
As detecções podem mostrar "No clip" porque a detecção e a captura são caminhos separados: o webhook escreve a linha enquanto o trabalhador grava a partir do RTSP, então a captura pode falhar enquanto as detecções continuam chegando. As verificações sugeridas são a data do arquivo mais recente em VIDEO_FINAL_CAPTURE_PATH, se o FFmpeg ainda está instalado e no caminho esperado, se as credenciais da câmera ou a URL do RTSP ainda são válidas, se ambos os processos de fundo estão vivos e se o usuário que executa o aplicativo pode ler o diretório de captura. Um tile "No clip" tracejado significa que um clipe era esperado, mas estava ausente, enquanto um ícone de câmera liso significa que a detecção nunca fez referência a um. As solicitações de vídeo e miniatura retornam 404 a menos que os nomes de arquivo contenham apenas letras, dígitos, pontos, hífens e sublinhados com extensões .mp4 ou .jpg, e qualquer caminho que mude quando normalizado é recusado, de modo que a travessia de diretório falha em vez de escapar do diretório de captura. Os detalhes do veículo mostrando "Desconhecido" significam que o DVLA não possui registro para aquela matrícula ou que a consulta falhou.
Comments
0 Rating appears after 10 ratings
Sign in to join the discussion.