- Reorganiza layout da tela de dispositivos admin - Renomeia secao "Controles do dispositivo" para "Atalhos" - Adiciona botao de Tickets com badge de quantidade - Simplifica textos de botoes (Acesso, Resetar) - Remove email da maquina do cabecalho - Move empresa e status para mesma linha - Remove chip de Build do resumo - Corrige deteccao de VRAM para GPUs >4GB usando nvidia-smi - Adiciona prefixo "VRAM" na exibicao de memoria da GPU - Documenta sincronizacao RustDesk 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
4.2 KiB
Desktop (Tauri) - Sincronizacao RustDesk com Backend
Este documento descreve o mecanismo de sincronizacao automatica do RustDesk com o backend apos o provisionamento no aplicativo desktop.
Visao Geral
O fluxo de sincronizacao do RustDesk garante que as credenciais de acesso remoto (ID e senha) sejam automaticamente registradas no backend assim que o RustDesk for provisionado na maquina. Isso elimina a necessidade de cadastro manual e permite acesso remoto imediato.
Arquitetura
Fluxo de Provisionamento
1. Usuario clica "Registrar" no app desktop
2. TypeScript faz POST /api/machines/register
3. TypeScript salva token/config no store local
4. TypeScript inicia RustDesk em background (fire-and-forget)
5. TypeScript redireciona IMEDIATAMENTE para o sistema
6. [Background] Rust provisiona RustDesk (~30s)
7. [Background] Rust faz POST /api/machines/remote-access (SYNC)
8. [Background] Rust atualiza lastSyncedAt no store
Por que o Sync e feito no Rust?
| Problema anterior | Solucao Rust |
|---|---|
CSP do Tauri bloqueava fetch() |
Rust usa reqwest diretamente, sem CSP |
| Race conditions com React state | Fluxo sincrono no Rust |
| Fire-and-forget nao completava | Sync acontece antes do return |
| Timeout do navegador | Rust tem controle total do HTTP |
Implementacao
Arquivo: apps/desktop/src-tauri/src/rustdesk.rs
O sync e executado automaticamente apos o provisionamento bem-sucedido:
// Apos salvar dados do RustDesk no store local
sync_remote_access_with_backend(&result)?;
Payload da API
{
"machineToken": "<token-da-maquina>",
"provider": "RustDesk",
"identifier": "<id-do-rustdesk>",
"password": "<senha-permanente>",
"notes": "Versao: 1.4.4. Provisionado em: 1765045637482"
}
Headers
Content-Type: application/jsonIdempotency-Key: <machineId>:RustDesk:<rustdeskId>(previne duplicatas)
Endpoint
POST /api/machines/remote-access
Arquivos de Configuracao
Store Local
Caminho: %LOCALAPPDATA%\br.com.esdrasrenan.sistemadechamados\machine-agent.json
Estrutura relevante:
{
"config": {
"machineId": "...",
"apiBaseUrl": "https://tickets.esdrasrenan.com.br"
},
"token": "...",
"rustdesk": {
"id": "497869711",
"password": "...",
"installedVersion": "1.4.4",
"lastProvisionedAt": 1765045637482,
"lastSyncedAt": 1765045638173,
"lastError": null
}
}
Logs
Caminho: %LOCALAPPDATA%\br.com.esdrasrenan.sistemadechamados\logs\rustdesk.log
Mensagens de sucesso:
[...] Iniciando sincronizacao com backend...
[...] Sync com backend OK: status 200 OK
[...] Acesso remoto sincronizado com backend
Diagnostico
Verificar se o Sync Funcionou
-
Abrir
machine-agent.json:%LOCALAPPDATA%\br.com.esdrasrenan.sistemadechamados\machine-agent.json -
Verificar campo
rustdesk.lastSyncedAt:- Se tem valor numerico: sync OK
- Se
null: sync falhou
-
Verificar logs:
%LOCALAPPDATA%\br.com.esdrasrenan.sistemadechamados\logs\rustdesk.log
Possiveis Erros
| Erro | Causa | Solucao |
|---|---|---|
400 Bad Request |
Payload incorreto | Verificar schema da API |
401 Unauthorized |
Token invalido/expirado | Re-registrar maquina |
Connection refused |
Backend indisponivel | Verificar URL da API |
lastSyncedAt: null |
Sync nao executou | Verificar logs do Rust |
Fallback Manual
Se o sync automatico falhar, o sistema tenta novamente a cada 30 segundos em background. Tambem e possivel forcar o re-provisionamento via:
- Aba "Configuracoes" no app desktop
- Clicar "Reprovisionar RustDesk"
Historico de Mudancas
Dezembro 2025 - Migracao do Sync para Rust
Problema: O sync feito em TypeScript (fetch()) falhava com "Failed to fetch" devido ao CSP do Tauri v2 bloquear requisicoes externas do webview.
Solucao: Mover o sync para o Rust, que faz HTTP diretamente via reqwest sem restricoes de CSP.
Arquivos modificados:
apps/desktop/src-tauri/src/rustdesk.rs- Adicionadosync_remote_access_with_backend()apps/desktop/src/main.tsx- Simplificado para fire-and-forget
Ultima atualizacao: Dezembro 2025 - Sync automatico via Rust apos provisionamento.