Initial commit: MSP Monitor Dashboard

- Next.js 14 frontend with dark cyan/navy theme
- tRPC API with Prisma ORM
- MeshCentral, LibreNMS, Headwind MDM integrations
- Multi-tenant architecture
- Alert system with email/SMS/webhook notifications
- Docker Compose deployment
- Complete documentation
This commit is contained in:
MSP Monitor
2026-01-21 19:29:20 +00:00
commit f4491757d9
57 changed files with 10503 additions and 0 deletions

72
scripts/backup-db.sh Normal file
View File

@@ -0,0 +1,72 @@
#!/bin/bash
# MSP Monitor Dashboard - Database Backup Script
# Crea un backup de la base de datos PostgreSQL
set -e
# Configuracion
BACKUP_DIR="${BACKUP_DIR:-/backups}"
RETENTION_DAYS="${RETENTION_DAYS:-30}"
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="msp_monitor_${DATE}.sql.gz"
# Cargar variables de entorno
if [ -f .env ]; then
export $(cat .env | grep -v '^#' | xargs)
fi
# Valores por defecto
DB_HOST="${DB_HOST:-localhost}"
DB_PORT="${DB_PORT:-5432}"
DB_USER="${POSTGRES_USER:-mspmonitor}"
DB_NAME="${POSTGRES_DB:-msp_monitor}"
DB_PASSWORD="${POSTGRES_PASSWORD:-changeme}"
echo "======================================"
echo " MSP Monitor - Database Backup"
echo "======================================"
echo "Fecha: $(date)"
echo "Base de datos: $DB_NAME"
echo ""
# Crear directorio de backups si no existe
mkdir -p "$BACKUP_DIR"
# Crear backup
echo "Creando backup..."
export PGPASSWORD="$DB_PASSWORD"
pg_dump -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -d "$DB_NAME" \
--no-owner --no-privileges --format=custom | gzip > "$BACKUP_DIR/$BACKUP_FILE"
unset PGPASSWORD
# Verificar que el backup se creo correctamente
if [ -f "$BACKUP_DIR/$BACKUP_FILE" ]; then
SIZE=$(du -h "$BACKUP_DIR/$BACKUP_FILE" | cut -f1)
echo "[✓] Backup creado: $BACKUP_DIR/$BACKUP_FILE ($SIZE)"
else
echo "[✗] Error creando backup"
exit 1
fi
# Eliminar backups antiguos
echo ""
echo "Limpiando backups antiguos (mas de $RETENTION_DAYS dias)..."
find "$BACKUP_DIR" -name "msp_monitor_*.sql.gz" -type f -mtime +$RETENTION_DAYS -delete
REMAINING=$(ls -1 "$BACKUP_DIR"/msp_monitor_*.sql.gz 2>/dev/null | wc -l)
echo "[✓] Backups restantes: $REMAINING"
# Opcional: Subir a S3 si esta configurado
if [ -n "$S3_BUCKET" ] && command -v aws &> /dev/null; then
echo ""
echo "Subiendo backup a S3..."
aws s3 cp "$BACKUP_DIR/$BACKUP_FILE" "s3://$S3_BUCKET/backups/$BACKUP_FILE"
echo "[✓] Backup subido a s3://$S3_BUCKET/backups/$BACKUP_FILE"
fi
echo ""
echo "======================================"
echo " Backup completado"
echo "======================================"

103
scripts/restore-db.sh Normal file
View File

