Skip to content
View in the app

A better way to browse. Learn more.

Unraid

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

[Plugin] Unraid Rsync — multi-job rsync backup scheduler

Featured Replies

Unraid Rsync is a native webGui plugin for scheduling and monitoring rsync backup jobs — either over SSH to/from a remote host, or locally between two paths on the server. Unlike the existing single-schedule rsync plugins, this is a multi-job scheduler: each job gets its own cron schedule, its own source→destination pairs, and its own rsync options.

GitHub: https://github.com/sasa-fajkovic/unraid-rsync

Install URL:

https://github.com/sasa-fajkovic/unraid-rsync/releases/latest/download/unraid.rsync.plg

Why I built this

I wanted to back up music, appdata, a Nextcloud install, and an Immich library to a remote Raspberry Pi over SSH — each with different schedules, different rsync flags, and pre/post hooks (stopping a database container before the transfer, starting it again after) while having proper integration with Unraid and it's notification system. None of the existing plugins covered multi-job + per-job hooks + per-job flag overrides in one place, so I built this one.

What it does

- Multiple independent jobs, each with:

- Transport: SSH (push/pull to a remote host) or Local (paths on this server, under /mnt)

- Its own cron schedule (not one global schedule), with a live "Next run" column

- A curated, whitelisted set of rsync flags as checkboxes/inputs (no free-form flag string — destructive flags are gated), each with inline help on hover

- Explicit source → destination pairs (one rsync call per pair, not a cartesian product of multiple sources × destinations)

- Pre/post hooks (run as root, output captured into the per-run log)

- Per-job log level and notify mode (off / success-only / failure-only / always)

- Live state badges (success/warning/failed/aborted/pending/running) and a per-run log viewer that polls live while a job is running

- Manual Run / Dry-run / Abort per job — dry-run before you trust anything unattended

- A Connections tab for reusable SSH endpoints (existing key file, managed key, or password via sshpass), with host-key discovery and a connection test

- A Credentials tab — a managed SSH key keychain (generate or import)

- Status tab showing the rolling plugin log + an rsync-binary presence check

- Notifications through Unraid's native notify system

- Clean uninstall (removes both the runtime tree and the persistent /boot config, clears cron lines)

Screenshots

image.png

image.png

image.png

image.png

image.png

image.png

image.png

Install

Requires Unraid 7.0.0+.

1. Plugins → Install Plugin

2. Paste:

https://github.com/sasa-fajkovic/unraid-rsync/releases/latest/download/unraid.rsync.plg

3. Click Install, then open Settings → User Utilities → Unraid Rsync

Updates are automatic via Plugins → Check for Updates — releases use CalVer and publish automatically on every merge to main.

A note on credential security

Credentials are stored on the USB flash /boot/config/plugins/unraid.rsync/credentials.json), which is FAT32 and world-readable — Unix permissions don't apply there. To keep things safe by default:

- Existing-key-file auth (the default) never copies your private key into the plugin's store — only the path is recorded.

- Managed keys are only ever decrypted to RAM (tmpfs, mode 600) at run time, and the private key is never shown again in the UI after saving.

- Password auth is stored obfuscated, not encrypted — use key auth where possible, and a low-privilege remote account if you must use a password.

This is documented up front in the README rather than buried, since it's a backup tool handling credentials.

Status

Feature-complete for my own use case (appdata / Nextcloud / Immich → remote Pi over SSH with DB stop/start hooks), running nightly. Not yet in Community Applications — submitting once this thread exists, since CA wants a forum support link in the .plg.

Bugs / feature requests: https://github.com/sasa-fajkovic/unraid-rsync/issues

Feedback welcome, especially on the credential-storage approach and anything that looks unsafe before more people start pointing this at real backups.

Edited by fajkovic.sasa

  • 1 month later...

Thanks for putting this out there! I love the UI but I'm running into two issues:

  1. My distant filesystem doesn't support setting the time attribute on directories, but -O (--omit-dir-times) isn't surfaced in the webui as a global or job specific flag. Would it be possible to add it?

  2. When I set a custom secret directory the plugin creates a cred json file, creates and stores new creds there, but stops showing them in the credential manager / stops allowing me to select them on connections:

