Iniciar aplicação automaticamente com Windows Server (NSSM + sc.exe)

Configure sua aplicação Node, Python ou Java pra subir sozinha após reboot do Windows Server usando NSSM como serviço — passo a passo executável.

Toda aplicação em produção precisa sobreviver a reboots. Atualizações de segurança do Windows, queda de energia, manutenção do hipervisor — qualquer um desses eventos derruba o servidor, e se sua aplicação Node, Python ou Java estiver rodando dentro de uma sessão interativa (node server.js num terminal aberto), ela morre junto e não volta sozinha.

A solução correta no Windows é registrar a aplicação como serviço do sistema. Serviços rodam na sessão 0 — isolada de qualquer login interativo —, sobem automaticamente no boot, reiniciam em caso de falha e expõem controles padronizados (sc start, sc stop, Get-Service). Este tutorial cobre o caminho mais usado pra aplicações que não nasceram como serviço Windows nativo: o NSSM (Non-Sucking Service Manager).

Tempo estimado: 15 a 20 minutos, incluindo verificação. Persona-alvo: desenvolvedor que já tem a aplicação rodando manualmente no servidor e quer torná-la persistente.

Pré-requisitos

O que você precisa antes de começar

Windows Server 2019, 2022 ou 2025 com acesso RDP de administrador. Sua aplicação já testada e rodando manualmente (node app.js, python app.py, java -jar app.jar). Caminho absoluto do executável (Node, Python, JRE) e do script de entrada anotados. PowerShell aberto como administrador.

SO testado Windows Server 2019/2022/2025
NSSM versão 2.24 (estável)
Privilégio necessário Administrator local
Porta da aplicação Sua escolha (ex: 3000)

Confirme antes de seguir que a aplicação roda quando você executa o comando manualmente no PowerShell e responde na porta esperada — transformar em serviço não corrige bug de configuração da aplicação em si.

Baixe e instale o NSSM

NSSM é um binário standalone (nssm.exe) — não tem instalador MSI nem dependências. A forma mais limpa é colocá-lo em C:\Tools\nssm\ e adicionar ao PATH do sistema.

01

Crie o diretório de ferramentas e baixe o NSSM pelo PowerShell:

New-Item -ItemType Directory -Force -Path C:\Tools\nssm
Invoke-WebRequest -Uri "https://nssm.cc/release/nssm-2.24.zip" -OutFile C:\Tools\nssm.zip
Expand-Archive -Path C:\Tools\nssm.zip -DestinationPath C:\Tools\nssm-temp
Copy-Item C:\Tools\nssm-temp\nssm-2.24\win64\nssm.exe C:\Tools\nssm\
Remove-Item C:\Tools\nssm.zip, C:\Tools\nssm-temp -Recurse -Force

O arquivo nssm.exe agora vive em C:\Tools\nssm\nssm.exe. Use sempre a build win64 em servidores modernos.

02

Adicione o NSSM ao PATH do sistema pra chamar nssm de qualquer diretório:

$old = [Environment]::GetEnvironmentVariable("Path", "Machine")
[Environment]::SetEnvironmentVariable("Path", "$old;C:\Tools\nssm", "Machine")

Feche o PowerShell e abra de novo pra recarregar o PATH. Confirme com nssm version — deve responder NSSM version 2.24.

Verifique a integridade do download

Se o servidor está exposto à internet, vale checar o hash SHA256 do arquivo baixado contra o publicado em nssm.cc. Binários executáveis baixados sem verificação são vetor clássico de comprometimento — vale o minuto extra.

Registre sua aplicação como serviço

Com NSSM disponível, cada serviço é configurado com nssm install <Nome> (modo GUI) ou nssm install <Nome> <executável> <argumentos> (modo headless). Vou mostrar o modo headless porque é reproduzível, versionável e funciona em Server Core.

01

Instale o serviço apontando pro interpretador e o script. Substitua os caminhos pelos da sua aplicação:

nssm install MeuApp "C:\Program Files\nodejs\node.exe" "C:\apps\meuapp\server.js"

Pra aplicações Python:

nssm install MeuApp "C:\Python312\python.exe" "C:\apps\meuapp\app.py"

Pra aplicações Java:

nssm install MeuApp "C:\Program Files\Java\jdk-21\bin\java.exe" "-jar C:\apps\meuapp\app.jar"

O nome do serviço (MeuApp) é o que aparece em services.msc e no sc query. Use nomes descritivos sem espaços.

