Manual Técnico de Operación - Odisa Tools

? Índice

  1. Información General
  2. Acceso al Servidor
  3. Scripts de Control
  4. Inicio de la Aplicación
  5. Detención de la Aplicación
  6. Monitoreo y Logs
  7. Solución de Problemas
  8. Mantenimiento

1. Información General

Arquitectura del Sistema

  • Aplicación: Flask (Python)
  • Servidor Web: Gunicorn (producción) / Flask dev server (desarrollo)
  • Puerto: 8001
  • Proxy: Nginx (opcional)
  • Ubicación: /volume1/web/odisa-tools/
  • IP del Servidor: 192.168.2.22

Componentes Principales

  • app.py: Aplicación principal Flask
  • wsgi.py: Punto de entrada para Gunicorn
  • logs/: Directorio de logs
  • uploads/: Archivos temporales
  • data/: Datos de usuarios y configuración

2. Acceso al Servidor

Conexión SSH

Para acceder al servidor, es NECESARIO usar un usuario con privilegios de administrador.

# Conexión SSH con usuario administrador ssh admin@192.168.2.22 
# O si tienes otro usuario administrador ssh [usuario_admin]@192.168.2.22

⚠️ IMPORTANTE:

  • La dirección IP del servidor es 192.168.2.22
  • DEBE usar un usuario con permisos de administrador
  • No funcionará con usuarios regulares sin privilegios

Primer Acceso

# 1. Conectarse al servidor ssh admin@192.168.2.22 
# 2. Navegar al directorio de la aplicación cd /volume1/web/odisa-tools 
# 3. Verificar que estás en el directorio correcto pwd # Debe mostrar: /volume1/web/odisa-tools

3. Scripts de Control

3.1 Script de Inicio (start.sh)

Crear el archivo start.sh en /volume1/web/odisa-tools/:

#!/bin/bash # start.sh - Script de inicio para Odisa Tools 
# Colores para output RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' # No Color 
# Configuración APP_DIR="/volume1/web/odisa-tools" PORT=8001 PID_FILE="$APP_DIR/odisa_tools.pid" LOG_FILE="$APP_DIR/logs/startup.log" 
echo -e "${GREEN}========================================${NC}" echo -e "${GREEN}   Iniciando Odisa Tools${NC}" echo -e "${GREEN}========================================${NC}" 
# Verificar si ya está corriendo if [ -f "$PID_FILE" ]; then    PID=$(cat $PID_FILE)    if ps -p $PID > /dev/null 2>&1; then        echo -e "${YELLOW}⚠️  La aplicación ya está corriendo (PID: $PID)${NC}"        exit 1    else        echo -e "${YELLOW}Removiendo archivo PID obsoleto...${NC}"        rm $PID_FILE    fi fi 
# Cambiar al directorio de la aplicación cd $APP_DIR || exit 1 
# Verificar entorno virtual if [ ! -d "venv" ]; then    echo -e "${RED}❌ Error: No se encuentra el entorno virtual${NC}"    echo "Ejecute: python3 -m venv venv"    exit 1 fi 
# Activar entorno virtual echo "? Activando entorno virtual..." source venv/bin/activate 
# Verificar dependencias echo "? Verificando dependencias..." pip list | grep Flask > /dev/null 2>&1 if [ $? -ne 0 ]; then    echo -e "${YELLOW}? Instalando dependencias...${NC}"    pip install -r requirements.txt fi 
# Crear directorios necesarios echo "? Verificando directorios..." mkdir -p logs uploads data/users 
# Limpiar logs antiguos si son muy grandes (>100MB) if [ -f "logs/odisa_tools.log" ]; then    LOG_SIZE=$(du -m "logs/odisa_tools.log" | cut -f1)    if [ $LOG_SIZE -gt 100 ]; then        echo "? Rotando logs antiguos..."        mv logs/odisa_tools.log logs/odisa_tools.log.$(date +%Y%m%d)    fi fi 
# Seleccionar modo de inicio echo "" echo "Seleccione el modo de inicio:" echo "1) Desarrollo (Flask debug)" echo "2) Producción (Gunicorn)" echo -n "Opción [1-2]: " read -r MODO 
case $MODO in    1)        echo -e "${GREEN}? Iniciando en modo DESARROLLO...${NC}"        echo "Logs en: $LOG_FILE"        nohup python app.py > "$LOG_FILE" 2>&1 &        PID=$!        ;;    2)        echo -e "${GREEN}? Iniciando en modo PRODUCCIÓN...${NC}"        echo "Logs en: $LOG_FILE"        nohup gunicorn --bind 127.0.0.1:$PORT \                       --workers 2 \                       --threads 2 \                       --timeout 120 \                       --access-logfile logs/access.log \                       --error-logfile logs/error.log \                       wsgi:app > "$LOG_FILE" 2>&1 &        PID=$!        ;;    *)        echo -e "${RED}❌ Opción inválida${NC}"        exit 1        ;; esac 
# Guardar PID echo $PID > $PID_FILE 
# Esperar a que inicie echo -n "⏳ Esperando que la aplicación inicie" for i in {1..10}; do    sleep 1    echo -n "."    curl -s http://localhost:$PORT > /dev/null 2>&1    if [ $? -eq 0 ]; then        echo ""        echo -e "${GREEN}✅ Aplicación iniciada exitosamente${NC}"        echo ""        echo "? Información del servicio:"        echo "   - PID: $PID"        echo "   - Puerto: $PORT"        echo "   - URL Local: http://localhost:$PORT"        echo "   - URL Red: http://192.168.2.22:$PORT"        echo "   - Logs: $APP_DIR/logs/odisa_tools.log"        echo ""        echo -e "${GREEN}========================================${NC}"        exit 0    fi done 
echo "" echo -e "${RED}❌ Error: La aplicación no respondió después de 10 segundos${NC}" echo "Revise los logs en: $LOG_FILE" kill $PID 2>/dev/null rm $PID_FILE exit 1