Setting:

image.png

New creds get created successfully:

image.png

Unavailable in Cred manager tab or new connections:

image.png

image.png

Edited by d3fc0n0wltraps

  • Author

@d3fc0n0wltraps - Thank you for the feedback. Give me a day or two and will look into adding this as well :)

edit:
- Added support for -O/--omit-dir-times and -J/--omit-link-times as part of release https://github.com/sasa-fajkovic/unraid-rsync/releases/tag/2026.08.07.

You can update the plugin and it will work.

edit2:

  • Fixed the bug - A custom Secrets directory setting made the plugin save your SSH keys to the new location but the Credentials/Connections/Jobs pages kept looking for them in the old default spot — so they appeared to vanish even though they were safely saved; fixed in the release https://github.com/sasa-fajkovic/unraid-rsync/releases/tag/2026.08.07d

@d3fc0n0wltraps - I did e2e tests and works now properly. Let me know the feedback from your side.

Edited by fajkovic.sasa

  • 4 weeks later...

HI, just installed your plugin (thanks so much for sharing/posting it for the community)

I’m trying to connect to an rsync server set up on my old QNAP NAS (which is on the same network etc.) I have provided the setting on the QNAP side (attached), which I have entered int the configure the connection within Unraid Rsync, however it’s giving me an error. To trouble short

I’ve tired turning off host key checking etc. (making it insecure, but no luck same error)

I’ve tried at the command line too to check too, but no luck

root@NodeCentral:~# rsync 192.168.102.134:873
The authenticity of host '192.168.102.134 (192.168.102.134)' can't be established.
ED25519 key fingerprint is: SHA256:7FcRdUeU+hW1zv7LT1vTsaMYW4shshshshsFAKEdjdjnR5ktWw
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? y
Please type 'yes', 'no' or the fingerprint: yes
Warning: Permanently added '192.168.102.134' (ED25519) to the list of known hosts.

````

So I’m a little stuck on what to do and looking for advice ?

IMG_7851.jpeg

IMG_7850.jpeg

Edited by NodeCentral

OK, some progress.. I can authenticiate now it seems, but the plug in gives me the message, but there is no NerdTools plugin available in the Unraid App Store ?

Password authentication requires the "sshpass" command, which is not part of Unraid's base OS. Install the NerdTools plugin and enable its sshpass package, or use key authentication (recommended).

Edited by NodeCentral

  • Author

Hi @NodeCentral — thanks for the detailed write-up and the screenshots. There are two separate things going on here, and one of them is my bug, not yours.


1. Port 873 is a different protocol.

What you enabled in HBS 3 ("Rsync Server", port 873) is the rsync daemon protocol — rsync://host/module. This plugin does rsync over SSH, which is a completely different transport. With 873 in the Port field the plugin ran ssh -p 873; your QNAP's rsync daemon accepted the TCP connection, didn't understand SSH, and hung up. That's the "Connection closed by remote host / not running SSH" you saw.

The message was technically accurate but never told you why, which is on me. The next release warns about port 873 on the Port field, on save, on Test connection, and on that exact Discover-host-key error.

2. Your command-line test was actually testing SSH, not the daemon.

This one is genuinely counter-intuitive and I think it's what sent you down the wrong path:

rsync 192.168.102.134:873

A single colon means "use the SSH transport", so rsync read 873 as a remote path and connected over SSH on port 22. That's why you got an ED25519 host-key prompt — it was sshd answering, not the rsync daemon. (To actually talk to the daemon you'd use rsync rsync://192.168.102.134:873/, or a double colon: rsync 192.168.102.134::.)

The useful part: that prompt proves SSH is already reachable on your QNAP.

So to get this working: on the QNAP, Control Panel → Network & File Services → Telnet/SSH → tick "Allow SSH connection" (port 22). Then in the plugin set the Port back to 22 and use a QNAP account permitted to log in over SSH. You can switch the HBS 3 Rsync Server back off — this plugin doesn't use it.

