feat(desktop-agent,admin/inventory): secure token storage via keyring; extended inventory collectors per OS; new /api/machines/inventory endpoint; posture rules + tickets; Admin UI inventory with filters, search and export; docs + CI desktop release

This commit is contained in:
Esdras Renan 2025-10-09 22:08:20 -03:00
parent c2050f311a
commit 479c66d52c
18 changed files with 1205 additions and 38 deletions

View file

@ -134,6 +134,20 @@ healthcheck:
Observação: o CI já força `docker service update --force` após `stack deploy` e passa `RELEASE_SHA` no ambiente para variar a spec em todo commit, assegurando rollout.
## App Desktop (Tauri)
- Build local por SO:
- Linux: `pnpm -C apps/desktop tauri build`
- Windows/macOS: executar o mesmo comando no respectivo sistema (o Tauri gera .msi/.dmg/.app).
- Por padrão, o executável em modo release usa `https://tickets.esdrasrenan.com.br` como `APP_URL` e `API_BASE_URL`.
- Para customizar, crie `apps/desktop/.env` com `VITE_APP_URL` e `VITE_API_BASE_URL`.
- Saída dos pacotes: `apps/desktop/src-tauri/target/release/bundle/`.
### Alertas de postura (opcional)
- Variáveis de ambiente para geração automática de tickets em alertas de postura (CPU alta, serviço parado, SMART em falha):
- `MACHINE_ALERTS_CREATE_TICKETS=true|false` (padrão: true)
- `MACHINE_ALERTS_TICKET_REQUESTER_EMAIL=admin@sistema.dev` (usuário solicitante dos tickets automáticos)
### Dashboard (opcional)
Você pode expor o painel do Convex para inspeção em produção.
@ -263,7 +277,7 @@ Benefícios
- `MAILER_SENDER_EMAIL` com erro de parsing:
- Adicionar aspas no `.env`.
- `pnpm` reclama de workspace:
- `pnpm-workspace.yaml` já aponta só para `.` (evita apps/desktop no deploy).
- O `pnpm-workspace.yaml` inclui `apps/desktop`. No deploy do web isso não impacta pois usamos filtros/paths do projeto. Se preferir isolar, ajuste para apenas `.`.
- Portainer erro de bind relativo:
- Usar caminho absoluto `/srv/apps/sistema:/app` no stack (feito).
- Prisma CLI “not found”:

View file

@ -16,7 +16,7 @@
- `.github/workflows/ci-cd-web-desktop.yml` — pipeline de deploy web + desktop + deploy do Convex.
- `docs/OPERACAO-PRODUCAO.md` — runbook de operação (deploy, seeds, CI/CD, troubleshooting).
- `docs/SETUP-HISTORICO.md` — este histórico.
- `pnpm-workspace.yaml`restrito a `packages: ['.']` para evitar o apps/desktop no deploy (corrige lockfile/CI).
- `pnpm-workspace.yaml`inclui `packages: ['.', 'apps/desktop']` para permitir comandos e builds do desktop. No deploy do web usamos filtros/paths; se preferir isolar, volte para apenas `'.'`.
- `scripts/deploy-from-git.sh` — fallback de deploy pullbased na VPS (sem Actions).
## Gestão de .env
@ -60,8 +60,8 @@
- Solução: `NPM_CONFIG_PRODUCTION=false` e `pnpm install --prod=false` no container de build.
5) Lockfile/Workspace quebrando CI
- Causa: incluir `apps/desktop` no workspace.
- Solução: `pnpm-workspace.yaml` com `packages: ['.']`.
- Causa: conflito de versões quando o desktop entrou no workspace.
- Solução: hoje mantemos `['.', 'apps/desktop']` e usamos filtros no CI/deploy. Alternativa: isolar o desktop fora do workspace.
6) Bind relativo no Swarm/Portainer
- Causa: `./:/app` vira path inválido.
@ -86,4 +86,3 @@
- Fixar versão do `convex-backend` (ao invés de `latest`) para releases mais controladas.
- Substituir bindmount por imagens construídas no CI (tempo de deploy menor, reprodutibilidade).
- Adicionar cache de dependências pnpm no container de build.

View file

@ -0,0 +1,31 @@
# Admin UI — Inventário por máquina
A página Admin > Máquinas agora exibe um inventário detalhado e pesquisável do parque, com filtros e exportação.
## Filtros e busca
- Busca livre por hostname, e-mail, MAC e número de série.
- Filtro por status: Online, Offline, Desconhecido.
- Filtro por sistema operacional (OS).
- Filtro por empresa (slug).
- Marcação “Somente com alertas” para investigar postura.
## Painel de detalhes
- Resumo: hostname, status, e-mail vinculado, SO/arch, sincronização do token (expiração/uso).
- Métricas recentes: CPU/Memory/Disco.
- Inventário básico: hardware (CPU/mem/serial), rede (IP/MAC), labels.
- Discos e partições: nome, mount, FS, capacidade, livre.
- Inventário estendido (varia por SO):
- Linux: SMART (OK/ALERTA), `lspci`, `lsusb` (texto), `lsblk` (interno para discos).
- Windows: serviços (amostra), softwares instalados (amostra), Defender.
- macOS: pacotes (`pkgutil`), serviços (`launchctl`).
- Postura/Alertas: CPU alta, serviço parado, SMART em falha com severidade e última avaliação.
## Exportação
- Copiar JSON: copia para a área de transferência todo o inventário exibido (métricas + inventário + alertas).
- Exportar JSON: baixa um arquivo `inventario-<hostname>.json` com os dados atuais.
## Notas
- Os dados vêm de duas fontes:
- Agente desktop (Tauri): envia inventário básico + estendido por SO via `POST /api/machines/heartbeat`.
- FleetDM (osquery): opcionalmente, via webhook `POST /api/integrations/fleet/hosts`.
- Postura é avaliada no servidor (Convex) a cada heartbeat/upsert. Tickets automáticos podem ser gerados se habilitado.

