Skip to main content

homebutler backup

Archives the volumes and bind mounts of your Docker Compose services into one tar.gz file.

Services are found through docker compose ls, so only containers started by Docker Compose are included. The archive also holds the Compose files and a manifest.json that records every mount.

Archives go to backup.dir or backup_dir in your config, and to ~/.homebutler/backups when neither is set.

For what a backup contains and how to schedule one, see Backup and restore and Scheduled backups.

CommandWhat it does
drillBoots a backed-up app in an isolated container and checks that it answers.
listLists the archives in the backup directory.

backup​

homebutler backup [flags]
homebutler backup [command]
FlagTypeDefaultDescription
--excludestring, repeatable-Host path to leave out. Repeat for several paths. Excludes bind mounts at or under the path, and records them in the archive. A path that matches no mount is reported.
--servicestring-Back up this Compose service only. The name is the service name in the Compose file.
--tostring-Directory to write the archive to, instead of the configured backup directory.

Back up one service.

homebutler backup --service uptime-kuma
Backup complete: /home/you/backups/backup_2026-10-25_111634.343.tar.gz
Services: uptime-kuma
Volumes: 1
Size: 871 B

Back up everything, send the archive to another folder, and leave out one bind mount. The second --exclude matches nothing, and the output says so.

homebutler backup --to /home/you/archive --exclude /srv/media --exclude /srv/typo
Backup complete: /home/you/archive/backup_2026-10-25_111649.038.tar.gz
Services: uptime-kuma, media
Volumes: 1
Size: 982 B

Excluded 1 bind mount(s), recorded in the archive:
media:/srv/media

⚠️ 1 --exclude path(s) matched no bind mount, so nothing was left out for them:
/srv/typo

A service that is not in any Compose project is an error.

homebutler backup --service nope
error: service "nope" not found in any compose project

backup drill​

Boots a backed-up app in an isolated container and checks that it answers.

homebutler backup drill [service] [flags]

The drill extracts the archive, starts the app's image with the restored volumes on a temporary network and a free host port, and requests the app's health path. It removes the container, network, and files afterwards.

The drill supports the apps that have a built-in health check: nginx-proxy-manager, vaultwarden, uptime-kuma, pi-hole, gitea, jellyfin, plex, portainer, homepage, and adguard-home. The service name must match the Compose service name in the archive.

The command exits 1 when the app does not come back, so a scheduled job sees the failure.

For the full procedure, see Backup drill.

ArgumentDescription
serviceService to drill. Required unless you use --all.
FlagTypeDefaultDescription
--allbooleanfalseDrill every supported app in the archive. Takes no service name. For this command --all means all apps in the archive, not all servers.
--archivestring-Archive to drill. The default is the newest archive in the backup directory.
homebutler backup drill uptime-kuma

The output, shortened: the timing line is removed.

🔍 Backup Drill — uptime-kuma

📦 Backup: /home/you/backups/backup_2026-10-25_111638.976.tar.gz
📏 Size: 1.1 KB
🔐 Integrity: ✅ tar valid (7 files)

🚀 Boot: ✅ container started in 2s
🌐 Health: ✅ HTTP 200 on port 33813

✅ DRILL PASSED

Drill every supported app in the newest archive.

homebutler backup drill --all
🔍 Backup Drill — all apps

uptime-kuma ✅ PASSED (5s)

📊 Result: 1/1 passed

A service with no health check is an error.

homebutler backup drill media
error: no health check defined for "media"

backup list​

Lists the archives in the backup directory.

homebutler backup list [flags]
homebutler backup list
NAME SIZE CREATED
backup_2026-10-25_111634.343.tar.gz 871 B 2026-10-25T11:16:38-07:00
backup_2026-10-25_111638.976.tar.gz 1.1 KB 2026-10-25T11:16:41-07:00

With no archives:

homebutler backup list
No backups found.