@@ -0,0 +1,103 @@
#!/bin/bash
# MSP Monitor Dashboard - Database Restore Script
# Restaura un backup de la base de datos PostgreSQL
set -e
# Verificar argumentos
if [ -z "$1" ]; then
echo "Uso: $0 <archivo_backup>"
echo ""
echo "Ejemplo: $0 /backups/msp_monitor_20240115_120000.sql.gz"
echo ""
echo "Backups disponibles:"
ls -la ${BACKUP_DIR:-/backups}/msp_monitor_*.sql.gz 2>/dev/null || echo "No se encontraron backups"
exit 1
fi
BACKUP_FILE="$1"
# Verificar que el archivo existe
if [ ! -f "$BACKUP_FILE" ]; then
echo "[✗] Archivo no encontrado: $BACKUP_FILE"
exit 1
fi
# Cargar variables de entorno
if [ -f .env ]; then
export $(cat .env | grep -v '^#' | xargs)
fi
# Valores por defecto
DB_HOST="${DB_HOST:-localhost}"
DB_PORT="${DB_PORT:-5432}"
DB_USER="${POSTGRES_USER:-mspmonitor}"
DB_NAME="${POSTGRES_DB:-msp_monitor}"
DB_PASSWORD="${POSTGRES_PASSWORD:-changeme}"
echo "======================================"
echo " MSP Monitor - Database Restore"
echo "======================================"
echo "Fecha: $(date)"
echo "Archivo: $BACKUP_FILE"
echo "Base de datos: $DB_NAME"
echo ""
# Confirmar restauracion
echo "ADVERTENCIA: Esta operacion eliminara todos los datos actuales."
read -p "¿Desea continuar? (si/no): " CONFIRM
if [ "$CONFIRM" != "si" ]; then
echo "Operacion cancelada"
exit 0
fi
export PGPASSWORD="$DB_PASSWORD"
# Crear backup de seguridad antes de restaurar
echo ""
echo "Creando backup de seguridad antes de restaurar..."
SAFETY_BACKUP="/tmp/msp_monitor_pre_restore_$(date +%Y%m%d_%H%M%S).sql.gz"
pg_dump -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -d "$DB_NAME" \
--no-owner --no-privileges --format=custom | gzip > "$SAFETY_BACKUP"
echo "[✓] Backup de seguridad: $SAFETY_BACKUP"
# Terminar conexiones activas
echo ""
echo "Terminando conexiones activas..."
psql -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -d postgres -c \
"SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = '$DB_NAME' AND pid <> pg_backend_pid();" \
> /dev/null 2>&1 || true
# Eliminar y recrear base de datos
echo ""
echo "Recreando base de datos..."
psql -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -d postgres -c "DROP DATABASE IF EXISTS $DB_NAME;"
psql -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -d postgres -c "CREATE DATABASE $DB_NAME;"
echo "[✓] Base de datos recreada"
# Restaurar backup
echo ""
echo "Restaurando backup..."
if [[ "$BACKUP_FILE" == *.gz ]]; then
gunzip -c "$BACKUP_FILE" | pg_restore -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -d "$DB_NAME" --no-owner --no-privileges
else
pg_restore -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -d "$DB_NAME" --no-owner --no-privileges "$BACKUP_FILE"
fi
echo "[✓] Backup restaurado"
unset PGPASSWORD
# Aplicar migraciones pendientes
echo ""
echo "Verificando migraciones..."
npx prisma db push --skip-generate 2>/dev/null || echo "[!] No se pudieron aplicar migraciones automaticamente"
echo ""
echo "======================================"
echo " Restauracion completada"
echo "======================================"
echo ""
echo "El backup de seguridad esta en: $SAFETY_BACKUP"
echo "Elimine manualmente cuando ya no lo necesite."

169
scripts/setup.sh Normal file
View File

