198 lines
6.9 KiB
Markdown
198 lines
6.9 KiB
Markdown
# V-Fire Monitor
|
|
|
|
Aplicacao Flask para monitoramento de centrais Notifier via Modbus/TCP, com painel web, descoberta de pontos, integracao com Zabbix e licenciamento por hardware.
|
|
|
|
## O que mudou nesta refatoracao
|
|
|
|
- Persistencia JSON com escrita atomica e migracao de configuracao legada.
|
|
- Login com hash de senha em vez de senha em texto puro no arquivo de configuracao.
|
|
- Alteracao de credenciais pelo proprio painel, sem editar arquivo manualmente.
|
|
- Chave secreta do Flask persistida localmente, sem valor fixo no codigo.
|
|
- Cookies de sessao e headers HTTP endurecidos para operacao web basica em producao.
|
|
- Protecao CSRF para login e APIs mutaveis.
|
|
- Validacao de payloads da API e respostas de erro consistentes.
|
|
- Validacao de IPs de nodes e validacao do serial antes de gravar a licenca.
|
|
- Logging basico para diagnostico, no lugar de falhas silenciosas.
|
|
- Polling Modbus e discovery por blocos, reduzindo chamadas individuais.
|
|
- Healthcheck publico e endpoint autenticado com status operacional do monitor.
|
|
- Shutdown mais limpo da thread de monitoramento.
|
|
- Frontend com assets locais, sem dependencia de CDN externa.
|
|
- Gerador de licenca com argumentos de linha de comando e validacao de data.
|
|
|
|
## Estrutura
|
|
|
|
- `monitor.py`: entrypoint simples da aplicacao Flask.
|
|
- `simulator_nfs320.py`: simulador Modbus/TCP local de uma central NFS-320 para testes.
|
|
- `vfire_monitor/__init__.py`: app factory e bootstrap da aplicacao.
|
|
- `vfire_monitor/core.py`: regras de negocio, persistencia, licenca e engine de monitoramento.
|
|
- `vfire_monitor/routes.py`: rotas web e APIs.
|
|
- `generator.py`: gerador de serial de licenca.
|
|
- `static/`: assets locais de interface carregados pela aplicacao.
|
|
- `templates/`: telas do login e dashboard.
|
|
- `tests/`: suite inicial de testes automatizados.
|
|
- `config_nodes.json`: configuracao persistida da aplicacao.
|
|
- `mapa_dispositivos.json`: mapa de dispositivos descobertos.
|
|
- `license.key`: serial instalado localmente.
|
|
- `app_secret.key`: segredo de sessao gerado automaticamente na primeira execucao.
|
|
|
|
## Requisitos
|
|
|
|
- Python 3.10+
|
|
- Conectividade com as centrais via Modbus/TCP
|
|
- Acesso ao servidor Zabbix, quando a integracao estiver habilitada
|
|
- Para instalacao automatizada da stack completa, Debian 13 (trixie)
|
|
|
|
Instalacao:
|
|
|
|
```bash
|
|
pip install -r requirements.txt
|
|
```
|
|
|
|
## Variaveis de ambiente
|
|
|
|
Veja `.env.example`.
|
|
|
|
As principais:
|
|
|
|
- `VFM_DEFAULT_PASSWORD`: senha inicial do usuario `admin` na primeira carga do sistema.
|
|
- `VFM_APP_SECRET`: opcional, substitui o segredo salvo em `app_secret.key`.
|
|
- `VFM_LICENSE_MASTER_KEY`: chave mestre do licenciamento. Em producao, use esta variavel e remova a dependencia da chave legada.
|
|
- `VFM_ENV`: use `production` para obrigar `VFM_LICENSE_MASTER_KEY` no startup.
|
|
- `VFM_LOG_LEVEL`: nivel de log, por exemplo `INFO` ou `DEBUG`.
|
|
- `VFM_SESSION_COOKIE_SECURE`: force cookie `Secure`, recomendado atras de HTTPS.
|
|
- `VFM_TRUST_PROXY`: habilita `ProxyFix` quando houver reverse proxy na frente.
|
|
- `VFM_MAX_CONTENT_LENGTH`: limite maximo do corpo HTTP em bytes.
|
|
- `HOST`: host HTTP do processo Flask.
|
|
- `PORT`: porta HTTP da aplicacao.
|
|
|
|
Cada central aceita:
|
|
|
|
- `nome`
|
|
- `ip`
|
|
- `unit`
|
|
- `port`: opcional na integracao Modbus, default `502`
|
|
|
|
## Execucao
|
|
|
|
```bash
|
|
python monitor.py
|
|
```
|
|
|
|
O sistema sobe em `http://0.0.0.0:8080` por padrao.
|
|
|
|
Healthcheck:
|
|
|
|
```bash
|
|
curl http://127.0.0.1:8080/healthz
|
|
```
|
|
|
|
Status operacional autenticado:
|
|
|
|
```bash
|
|
curl http://127.0.0.1:8080/api/system/status
|
|
```
|
|
|
|
## Instalador Debian 13
|
|
|
|
O repositorio inclui um instalador para Debian 13 que provisiona:
|
|
|
|
- `V-Fire Monitor` como servico `systemd`
|
|
- `PostgreSQL`
|
|
- `Zabbix Server + frontend Nginx`
|
|
- `Grafana`
|
|
- importacao automatica do template `Notifier NFS320`
|
|
- criacao automatica do host monitorado no Zabbix
|
|
- datasource do Grafana apontando para o Zabbix
|
|
- dashboard inicial de planta baixa e icones SVG locais
|
|
|
|
Arquivos:
|
|
|
|
- [installer/install_debian13.sh](/mnt/c/Users/Syllas/Documents/V-Fire-Monitor/installer/install_debian13.sh)
|
|
- [installer/vfire-stack.env.example](/mnt/c/Users/Syllas/Documents/V-Fire-Monitor/installer/vfire-stack.env.example)
|
|
- [serve.py](/mnt/c/Users/Syllas/Documents/V-Fire-Monitor/serve.py): entrypoint de producao do app com Waitress
|
|
- [docs/INSTALACAO_DEBIAN13.md](/mnt/c/Users/Syllas/Documents/V-Fire-Monitor/docs/INSTALACAO_DEBIAN13.md)
|
|
- [docs/LICENCIAMENTO.md](/mnt/c/Users/Syllas/Documents/V-Fire-Monitor/docs/LICENCIAMENTO.md)
|
|
- [docs/GRAFANA_PLANTA_BAIXA.md](/mnt/c/Users/Syllas/Documents/V-Fire-Monitor/docs/GRAFANA_PLANTA_BAIXA.md)
|
|
- [floorplan/floorplan-map.example.json](/mnt/c/Users/Syllas/Documents/V-Fire-Monitor/floorplan/floorplan-map.example.json)
|
|
- [tools/build_floorplan_bundle.py](/mnt/c/Users/Syllas/Documents/V-Fire-Monitor/tools/build_floorplan_bundle.py)
|
|
|
|
Fluxo recomendado:
|
|
|
|
1. Copie `installer/vfire-stack.env.example` para `installer/vfire-stack.env`.
|
|
2. Ajuste senhas, hostname e `VFM_LICENSE_MASTER_KEY`.
|
|
3. Opcionalmente valide em dry-run:
|
|
|
|
```bash
|
|
./installer/install_debian13.sh --dry-run ./installer/vfire-stack.env
|
|
```
|
|
|
|
4. Execute como `root` no Debian 13:
|
|
|
|
```bash
|
|
chmod +x installer/install_debian13.sh
|
|
./installer/install_debian13.sh ./installer/vfire-stack.env
|
|
```
|
|
|
|
Portas padrao do instalador:
|
|
|
|
- `V-Fire Monitor`: `8088`
|
|
- `Zabbix frontend`: `8080`
|
|
- `Grafana`: `3000`
|
|
|
|
Ao final, o instalador grava um resumo em `/root/vfire-stack-summary.txt`.
|
|
|
|
## Geracao de licenca
|
|
|
|
Modo interativo:
|
|
|
|
```bash
|
|
python generator.py
|
|
```
|
|
|
|
Modo por argumentos:
|
|
|
|
```bash
|
|
python generator.py --hwid "UUID-DO-CLIENTE" --cliente "Cliente" --expira 2026-12-31
|
|
```
|
|
|
|
## Simulador NFS-320
|
|
|
|
Para testar sem uma central fisica:
|
|
|
|
```bash
|
|
python simulator_nfs320.py --host 127.0.0.1 --port 1502
|
|
```
|
|
|
|
Depois, no painel do V-Fire Monitor, cadastre uma central com:
|
|
|
|
- `Nome`: `Sim NFS320`
|
|
- `IP`: `127.0.0.1`
|
|
- `Unit`: `3`
|
|
- `Porta`: `1502`
|
|
|
|
O simulador publica detectores, modulos e um painel repetidor com estados alternando entre normal, incidente, ack e removido.
|
|
|
|
## Observacoes operacionais
|
|
|
|
- A senha do painel fica armazenada como hash em `config_nodes.json`.
|
|
- O serial de licenca e validado antes de ser salvo em `license.key`.
|
|
- Em Linux, `app_secret.key` e `license.key` passam a ser gravados com permissao privada (`0600`).
|
|
- O painel exige token CSRF em login e chamadas mutaveis da API.
|
|
- Se existir configuracao antiga com `web_password`, ela e migrada automaticamente para `web_password_hash`.
|
|
- Em ambiente de desenvolvimento, o sistema ainda aceita a chave de licenca legada embutida para manter compatibilidade.
|
|
- Em ambiente de producao (`VFM_ENV=production`), `VFM_LICENSE_MASTER_KEY` passa a ser obrigatoria e o sistema falha no startup sem ela.
|
|
- A interface web usa assets locais em `static/`, sem dependencia de internet para carregar CSS e JS.
|
|
|
|
## Testes
|
|
|
|
Executar:
|
|
|
|
```bash
|
|
python3 -m pytest
|
|
```
|
|
|
|
## Proximos passos recomendados
|
|
|
|
- Adicionar testes cobrindo polling Modbus e integracao com Zabbix com doubles dedicados.
|
|
- Separar configuracao e logging em modulos proprios se a aplicacao continuar crescendo.
|