Instalación de Statping-ng: Monitorización y Página de Estado

Statping-ng es una herramienta de monitorización de servicios autoalojada que genera automáticamente una página de estado pública con estadísticas de uptime, tiempos de respuesta y notificaciones multicanal. Sucesor activo del proyecto Statping original, ofrece despliegue simplificado mediante Docker, soporte para múltiples bases de datos y una API REST completa para integraciones en servidores Linux.

Requisitos Previos

  • Ubuntu 20.04/22.04 o CentOS/Rocky Linux 8+
  • Docker Engine 20.10+ y Docker Compose (recomendado)
  • Al menos 512 MB de RAM (1 GB recomendado)
  • SQLite (por defecto), MySQL 8.0+ o PostgreSQL 14+ (para producción)
  • Nginx para proxy inverso con SSL
  • Acceso root o usuario con privilegios sudo

Instalación con Docker

Docker Compose es el método recomendado para producción:

# Crear directorio para Statping-ng
mkdir -p /opt/statping && cd /opt/statping

# Crear docker-compose.yml con PostgreSQL
cat > docker-compose.yml << 'EOF'
version: '3.8'

services:
  # Base de datos PostgreSQL
  db:
    image: postgres:15-alpine
    restart: unless-stopped
    environment:
      POSTGRES_USER: statping
      POSTGRES_PASSWORD: statping_secure_pass
      POSTGRES_DB: statping
    volumes:
      - pg_data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U statping"]
      interval: 10s
      timeout: 5s
      retries: 5

  # Aplicación Statping-ng
  statping:
    image: adamboutcher/statping-ng:latest
    restart: unless-stopped
    ports:
      - "8080:8080"
    environment:
      DB_CONN: postgres
      DB_HOST: db
      DB_PORT: 5432
      DB_DATABASE: statping
      DB_USER: statping
      DB_PASS: statping_secure_pass
      NAME: "Estado de Servicios"
      DESCRIPTION: "Monitorización en tiempo real de nuestra infraestructura"
      DOMAIN: https://status.mi-dominio.com
      IS_DOCKER: true
    volumes:
      - statping_data:/app
    depends_on:
      db:
        condition: service_healthy

volumes:
  pg_data:
  statping_data:
EOF

# Iniciar los servicios
docker-compose up -d

# Ver los logs de inicio
docker-compose logs -f statping

Para una instalación más simple con SQLite:

# Docker simple con SQLite (ideal para pruebas)
docker run -d \
    --name statping \
    -p 8080:8080 \
    -v /opt/statping/data:/app \
    -e NAME="Mis Servicios" \
    -e DESCRIPTION="Panel de estado" \
    -e DOMAIN="http://localhost:8080" \
    --restart unless-stopped \
    adamboutcher/statping-ng:latest

Instalación Binaria

Para instalación directa sin Docker:

# Detectar arquitectura del sistema
ARCH=$(uname -m)
if [ "$ARCH" = "x86_64" ]; then ARCH="amd64"; fi

# Descargar el binario más reciente
STATPING_VERSION=$(curl -s https://api.github.com/repos/statping-ng/statping-ng/releases/latest | grep tag_name | cut -d '"' -f 4)
curl -L "https://github.com/statping-ng/statping-ng/releases/download/${STATPING_VERSION}/statping-linux-${ARCH}.tar.gz" -o statping.tar.gz

# Extraer e instalar
tar -xzf statping.tar.gz
sudo mv statping /usr/local/bin/
sudo chmod +x /usr/local/bin/statping

# Verificar instalación
statping version

# Crear usuario del sistema
sudo useradd -r -s /bin/false statping
sudo mkdir -p /opt/statping
sudo chown statping:statping /opt/statping

# Crear archivo de entorno
sudo cat > /etc/statping/env << 'EOF'
# Configuración de Statping-ng
NAME=Estado de Servicios
DESCRIPTION=Panel de monitorización
DOMAIN=https://status.mi-dominio.com
DB_CONN=sqlite
EOF

# Crear servicio systemd
sudo cat > /etc/systemd/system/statping.service << 'EOF'
[Unit]
Description=Statping-ng Status Page
After=network.target

[Service]
Type=simple
User=statping
WorkingDirectory=/opt/statping
EnvironmentFile=/etc/statping/env
ExecStart=/usr/local/bin/statping
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target
EOF

sudo systemctl daemon-reload
sudo systemctl enable statping
sudo systemctl start statping

Configuración de Servicios

Añadir servicios a monitorizar desde la interfaz web o la API:

# Token de API disponible en: Configuración > API Token

# Crear servicio HTTP
curl -X POST http://localhost:8080/api/services \
    -H "Authorization: Bearer TU_TOKEN_API" \
    -H "Content-Type: application/json" \
    -d '{
        "name": "Sitio Web Principal",
        "domain": "https://mi-dominio.com",
        "type": "http",
        "method": "GET",
        "expected_status": 200,
        "interval": 30,
        "timeout": 10,
        "check_type": "http",
        "public": true,
        "notify_all": true
    }'

