sistema-de-chamados/docs/desktop/rustdesk-sync.md
esdrasrenan 23e7cf58ae Redesenho da UI de dispositivos e correcao de VRAM
- 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>
2025-12-06 17:01:40 -03:00

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/json
  • Idempotency-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

  1. Abrir machine-agent.json:

    %LOCALAPPDATA%\br.com.esdrasrenan.sistemadechamados\machine-agent.json
    
  2. Verificar campo rustdesk.lastSyncedAt:

    • Se tem valor numerico: sync OK
    • Se null: sync falhou
  3. 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:

  1. Aba "Configuracoes" no app desktop
  2. 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 - Adicionado sync_remote_access_with_backend()
  • apps/desktop/src/main.tsx - Simplificado para fire-and-forget

Ultima atualizacao: Dezembro 2025 - Sync automatico via Rust apos provisionamento.