3.2 Script de Detención (stop_odisa_tools.sh)

Crear el archivo stop_odisa_tools.sh en /volume1/web/odisa-tools/:

#!/bin/bash # stop_odisa_tools.sh - Script de detención para Odisa Tools 
# Colores RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' 
# Configuración APP_DIR="/volume1/web/odisa-tools" PORT=8001 PID_FILE="$APP_DIR/odisa_tools.pid" 
echo -e "${YELLOW}========================================${NC}" echo -e "${YELLOW}   Deteniendo Odisa Tools${NC}" echo -e "${YELLOW}========================================${NC}" 
# Método 1: Usar PID file if [ -f "$PID_FILE" ]; then    PID=$(cat $PID_FILE)    echo "? PID encontrado en archivo: $PID"        if ps -p $PID > /dev/null 2>&1; then        echo "? Deteniendo proceso $PID..."        kill $PID        sleep 2                # Verificar si se detuvo        if ps -p $PID > /dev/null 2>&1; then            echo -e "${YELLOW}⚠️  El proceso no respondió, forzando detención...${NC}"            kill -9 $PID        fi                rm $PID_FILE        echo -e "${GREEN}✅ Proceso detenido exitosamente${NC}"    else        echo -e "${YELLOW}⚠️  El proceso $PID no está corriendo${NC}"        rm $PID_FILE    fi else    echo "? No se encontró archivo PID, buscando procesos..." fi 
# Método 2: Buscar procesos por puerto echo "" echo "? Buscando procesos en puerto $PORT..." PIDS=$(lsof -ti:$PORT) 
if [ ! -z "$PIDS" ]; then    echo "Procesos encontrados: $PIDS"    for PID in $PIDS; do        echo "? Deteniendo proceso $PID..."        kill $PID 2>/dev/null    done    sleep 2        # Verificar si quedan procesos    REMAINING=$(lsof -ti:$PORT)    if [ ! -z "$REMAINING" ]; then        echo -e "${YELLOW}⚠️  Forzando detención de procesos restantes...${NC}"        for PID in $REMAINING; do            kill -9 $PID 2>/dev/null        done    fi    echo -e "${GREEN}✅ Procesos detenidos${NC}" else    echo "No se encontraron procesos en el puerto $PORT" fi 
# Método 3: Buscar procesos Python/Gunicorn relacionados echo "" echo "? Buscando procesos de la aplicación..." PYTHON_PIDS=$(ps aux | grep -E "(python.*app\.py|gunicorn.*wsgi:app)" | grep -v grep | awk '{print $2}') 
if [ ! -z "$PYTHON_PIDS" ]; then    echo "Procesos Python/Gunicorn encontrados:"    for PID in $PYTHON_PIDS; do        ps -p $PID -o pid,cmd --no-headers        echo -n "¿Detener proceso $PID? [s/N]: "        read -r CONFIRM        if [ "$CONFIRM" = "s" ] || [ "$CONFIRM" = "S" ]; then            kill $PID 2>/dev/null            echo "Proceso $PID detenido"        fi    done fi 
# Limpiar archivos temporales echo "" echo "? Limpiando archivos temporales..." rm -f $APP_DIR/*.pid rm -f $APP_DIR/*.sock 
echo "" echo -e "${GREEN}========================================${NC}" echo -e "${GREEN}   Odisa Tools detenido${NC}" echo -e "${GREEN}========================================${NC}"