46
docs/desktop-build.md Normal file
View file

@ -0,0 +1,46 @@
# Build do App Desktop (Tauri)
Guia rápido para gerar instaladores do app desktop em cada sistema operacional.
## Prérequisitos
- Node.js 20+ e pnpm (Corepack habilitado):
- `corepack enable && corepack prepare pnpm@9 --activate`
- Rust toolchain (stable) instalado.
- Dependências nativas por SO:
- Linux (Debian/Ubuntu):
```bash
sudo apt update && sudo apt install -y \
libwebkit2gtk-4.1-dev build-essential curl wget file \
libxdo-dev libssl-dev libayatana-appindicator3-dev librsvg2-dev
```
- Windows: Visual Studio Build Tools + WebView2 Runtime.
- macOS: Xcode Command Line Tools.
## Configuração de URLs
- Produção: por padrão o app usa `https://tickets.esdrasrenan.com.br`.
- Desenvolvimento: crie `apps/desktop/.env` a partir de `apps/desktop/.env.example` e ajuste:
```
VITE_APP_URL=http://localhost:3000
VITE_API_BASE_URL=
```
## Comandos de build
- Linux/macOS/Windows (rodar no próprio sistema):
```bash
pnpm -C apps/desktop tauri build
```
- Apenas frontend (Vite):
```bash
pnpm -C apps/desktop build
```
Saída de artefatos: `apps/desktop/src-tauri/target/release/bundle/`.
## Dicas
- Primeira compilação do Rust pode demorar (download de crates e linkedição).
- Se o linkeditor for lento no Linux, considere instalar `lld` e usar:
```bash
RUSTFLAGS="-Clink-arg=-fuse-ld=lld" pnpm -C apps/desktop tauri build
```
- Para logs detalhados em dev, rode `pnpm -C apps/desktop tauri dev`.

View file

@ -14,6 +14,7 @@
- Web atual permanece operacional com login por usuário/senha.
- Novas features serão adições compatíveis (machine login opcional).
- Melhor abordagem para inventário: usar **osquery + FleetDM** (stack pronta) integrando registros no Convex.
- Agente desktop coleta inventário básico + estendido por SO (Linux: dpkg/rpm + systemd + lsblk/lspci/lsusb/smartctl; Windows: WMI/registry via PowerShell; macOS: system_profiler/pkgutil/launchctl) e envia via heartbeat e/ou `/api/machines/inventory`.
## Marcos & Progresso
| Macro-entrega | Status | Observações |
@ -22,6 +23,7 @@
| Projeto Tauri inicial apontando para UI Next | 🔄 Em andamento | Estrutura `apps/desktop` criada; pendente testar build após instalar toolchain Rust. |
| Schema Convex + tokens de máquina | ✅ Concluído | Tabelas `machines` / `machineTokens` criadas com TTL e fingerprint. |
| API de registro/heartbeat e exchange Better Auth | 🔄 Em andamento | Endpoints `/api/machines/*` disponíveis; falta testar fluxo end-to-end com app desktop. |
| Endpoint upsert de inventário dedicado | ✅ Concluído | `POST /api/machines/inventory` (modo por token ou provisioningSecret). |
| Integração FleetDM → Convex (inventário básico) | 🔄 Em andamento | Endpoint `/api/integrations/fleet/hosts` criado; falta validar payload real e ajustes de métricas/empresa. |
| Admin > Máquinas (listagem, detalhes, métricas) | ✅ Concluído | Página `/admin/machines` exibe parque completo com status ao vivo, inventário e métricas. |
| Ajustes na UI/Next para sessão por máquina | ⏳ A fazer | Detectar token e exibir info da máquina em tickets. |
@ -38,8 +40,9 @@ Legenda: ✅ concluído · 🔄 em andamento · ⏳ a fazer.
- **Infra extra:** Endpoints públicos para updater do Tauri, armazenamento de inventário seguro, certificados para assinatura de builds.
## Próximos Passos Imediatos
1. Instalar toolchain Tauri local (Rust + dependências nativas) e testar `pnpm --filter appsdesktop tauri dev` apontando para o Next (`pnpm dev`).
2. Detalhar fluxo de provisioning de máquina no Convex e atualizar este documento.
1. Finalizar coletores específicos para Windows/macOS (ajustes finos e parse de dados).
2. Adicionar UI administrativa para visualizar inventário estendido e alertas de postura por máquina.
3. Refinar regras (janela temporal para CPU alta, whitelists de serviços, severidades por SMART).
## Notas de Implementação (Atual)
- Criada pasta `apps/desktop` via `create-tauri-app` com template `vanilla-ts`.