02

Configure o diretório de trabalho da aplicação. Sem isso, caminhos relativos no código (logs, arquivos de config, módulos) quebram porque o serviço inicia em C:\Windows\System32 por default:

nssm set MeuApp AppDirectory "C:\apps\meuapp"

Esse é o erro de configuração mais comum em primeira instalação. Anote: AppDirectory sempre aponta pro diretório que contém o script de entrada.

03

Defina variáveis de ambiente que a aplicação espera. NSSM aceita múltiplas variáveis separadas por \0 (escape literal), ou você seta uma de cada vez:

nssm set MeuApp AppEnvironmentExtra "NODE_ENV=production" "PORT=3000" "DATABASE_URL=postgres://..."

Variáveis sensíveis (tokens, senhas) podem ir aqui, mas considere que o registro do Windows é legível por qualquer admin. Pra secrets de verdade, prefira ler de arquivo .env protegido por ACL ou de um cofre.

04

Configure logs de stdout e stderr — sem isso, qualquer mensagem que a aplicação imprime simplesmente some:

New-Item -ItemType Directory -Force -Path C:\apps\meuapp\logs
nssm set MeuApp AppStdout "C:\apps\meuapp\logs\stdout.log"
nssm set MeuApp AppStderr "C:\apps\meuapp\logs\stderr.log"
nssm set MeuApp AppRotateFiles 1
nssm set MeuApp AppRotateOnline 1
nssm set MeuApp AppRotateBytes 10485760

AppRotateBytes 10485760 rotaciona quando o arquivo atinge 10 MB. Sem rotação, um log esquecido cresce até encher o disco.

05

Configure política de restart em caso de crash. NSSM oferece três modos: Restart (default — sempre reinicia), Ignore (não faz nada) e Exit (não reinicia). Pra produção, mantenha o default mas ajuste o delay:

nssm set MeuApp AppExit Default Restart
nssm set MeuApp AppRestartDelay 5000

Delay de 5 segundos evita loop de crash apertado consumindo CPU se a aplicação está quebrando logo no startup.

Inicie e configure auto-start

Com tudo configurado, falta marcar o serviço pra subir no boot e iniciá-lo agora pela primeira vez como serviço.

01

Marque o serviço como Automatic (sobe no boot) e configure dependências de rede:

sc config MeuApp start= auto
sc config MeuApp depend= Tcpip/Dnscache

O espaço depois do = é obrigatório — sintaxe peculiar do sc.exe. A dependência garante que a pilha TCP/IP e o cliente DNS estejam prontos antes do serviço iniciar — sem isso, aplicações que fazem lookup DNS no startup falham aleatoriamente no boot.

02

Inicie o serviço agora:

nssm start MeuApp

Você deve ver MeuApp: START: The operation completed successfully.. Se receber erro, pule pra seção de verificação abaixo antes de seguir.

Conta de execução dedicada

Em ambientes mais maduros, evite rodar como LocalSystem (default). Crie uma conta local de serviço (net user svc_meuapp <senha> /add), conceda só as permissões NTFS necessárias no diretório da app e use nssm set MeuApp ObjectName .\svc_meuapp <senha>. Comprometimento da aplicação fica contido — não escala pra SYSTEM.

Verificação

Antes de considerar a tarefa pronta, valide três coisas: serviço respondeu ao start, aplicação está respondendo na porta esperada, e o boot real reinicia tudo sozinho.

01

Confirme que o serviço está rodando:

Get-Service MeuApp

A coluna Status deve mostrar Running e StartType deve ser Automatic. Se aparecer Stopped, abra C:\apps\meuapp\logs\stderr.log — o erro real da aplicação está lá.

02

Teste o endpoint da aplicação:

Invoke-WebRequest http://localhost:3000 -UseBasicParsing | Select-Object StatusCode, Content

Substitua a porta pela que você configurou. Resposta 200 OK confirma que está atendendo dentro da sessão 0 corretamente.

03

Reinicie o servidor pra validar o auto-start de verdade. Esta é a única forma confiável de garantir que vai funcionar amanhã quando você não estiver olhando:

Restart-Computer -Force

Reconecte por RDP após uns 60 segundos e rode Get-Service MeuApp de novo. Status Running sem você ter feito nada = configuração correta.

Resolução de problemas

Serviço inicia mas para imediatamente

