Sistema de copias de seguridad para Homeassistant

Tarjeta Backup HA en Homeassistant

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.

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:

Vamos a empezar a crear el archivo llamado 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/*"

La primera ruta que en mi caso es /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:

El siguiente código en la parte de shell_command:
shell_command:
  backup_ha: "ssh root@192.168.1.7 bash /media/docker/homeassistant/config/backup_ha.sh"
En este comando hay que cambiar la ip por la de vuestro sistema, y la ruta por la vuestra donde habeis guardado el archivo backup_ha.sh

sensor:

Sensor último backup

Ahora vamos a crear los sensores para que nos muestre una serie de datos interesantes para nuestro sistema de copias de seguridad. Este sensor nos muestra en pantalla el nombre del fichero de la última copia de seguridad, modificar la ruta por la vuestra donde vais a guardar las copias de seguridad y el usuario e ip por vuestro sistema:
- 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

Este sensor nos muestra en pantalla el tamaño total de la carpeta donde se guardan las copias de seguridad, si en ella guardais mas cosas habría que hacer un filtro para que seleccione solo los archivos que queramos, si no dará un dato erróneo para nosotros. Igualmente hay que cambiar la ruta por la vuestra:
- 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

Este nos muestra en pantalla el numero total de archivos dentro de la carpeta donde se guardan las copias de seguridad, también teneis que cambiar la ruta por la vuestra e igualmente si hay en esa carpeta otros archivos os va a dar un dato que no es fiable:
- platform: command_line
  name: backup count
  command: "ssh root@192.168.1.7 ls /media/backup_ha | wc -l"
  scan_interval: 60

group:

En esta parte pondremos los diferentes elementos en un grupo para visualizarlos, si quereis personalizarlo podeis leeros la guía de grupos http://domology.es/grupos-pestanas-paneles-ha/
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:

Vamos a crear ademas un automation para que nos ejecute una copia a diario, en este caso se haría todos los días a las 00:00h:
automation:
  - alias: Backup diario
    trigger:
      platform: time
      at: '00:00:00'
    action:
      - service: shell_command.backup_ha

customize:

Aqui vamos a dejar un poco bonita la tarjeta donde van todos los elementos, podeis modificar los iconos y los nombres a vuestro gusto personal:
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

Los archivos de copia de seguridad se van guardando en la carpeta elegida en el comando backup_ha.sh:
Archivos de copia de seguridad

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.

4 comentarios sobre “Sistema de copias de seguridad para Homeassistant

  • el 24 diciembre, 2018 a las 18:52
    Permalink

    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

    • el 26 diciembre, 2018 a las 09:40
      Permalink

      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.

  • el 29 agosto, 2019 a las 14:49
    Permalink

    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

Deja un comentario

Síguenos

Siguenos en facebook