SeedSync is a tool to sync files from a remote Linux server (like your seedbox) to your local machine. It uses LFTP to transfer files fast!
Note: This is a modernized fork of ipsingh06/seedsync with updated dependencies and Docker-only deployment.
- Built on top of LFTP, the fastest file transfer program
- Web UI — track and control your transfers from anywhere
- Multiple path pairs — sync from multiple remote directories independently
- Exclude patterns — filter out unwanted files with glob patterns
- Multi-select — select multiple files for bulk queue/stop/delete
- Auto-Queue — only sync the files you want based on pattern matching
- Automatically extract your files after sync
- Webhook notifications — HTTP POST on download/extract events
- Delete local and remote files easily
- Dark mode, staging directory, bandwidth limiting, and more
- Lightweight Docker image — ~45 MB Alpine-based, multi-arch (amd64/arm64)
- Fully open source!
Full documentation is available at nitrobass24.github.io/seedsync
- Create a
docker-compose.yml:
services:
seedsync:
image: ghcr.io/nitrobass24/seedsync:latest
container_name: seedsync
ports:
- "8800:8800"
environment:
- PUID=1000 # Your user ID (run 'id' to find)
- PGID=1000 # Your group ID
# - UMASK=002 # Optional: file permission mask (002 for 775/664)
volumes:
- ./config:/config
- /path/to/downloads:/downloads
# Uncomment below to use SSH key authentication
# - ~/.ssh/id_rsa:/home/seedsync/.ssh/id_rsa:ro
restart: unless-stopped- Start the container:
docker compose up -d- Access the web UI at http://localhost:8800
docker run -d \
--name seedsync \
-p 8800:8800 \
-e PUID=1000 \
-e PGID=1000 \
-v /path/to/config:/config \
-v /path/to/downloads:/downloads \
ghcr.io/nitrobass24/seedsync:latest
# Optional: control file permissions with UMASK
# -e UMASK=002 # 775/664 permissionsSSH Key Auth: To use key-based authentication, mount your private key:
-v ~/.ssh/id_rsa:/home/seedsync/.ssh/id_rsa:ro
SeedSync is available as a Community Application on Unraid.
- In the Unraid web UI, go to Docker → Template Repositories and add:
https://github.com/nitrobass24/unraid-templates - Go to the Apps tab, search for SeedSync, and click Install.
- Review the default paths and click Apply:
- Config:
/mnt/user/appdata/seedsync - Downloads:
/mnt/user/downloads/seedsync
- Config:
- Access the web UI at
http://<your-unraid-ip>:8800
Note: PUID/PGID default to
99/100(Unraid'snobody/users), which is correct for most Unraid setups.
On first run, access the web UI and configure:
- Remote Server: Your seedbox SSH hostname/IP
- SSH Credentials: Username and password
- Remote Path: Directory on the seedbox to sync from
- Local Path: Maps to
/downloadsin the container
To sync from multiple remote directories, use Path Pairs in Settings. Each pair has its own remote path, local path, auto-queue toggle, and exclude patterns. Path pairs run independent LFTP and scanner instances.
To use password-less SSH key authentication:
- Mount your private key into the container (see volume examples above)
- In the web UI Settings, enable "Use password-less key-based authentication"
- The password field can be left blank when key auth is enabled
You can limit download speed in Settings under the Connections section. The Bandwidth Limit field accepts:
- Numeric values in bytes/sec (e.g.,
102400for 100 KB/s) - Values with suffixes:
Kfor KB/s,Mfor MB/s (e.g.,500K,2M) 0or empty for unlimited
The best way to use SeedSync is with hard links and a dedicated completion directory:
- Configure your torrent client (qBittorrent, ruTorrent, etc.) to hard link completed downloads into a separate folder (e.g.,
/downloads/complete). Hard links don't use extra disk space — your originals stay intact for seeding. - Point SeedSync at the completion directory.
- Enable Auto-Queue and turn on "Delete remote file after syncing" in Settings.
This way, each file is downloaded exactly once. After SeedSync syncs it, the hard link is removed from the completion directory, so it's never re-downloaded — even after a container restart. Your originals remain untouched for seeding.
Note: Both directories must be on the same filesystem for hard links to work.
See the full setup guide in the docs for directory layout examples and torrent client configuration.
# Clone the repository
git clone https://github.com/nitrobass24/seedsync.git
cd seedsync
# Build and run
make build
make run
# View logs
make logs| Variable | Default | Description |
|---|---|---|
PUID |
1000 | User ID for file permissions |
PGID |
1000 | Group ID for file permissions |
UMASK |
(unset) | File permission mask (e.g. 002 for 775/664, 000 for 777/666) |
| Path | Description |
|---|---|
/config |
Configuration and state files |
/downloads |
Download destination directory |
/home/seedsync/.ssh/id_rsa |
SSH private key (optional, for key-based auth) |
| Port | Description |
|---|---|
| 8800 | Web UI |
docker logs seedsyncEnsure your PUID and PGID match your host user:
id # Shows your UID and GID- Verify your seedbox allows SSH connections
- Check that the SSH port is correct (default: 22)
- Ensure your credentials are correct
- If using SSH key auth, ensure the key is mounted at
/home/seedsync/.ssh/id_rsa(read-only is fine)
If your seedbox has Python 3 installed at a non-standard location (e.g. a custom build in your home directory), set Remote Python Path in Settings to the full path to the Python 3 binary. For example: ~/python3/bin/python3. Leave empty to use the default python3.
If you see an error about /bin/bash not found, SeedSync will attempt to auto-detect the available shell on your remote server. Check the logs for the detected shell path. If detection fails, create a symlink on the remote server:
sudo ln -s /usr/bin/bash /bin/bashIf you see scp: dest open '/tmp/scanfs': Permission denied in the logs, your remote server doesn't allow writes to /tmp. SeedSync copies its scanner utility there by default.
Fix: open the web UI Settings, find Server Script Path, and change it to a directory you own on the remote server — for example ~ or ~/.local. Save and restart the container.
If you see Server Script Path '...' is a directory on the remote server, the configured path overlaps with your sync directory and a folder named scanfs already exists there.
Fix:
- Change Server Script Path to a location outside your sync tree (
~or~/.local) - Remove the conflicting directory from the remote server:
rm -rf /your/sync/path/scanfs - Restart the container
Please report issues on the issues page.
Include container logs: docker logs seedsync
SeedSync is distributed under Apache License Version 2.0. See LICENSE.txt for more information.