3. The sshpass / NerdTools message is my bug, and you're right that it's a dead end.

NerdTools was archived by its authors in March 2024 and isn't available on Unraid 7, so that message was telling you to do something impossible. Password auth was effectively broken on a stock box and the plugin should never have pointed you there.

I've fixed it properly rather than just rewording the message: password auth now uses OpenSSH's own SSH_ASKPASS mechanism, so it needs nothing installed at all — no sshpass, no NerdTools. The password is read from a RAM-only file created at mode 600 for the duration of the run and deleted afterwards; it never appears in a command line, an environment variable, or ps. (It's actually a small security improvement on the old sshpass approach, where the path to that file sat in the process arguments and was visible to any local user via ps.)

That's merged shortly and will be in the next release. Key auth is still what I'd recommend where you have the choice, but password auth will simply work.

Fix merged here: https://github.com/sasa-fajkovic/unraid-rsync/pull/137 and a new release is here: https://github.com/sasa-fajkovic/unraid-rsync/releases/tag/2026.08.31a

Thanks again for reporting both — the second one in particular caught a real regression affecting everyone using password auth, not just you.

Hi @fajkovic.sasa

Thank you so much for your plugin, I was really looking forward for something lighter to replace "luckyBackup", unfortunately I'm struggling to make it work, I'll write my progress so far, and please let me know if you prefer to move this conversation to GitHub.

This is my current Asustor rsync configuration with a simple password (SSH is enabled on port 22)

image.png

From command line I just login trough ssh
ssh xxx.myasustor.com 

 
and run
rsync --archive –v --progress
[email protected]::rsync_bkp /home/pandasharp/Downloads/ 

This is my current working LuckyBackup configuration on Unraid

image.png


image.png

If I try a dry run I get

=====================================

execution of task : rsync_bkp, starting

Source : rsync_bkp

Destination : /mnt/user/data/downloads/

receiving incremental file list

./

  • file1...

  • ...file20

Number of files: 20 (reg: 17, dir: 3)

Number of created files: 19 (reg: 17, dir: 2)

Number of deleted files: 0

Number of regular files transferred: 17

Total file size: 13.36G bytes

Total transferred file size: 13.36G bytes

Literal data: 0 bytes

Matched data: 0 bytes

File list size: 911

File list generation time: 0.001 seconds

File list transfer time: 0.000 seconds

Total bytes sent: 86

Total bytes received: 988

sent 86 bytes received 988 bytes 716.00 bytes/sec

total size is 13.36G speedup is 12,441,692.74 (DRY RUN)

execution of task : rsync_bkp, finished =====================================

and this is How I'm trying to configure your plugin, connection wokrs

image.png

job configuration

image.png

dry run log

[2026-09-02T16:10:22+02:00] Run started for job "rsync_bkp" (j-rsync-bkp) [DRY-RUN] [manual].

[2026-09-02T16:10:22+02:00] Timestamps in timezone: Europe/Berlin.

[2026-09-02T16:10:22+02:00] Pair #1: [email protected]:/rsync_bkp -> /mnt/user/data/downloads/

Warning: Permanently added 'xxxx.myasustor.com' (ECDSA) to the list of known hosts.

2026/09/02 16:10:23 [360712] receiving file list

receiving incremental file list

rsync: [sender] link_stat "/rsync_bkp" failed: No such file or directory (2)

2026/09/02 16:10:23 [360712] Number of files: 0

2026/09/02 16:10:23 [360712] Number of created files: 0

2026/09/02 16:10:23 [360712] Number of deleted files: 0

2026/09/02 16:10:23 [360712] Number of regular files transferred: 0

2026/09/02 16:10:23 [360712] Total file size: 0 bytes

2026/09/02 16:10:23 [360712] Total transferred file size: 0 bytes

2026/09/02 16:10:23 [360712] Literal data: 0 bytes

Number of files: 0

2026/09/02 16:10:23 [360712] Matched data: 0 bytes

2026/09/02 16:10:23 [360712] File list size: 8

2026/09/02 16:10:23 [360712] Total bytes sent: 8

2026/09/02 16:10:23 [360712] Total bytes received: 8

2026/09/02 16:10:23 [360712] sent 8 bytes received 8 bytes 10.67 bytes/sec

Number of created files: 0

Number of deleted files: 0

Number of regular files transferred: 0

Total file size: 0 bytes

Total transferred file size: 0 bytes

Literal data: 0 bytes

Matched data: 0 bytes

2026/09/02 16:10:23 [360712] total size is 0 speedup is 0.00 (DRY RUN)

File list size: 8

Total bytes sent: 8

Total bytes received: 8

sent 8 bytes received 8 bytes 10.67 bytes/sec

total size is 0 speedup is 0.00 (DRY RUN)

2026/09/02 16:10:23 [360712] rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1876) [Receiver=3.4.4]

