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:
72
scripts/backup-db.sh
Normal file
72
scripts/backup-db.sh
Normal 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
103
scripts/restore-db.sh
Normal 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
169
scripts/setup.sh
Normal 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 "======================================"
|
||||
Reference in New Issue
Block a user