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:

yaml
# /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:

javascript
# 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:

bash
# 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 dias

Status Page pública

Crie uma página de status pública para comunicar incidentes aos usuários:

nginx
# 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:

bash
# 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

Não quer configurar manualmente?

Implante o VPS em menos de 5 minutos com a Runstack. Infraestrutura da OPEN Datacenter, com servidores em São Paulo.

Perguntas frequentes

UptimeRobot: SaaS, gratuito para 50 monitores com intervalo de 5 min, pago para intervalo de 1 min. Uptime Kuma: self-hosted, gratuito, ilimitado, intervalo de até 20 segundos, seus dados no seu servidor. Para VPS com Uptime Kuma self-hosted: vantagem de privacidade e controle. Desvantagem: se a VPS cair, o monitoramento para, use uma segunda VPS como "guardião".

Sim, mas com uma limitação: se a VPS ficar completamente off, o Uptime Kuma também para. Para esse caso: configure um segundo monitor externo (UptimeRobot free ou uma segunda VPS com Uptime Kuma) apontando para a sua VPS principal.

API REST: GET /api/v1/monitor/{id}/beats retorna o histórico de verificações. Para relatório mensal: export CSV na interface. Para integração com Grafana: Uptime Kuma expõe endpoint de métricas Prometheus em /metrics que pode ser usado como datasource.

Para a maioria dos casos de uso: sim. Um downtime de 20-60 segundos é aceitável para detectar e alertar. Para SLAs com requisitos de segundos de detecção: use um health check mais robusto (ex: múltiplos agents em locais diferentes com agregação).

Sim. Uptime Kuma expõe métricas no formato Prometheus em /metrics (habilite em Settings → Advanced). Adicione como target no Prometheus e crie dashboards no Grafana com os dados de uptime. Assim você tem métricas de disponibilidade junto com métricas de performance no mesmo painel.