2026/09/02 16:10:23 [360712] rsync: [Receiver] write error: Broken pipe (32)

rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1876) [Receiver=3.4.4]

rsync: [Receiver] write error: Broken pipe (32)

[2026-09-02T16:10:23+02:00] Pair #1 rsync exited with code 23 (PARTIAL).

[2026-09-02T16:10:23+02:00] Run finished: state=PARTIAL exitCode=23.

I suspect the issue could be here


[email protected]:/rsync_bkp -> /mnt/user/data/downloads/

rsync: [sender] link_stat "/rsync_bkp" failed: No such file or directory (2)

your plugin really want a folder that starts with / , but I just use a module the rsync --archive –v --progress [email protected]::rsync_bkp /home/pandasharp/Downloads/ 

Usage: rsync [OPTION]... SRC [SRC]... DEST

or rsync [OPTION]... SRC [SRC]... [USER@]HOST:DEST

or rsync [OPTION]... SRC [SRC]... [USER@]HOST::DEST

or rsync [OPTION]... SRC [SRC]... rsync://[USER@]HOST[:PORT]/DEST

or rsync [OPTION]... [USER@]HOST:SRC [DEST]

or rsync [OPTION]... [USER@]HOST::SRC [DEST]

or rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST]

The ':' usages connect via remote shell, while '::' & 'rsync://' usages connect

to an rsync daemon, and require SRC or DEST to start with a module name.

I'm not an rsync expert, any help is appreciated, looking forward to hearing from you, thanks!

image.png

image.png

  • Author

Hi @PandaSharp — thanks for the write-up with all the details. The screenshots and both logs made this easy to pin down, and they've led to two changes in the plugin.

PS, forum is fine, no need to move to GitHub.


Short version: nothing is broken, but the plugin can't do what your LuckyBackup task is doing. One field has the wrong kind of value in it.

WHY IT FAILED

There are two different rsync protocols:

  • host:/path rsync over SSH (port 22) <- what this plugin speaks

  • host::module rsync daemon / rsyncd <- a separate protocol, port 873

Look closely at your own LuckyBackup screenshot: "Remote module" is ticked and the "ssh" box is NOT ticked. So despite SSH being enabled on the NAS, LuckyBackup isn't using it at all — it's talking to the rsync daemon:

rsync ... --password-file=/luckybackup/p pandasharp@HOST::rsync_bkp /mnt/user/data/downloads/

Note the double colon. "rsync_bkp" there is the name of a Backup Module on your Asustor — not a folder.

This plugin only speaks rsync-over-SSH, so it builds a single colon:

pandasharp@HOST:/rsync_bkp

Over SSH there are no modules, so rsync looks for a literal directory called /rsync_bkp on the NAS. There isn't one, which is exactly what it told you:

rsync: [sender] link_stat "/rsync_bkp" failed: No such file or directory (2)

Your diagnosis was right, by the way — that field does want a real path. Adding the leading slash just didn't turn a module name into one.

THE FIX