Causa quase sempre é AppDirectory incorreto ou variável de ambiente faltando. Abra stderr.log — a stack trace da aplicação está lá. Pra debug interativo, rode o comando exato que o NSSM rodaria a partir de um PowerShell admin: cd C:\apps\meuapp; & "C:\Program Files\nodejs\node.exe" server.js. Se quebra, é problema da app, não do NSSM.

Erro “The service did not respond to the start or control request in a timely fashion”

A aplicação levou mais de 30 segundos pra abrir a porta de listen. Aplicações Java grandes ou Python com lazy import podem encostar nesse limite. Aumente o timeout do Windows:

nssm set MeuApp AppThrottle 10000
sc config MeuApp obj= LocalSystem

Pra raiz do problema, considere mover initialização pesada pra background depois do bind da porta.

Logs vazios mesmo com aplicação crashando

Verifique se o processo está realmente escrevendo em stdout/stderr e não em arquivo próprio. Algumas libs de log (Winston, Log4j) precisam de configuração explícita pra mandar pro stdout. Confirme também que o usuário do serviço tem permissão NTFS de escrita em C:\apps\meuapp\logs.

Próximos passos

Com a aplicação rodando como serviço persistente, vale endurecer o ambiente:

  • Configure regra no Windows Defender Firewall liberando só a porta da aplicação (New-NetFirewallRule -DisplayName "MeuApp" -Direction Inbound -LocalPort 3000 -Protocol TCP -Action Allow)
  • Coloque um IIS ou um reverse proxy (Caddy, nginx pra Windows) na frente pra terminar TLS e adicionar HTTP/2
  • Configure backup automático do diretório da aplicação e do registro do serviço (nssm dump MeuApp > C:\backup\meuapp-service.cmd)
  • Monitore o serviço externamente — Get-Service confirma só que o processo está vivo, não que está respondendo corretamente

Se você está colocando isso em produção, uma VPS Hostini com Windows Server pré-configurado entrega RDP estável e snapshots agendados antes de cada deploy, então rollback de configuração de serviço é uma operação de minutos, não horas.

Perguntas frequentes

Posso usar Task Scheduler em vez de NSSM?

Sim, mas com limitações. Task Scheduler com trigger "At startup" funciona pra scripts simples, porém não reinicia o processo se ele crashar, não captura stdout/stderr em arquivo e não roda na sessão 0 isolada. NSSM resolve esses três pontos por padrão. Para aplicações de produção, NSSM ou sc.exe com binário nativo Windows Service são a escolha correta.

O serviço precisa rodar como Administrador?

Não. Use a conta LocalSystem (default do NSSM) ou crie uma conta de serviço dedicada com privilégios mínimos. Rodar como Administrador é desnecessário pra maioria das aplicações web — bastam permissões de leitura no diretório do código e escrita no diretório de logs.

Como vejo os logs da aplicação depois que ela vira serviço?

NSSM redireciona stdout e stderr pros arquivos configurados em AppStdout e AppStderr. Configure rotação com AppRotateFiles=1, AppRotateBytes=10485760 (10 MB) pra evitar log infinito. Eventos do próprio serviço (start, stop, crash) ficam em Event Viewer → Windows Logs → Application.

A aplicação inicia antes da rede estar pronta — como evito?

Configure a dependência do serviço com `sc config NomeServico depend= Tcpip/Dnscache/LanmanWorkstation`. Isso força o Windows a iniciar o serviço só depois que TCP/IP, DNS Client e a estação de rede estiverem prontos. NSSM também tem opção AppStopMethodSkip pra controle fino do shutdown.

Posso instalar várias instâncias da mesma aplicação em portas diferentes?

Sim. Crie um serviço NSSM por instância com nomes distintos (MeuApp-3000, MeuApp-3001) e use AppParameters ou variáveis de ambiente (AppEnvironmentExtra PORT=3001) pra diferenciar. Cada serviço gerencia seu processo independentemente.

NSSM funciona em Windows Server Core (sem GUI)?

Sim. Toda interação com NSSM pode ser feita via linha de comando — `nssm install`, `nssm set`, `nssm start`. A GUI (nssm install sem argumentos) só abre se houver shell gráfico disponível. Core é totalmente suportado.

Tópicos:
Próximos passos Cloud Ryzen com NVMe e proteção DDoS sempre ativa.Coloque em produção numa VPS Hostini →
Esse tutorial foi útil?
Falar no WhatsApp