Uptime Kuma: monitoramento self-hosted
Uptime Kuma é a alternativa self-hosted ao UptimeRobot — monitora disponibilidade de URLs, portas TCP, containers Docker e serviços DNS, envia alertas por Telegram/Slack/e-mail e gera uma página de status pública. Leve (~50 MB RAM) e com interface moderna, é a primeira ferramenta de monitoramento que qualquer VPS deveria ter.
Instalar Uptime Kuma com Docker Compose
Setup em um único arquivo:
# /opt/uptime-kuma/docker-compose.yml
services:
uptime-kuma:
image: louislam/uptime-kuma:1
restart: always
volumes:
- uptime_kuma_data:/app/data
ports:
- "127.0.0.1:3001:3001" # apenas loopback — acesse via Nginx
volumes:
uptime_kuma_data:
# Subir
docker compose up -d
# Acessar via tunel SSH:
# ssh -L 3001:localhost:3001 deploy@IP_DA_VPS
# Abrir: http://localhost:3001
# Ou expor via Nginx (recomendado):
# server_name status.seudominio.com.br;
# proxy_pass http://localhost:3001;Configurar monitores via API
Após o setup inicial no browser, adicione monitores programaticamente:
# Uptime Kuma tem API REST e WebSocket
# Para automatizar via CLI, use uptime-kuma-api (npm package)
npm install -g uptime-kuma-api
# Ou via script Node.js:
const { UptimeKumaClient } = require("uptime-kuma-api")
const client = new UptimeKumaClient({ baseURL: "http://localhost:3001" })
await client.login("admin", "sua_senha")
// Adicionar monitor HTTP(S)
await client.addMonitor({
type: "http",
name: "API de Produção",
url: "https://api.seudominio.com.br/health",
interval: 60, // verificar a cada 60 segundos
maxretries: 3, // marcar down após 3 falhas
keyword: '"status":"ok"', // verificar conteúdo da resposta
accepted_statuscodes: [["200-299"]],
})
// Monitor TCP (ex: banco de dados)
await client.addMonitor({
type: "tcp",
name: "PostgreSQL",
hostname: "localhost",
port: 5432,
interval: 60,
})Tipos de monitores disponíveis
Uptime Kuma suporta múltiplos tipos de verificação:
# HTTP(S) — verificar status code e tempo de resposta
# Tipo: http — URL: https://seudominio.com.br
# Aceitar: 200-299 — Timeout: 30s
# TCP — verificar se porta está aberta
# Tipo: tcp — Host: localhost — Porta: 5432
# Ping — verificar latência ICMP
# Tipo: ping — Host: 8.8.8.8
# DNS — verificar resolução de domínio
# Tipo: dns — Nome: seudominio.com.br — Resolver: 8.8.8.8
# Docker Container — verificar estado do container
# Tipo: docker — Container ID/Nome: minha_api
# Keyword — verificar conteúdo da resposta
# Tipo: http — URL: /health
# Keyword: "status":"ok" (a resposta deve conter este texto)
# JSON Query — validar resposta JSON
# Tipo: json-query — URL: /health
# Query: $.status == "ok"
# Certificate Expiry — alertar antes do SSL expirar
# Tipo: certificate — URL: https://seudominio.com.br
# Alertar quando faltarem: 14 diasStatus Page pública
Crie uma página de status pública para comunicar incidentes aos usuários:
# Via interface Grafana: Status Pages → New Status Page
# Configurações:
# - Slug: status (URL será: status.seudominio.com.br)
# - Título: Status dos Serviços
# - Selecionar monitores a exibir (pode escolher um subset)
# - Mostrar histórico: últimos 90 dias
# - Incident management: criar e comunicar incidentes
# Nginx para a status page:
server {
listen 443 ssl;
server_name status.seudominio.com.br;
ssl_certificate /etc/letsencrypt/live/status.seudominio.com.br/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/status.seudominio.com.br/privkey.pem;
location / {
proxy_pass http://localhost:3001;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade"; # necessário para WebSocket
proxy_set_header Host $host;
}
}Configurar notificações Telegram
Configure alertas instantâneos via Telegram:
# Via interface: Settings → Notifications → Add Notification
# Telegram:
# - Notification Type: Telegram
# - Bot Token: SEU_TOKEN_DO_BOTFATHER
# - Chat ID: SEU_CHAT_ID (ou ID do grupo negativo)
# - Mensagem customizada: disponível com variáveis
# Template de mensagem:
# 🔴 [DOWN] {{ monitor.name }}
# URL: {{ monitor.url }}
# Reason: {{ msg }}
# Duração: {{ duration }}
# Time: {{ time }}
# Ou 🟢 [UP] {{ monitor.name }} — duração do downtime: {{ duration }}
# Associar notificação a monitores específicos:
# Monitor → Edit → Notifications → selecionar a notificação configurada$ runstack deploy --plan starter
Não quer configurar manualmente?
Não quer configurar manualmente? Implante o VPS em menos de 3 minutos com a Runstack. Infraestrutura da OPEN DATACENTER, com servidores no Brasil.