Your Asustor screenshot already has the answer: module rsync_bkp points at /Download/rsync_dir. That folder is what the job should target. You just need its full path as SSH sees it, which on ADM usually sits under a volume prefix.

1) From an Unraid terminal, find the real path:

ssh pandasharp@HOST 'grep -A3 "\[rsync_bkp\]" /etc/rsyncd.conf; ls -d /volume*/Download/rsync_dir /share/Download/rsync_dir 2>/dev/null'

The "path =" line in rsyncd.conf is the authoritative answer.

2) Prove it before touching the plugin — this is a dry run, it changes nothing:

rsync -n -rtv pandasharp@HOST:/volume1/Download/rsync_dir/ /mnt/user/data/downloads/

Substitute whatever step 1 gave you. Once you see a file list, that's your path.

3) In the job, keep Transport = SSH and Direction = Pull, and change only the

right-hand box of the pair:

left (local) /mnt/user/data/downloads/

right (remote) /volume1/Download/rsync_dir/ <- the real path

Your connection needs no changes — "Connection succeeded" already proves SSH login

and password auth work against your NAS.

WHAT I CHANGED BECAUSE OF YOUR REPORT — release 2026.09.02

Two things, both out now. Update the plugin to get them.

1. The remote path field is no longer silent about this. A module name, a host::module, an rsync:// address, or a pasted host:/path now each get a message explaining what the field actually wants, instead of failing on the first run with that link_stat error. A single top-level path like /rsync_bkp still saves (it's a legal path — /data and /backup are real remote paths for other people) but now warns that it may be a module name. The source/destination pairs row also gained proper help text explaining which box is which — it had none.

2. New option: "Remote rsync path (SSH jobs)" (--rsync-path), in the rsync options of a job and in Global Settings. You may well need this one. rsync-over-SSH requires the rsync binary on the NAS side, and appliances often keep it somewhere that isn't on the PATH you get from a non-interactive SSH login. If step 2 above gives you "rsync: command not found" or "remote command not found" instead of a file list, that's what's happening —

run ssh pandasharp@HOST 'which rsync || ls /usr/bin/rsync /usr/local/bin/rsync'

and put the answer in that field. Before this release there was no way to set it.

ON DAEMON SUPPORT

You're right that the plugin can't do host::module at all, and that was a deliberate scope decision rather than an oversight. But you're the second person to arrive here from a NAS whose UI only offers an "Rsync Server" toggle, so I've opened a tracking issue for proper rsync daemon transport:

https://github.com/sasa-fajkovic/unraid-rsync/issues/139

I won't promise a date — it's a third transport with its own auth model, not a flag.

The SSH route above should get you running tonight in the meantime.

Let me know how step 1 goes, and if the path turns out to be somewhere unexpected on

Hi @fajkovic.sasa

Thanks a lot for your quick and detailed reply, I'm a bit swamped for the next several days, but I'll give it a shot as soon I'll have a change ... and I forgot to mention that I tried also /Download/rsync_dir instead of /rsync_bkp but still no luck, it must have been because of the mix up of protocols, I'll dig and debug everything from command line with a dry run, thanks!

  • Author

Hey @PandaSharp ,
I've just merged https://github.com/sasa-fajkovic/unraid-rsync/pull/140
Latest release: https://github.com/sasa-fajkovic/unraid-rsync/releases/tag/2026.09.04

This now adds rsync daemon support that you can choose as a transport layer on top of SSH
image.png

You can select it per job and/or per connection level giving you granularity if needed :)

Hope this helps and you will now have everything working nicely.

In your case, probably the thing to do is create a connection using rsyncd then define:

  • Name - whatever you wanna call the connection. Asustor NAS for example

  • Host - IP of your NAS device

  • Username - the module user from the NAS "Rsync Server" page, not the SSH account

  • Module secret - it's password. Leave blank if the module has no auth users

Thanks again for posting this. I've been using it very successfully since you added the omit times flags. This has now fully replaced my previous rclone/user script solution.

I did have a quick question - and this may be a long shot / not in your wheelhouse. No worries either way.