# Crear servicio de comprobación TCP (puerto)
curl -X POST http://localhost:8080/api/services \
    -H "Authorization: Bearer TU_TOKEN_API" \
    -H "Content-Type: application/json" \
    -d '{
        "name": "Base de Datos MySQL",
        "domain": "db.mi-dominio.com",
        "port": 3306,
        "type": "tcp",
        "interval": 60,
        "timeout": 5,
        "public": false
    }'

# Crear servicio ICMP (ping)
curl -X POST http://localhost:8080/api/services \
    -H "Authorization: Bearer TU_TOKEN_API" \
    -H "Content-Type: application/json" \
    -d '{
        "name": "Servidor de Correo",
        "domain": "mail.mi-dominio.com",
        "type": "icmp",
        "interval": 60
    }'

# Listar todos los servicios
curl -s http://localhost:8080/api/services \
    -H "Authorization: Bearer TU_TOKEN_API" | python3 -m json.tool

Canales de Notificación

Configurar notificaciones para alertas de caída:

# Configurar notificaciones por correo (SMTP)
curl -X POST http://localhost:8080/api/notifiers/email \
    -H "Authorization: Bearer TU_TOKEN_API" \
    -H "Content-Type: application/json" \
    -d '{
        "enabled": true,
        "host": "smtp.gmail.com",
        "port": 587,
        "username": "[email protected]",
        "password": "mi_password_app",
        "send_resolve": true
    }'

# Configurar notificaciones a Slack
curl -X POST http://localhost:8080/api/notifiers/slack \
    -H "Authorization: Bearer TU_TOKEN_API" \
    -H "Content-Type: application/json" \
    -d '{
        "enabled": true,
        "host": "https://hooks.slack.com/services/T.../B.../...",
        "send_resolve": true
    }'

# Configurar webhook genérico
curl -X POST http://localhost:8080/api/notifiers/webhook \
    -H "Authorization: Bearer TU_TOKEN_API" \
    -H "Content-Type: application/json" \
    -d '{
        "enabled": true,
        "host": "https://mi-sistema.com/webhook/alertas",
        "port": 443,
        "method": "POST",
        "send_resolve": true
    }'

# Probar las notificaciones configuradas
curl -X POST http://localhost:8080/api/notifiers/email/test \
    -H "Authorization: Bearer TU_TOKEN_API"

Temas Personalizados

Personalizar el aspecto de la página de estado:

# Acceder a la configuración de temas desde el panel admin
# Configuración > Tema

# CSS personalizado (desde el panel web)
cat > /tmp/custom-theme.css << 'EOF'
/* Tema personalizado para la página de estado */

:root {
    --primary-color: #2563eb;
    --success-color: #16a34a;
    --warning-color: #d97706;
    --danger-color: #dc2626;
}

/* Personalizar el encabezado */
.navbar {
    background-color: var(--primary-color) !important;
}

/* Estilo de los badges de estado */
.badge-success {
    background-color: var(--success-color);
}

/* Personalizar el pie de página */
footer {
    text-align: center;
    padding: 20px;
    color: #6b7280;
}
EOF

# El CSS se puede añadir desde:
# Panel Admin > Configuración > Tema > CSS personalizado

# Variables de entorno para personalización básica
# En docker-compose.yml o archivo .env:
# NAME="Estado de Nuestros Servicios"
# DESCRIPTION="Monitorización en tiempo real"
# DOMAIN=https://status.mi-dominio.com

Uso de la API

La API REST de Statping-ng permite integraciones completas:

# Obtener estadísticas generales
curl -s http://localhost:8080/api \
    -H "Authorization: Bearer TU_TOKEN_API" | python3 -m json.tool

# Obtener uptime de un servicio específico
curl -s http://localhost:8080/api/services/1 \
    -H "Authorization: Bearer TU_TOKEN_API"

