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

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
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.
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.
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.
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
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.



