Add production installer and observability tooling
This commit is contained in:
@@ -0,0 +1,123 @@
|
||||
# Grafana e Planta Baixa
|
||||
|
||||
Este guia cobre o uso do Grafana com o `V-Fire Monitor` para dashboards baseados em planta baixa.
|
||||
|
||||
## Arquivos de apoio
|
||||
|
||||
- [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)
|
||||
|
||||
## O que o instalador ja deixa pronto
|
||||
|
||||
Na instalacao Debian 13:
|
||||
|
||||
- plugin Zabbix do Grafana instalado
|
||||
- datasource `Zabbix` provisionado
|
||||
- dashboard inicial `V-Fire Floorplan Starter`
|
||||
- icones SVG servidos pelo proprio `V-Fire Monitor`
|
||||
|
||||
## URLs dos icones
|
||||
|
||||
Substitua `SEU_HOST` pelo host do V-Fire Monitor.
|
||||
|
||||
- `http://SEU_HOST:8088/static/grafana-icons/detector-smoke.svg`
|
||||
- `http://SEU_HOST:8088/static/grafana-icons/detector-heat.svg`
|
||||
- `http://SEU_HOST:8088/static/grafana-icons/module-input.svg`
|
||||
- `http://SEU_HOST:8088/static/grafana-icons/siren.svg`
|
||||
- `http://SEU_HOST:8088/static/grafana-icons/panel-nfs320.svg`
|
||||
|
||||
## Dashboard inicial
|
||||
|
||||
O instalador provisiona a pasta `V-Fire` no Grafana e um dashboard chamado:
|
||||
|
||||
- `V-Fire Floorplan Starter`
|
||||
|
||||
Esse dashboard serve como ponto de partida e lembra as URLs dos icones.
|
||||
|
||||
## Formato versionavel da planta
|
||||
|
||||
Para nao depender apenas de arrastar elementos manualmente no Grafana, o repositorio agora inclui um formato JSON de mapa de planta.
|
||||
|
||||
Campos principais:
|
||||
|
||||
- `title`
|
||||
- `grafana_dashboard_uid`
|
||||
- `background_image_url`
|
||||
- `vfire_base_url`
|
||||
- `zabbix_host`
|
||||
- `items`
|
||||
|
||||
Cada item descreve:
|
||||
|
||||
- `id`
|
||||
- `label`
|
||||
- `item_key`
|
||||
- `icon`
|
||||
- `x`
|
||||
- `y`
|
||||
- `width`
|
||||
- `height`
|
||||
- `rotation`
|
||||
|
||||
## Gerar bundle normalizado
|
||||
|
||||
Exemplo:
|
||||
|
||||
```bash
|
||||
python3 tools/build_floorplan_bundle.py floorplan/floorplan-map.example.json
|
||||
```
|
||||
|
||||
Isso gera um arquivo `.bundle.json` com:
|
||||
|
||||
- URLs completas dos icones
|
||||
- referencia do host do Zabbix
|
||||
- referencias dos `item_key`
|
||||
- coordenadas prontas para uso em futuras automacoes
|
||||
|
||||
## Montando a planta baixa
|
||||
|
||||
Abordagem recomendada:
|
||||
|
||||
1. Abra o dashboard `V-Fire Floorplan Starter`
|
||||
2. Crie ou edite um painel do tipo `Canvas`
|
||||
3. Defina a imagem de fundo com a planta baixa do local
|
||||
4. Adicione elementos visuais ou imagens representando cada ponto
|
||||
5. Use os SVGs do `V-Fire Monitor` como base visual
|
||||
6. Associe cada elemento ao item correspondente no datasource `Zabbix`
|
||||
|
||||
## Como mapear itens
|
||||
|
||||
Os itens que o app envia ao Zabbix seguem chaves como:
|
||||
|
||||
- `notifier.status[NomeDoPonto]`
|
||||
- `notifier.comm[NomeDoPonto]`
|
||||
- `node.status[NomeDaCentral]`
|
||||
|
||||
Os nomes dos pontos sao descobertos automaticamente a partir do monitoramento.
|
||||
|
||||
## Estrategia recomendada de planta baixa
|
||||
|
||||
- use a planta como imagem base
|
||||
- posicione um icone por detector, modulo ou sirene
|
||||
- use cor dinamica para refletir estado
|
||||
- crie uma legenda simples com:
|
||||
- normal
|
||||
- incidente
|
||||
- ack
|
||||
- removido
|
||||
- offline
|
||||
|
||||
## Observacao pratica
|
||||
|
||||
O instalador nao conhece a planta baixa real do cliente.
|
||||
|
||||
Por isso, ele consegue deixar:
|
||||
|
||||
- Grafana integrado
|
||||
- datasource pronto
|
||||
- dashboard inicial provisionado
|
||||
- icones prontos
|
||||
- formato versionavel da planta baixa
|
||||
- bundle normalizado para futuras importacoes
|
||||
|
||||
Mas o posicionamento exato dos elementos na planta baixa ainda precisa ser feito conforme o layout real da instalacao.
|
||||
@@ -0,0 +1,186 @@
|
||||
# Instalacao no Debian 13
|
||||
|
||||
Este guia cobre a instalacao da stack completa em uma maquina dedicada com:
|
||||
|
||||
- `V-Fire Monitor`
|
||||
- `PostgreSQL`
|
||||
- `Zabbix Server + frontend`
|
||||
- `Grafana`
|
||||
|
||||
## Visao geral
|
||||
|
||||
O instalador provisiona:
|
||||
|
||||
- app em `/opt/vfire-monitor`
|
||||
- dados persistentes em `/var/lib/vfire-monitor`
|
||||
- logs do app em `/var/log/vfire-monitor/app.log`
|
||||
- servico `systemd` do V-Fire Monitor
|
||||
- template do Zabbix importado automaticamente
|
||||
- host monitorado do Zabbix criado automaticamente
|
||||
- datasource do Grafana apontando para o Zabbix
|
||||
- dashboard inicial do Grafana provisionado
|
||||
|
||||
Portas padrao:
|
||||
|
||||
- `V-Fire Monitor`: `8088`
|
||||
- `Zabbix frontend`: `8080`
|
||||
- `Grafana`: `3000`
|
||||
|
||||
## Requisitos
|
||||
|
||||
- Debian 13 (`trixie`)
|
||||
- acesso `root`
|
||||
- internet para baixar pacotes
|
||||
- portas livres para os servicos
|
||||
- chave `VFM_LICENSE_MASTER_KEY` se a instalacao for de producao
|
||||
|
||||
## Arquivos do instalador
|
||||
|
||||
- [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)
|
||||
|
||||
## Passo 1: preparar configuracao
|
||||
|
||||
Copie o arquivo de exemplo:
|
||||
|
||||
```bash
|
||||
cp installer/vfire-stack.env.example installer/vfire-stack.env
|
||||
```
|
||||
|
||||
Edite `installer/vfire-stack.env`.
|
||||
|
||||
Campos minimos que voce deve revisar:
|
||||
|
||||
- `PUBLIC_HOSTNAME`
|
||||
- `VFM_DEFAULT_PASSWORD`
|
||||
- `VFM_LICENSE_MASTER_KEY`
|
||||
- `ZABBIX_DB_PASSWORD`
|
||||
- `ZABBIX_ADMIN_PASSWORD`
|
||||
- `GRAFANA_ADMIN_PASSWORD`
|
||||
|
||||
Se voce quiser testar sem chave mestre, pode usar:
|
||||
|
||||
```env
|
||||
ALLOW_LEGACY_LICENSE_KEY=1
|
||||
```
|
||||
|
||||
Isso e aceitavel para laboratorio. Para producao, use `VFM_LICENSE_MASTER_KEY`.
|
||||
|
||||
## Passo 2: validar em dry-run
|
||||
|
||||
Antes de instalar de verdade:
|
||||
|
||||
```bash
|
||||
chmod +x installer/install_debian13.sh
|
||||
./installer/install_debian13.sh --dry-run ./installer/vfire-stack.env
|
||||
```
|
||||
|
||||
Esse modo mostra as principais acoes sem executar a instalacao real.
|
||||
|
||||
## Passo 3: executar a instalacao
|
||||
|
||||
Como `root`:
|
||||
|
||||
```bash
|
||||
./installer/install_debian13.sh ./installer/vfire-stack.env
|
||||
```
|
||||
|
||||
## Passo 4: validar os servicos
|
||||
|
||||
Verifique:
|
||||
|
||||
```bash
|
||||
systemctl status vfire-monitor
|
||||
systemctl status zabbix-server
|
||||
systemctl status grafana-server
|
||||
systemctl status nginx
|
||||
```
|
||||
|
||||
Healthchecks HTTP:
|
||||
|
||||
```bash
|
||||
curl http://127.0.0.1:8088/healthz
|
||||
curl -I http://127.0.0.1:8080/
|
||||
curl -I http://127.0.0.1:3000/login
|
||||
```
|
||||
|
||||
## Passo 5: acessar os paineis
|
||||
|
||||
Substitua `SEU_HOST` pelo hostname ou IP do servidor.
|
||||
|
||||
V-Fire Monitor:
|
||||
|
||||
```text
|
||||
http://SEU_HOST:8088
|
||||
```
|
||||
|
||||
Zabbix:
|
||||
|
||||
```text
|
||||
http://SEU_HOST:8080
|
||||
```
|
||||
|
||||
Grafana:
|
||||
|
||||
```text
|
||||
http://SEU_HOST:3000
|
||||
```
|
||||
|
||||
## Credenciais
|
||||
|
||||
O instalador grava um resumo em:
|
||||
|
||||
```text
|
||||
/root/vfire-stack-summary.txt
|
||||
```
|
||||
|
||||
Esse arquivo inclui:
|
||||
|
||||
- URL do V-Fire Monitor
|
||||
- senha inicial do painel
|
||||
- senha do Admin do Zabbix
|
||||
- senha do admin do Grafana
|
||||
- credenciais do banco do Zabbix
|
||||
- nome do template do Zabbix
|
||||
- nome do host do Zabbix
|
||||
|
||||
## Estrutura final
|
||||
|
||||
Arquivos principais apos instalar:
|
||||
|
||||
- codigo: `/opt/vfire-monitor`
|
||||
- dados: `/var/lib/vfire-monitor`
|
||||
- ambiente: `/etc/default/vfire-monitor`
|
||||
- servico: `/etc/systemd/system/vfire-monitor.service`
|
||||
|
||||
## Operacoes comuns
|
||||
|
||||
Reiniciar o app:
|
||||
|
||||
```bash
|
||||
systemctl restart vfire-monitor
|
||||
```
|
||||
|
||||
Ver log do app:
|
||||
|
||||
```bash
|
||||
tail -f /var/log/vfire-monitor/app.log
|
||||
```
|
||||
|
||||
Reiniciar Zabbix:
|
||||
|
||||
```bash
|
||||
systemctl restart zabbix-server nginx
|
||||
```
|
||||
|
||||
Reiniciar Grafana:
|
||||
|
||||
```bash
|
||||
systemctl restart grafana-server
|
||||
```
|
||||
|
||||
## Observacoes
|
||||
|
||||
- o instalador foi desenhado para Debian 13
|
||||
- o app roda com Waitress, nao com o servidor de desenvolvimento do Flask
|
||||
- o frontend do app usa assets locais, sem depender de CDN
|
||||
@@ -0,0 +1,113 @@
|
||||
# Licenciamento
|
||||
|
||||
Este guia cobre a geracao e a instalacao de licenca do `V-Fire Monitor`.
|
||||
|
||||
## Como o licenciamento funciona
|
||||
|
||||
A licenca vincula:
|
||||
|
||||
- `HWID` da maquina
|
||||
- nome do cliente
|
||||
- data de expiracao
|
||||
|
||||
O serial e salvo em `license.key`.
|
||||
|
||||
## Modos de chave
|
||||
|
||||
Existem dois cenarios:
|
||||
|
||||
1. `Chave mestre via VFM_LICENSE_MASTER_KEY`
|
||||
2. `Chave legada embutida`
|
||||
|
||||
Para producao, use `VFM_LICENSE_MASTER_KEY`.
|
||||
|
||||
## Identificar o HWID
|
||||
|
||||
Quando o app esta sem licenca, a tela inicial mostra o `Hardware ID`.
|
||||
|
||||
Voce tambem pode coletar no proprio sistema onde o app esta rodando:
|
||||
|
||||
```bash
|
||||
python3 - <<'PY'
|
||||
from vfire_monitor.core import get_hardware_id
|
||||
print(get_hardware_id())
|
||||
PY
|
||||
```
|
||||
|
||||
## Gerar o serial
|
||||
|
||||
Uso por argumentos:
|
||||
|
||||
```bash
|
||||
python3 generator.py --hwid "HWID-DA-MAQUINA" --cliente "Nome do Cliente" --expira 2027-01-01
|
||||
```
|
||||
|
||||
Se `VFM_LICENSE_MASTER_KEY` estiver definida no ambiente, o gerador usa essa chave.
|
||||
|
||||
Se nao estiver definida, ele usa a chave legada embutida.
|
||||
|
||||
## Instalar a licenca pelo painel
|
||||
|
||||
1. Abra o painel do `V-Fire Monitor`
|
||||
2. Na tela de bloqueio, copie o `HWID`
|
||||
3. Gere o serial
|
||||
4. Cole o serial no campo de ativacao
|
||||
5. Clique em `Ativar licenca`
|
||||
|
||||
O backend valida:
|
||||
|
||||
- serial
|
||||
- HWID
|
||||
- data de expiracao
|
||||
|
||||
Se tudo estiver correto, o monitoramento e liberado.
|
||||
|
||||
## Instalar a licenca manualmente no servidor
|
||||
|
||||
Se voce ja tem o serial:
|
||||
|
||||
```bash
|
||||
cat > /var/lib/vfire-monitor/license.key <<'EOF'
|
||||
SEU_SERIAL_AQUI
|
||||
EOF
|
||||
|
||||
chown vfire-monitor:vfire-monitor /var/lib/vfire-monitor/license.key
|
||||
chmod 600 /var/lib/vfire-monitor/license.key
|
||||
systemctl restart vfire-monitor
|
||||
```
|
||||
|
||||
## Validar a licenca instalada
|
||||
|
||||
Exemplo local:
|
||||
|
||||
```bash
|
||||
python3 - <<'PY'
|
||||
from pathlib import Path
|
||||
from vfire_monitor.core import LEGACY_LICENSE_KEY, LicenseService
|
||||
|
||||
service = LicenseService(Path("license.key"), LEGACY_LICENSE_KEY)
|
||||
status = service.verify()
|
||||
print(status.valid, status.message, status.days_remaining, status.hardware_id)
|
||||
PY
|
||||
```
|
||||
|
||||
Se a instalacao de producao usar `VFM_LICENSE_MASTER_KEY`, a validacao deve usar a mesma chave mestre.
|
||||
|
||||
## Quando a licenca falha
|
||||
|
||||
Os erros mais comuns sao:
|
||||
|
||||
- `Licenca ausente`
|
||||
- `Serial invalido`
|
||||
- `HWID incompativel`
|
||||
- `Licenca expirada`
|
||||
|
||||
## Boas praticas
|
||||
|
||||
- use chave mestre por variavel de ambiente em producao
|
||||
- nao distribua a chave legada em ambiente final
|
||||
- mantenha backup de:
|
||||
- `license.key`
|
||||
- `app_secret.key`
|
||||
- `config_nodes.json`
|
||||
- `mapa_dispositivos.json`
|
||||
Reference in New Issue
Block a user