Monitorizar/Daemonizar Node-Red

Vamos a usar monit para daemonizar/monitorizar node-red
Pero sin usar privilegios de root.
Lo de daemonizar viene porque quiero que node-red se rearranque automaticamente. (como un demonio del sistema).
Tambien es valido para cualquier otro programa.

1) Instalar monit.

apt-get install monit como root o sudo apt-get install monit

Si no tienes permisos de root puedes instalarlo en el directorio de trabajo de tu usuario: Apendice1 instalar monit sin ser root




2) preparar coocalhost:1313/posts/pentesting/euskalhack_2019/pentestin_illidan/#crear-un-diccionario-con-los-datos-de-una-webnfiguraciones como usuario.

Supongamos que node-red correra como el usuario em50l

  • Crear carpeta ~/monit / mkdir ~/monit

  • Crear archivo de inicio monit.rc / nano ~/monit/monit.rc / (nano o tu editor de texto preferido)
    Pega el siguiente script mofificando em50l por tu usuario.

    ###############################################################################
    ## Monit control file
    ###############################################################################
      set daemon 120            # check services at 2-minute intervals
      with start delay 15       # optional: delay the first check by 4-minutes (by
      set logfile    /home/em50l/monit/monit.log
      set idfile     /home/em50l/monit/id
      set statefile  /home/em50l/monit/state
      set eventqueue
          basedir    /home/em50l/monit/events # set the base directory where events will be stored
          slots 50                       # optionally limit the queue size
    
    check process nodered matching "node-red"
    start program = "/home/em50l/monit/node-red_start"
    stop  program = "/home/em50l/monit/node-red_stop"
    if failed host 127.0.0.1 port 1880 protocol http then restart
    
  • Crear archivo de inicio nano ~/monit/node-red_start
    Pega y personaliza el siguiente script.(ctrl+x para salir)
    #!/bin/sh
    
    ## Arranque de node-red
    ( cd ; node-red --max-old-space-size=80 &)&
    
    ## Aviso telegram avisando del re-inicio.
    tk=bot_token_de_tu_bot_telegram
    id=Tu_ID_telegram_o_chat_ID
    txt=$(hostname)+node-red+init+OK
    (timeout 5s curl -sk "https://api.telegram.org/$tk/sendMessage?chat_id=$id\&text=$txt " )&
    



3) Prueba de funcionamiento.

  • Arranco Monit “aocalhost:1313/posts/pentesting/euskalhack_2019/pentestin_illidan/#crear-un-diccionario-con-los-datos-de-una-web mano” monit -vv -c ~/monit/monit.rc
    
    em50l@jejo.es:~$ monit -vv -c ~/monit/monit.rc 
    Runtime constants:
     Control file       = /home/em50l/monit/monit.rc
     Log file           = /home/em50l/monit/monit.log
     Pid file           = /home/em50l/.monit.pid
     Id file            = /home/em50l/monit/id
     State file         = /home/em50l/monit/state
     Debug              = True
     Log                = True
     Use syslog         = False
     Is Daemon          = True
     Use process engine = True
     Poll time          = 120 seconds with start delay 15 seconds
     Expect buffer      = 256 bytes
     Event queue        = base directory /home/em50l/monit/events with 50 slots
     Mail from          = (not defined)
     Mail subject       = (not defined)
     Mail message       = (not defined)
     Start monit httpd  = False
    
    The service list contains the following entries:
    
    Process Name          = nodered
     Match                = node-red
     Monitoring mode      = active
     Start program        = '/home/em50l/monit/node-red_start' timeout 30 second(s)
     Existence            = if does not exist then restart
     Pid                  = if changed then alert
     PPid                 = if changed then alert
     Port                 = if failed [127.0.0.1:1880 [HTTP via TCPSSL] with timeout 5000 seconds] then restart
    
    System Name           = em50l
     Monitoring mode      = active
    https://www.cyberciti.biz/tips/howto-monitor-and-restart-linux-unix-service.html
    -------------------------------------------------------------------------------
    pidfile '/home/em50l/.monit.pid' does not exist
    Starting Monit 5.9 daemon
    Monit start delay set -- pause for 15s
    
  • Visualizo log cat ~/monit/monit.log
    em50l@jejo.es:~$ cat ~/monit/monit.log 
    [UTC Nov  3 17:43:00] info     : Starting Monit 5.9 daemon
    [UTC Nov  3 17:43:00] info     : Monit start delay set -- pause for 15s
    [UTC Nov  3 17:43:15] info     : 'jejo.es' Monit started
    [UTC Nov  3 17:43:15] error    : 'nodered' process is not running
    [UTC Nov  3 17:43:15] info     : 'nodered' trying to restart
    [UTC Nov  3 17:43:15] info     : 'nodered' start: /home/em50l/monit/node-red_start
    
    Aqui se puede ver como a los 15 segundos se realiza una comprobacion de si node-red esta arrancado. Como no es asi. Arranca node-red y nos envia un telegram.
  • Prueba reinicio node-red
    Si mato el proceso node-red / killall node-red
    Vere como rearranca automaticamente de nuevo. (en un periodo inferior a 2min)



4) Persistencia.

Si quiero que monit cargue al inicio con permisos de usuario

  • usando /etc/rc.local: (Permisos root necesarios) Podrias añadir una linea como esta a /etc/rc.local Recuerda: mofifica em50l por tu usuario.
    (cd /home/em50l/ ;su  em50l -c "monit -vv -c /home/em50l/monit/monit.rc&")&
    
  • usando crontab: (no se necesitan permisos root) Desde el usuario que va a ejecutar node-red.
    Abre el editor de tareas crontab -e y añade @reboot monit -c ~/monit/monit.rc& al final del texto.
    # For more information see the manual pages of crontab(5) and cron(8)
    @reboot monit -c ~/monit/monit.rc&
    



Y ya tendriamos node-red monitorizado y daemonizado.

(sin el uso de permisos root)




Referencias

Apendice1: instalar monit sin ser root.

ve a https://mmonit.com/monit/#download
Descargate el binario compatible con tu sistema y arquitectura.
y descomprimelo en la carpeta *monit de tu usuario

wget https://mmonit.com/monit/dist/binary/5.26.0/monit-5.26.0-linux-x64.tar.gz
tar -xvf monit-5.26.0-linux-x64.tar.gz -C ~/monit/
cp ~/monit/monit-*/bin/monit ~/monit/

Tendras que modificar crontab -e para que apunte al ejecutable en la carpeta del usuario.

@reboot ~/monit/monit -c ~/monit/monit.rc&