Vamos a configurar un sistema de copias de seguridad para Homeassistant, para ello vamos a hacer uso de los comandos mediante SSH y que está perfectamente explicado en esta entrada http://domology.es/scripts-y-comandos-ssh-en-home-assistant/, para poder comunicarnos entre Homeassistant y el sistema donde 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.
Tabla de contenidos
Requisitos previos:
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:
sudo apt-get update
y después instalamos el paquete zip:
sudo apt-get install zip
Estrategia:
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:
/media/backup_ha/
Script BASH:
backup_ha.sh
para que ejecute la copia de seguridad con el siguiente código:#!/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/*"
/media/backup_ha/
es donde se van a guardar los archivos .zip con la copia de seguridad, esto teneis que cambiarlo por la ruta donde van vuestras copias de seguridad asegurandose siempre de tener permisos de escritura en dicha carpeta.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, podeis modificarlo para incluir o excluir los archivos que querais, 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, aqui https://www.home-assistant.io/docs/configuration/splitting_configuration/ podeis encontrar mas información.
script:
Copiamos y pegamos el siguiente código en la parte de script de tu sistema:
script:
backup_ha:
alias: Backup HA
sequence:
- service: shell_command.backup_ha
shell_command:
shell_command:
backup_ha: "ssh root@192.168.1.7 bash /media/docker/homeassistant/config/backup_ha.sh"
backup_ha.sh
sensor:
Sensor último backup
- platform: command_line
name: last backup ha
command: "ssh root@192.168.1.7 ls /media/backup_ha -Art | tail -n -1 | grep '.zip'"
Sensor tamaño total
- 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
Sensor numero de backup
- platform: command_line
name: backup count
command: "ssh root@192.168.1.7 ls /media/backup_ha | wc -l"
scan_interval: 60
group:
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
automation:
automation:
- alias: Backup diario
trigger:
platform: time
at: '00:00:00'
action:
- service: shell_command.backup_ha
customize:
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
backup_ha.sh
:
Si tienes dudas o cualquier consulta puedes encontrarnos en el grupo de Telegram
Adiós amigos!!!
ACTUALIZACIÓN SEGURIDAD 11/10/2018
Ya que tenemos dentro de las copias de seguridad el archivo «secrets.yaml» y dentro de el hay muchas contraseñas que no deberiamos 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 envia como texto plano en la orden, asi que si quereis hacerlo tened esto en cuenta y poner una clave larga y diferente a las demas que useis, 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 despues de zip esto: -P password
Así quedaría el comando:
#!/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/*"
ACTUALIZACIÓN COPIA EN UNIDAD EXTERNA 08/07/2019
Es probable que quieras que tu backup se almacene en otra unidad o en una nube por ejemplo.
Hoy os traemos un script elaborado por Rahul, gracias al cual podrás hacer una copia de tu backup en un servidor FTP
#!/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
Recordad que la seguridad al 100% no existe.
Lo primero decir que no tengo ni idea de linux ni raspberry ni de nada.
quería realizar este tutorial y lo primero que me pregunto es lo siguiente.
si realizo una copia por si se corrompe la tarjeta y la copia la hago en la tarjeta ¿de que me sirve?. Si no es en esa tarjeta, ¿donde se hace? no llego a entender esto
En la parte del tutorial de «estrategia» se habla de eso, obviamente no tiene mucho sentido dejarlo en misma tarjeta, tendrias que usar una memoria usb u otro sistema de almacenamiento.
Sugerencia: Que tal ampliar este articulo haciendo la copia de seguridad en la nube?
Para los que useis Raspbian,
El manual es valido, pero quitarle a todos los comandos el encabezado ssh root@192.168.1.7
La copia en memoria USB me ha dado muchos problemas de permisos, al montarse automaticamente, asi que he preferido complicarme la vida con el FTP
Generamos un fichero backup_ha_ftp.sh y copiamos el contenido del script de Rahul pero con nuestro parametros.
Ahora modificamos los siguientes ficheros:
shell_command.yaml
backup_ha: «bash /home/homeassistant/.homeassistant/backup_ha.sh»
backup_ha_ftp: «bash /home/homeassistant/.homeassistant/backup_ha_ftp.sh»
scripts.yaml
backup_ha:
alias: Backup HA
sequence:
– service: shell_command.backup_ha
– service: shell_command.backup_ha_ftp
automation.yaml
– alias: Backup diario
trigger:
platform: time
at: ’00:00:00′
action:
– service: shell_command.backup_ha
– service: shell_command.backup_ha_ftp
A mi para que me funcionara la comunicacion ftp he tenido que activar el modo pasivo cambiando del script la linea 14 por esta ftp -n -p $FTP_SERVER << EndFTP
ademas si creas los ficheros desde el usuario pi, tendras problemas de permisos y tendras que hacer un chmod 777 a los ficheros para solucionarlos.
Os recomiendo que si no os funciona, probeis a ejecutar el script desde el usuario homeassistant a ver donde esta el fallo.
Un saludo