Case study

UniWake

Ferramenta open source para a equipe de TI ligar, monitorar, agendar e desligar pelo navegador os computadores dos laboratórios.

Painel do UniWake com os contadores de máquinas ligadas e desligadas e os cartões de cada sala.
FIG. 01 — Painel do UniWake

Contexto e problema

Ligar e desligar os computadores dos laboratórios é tarefa diária da equipe de TI da instituição de ensino onde trabalho.

Havia duas restrições: não existe servidor dedicado para isso e não é permitido instalar programas nas máquinas dos laboratórios.

Solução

  • Roda como serviço do Windows no PC de quem cuida da TI; o painel abre no navegador.
  • Liga salas inteiras por Wake-on-LAN e confere ao vivo, por ping e TCP, quem acordou.
  • Desliga no modelo pull: uma tarefa agendada em cada máquina, preparada por script PowerShell, pergunta a cada minuto se há ordem. Funciona mesmo com o PC da TI desligado.
  • Agendamentos com exceção de feriados e recessos.
  • Modo equipe: dois ou mais PCs da TI, pareados por código, mantêm o mesmo cadastro pela rede local.
  • Perfis de administrador e operador, auditoria exportável em CSV e backup diário automático.
  • Atualização automática que volta sozinha para a versão anterior se a nova não responder em 2 minutos.
  • Modo demonstração com uma rede de laboratórios simulada, para conhecer o sistema sem enviar nada.

Decisões técnicas

  1. Desligamento por pull, com tarefas agendadas nas máquinas

    Por quê
    Desligar a partir do hub (WMI, WinRM ou shutdown /m) exigiria a mesma senha de administrador em todos os PCs, portas de entrada abertas e o hub ligado na hora do desligamento. Instalar um serviço nas máquinas não era permitido.
    Trade-off
    Ordens manuais levam até cerca de 1 minuto para valer, e cada máquina inicia o PowerShell uma vez por minuto. Softwares de congelamento como o Deep Freeze podem apagar as tarefas.
  2. Modo equipe peer-to-peer, sem coordenador

    Por quê
    Não há servidor para instalar ou manter ligado: um PC que estava desligado se atualiza com qualquer outro que esteja ligado. O pareamento usa SPAKE2 e o transporte, TLS 1.3.
    Trade-off
    Cada PC abre uma porta de entrada, e conflitos de edição são resolvidos pela última escrita.
  3. Node.js 24 e TypeScript no servidor e no painel

    Por quê
    Uma só linguagem e schemas Zod compartilhados entre o servidor e o painel React. A vantagem de um binário único veio do bundle com runtime fixo.
    Trade-off
    O pacote de atualização fica maior (cerca de 35 MB com o runtime) do que um binário em Go.
  4. Atualização verificada por SHA-256, com rollback

    Por quê
    Um processo atualizador separado faz backup do banco antes de trocar a versão e restaura tudo se a nova não responder.
    Trade-off
    O hash publicado na própria release prova integridade, não autoria. Sem assinatura de código, o Windows mostra o aviso do SmartScreen na instalação.

Stack

Servidor
  • Node.js 24
  • TypeScript
  • Fastify
  • Zod
  • SQLite (node:sqlite)
  • SSE
Painel
  • React
  • React Router
  • TanStack Query
  • Tailwind CSS
  • Vite
Máquinas
  • PowerShell
  • Agendador de Tarefas do Windows
  • Wake-on-LAN
Qualidade
  • Vitest
  • Playwright
  • axe
  • Pester
  • PSScriptAnalyzer
  • GitHub Actions
Entrega
  • Inno Setup
  • WinSW (serviço do Windows)

Estado atual

  • Em uso pela equipe de TI do Instituto Pan Americano.
  • Instalador para Windows publicado nas releases do GitHub; a versão atual está na página de releases.
  • Testado em campo em outubro de 2026. As notas de cada release separam o que foi corrigido do que ainda não foi verificado em campo.
  • Decisões de arquitetura registradas no repositório (specs/decisions.md).

Imagens e diagrama

Arquitetura: PCs da TI sincronizados na rede local e máquinas dos laboratórios com tarefa agendadaREDE LOCAL DA TIPC da TI · Aserviço UniWakepainel no navegadorPC da TI · Bserviço UniWakemodo equipesincronizaLABORATÓRIOSMáquinas da salatarefa agendada (PowerShell)agenda dos próximos 14 diasMáquinas de outra salatarefa agendada (PowerShell)agenda dos próximos 14 diasWake-on-LAN (liga)a cada minuto: há ordem?Wake-on-LAN (liga)a cada minuto: há ordem?Linha tracejada: a máquina puxa a ordem (pull). Desligamento agendado acontece mesmo com os PCs da TI desligados.
FIG. 02 — Arquitetura: PCs da TI sincronizados na rede local e máquinas dos laboratórios com tarefa agendada

Dois PCs da TI rodam o serviço UniWake e sincronizam o cadastro pela rede local. Eles enviam o pacote Wake-on-LAN para ligar as máquinas dos laboratórios. Para desligar, a tarefa agendada em cada máquina consulta o PC da TI a cada minuto e guarda a agenda dos próximos 14 dias, então o desligamento agendado acontece mesmo com os PCs da TI desligados.

Painel com contadores de máquinas ligadas, desligadas e desconhecidas e um cartão por sala com o botão Ligar sala.
FIG. 03 — Painel: contadores e salas
Lista de máquinas de uma sala com status Ligado ou Desligado e um painel lateral acompanhando a ligação em andamento. Nomes, IPs e MACs ocultados.
FIG. 04 — Ligar uma sala e acompanhar ao vivo (nomes, IPs e MACs ocultados)
Tela Preparar máquinas com a escolha da sala, o código e o comando PowerShell a executar. Endereço ocultado.
FIG. 05 — Preparar máquinas: sala, código e comando (endereço ocultado)
Tela Modo equipe listando os PCs da TI pareados, a situação de cada um e a última sincronização.
FIG. 06 — Modo equipe: PCs, situação e última sincronização