@@ -0,0 +1,169 @@
#!/bin/bash
# MSP Monitor Dashboard - Setup Script
# Este script configura el entorno de desarrollo/produccion
set -e
echo "======================================"
echo " MSP Monitor Dashboard - Setup"
echo "======================================"
# Colores para output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
# Funcion para imprimir mensajes
print_status() {
echo -e "${GREEN}[✓]${NC} $1"
}
print_warning() {
echo -e "${YELLOW}[!]${NC} $1"
}
print_error() {
echo -e "${RED}[✗]${NC} $1"
}
# Verificar si se ejecuta como root
if [ "$EUID" -ne 0 ]; then
print_warning "Este script debe ejecutarse como root para algunas operaciones"
fi
# Verificar dependencias
echo ""
echo "Verificando dependencias..."
check_command() {
if command -v $1 &> /dev/null; then
print_status "$1 instalado"
return 0
else
print_error "$1 no encontrado"
return 1
fi
}
MISSING_DEPS=0
check_command docker || MISSING_DEPS=1
check_command docker-compose || check_command "docker compose" || MISSING_DEPS=1
check_command node || MISSING_DEPS=1
check_command npm || MISSING_DEPS=1
if [ $MISSING_DEPS -eq 1 ]; then
print_error "Faltan dependencias. Instale las herramientas faltantes antes de continuar."
exit 1
fi
# Crear archivo .env si no existe
if [ ! -f .env ]; then
echo ""
echo "Creando archivo .env..."
cp .env.example .env
# Generar JWT_SECRET aleatorio
JWT_SECRET=$(openssl rand -base64 32)
sed -i "s|JWT_SECRET=.*|JWT_SECRET=\"$JWT_SECRET\"|" .env
print_status "Archivo .env creado"
print_warning "Edite el archivo .env con sus configuraciones antes de continuar"
else
print_status "Archivo .env ya existe"
fi
# Instalar dependencias de Node.js
echo ""
echo "Instalando dependencias de Node.js..."
npm install
print_status "Dependencias instaladas"
# Generar cliente de Prisma
echo ""
echo "Generando cliente de Prisma..."
npx prisma generate
print_status "Cliente de Prisma generado"
# Preguntar si iniciar en modo desarrollo o produccion
echo ""
echo "Seleccione el modo de ejecucion:"
echo "1) Desarrollo (npm run dev)"
echo "2) Produccion (Docker)"
echo "3) Solo configurar, no iniciar"
read -p "Opcion [1-3]: " MODE
case $MODE in
1)
echo ""
echo "Iniciando servicios de desarrollo..."
# Iniciar PostgreSQL y Redis con Docker
docker-compose -f docker/docker-compose.yml up -d postgres redis
# Esperar a que los servicios esten listos
echo "Esperando a que los servicios esten listos..."
sleep 5
# Aplicar migraciones
echo ""
echo "Aplicando migraciones de base de datos..."
npx prisma db push
print_status "Migraciones aplicadas"
# Iniciar aplicacion
echo ""
print_status "Iniciando servidor de desarrollo..."
npm run dev
;;
2)
echo ""
echo "Construyendo e iniciando contenedores de produccion..."
# Construir imagenes
docker-compose -f docker/docker-compose.yml build
# Iniciar servicios
docker-compose -f docker/docker-compose.yml up -d
# Esperar a que los servicios esten listos
echo "Esperando a que los servicios esten listos..."
sleep 10
# Aplicar migraciones
echo ""
echo "Aplicando migraciones de base de datos..."
docker-compose -f docker/docker-compose.yml exec dashboard npx prisma db push
print_status "Migraciones aplicadas"
print_status "Servicios iniciados"
echo ""
echo "Dashboard disponible en: http://localhost:3000"
echo ""
echo "Comandos utiles:"
echo " docker-compose -f docker/docker-compose.yml logs -f # Ver logs"
echo " docker-compose -f docker/docker-compose.yml down # Detener servicios"
echo " docker-compose -f docker/docker-compose.yml restart # Reiniciar servicios"
;;
3)
print_status "Configuracion completada"
echo ""
echo "Proximos pasos:"
echo "1. Edite el archivo .env con sus configuraciones"
echo "2. Ejecute 'npm run dev' para desarrollo"
echo "3. O ejecute 'docker-compose -f docker/docker-compose.yml up -d' para produccion"
;;
*)
print_error "Opcion no valida"
exit 1
;;
esac
echo ""
echo "======================================"
echo " Setup completado"
echo "======================================"