# Crear un incidente manualmente
curl -X POST http://localhost:8080/api/incidents \
    -H "Authorization: Bearer TU_TOKEN_API" \
    -H "Content-Type: application/json" \
    -d '{
        "title": "Mantenimiento programado",
        "description": "Actualización del sistema de base de datos este domingo de 2:00 a 4:00 AM",
        "started_on": "2024-03-10T02:00:00Z",
        "created_at": "2024-03-08T10:00:00Z"
    }'

# Obtener historial de fallos de un servicio
curl -s "http://localhost:8080/api/services/1/failures" \
    -H "Authorization: Bearer TU_TOKEN_API"

# Script de automatización: crear incidente desde monitorización externa
cat > /usr/local/bin/statping-alert.sh << 'EOF'
#!/bin/bash
# Crear incidente en Statping-ng desde script externo

SERVICE_ID=$1
MESSAGE=$2
STATPING_URL="http://localhost:8080/api"
TOKEN="TU_TOKEN_API"

# Registrar fallo en el servicio
curl -s -X POST "$STATPING_URL/services/${SERVICE_ID}/failures" \
    -H "Authorization: Bearer $TOKEN" \
    -H "Content-Type: application/json" \
    -d "{\"issue\": \"$MESSAGE\"}"
EOF

chmod +x /usr/local/bin/statping-alert.sh

Configuración de Producción

Proxy Nginx con SSL para producción:

# Instalar Certbot para SSL
sudo apt-get install -y certbot python3-certbot-nginx

# Crear configuración Nginx
sudo cat > /etc/nginx/sites-available/statping << 'EOF'
# Proxy para Statping-ng con SSL
server {
    listen 80;
    server_name status.mi-dominio.com;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;
    server_name status.mi-dominio.com;
    
    # Certificados SSL (gestionados por Certbot)
    ssl_certificate /etc/letsencrypt/live/status.mi-dominio.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/status.mi-dominio.com/privkey.pem;
    ssl_protocols TLSv1.2 TLSv1.3;
    
    # Configuración del proxy
    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_buffering off;
        
        # WebSocket para actualizaciones en tiempo real
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}
EOF

sudo ln -s /etc/nginx/sites-available/statping /etc/nginx/sites-enabled/
sudo nginx -t

# Obtener certificado SSL
sudo certbot --nginx -d status.mi-dominio.com

# Recargar Nginx
sudo systemctl reload nginx

Configurar copias de seguridad automáticas:

# Script de backup para Statping-ng con Docker
cat > /usr/local/bin/backup-statping.sh << 'EOF'
#!/bin/bash
# Backup de Statping-ng

BACKUP_DIR="/opt/backups/statping"
DATE=$(date +%Y%m%d-%H%M%S)

mkdir -p "$BACKUP_DIR"

# Backup del volumen de datos
docker run --rm \
    -v statping_statping_data:/source \
    -v "$BACKUP_DIR":/backup \
    alpine tar czf "/backup/statping-data-${DATE}.tar.gz" -C /source .

# Backup de la base de datos PostgreSQL
docker exec statping-db-1 pg_dump -U statping statping \
    | gzip > "$BACKUP_DIR/statping-db-${DATE}.sql.gz"

# Eliminar backups de más de 30 días
find "$BACKUP_DIR" -name "*.gz" -mtime +30 -delete

echo "Backup completado: $DATE"
EOF

chmod +x /usr/local/bin/backup-statping.sh
echo "0 3 * * * root /usr/local/bin/backup-statping.sh" | sudo tee /etc/cron.d/statping-backup

Solución de Problemas

Statping no arranca después de reiniciar:

# Verificar logs del contenedor
docker-compose logs statping --tail=30

# Verificar que la base de datos está accesible
docker-compose exec db pg_isready -U statping

# Reiniciar solo el servicio de statping
docker-compose restart statping

La página de estado no carga:

# Verificar que el servicio responde localmente
curl -sv http://localhost:8080/health

# Verificar configuración de Nginx
sudo nginx -t
sudo tail -f /var/log/nginx/error.log

Los servicios aparecen siempre como caídos:

# Verificar conectividad de red desde el contenedor
docker exec statping-statping-1 curl -sv https://mi-dominio.com

# Revisar el timeout configurado (puede ser muy bajo)
# Aumentar timeout en la configuración del servicio

Conclusión

Statping-ng es una solución completa y ligera para monitorización de servicios y página de estado pública que requiere mínimos recursos del sistema. Su API REST permite integraciones con cualquier sistema de alertas existente, mientras que el soporte para múltiples canales de notificación garantiza que el equipo sea informado inmediatamente ante cualquier incidencia. El despliegue con Docker y PostgreSQL proporciona una base robusta para entornos de producción con alta disponibilidad.