Great, thanks. So if I write a little script to archive the entire config directory and ship it over to the NAS, and run that as a cron job, I should be good?
I don’t see why not. I just copy stuff over manually right before I update to the newest HA version an every so often in between when I make a significant number of changes.
But just to re-emphasize - make you get the entire contents of that folder, hidden stuff and all.
Thanks. There’s a bit of an issue with the file /.storage/auth, which is owned by root, so my regular uid isn’t able to add it to the archive. Everything else zips up nicely.
I just run a chown on my docker config directory to switch it away from root to my current user (finity) and it all still works fine. And I can back everything up including that auth file.
So the way I backup seems overly involved, but it works.
1- Use Portainer to stop the Home Assistant container - if Home Assitant is running I’ve found files skip and don’t copy over
2- Sudo nautilus which pulls up the root file explorer and gets around the permission issues.
3- Copy the entire config directory to my NAS drive and backup folder
4- Start the container again in portainer after copying is complete
I mean, this works, but I really would like to automate the process if possible. I just haven’t figured out a good way to do that though.
Update - I think I figured out a way to automate. I wrote a script to backup and run it nightly through the crontab. Generally following the directions here - Using rsync and cron to automate incremental backups
First I created a script file called hass_backup.sh that stops the container, does the backup using rsync, then starts the home assistant docker container back up
To make sure that all the root files copy, I did this in the global crontab by running sudo gedit /etc/crontab
I then added commands to run the script nightly at 2 AM as root. I also then added another command to the crontab to start the container at 2:15 AM in case anything happens where the first script fails at some point so Home Assistant doesn’t stay offline.
I just switched from a supervised Pi4 setup to running on a laptop with Ubuntu and docker and faced the same questions. After some research (for those who also found this link as I did), I settled on Duplicati: https://hub.docker.com/r/linuxserver/duplicati
Runs in docker, and as long as you provide it your docker root folder as a volume, it can back up all your containers.
(supports GDrive, OneDrive, local (NFS), and tons more destinations)
The latest version 2022.4 now allows you to manually create backups through the UI for home assistant container pretty easily.
But I would still recomend an automated backup like the cron rsync example I posted above or using Duplicati as the last poster suggested. I saw this helpful video guide to setup duplicati recently as well if you’re looking for step by step instructions.
Duplicati seems like a perfect solution. However as stated in the video, if HA is running, database files backup will fail. He told that it’s not a probem for him, as he only want’s to backup configuration files, but for me it would be important to backup db as well. I had an incident of deleting (yes, stupid me) my whole HA docker folder and lost about half a year of data (luckily had half year old full backup).
Does anybody have a idea how to solve this issue and use duplicati to backup the whole docker folder with db-s included?
The shell script stops the Home Assistant container every night at 2AM. It then uses Rsync to copy the home assistant config files over to another backup folder (fully in tack because Home Assistant is stopped). After the backup the shell script starts Home Assistant again. I then use the built in backup program in Ubuntu (which I believe is just duplicity) to copy the backup from that other folder to my Google Drive automatically. Duplicati could also be used to copy the backup to create a “backup of the backup”.
I think the problem with just using Duplicati alone is you can’t use it to stop Home Assistant (at least no way I am aware of)
I’ve had issues restoring Home Assistant container using Duplicacy. I think it’s a permissions issue in respect of the /.storage/auth file (which I can see is referred to above), either the backing up of this and/or the restoring of it. I’m running Unraid. Does anyone know what I should do to avoid any permissions issue? Thanks.
It’s been a while, so let me add to this for anyone else finding this now.
I have moved my DB to MariaDB. I wanted to be able to show 45 days of recorder data, and my DB is now 65GB (As opposed to my InfluxDB with over a year’s worth of data only being 11GB). But even with the built-in DB, there are options.
I use GitHub - tiredofit/docker-db-backup: Backup multiple database types on a scheduled basis with many customizable options. This can backup many different databases. And I have an NFS mount to my NAS where it puts the database backups.
This way backups get done through SQL and not file-level.
It supports SQLite (which I think HA uses?), so it’s just a matter of mounting the db file to this container and it should be able to back that up properly.
As for the mentioned permissions issues, you can either run duplicati as root, and there shouldn’t be any issues, or make sure all containers are running as the correct PUID/GUID.
#!/bin/bash
# Backup HA
echo "Backing up Home Assistant to pCloud..."
rclone sync /opt/appdata/homeassistant/backups pCloud:/homeassistant_backup/ -P
echo "Backup of Home Assistant database to pCloud completed."
# Remove oldest HA backups
echo "Removing oldest Home Assistant backups..."
ls -t /opt/appdata/homeassistant/backups | tail -n +4 | xargs -I {} rm -f "/opt/appdata/homeassistant/backups/{}"
echo "Finnished removing old Home Assistant backups."
Setup a cron job on the host to run the script each night.
Pro: It works, and by using HA’s own backup functionality, removes the risk of database issues. Also, no need to stop and start Home Assistant.
Con: Ideally, I would have liked to do also the HA backup from the script, but I haven’t managed to figure out how to do that.
This is the type of question you should search before posting, as it has nothing to do with Docker. But yes, the database is definitely part of the backup.
unfortunately, it doesn’t seem to work here, I don’t really get why it complains about zha_gateway. And on the other hand, I migrated the database from sqlite to pgsql, which I’m already backing up. Perhaps I should do just a rclone/rsync task for the data directory.
homeassistant | 2024-01-19 00:55:00.144 ERROR (MainThread) [homeassistant.components.automation.backup_create_backup] While executing automation automation.backup_create_backup
homeassistant | Traceback (most recent call last):
homeassistant | File "/usr/src/homeassistant/homeassistant/components/automation/__init__.py", line 669, in async_trigger
homeassistant | await self.action_script.async_run(
homeassistant | File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 1587, in async_run
homeassistant | return await asyncio.shield(run.async_run())
homeassistant | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
homeassistant | File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 426, in async_run
homeassistant | await self._async_step(log_exceptions=False)
homeassistant | File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 479, in _async_step
homeassistant | self._handle_exception(
homeassistant | File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 502, in _handle_exception
homeassistant | raise exception
homeassistant | File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 476, in _async_step
homeassistant | await getattr(self, handler)()
homeassistant | File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 713, in _async_call_service_step
homeassistant | response_data = await self._async_run_long_action(
homeassistant | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
homeassistant | File "/usr/src/homeassistant/homeassistant/helpers/script.py", line 675, in _async_run_long_action
homeassistant | return long_task.result()
homeassistant | ^^^^^^^^^^^^^^^^^^
homeassistant | File "/usr/src/homeassistant/homeassistant/core.py", line 2149, in async_call
homeassistant | response_data = await coro
homeassistant | ^^^^^^^^^^
homeassistant | File "/usr/src/homeassistant/homeassistant/core.py", line 2186, in _execute_service
homeassistant | return await target(service_call)
homeassistant | ^^^^^^^^^^^^^^^^^^^^^^^^^^
homeassistant | File "/usr/src/homeassistant/homeassistant/components/backup/__init__.py", line 29, in async_handle_create_service
homeassistant | await backup_manager.generate_backup()
homeassistant | File "/usr/src/homeassistant/homeassistant/components/backup/manager.py", line 176, in generate_backup
homeassistant | raise result
homeassistant | File "/usr/src/homeassistant/homeassistant/components/zha/backup.py", line 15, in async_pre_backup
homeassistant | zha_gateway = get_zha_gateway(hass)
homeassistant | ^^^^^^^^^^^^^^^^^^^^^
homeassistant | File "/usr/src/homeassistant/homeassistant/components/zha/core/helpers.py", line 459, in get_zha_gateway
homeassistant | raise ValueError("No gateway object exists")
homeassistant | ValueError: No gateway object exists
I am using git as backup. It is a bit fiddly with the permissions, but I have a script which can be run as root.I have it run by a cron job a few times a day:
#!/bin/bash
cd <path to installation>
chmod -R a+r .
sudo -i -u <username> bash << EOF
cd <path to installation>
git add .
git commit -m "[BACKUP `date +'%Y-%m-%d %T'`]"
git push
EOF
Git makes it really easy to track changes or to revert only some part of the configuration. There are also great free online services to host your repository
I am also using MariaDB and I have another machine replicate it continuously. Then on that other machine I make a backup every night with something like:
mysqldump -u <username> -p ha | lbzip2 -9czq > backup.bz2