An Unraid plugin that backs up, restores, and syncs Docker and Podman container appdata between local and remote hosts through the Unraid web UI.
- Web UI configuration editor for backup groups, containers, paths, and SSH settings
- Manual backup and restore with group or container granularity
- Dry-run and debug modes for safe testing
- Scheduled backups via Unraid's cron system
- Local and remote host support using
rsyncover SSH - Live log tail while jobs run
- Rotating run history keeps the last 5 logs and results
- Container config export (
docker inspectorpodman inspectJSON) alongside appdata - Docker and Podman support with a per-container/per-host runtime selector
- Quadlet/systemd auto-detection containers managed by a systemd service unit are stopped/started via
systemctl, falling back to Docker/Podman direct commands otherwise
AppdataSync is a narrower alternative that exists to scratch a different itch.
The main differences:
- Remote source hosts. CA backs up containers running on the local Unraid box.
AppdataSync can also back up appdata from containers running on remote Docker
hosts, pulled over SSH via reusable host profiles (
rsyncover SSH). This is the primary reason AppdataSync exists. - Mirror vs. snapshots. CA keeps dated, full tar snapshots with retention
by age, giving you point-in-time history to roll back to. AppdataSync keeps a
more live mirror (
--delete) of each container's appdata plus an exporteddocker inspectJSON config , i.e. the current state, not a history of past runs. The rotating "last 5" history here refers to run logs/results, not backup snapshots. If you need to restore a container to how it looked three days ago, use CA; if you want a current, browsable copy of appdata, AppdataSync fits better. - Group + hook orchestration. AppdataSync organizes containers into groups
with global (
pre_run/post_run) and per-group (pre_group/post_group) hooks that abort the run on non-zero exit. CA has its own per-container settings, exclusions, and PreRun/PreBackup/PostBackup/PostRun scripts, a different, more per-container model. - Scope. AppdataSync handles Docker and Podman appdata. CA additionally backs up your USB flash drive and VM/libvirt metadata.
- Backend. AppdataSync is Python-based (see the Python requirement above); CA is PHP/bash. Pick whichever matches what you already have provisioned.
If you only back up local containers and want dated snapshots, CA is the safer choice. If you have containers spread across multiple hosts, want a current remote-mirror of their appdata, or prefer group/hook-driven orchestration, AppdataSync is worth a look.
- In the Unraid UI go to Plugins > Install Plugin
- Paste the
.plgURL from the latest release - Click Install
After installation the plugin is available at Tools > AppdataSync.
- Unraid 7.0.0 or later
- Docker Engine or Podman on target hosts
rsyncandsshavailable on local and remote systems- Python packages:
docker,pyyaml(colorlogis optional, for colored terminal output)- The
podmanCLI is used directly for Podman containers, so no extra Python package is needed
- The
Unraid does not include Python by default, and this plugin's install script
will only pip install the dependencies above if a python3 interpreter is
already present (otherwise it prints a warning and the backend won't run). You
must install a Python 3 provider plugin before installing AppdataSync.
The recommended provider is desertwitch's python-unRAID (dwpython), which
installs Python 3, pip, and setuptools as proper Unraid packages:
- In the Unraid UI go to Plugins > Install Plugin
- Paste the dwpython plugin URL:
https://raw.githubusercontent.com/desertwitch/python-unRAID/main/plugin/dwpython.plg - Click Install, then accept the default backend (Python 3.11.x) or pick a newer one (3.12 / 3.13 / 3.14) from its settings page
AppdataSync is developed and tested against the Python versions shipped by dwpython (3.11+). Older interpreters may work but are not supported.
- Open Tools > AppdataSync
- Configure your backup destination, groups, and containers in the web UI
- Click Save Configuration
- Run a Dry Run first to preview what will happen
- Run Backup All or Backup Group to back up appdata
- Use Restore Group or Restore Container to restore from a previous backup
All container and host settings are managed through the web UI and stored in:
/boot/config/plugins/appdatasync/config.yaml
SSH credentials and the default container runtime (docker or podman) live
in host profiles under hosts: and are inherited by any container that references
the profile by host: name. The local host is always available and carries no SSH
settings. To give a single container different SSH credentials from its host profile,
set ssh_override: yes on the container and provide ssh_user, ssh_key, and
ssh_port there. A container can also override the host's runtime with its own
runtime: field.
Example config.yaml:
backup_destination: /mnt/user/backup/appdata
store_by_group: yes
hosts:
- name: local
- name: my-server
ssh_user: userName
ssh_key: /mnt/user/system/keys/ssh_key
ssh_port: 22
runtime: podman # default runtime for containers on this host
groups:
group-1:
- name: container-a # local Docker container
host: local
appdata_path: /mnt/user/appdata/container-a
restart: yes
start_delay: 10
- name: container-c # remote Podman container, inherits my-server SSH
host: my-server
runtime: podman
appdata_path: /docker/container-c
restart: yesNote on rootless Podman: rootless Podman containers are visible only to the user
that owns them. Make sure the ssh_user on the remote host (or the local user running
the plugin) matches the Podman user, otherwise the container list and stop/start
operations will be empty or fail.
Note on Quadlets and systemd-managed containers: if a container has a matching
systemd service unit (e.g. mycontainer.service from a mycontainer.container Quadlet
or a custom unit), AppdataSync automatically uses systemctl for stop/start/status.
The inspect export still uses the configured runtime (podman inspect/docker inspect).
No extra configuration is required; set runtime: podman as usual and keep the
container name matching the systemd unit name.
Optional hooks (absolute script paths; a non-zero exit aborts the run and marks
it failed) can be set globally as hooks.pre_run / hooks.post_run, and per group
as hooks.pre_group / hooks.post_group.
Enable scheduled backups from the plugin UI:
- Choose frequency: daily, weekly, monthly, or custom cron
- Select groups to back up (leave blank for all groups)
- Optionally run scheduled backups in dry-run mode
The schedule writes a plugin-owned cron file and syncs it via /usr/local/sbin/update_cron.
Scheduled and manual run logs are kept under /boot/config/plugins/appdatasync/logs/, with the last 5 runs available in the Recent Runs section.
The core backup.py utility was written and used by me over the last couple years. The Unraid web UI portions of this plugin were developed with assistance from large-language-model coding tools, specifically Kimi K2.7 (accessed via the Claude Code CLI, model kimi-k2.7-code:cloud) and GLM-5.2 (accessed via the Claude Code CLI, model GLM-5.2:cloud).
This work is shared partly as a learning exercise in AI/LLM-assisted development, prompt engineering, and practical tooling integration. The generated code was reviewed, tested, and refined by the project author, but contributors and users are encouraged to audit it as they would any AI-assisted codebase.