Vamos a configurar un sistema de copias de seguridad para Home Assistant. Para ello, utilizaremos comandos a través de SSH, siguiendo las instrucciones detalladas en esta entrada: Uso de Scripts y Comandos SSH en Home Assistant. Esto nos permitirá establecer una comunicación eficaz entre Home Assistant y el sistema en el que está instalado.
Esta guía la he realizado con Homeassistant en Docker, pero funciona exactamente igual sin él solo cambiando las rutas por las de vuestro sistema.
Lo primero que tenemos que hacer si no lo tenemos es instalar el paquete zip para poder comprimir los "backup" y que ocupen menos espacio, pero antes actualizamos como siempre el sistema:
1 |
sudo apt-get update |
y después instalamos el paquete zip:
1 |
sudo apt-get install zip |
Seguidamente tenemos que pensar como vamos a hacer las copias de seguridad, lo ideal es hacerlo en un sitio fuera de la misma microsd (o hdd) donde esté el sistema, para que ante un fallo de la misma no comprometamos también las copias de seguridad, cuando lo tengamos nos guardamos la ruta ya que nos hará falta para mas adelante, en mi caso:
1 |
/media/backup_ha/ |
1 2 |
#!/bin/bash cd /media/backup_ha/ && zip -r "HA-backup-$(date +"%Y-%m-%d_%H-%M").zip" /media/docker/homeassistant/ -x "*.log" -x "/*tts/*" -x "*.db" -x "*.db-shm" -x "*.db-wal" -x "*.mp3" -x "/*deps/*" -x "/*www/camera_shots/*" -x "/*.git/*" -x "/*shell/gif_maker/venv/*" |
La segunda ruta que en mi caso es /media/docker/homeassistant/ es la ruta donde teneis vuestra instalación de Homeassistant, si teneis Homeassistant en una Raspberrypi seguramente la ruta seria algo así: /home/homeassistant/.homeassistant/
Toda la parte del final del comando son las rutas y archivos que se excluyen de la copia de seguridad: -x "*.db" esto excluiría cualquier archivo con extensión .db, podéis modificarlo para incluir o excluir los archivos que queráis, pero tener cuidado de no copiar archivos en uso como la base de datos, que además no tiene sentido guardarlos.
El archivo backup_ha.sh lo dejamos en la carpeta /config de Homeassistant.
Ahora hay que crear una serie de códigos para cada uno de los elementos del sistema de copia de seguridad para Homeassistant como son sensores, grupo, automation, shell_command, script y customize. Cada uno se hace en su correspondiente sitio en función de como tengáis los include del sistema, aquí Splitting up the configuration podéis encontrar mas información.
Copiamos y pegamos el siguiente código en la parte de script de tu sistema:
1 2 3 4 5 |
script: backup_ha: alias: Backup HA sequence: - service: shell_command.backup_ha |
1 2 |
shell_command: backup_ha: "ssh root@192.168.1.7 bash /media/docker/homeassistant/config/backup_ha.sh" |
backup_ha.sh
1 2 3 |
- platform: command_line name: last backup ha command: "ssh root@192.168.1.7 ls /media/backup_ha -Art | tail -n -1 | grep '.zip'" |
1 2 3 4 |
- platform: command_line name: backup size total command: "ssh root@192.168.1.7 du -sh /media/backup_ha | awk '{print $1}'" scan_interval: 60 |
1 2 3 4 |
- platform: command_line name: backup count command: "ssh root@192.168.1.7 ls /media/backup_ha | wc -l" scan_interval: 60 |
1 2 3 4 5 6 7 8 9 10 |
group: backupha: name: Backup HA control: hidden entities: - script.backup_ha - sensor.last_backup_ha - sensor.backup_size_total - sensor.backup_count - automation.backup_diario |
1 2 3 4 5 6 7 |
automation: - alias: Backup diario trigger: platform: time at: '00:00:00' action: - service: shell_command.backup_ha |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
customize: script.backup_ha: friendly_name: Backup icon: mdi:content-save sensor.last_backup_ha: friendly_name: Ultimo backup icon: mdi:file-document sensor.backup_size_total: friendly_name: Tamaño total backup icon: mdi:archive sensor.backup_count: friendly_name: Total backup icon: mdi:format-list-numbers automation.backup_diario: icon: mdi:calendar-clock |
Ya que tenemos dentro de las copias de seguridad el archivo "secrets.yaml" y dentro de el hay muchas contraseñas que no deberíamos dejar acceder a nadie, he pensado en modificar un poco el comando para que al hacer el zip se haga con contraseña, hay un problema con todo esto, y es que la contraseña que pongas se va a quedar guardada como texto plano en los logs del sistema ya que se envía como texto plano en la orden, así que si queréis hacerlo tened esto en cuenta y poner una clave larga y diferente a las demás que uséis, de todas maneras para verla alguien tendría que tener acceso root a tu sistema, de cualquier manera es mejor ponerla que no, lo he pensado por si quieres dejar los backup en Dropbox o cualquier otro sitio de almacenamiento en la nube.
Sería poniendo después de zip esto: -P password
Así quedaría el comando:
1 2 |
#!/bin/bash cd /media/backup_ha/ && zip -P password -r "HA-backup-$(date +"%Y-%m-%d_%H-%M").zip" /media/docker/homeassistant/ -x "*.log" -x "/*tts/*" -x "*.db" -x "*.db-shm" -x "*.db-wal" -x "*.mp3" -x "/*deps/*" -x "/*www/camera_shots/*" -x "/*.git/*" -x "/*shell/gif_maker/venv/*" |
Es probable que quieras que tu backup se almacene en otra unidad o en una nube por ejemplo, gracias al cual podrás hacer una copia de tu backup en un servidor FTP
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 40 |
#!/bin/bash ###################################################### # Script Written by : Rahul Kumar # Date: Feb 21, 2013 ###################################################### DATE=`date +%d%b%y` LOCAL_BACKUP_DIR="/media/backup_ha/" FTP_SERVER="ftp.dominio.net" FTP_USERNAME="ftp user name" FTP_PASSWORD="ftp user password" FTP_UPLOAD_DIR="/backup_ha/" LOG_FILE=/backup/backup-DATE.log ############### UPLOAD to FTP Server ################ ftp -n $FTP_SERVER << EndFTP user "$FTP_USERNAME" "$FTP_PASSWORD" binary hash cd $FTP_UPLOAD_DIR #pwd lcd $LOCAL_BACKUP_DIR put "HA-backup-$(date +"%Y-%m-%d_%H-%M").zip" bye EndFTP if test $? = 0 then echo "Copia de seguridad copiada a servidor FTP satisfactoriamente Archivo HA-backup-$(date +"%Y-%m-%d_%H-%M").zip " > $LOG_FILE else echo "Error en copia a servidor FTP" > $LOG_FILE fi |