3.3 Script de Reinicio (restart.sh)

#!/bin/bash # restart.sh - Reinicia Odisa Tools 
echo "? Reiniciando Odisa Tools..." echo "" 
# Detener ./stop_odisa_tools.sh 
echo "" echo "⏳ Esperando 3 segundos..." sleep 3 echo "" 
# Iniciar ./start.sh

3.4 Script de Estado (status.sh)

#!/bin/bash # status.sh - Verifica el estado de Odisa Tools 
# Colores GREEN='\033[0;32m' RED='\033[0;31m' YELLOW='\033[1;33m' NC='\033[0m' 
APP_DIR="/volume1/web/odisa-tools" PORT=8001 PID_FILE="$APP_DIR/odisa_tools.pid" 
echo "=========================================" echo "   Estado de Odisa Tools" echo "=========================================" echo "" echo "? Servidor: 192.168.2.22" echo "? Directorio: $APP_DIR" echo "? Puerto: $PORT" echo "" 
# Verificar PID file if [ -f "$PID_FILE" ]; then    PID=$(cat $PID_FILE)    if ps -p $PID > /dev/null 2>&1; then        echo -e "Estado: ${GREEN}● ACTIVO${NC}"        echo "PID: $PID"        echo "Proceso:"        ps -p $PID -o pid,vsz,rss,pcpu,pmem,cmd --no-headers    else        echo -e "Estado: ${RED}● INACTIVO${NC} (PID file obsoleto)"    fi else    echo -e "Estado: ${YELLOW}● DESCONOCIDO${NC} (sin PID file)" fi 
# Verificar puerto echo "" echo "Puerto $PORT:" lsof -i:$PORT 2>/dev/null if [ $? -ne 0 ]; then    echo "  No hay procesos escuchando" fi 
# Verificar conectividad echo "" echo "Prueba de conectividad:" curl -s -o /dev/null -w "  HTTP Code: %{http_code}\n  Tiempo: %{time_total}s\n" http://localhost:$PORT 
# URLs de acceso echo "" echo "URLs de acceso:" echo "  - Local: http://localhost:$PORT" echo "  - Red: http://192.168.2.22:$PORT" 
# Espacio en disco echo "" echo "Espacio en disco:" df -h $APP_DIR | tail -1 
# Logs recientes echo "" echo "Últimas líneas del log:" tail -5 $APP_DIR/logs/odisa_tools.log 2>/dev/null || echo "  No se puede leer el log" 
echo "========================================="

4. Inicio de la Aplicación

Procedimiento de Inicio Completo

  1. Conectarse al servidor con usuario administrador:
ssh admin@192.168.2.22 # Ingresar contraseña del usuario administrador
  1. Navegar al directorio de la aplicación:
cd /volume1/web/odisa-tools
  1. Verificar ubicación actual:
pwd # Debe mostrar: /volume1/web/odisa-tools
  1. Dar permisos de ejecución a los scripts (solo la primera vez):
chmod +x start.sh stop_odisa_tools.sh restart.sh status.sh
  1. Iniciar la aplicación:
./start.sh # Seleccionar opción 1 para desarrollo o 2 para producción
  1. Verificar que la aplicación esté funcionando:
./status.sh
  1. Acceder a la aplicación desde el navegador:
    • Abrir navegador web
    • Ingresar: http://192.168.2.22:8001

Inicio Rápido (después de la configuración inicial)

# Conectarse ssh admin@192.168.2.22 
# Ir al directorio cd /volume1/web/odisa-tools 
# Iniciar ./start.sh

Inicio Automático al Arranque del Sistema

Crear servicio systemd (si está disponible):