A popular plugin, custom tab, allows users to make a custom tab out of anything and add it to Unraid's nav bar. Usually this plays well with other installed plugins via the Built-In page dropdown. It looks like there's an entry there, but when I configure it I just get a blank Unraid page. I'm not sure if the custom tab plugin has robust documentation about what it's looking for as I've never run into this issue with an Unraid plugin.

image.png

As a workaround I have it configured to use the plugin url (https://nas.effoff.dev/Settings/UnraidRsync) but that has several drawbacks. That URL is serviced by my reverse proxy so if that's down it won't work, or if I connect to my Unraid box using its IP or the actual machine name then I have to re-login to use the link.

Again, thanks for your efforts so far and no worries if this isn't something that can be fixed/isn't something you want to take on.

  • Author

Thanks @d3fc0n0wltraps — glad it's replaced the rclone setup.

Not a Custom Tab bug and not really fixable on my side: Custom Tab's "Built-In Page" mode copies the body of the selected .page file into a new tab. UnraidRsync.page is only a tab container (Unraid xmenu), so its body is intentionally empty — the seven real pages are separate files. Putting content in the container would add a phantom eighth tab to the normal Settings page, so I'd rather not.

Two ways that already work:

1. Use Custom Tab's URL mode with a relative URL: /Settings/UnraidRsync

It's same-origin, so it works via IP, hostname or proxy without re-login and doesn't depend on the proxy being up. (Unraid only allows framing from the same origin, which is why the full proxy URL only worked when you were browsing through the proxy.)

2. Or pick the individual pages from the Built-In dropdown — they're listed under their own names: "Overview", "Jobs", "Connections", "Credentials", "Global Settings", "Status", "History" (all unraid.rsync/UR.*.page). One nav tab per page.

Option 1 is probably what you want.

HI @fajkovic.sasa

Thanks a lot for your work, I'll give it a try on Wednesday and let you know how it goes, I'll be really happy to replace lucky backup with your lighter and integrated plugin :)

  • Author

Hey @PandaSharp let me know how it goes when you give it a shot :)

Hi @fajkovic.sasa just tried a quick dry run and it worked, I'll test a full sync as soon I'll get a chance... I'll try to let you know, but if you don't hear back from me, it means all good :)

Thanks a lot for your work!

  • Author

Glad the dry run worked and have high hopes the real run will also work :)

Hi @fajkovic.sasa I did a real run and I can confirm that it worked indeed! 🥳

Going to ask a small tweak, if it's possible: is there any way to have a less verbose log? would be amazing to have a new line something like every 5% increase or every 30/60 sec... but I don't know if depends on your or on rsync code, thanks!

  • Author

Hey @PandaSharp - I've added a "Summary" level for logging which will reduce it significantly. Choose that :)

On 9/7/2026 at 1:15 AM, fajkovic.sasa said:

Thanks @d3fc0n0wltraps — glad it's replaced the rclone setup.

Not a Custom Tab bug and not really fixable on my side: Custom Tab's "Built-In Page" mode copies the body of the selected .page file into a new tab. UnraidRsync.page is only a tab container (Unraid xmenu), so its body is intentionally empty — the seven real pages are separate files. Putting content in the container would add a phantom eighth tab to the normal Settings page, so I'd rather not.

Two ways that already work:

1. Use Custom Tab's URL mode with a relative URL: /Settings/UnraidRsync

It's same-origin, so it works via IP, hostname or proxy without re-login and doesn't depend on the proxy being up. (Unraid only allows framing from the same origin, which is why the full proxy URL only worked when you were browsing through the proxy.)

2. Or pick the individual pages from the Built-In dropdown — they're listed under their own names: "Overview", "Jobs", "Connections", "Credentials", "Global Settings", "Status", "History" (all unraid.rsync/UR.*.page). One nav tab per page.

Option 1 is probably what you want.

Option 1 was absolutely what I wanted. It's working great, thanks again.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

Account

Navigation

Search

Search

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.