Usualmente en casa desde que me mudé, suele haber 1 o 2 cortes de energía eléctrica por trimestre de menos de 15 minutos de duración. Ya sea que sean atribuibles a ENSA o ETESA o alguna falla de equipos cerca, siempre es bueno mantener la red funcionando y permitir el correcto apagado de los dispositivos de red para evitar potenciales daños a los equipos.
En el mundo Linux tenemos el demonio apcupsd
para gestionar los sistemas de alimentación ininterrumpida de la marca APC. En específico adquirí un APC Back-UPS BE850M2, un unidad compacta que entrega 850 VA lo que correspondería a 450 W con 6 conexiones a batería y 3 de regulación de subidas eléctricas.
Esto es más que suficiente para mantener la red funcionando durante el tiempo promedio de los apagones y en caso tal que un evento de interrupción de suministro eléctrico se prolongue más de lo habitual, entonces ocurra el correcto apagado de los equipos.
Para hacer la gestión de energía lo primero que hice fue conectar el bastión hobbiton por USB al UPS. Luego solo fue cuestión de instalar el demonio apcupsd
que no esta disponible en los repositorios oficiales, sino en EPEL.
1 | sudo dnf install apcupsd |
Ahora lo activamos e iniciamos con la ayuda de systemd
:
1 2 | sudo systemctl enable apcupsd sudo systemctl start apcupsd |
Desde la terminal con apcaccess
podemos ver el estado actual del UPS
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | apcaccess APC : 001,036,0875 DATE : 2023-08-09 10:19:59 -0500 HOSTNAME : hobbiton VERSION : 3.14.14 (31 May 2016) redhat UPSNAME : BAYANO1 CABLE : USB Cable DRIVER : USB UPS Driver UPSMODE : Stand Alone STARTTIME: 2023-08-09 10:19:58 -0500 MODEL : Back-UPS ES 850M2 STATUS : ONLINE LINEV : 117.0 Volts LOADPCT : 8.0 Percent BCHARGE : 100.0 Percent TIMELEFT : 82.0 Minutes MBATTCHG : 5 Percent MINTIMEL : 3 Minutes MAXTIME : 0 Seconds SENSE : Medium LOTRANS : 92.0 Volts HITRANS : 139.0 Volts ALARMDEL : 30 Seconds BATTV : 13.7 Volts LASTXFER : Unacceptable line voltage changes NUMXFERS : 0 TONBATT : 0 Seconds CUMONBATT: 0 Seconds XOFFBATT : N/A SELFTEST : NO STATFLAG : 0x05000008 SERIALNO : 4B2021117124 BATTDATE : 2020-05-21 NOMINV : 120 Volts NOMBATTV : 12.0 Volts NOMPOWER : 450 Watts FIRMWARE : 931.a10.D USB FW:a1 END APC : 2023-08-09 10:20:04 -0500 |
De aquí resulta interesante conocer 3 variables. LOADPCT
, BCHARGE
y TIMELEFT
. LOADPCT
muestra la cantidad de carga puesta en la batería con la corriente activa. BCHARGE
es la carga de la batería. TIMELEFT
es el tiempo estimado que funcionaría el UPS con la carga actual. Creo que 82 minutos no está nada mal, considerando que este UPS mantiene funcionando el USG, uno de los USW-8-150, el modem 4G, el servidor bastión hobbiton y el UniFi DVR.
Hasta ahora, todo parece estar en orden y funcionando correctamente.
Para trastear un poco, tenemos el comando apcaccess
que nos permite hacer algunos ajustes, aunque esto depende en gran medida que el modelo lo soporte, pero antes de usarlo debemos detener la unidad systemd apcupsd
.
En cierto modo tener un registro de notificaciones de los modos del UPS te permitirá llevar un registro de los apagones. Dentro del directorio /etc/upsapcd
hay varios scripts que nos interesan y que se activan tras ciertas condiciones, vamos a modificarlos un poco para que nos avisen vía Telegram.
/etc/apcupsd/onbattery
: este script se ejecuta cuando hay un corte eléctrico y comienza a funcionar la batería.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | #!/usr/bin/sh # # This shell script if placed in /etc/apcupsd # will be called by /etc/apcupsd/apccontrol when the UPS # goes on batteries. # We send an email message to root to notify him. # HOSTNAME=`hostname` MSG="$HOSTNAME UPS $1 Power Failure !!!" # telegram_bot_API_Token="<inserte-su-token>" telegram_chat_id="<inserte-su-chat-id>" curl -s -o /dev/null -X GET "https://api.telegram.org/bot${telegram_bot_API_Token}/sendMessage?chat_id=${telegram_chat_id}" --data-urlencode "text=[$HOSTNAME] ⚡ $1 sin servicio eléctrico." # ( echo "Subject: $MSG" echo " " echo "$MSG" echo " " /sbin/apcaccess status ) | $APCUPSD_MAIL -s "$MSG" $SYSADMIN exit 0 |
/etc/apcupsd/offbattery
: este script se ejecuta cuando se reestablece el servicio eléctrico.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | #!/usr/bin/sh # # This shell script if placed in /etc/apcupsd # will be called by /etc/apcupsd/apccontrol when the # UPS goes back on to the mains after a power failure. # We send an email message to root to notify him. # HOSTNAME=`hostname` MSG="$HOSTNAME UPS $1 Power has returned" # telegram_bot_API_Token="<inserte-su-token>" telegram_chat_id="<inserte-su-chat-id>" curl -s -o /dev/null -X GET "https://api.telegram.org/bot${telegram_bot_API_Token}/sendMessage?chat_id=${telegram_chat_id}" --data-urlencode "text=[$HOSTNAME] ⚡ $1 servicio eléctrico reestablecido." # ( echo "Subject: $MSG" echo " " echo "$MSG" echo " " /sbin/apcaccess status ) | $APCUPSD_MAIL -s "$MSG" $SYSADMIN exit 0 |
/etc/apcupsd/changeme
: este script se ejecuta cuando se detecta que la batería debe ser reemplazada.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | #!/usr/bin/sh # # This shell script if placed in /etc/apcupsd # will be called by /etc/apcupsd/apccontrol when apcupsd # detects that the battery should be replaced. # We send an email message to root to notify him. # HOSTNAME=`hostname` MSG="$HOSTNAME UPS $1 battery needs changing NOW." # telegram_bot_API_Token="<inserte-su-token>" telegram_chat_id="<inserte-su-chat-id>" curl -s -o /dev/null -X GET "https://api.telegram.org/bot${telegram_bot_API_Token}/sendMessage?chat_id=${telegram_chat_id}" --data-urlencode "text=[$HOSTNAME] 🪫 $1 la batería necesita ser reemplazada pronto." # ( echo "Subject: $MSG" echo " " echo "$MSG" echo " " /sbin/apcaccess status ) | $APCUPSD_MAIL -s "$MSG" $SYSADMIN exit 0 |
Una vez hecho estos cambios en los archivos, podemos reiniciar la unidad de apcupsd
para que se apliquen.
1 | sudo systemctl restart apcupsd |
Si bien apcupsd
puede controlar y apagar el equipo según los parámetros con los que se configura, prefiero tener un script que me permita un control más fino sobre los UPS, BAYANO1 y BAYANO2, y su nivel de batería. Los BAYANO# fueron nombrados así en reminiscencia a la hidroeléctrica Ascanio Arosemena del Río Bayano.
En el evento de interrupción eléctrica apcupsd
enviará el mensaje que pasa a funcionar con batería 6 segundos después del corte en BAYANO1 y BAYANO2.
BAYANO2 mantiene funcionando varios servidores, una vez alcanzado un porcentaje de 75% de batería, envía un mensaje vía Telegram con el porcentaje y apaga los servidores no escenciales dejando solamente el que mantiene los sitios web.
Tanto BAYANO1 como BAYANO2, una vez alcanzado el 30% de batería el script envía un mensaje que se ha alcanzado ese nivel. Al llegar a 20% enviará un nuevo mensaje informando que se ha alcanzado un nivel crítico y apaga el bastión hobbiton y el servidor web barad-dur. Los dispositivos de red continúan funcionando hasta que la batería se descargue completamente.
Remotamente en Google Cloud Platform una instancia e2-micro
se mantiene supervisando el dominio de manera que lanza un mensaje vía Telegram cuando deja de responder la IP por completo después de un tiempo prudencial considerando un posible cambio en la IP del DNS.
En el evento del restablecimiento del servicio eléctrico, si el UPS se descargo por completo, cuando el USG enciende nuevamente por medio de wake on lan levanta el servidor bastión hobbiton y este una vez inicia el servidor web barad-dur al detectar que no esta en línea.
Cuando BAYANO2 alcanza 80% de batería, entonces barad-dur inicia por medio de wake on lan los demás servidores y así se automatiza el despliegue de toda la red.
@linkmoises
Aún no hay comentarios...