sudo nano /etc/systemd/system/odisa-tools.service

Contenido del archivo:

[Unit] Description=Odisa Tools Application After=network.target 
[Service] Type=forking User=admin WorkingDirectory=/volume1/web/odisa-tools Environment="PATH=/volume1/web/odisa-tools/venv/bin" ExecStart=/volume1/web/odisa-tools/start.sh ExecStop=/volume1/web/odisa-tools/stop_odisa_tools.sh PIDFile=/volume1/web/odisa-tools/odisa_tools.pid Restart=on-failure 
[Install] WantedBy=multi-user.target

Habilitar el servicio:

sudo systemctl daemon-reload sudo systemctl enable odisa-tools sudo systemctl start odisa-tools

5. Detención de la Aplicación

Detención Normal

# Conectarse al servidor ssh admin@192.168.2.22 
# Ir al directorio cd /volume1/web/odisa-tools 
# Detener la aplicación ./stop_odisa_tools.sh

Detención de Emergencia

Si el script de detención no funciona:

# Matar todos los procesos en el puerto sudo kill -9 $(lsof -ti:8001) 
# O buscar y matar procesos Python específicos ps aux | grep "python.*app.py" | grep -v grep | awk '{print $2}' | xargs kill -9

6. Monitoreo y Logs

Ubicación de Logs

  • Principal: /volume1/web/odisa-tools/logs/odisa_tools.log
  • Acceso HTTP: /volume1/web/odisa-tools/logs/access.log
  • Errores: /volume1/web/odisa-tools/logs/error.log
  • Inicio: /volume1/web/odisa-tools/logs/startup.log

Monitoreo en Tiempo Real

# Conectarse primero ssh admin@192.168.2.22 cd /volume1/web/odisa-tools 
# Ver logs en tiempo real tail -f logs/odisa_tools.log 
# Filtrar por errores tail -f logs/odisa_tools.log | grep ERROR 
# Ver logs de eliminación de productos tail -f logs/odisa_tools.log | grep -i "elimina" 
# Monitorear estado cada 2 segundos watch -n 2 './status.sh'

Análisis de Logs

# Contar errores del día grep "$(date '+%Y-%m-%d')" logs/odisa_tools.log | grep -c ERROR 
# Ver operaciones por usuario grep "Usuario: admin" logs/odisa_tools.log | tail -20 
# Buscar problemas de API grep -i "error.*bitrix\|error.*sap" logs/odisa_tools.log 
# Ver últimas eliminaciones grep "eliminación" logs/odisa_tools.log | tail -10

7. Solución de Problemas

Problema: No puedo conectarme por SSH

Verificar:

  • Usar usuario administrador: ssh admin@192.168.2.22
  • Verificar conectividad: ping 192.168.2.22
  • Verificar que SSH esté habilitado en el servidor

Problema: La aplicación no inicia

Diagnóstico:

# Verificar puerto ocupado lsof -i:8001 
# Ver logs de inicio cat logs/startup.log 
# Verificar permisos ls -la logs/ uploads/ 
# Verificar Python python3 --version

Soluciones:

  1. Puerto ocupado: Ejecutar ./stop_odisa_tools.sh primero
  2. Permisos incorrectos: chmod -R 755 logs uploads
  3. Falta entorno virtual: python3 -m venv venv
  4. Faltan dependencias: source venv/bin/activate && pip install -r requirements.txt

Problema: Error 502 Bad Gateway

Diagnóstico:

# Verificar si la app responde curl http://localhost:8001 
# Ver estado ./status.sh 
# Revisar logs tail -50 logs/odisa_tools.log

Solución:

# Reiniciar la aplicación ./restart.sh

Problema: No puedo acceder desde el navegador

Verificar:

  1. La aplicación está corriendo: ./status.sh
  2. Firewall permite puerto 8001
  3. URL correcta: http://192.168.2.22:8001
  4. No usar HTTPS (es HTTP)

Problema: Logs muy grandes

Solución manual:

# Rotar logs cd /volume1/web/odisa-tools mv logs/odisa_tools.log logs/odisa_tools.log.$(date +%Y%m%d) touch logs/odisa_tools.log 
# Limpiar logs antiguos (más de 30 días) find logs/ -name "*.log.*" -mtime +30 -delete

Solución automática con crontab:

# Editar crontab como admin crontab -e 
# Agregar rotación semanal 0 0 * * 0 cd /volume1/web/odisa-tools && mv logs/odisa_tools.log logs/odisa_tools.log.$(date +\%Y\%m\%d) && touch logs/odisa_tools.log

8. Mantenimiento

Backup de Datos

Crear script backup.sh en /volume1/web/odisa-tools/:

#!/bin/bash BACKUP_DIR="/volume1/backups/odisa_tools" APP_DIR="/volume1/web/odisa-tools" DATE=$(date +%Y%m%d_%H%M%S) 
echo "? Creando backup de Odisa Tools..." 
# Crear directorio de backups si no existe mkdir -p $BACKUP_DIR 
# Crear backup tar -czf "$BACKUP_DIR/odisa_backup_$DATE.tar.gz" \    -C "$APP_DIR" \    data/ \    tools/bitrix_products/config.json \    tools/sap_promotions/sap_config.json \    tools/sap_promotions/google_sheets_config.json \    2>/dev/null 
echo "✅ Backup creado: $BACKUP_DIR/odisa_backup_$DATE.tar.gz" 
# Eliminar backups antiguos (más de 30 días) find $BACKUP_DIR -name "odisa_backup_*.tar.gz" -mtime +30 -delete echo "? Backups antiguos eliminados"

Actualización de la Aplicación

Crear script update.sh:

#!/bin/bash # update.sh - Actualizar Odisa Tools 
cd /volume1/web/odisa-tools 
echo "? Actualizando Odisa Tools..." 
# 1. Hacer backup primero ./backup.sh 
# 2. Detener aplicación ./stop_odisa_tools.sh 
# 3. Actualizar código (si usas Git) if [ -d ".git" ]; then    git pull origin main fi 
# 4. Actualizar dependencias source venv/bin/activate pip install -r requirements.txt --upgrade 
# 5. Reiniciar ./start.sh 
echo "✅ Actualización completada"

Monitoreo de Salud Automático

Crear script check_health.sh:

#!/bin/bash APP_DIR="/volume1/web/odisa-tools" PORT=8001 LOG_FILE="$APP_DIR/logs/health.log" 
# Verificar si responde curl -f http://localhost:$PORT > /dev/null 2>&1 
if [ $? -ne 0 ]; then    echo "$(date): Aplicación no responde, reiniciando..." >> $LOG_FILE    cd $APP_DIR    ./restart.sh        # Notificar por email o sistema de alertas    # mail -s "Odisa Tools reiniciado" admin@empresa.com < $LOG_FILE fi

Agregar a crontab para verificación cada 5 minutos:

*/5 * * * * /volume1/web/odisa-tools/check_health.sh

? Información de Contacto Rápido

Accesos Principales

  • Servidor SSH: admin@192.168.2.22
  • Aplicación Web: http://192.168.2.22:8001
  • Directorio: /volume1/web/odisa-tools/
  • Puerto: 8001

Rutas Importantes

  • Logs: /volume1/web/odisa-tools/logs/
  • Configuración Bitrix: /volume1/web/odisa-tools/tools/bitrix_products/config.json
  • Configuración SAP: /volume1/web/odisa-tools/tools/sap_promotions/sap_config.json
  • Usuarios: /volume1/web/odisa-tools/data/users.json

Comandos Esenciales

# Acceso al servidor (USAR USUARIO ADMIN) ssh admin@192.168.2.22 
# Navegar a la aplicación cd /volume1/web/odisa-tools 
# Estado ./status.sh 
# Iniciar ./start.sh 
# Detener ./stop_odisa_tools.sh 
# Reiniciar ./restart.sh 
# Ver logs en tiempo real tail -f logs/odisa_tools.log 
# Backup ./backup.sh

Credenciales por Defecto

  • Usuario administrador web: admin / admin123
  • Cambiar inmediatamente después del primer acceso

⚠️ RECORDATORIOS IMPORTANTES:

  1. SIEMPRE conectarse con usuario administrador por SSH
  2. La ruta correcta es /volume1/web/odisa-tools/
  3. El servidor está en 192.168.2.22
  4. Puerto de la aplicación: 8001
  5. Hacer backups regulares de la carpeta data/

Versión del manual: 1.1 Última actualización: Agosto 2025 Ubicación del sistema: 192.168.2.22:/volume1/web/odisa-tools/