Skip to content

nitrobass24/seedsync

Repository files navigation

SeedSync

CI Status Latest Release Stars Docker Pulls Image Size License Documentation Angular 21 Python 3.13 Platform
Python Tests: 828 Angular Tests: 412 E2E Tests: 95

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.

Features

  • Built on top of LFTP — the fastest file transfer tool around
  • Web UI — track and control transfers from any browser
  • Multiple path pairs — sync from independent remote/local directory pairs, each with its own settings
  • Auto-Queue — automatically queue files matching your patterns
  • Exclude patterns — filter out unwanted files (*.nfo, Sample/, etc.) per path pair
  • Multi-select bulk actions — queue, stop, or delete multiple files at once
  • Auto-extract — unpack RAR, ZIP, 7z, tar, gz, bz2, xz archives after download
  • File integrity verification — inline checksum during download plus optional post-download validation
  • Notifications — Discord, Telegram, or generic webhook on download/extract events
  • Sonarr/Radarr integration — trigger imports with multiple named instances, attached per path pair
  • Staging directory — land downloads on fast storage, then move to the final location
  • Optional API key auth with CSRF protection and rate limiting
  • Dark mode, bandwidth limiting, virtual scrolling for large libraries, and more
  • Lightweight Docker image — ~45 MB Alpine-based, multi-arch (amd64/arm64)
  • Fully open source!

Documentation

Full documentation is available at nitrobass24.github.io/seedsync

Quick Start (Docker)

Using Docker Compose (Recommended)

  1. 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
  1. Start the container:
docker compose up -d
  1. Access the web UI at http://localhost:8800

Using Docker Run

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 permissions

SSH Key Auth: To use key-based authentication, mount your private key: -v ~/.ssh/id_rsa:/home/seedsync/.ssh/id_rsa:ro

Unraid

SeedSync is available as a Community Application on Unraid.

  1. In the Unraid web UI, go to Docker → Template Repositories and add:
    https://github.com/nitrobass24/unraid-templates
    
  2. Go to the Apps tab, search for SeedSync, and click Install.
  3. Review the default paths and click Apply:
    • Config: /mnt/user/appdata/seedsync
    • Downloads: /mnt/user/downloads/seedsync
  4. Access the web UI at http://<your-unraid-ip>:8800

Note: PUID/PGID default to 99/100 (Unraid's nobody/users), which is correct for most Unraid setups.

Recommended Workflow

The best way to use SeedSync is with hard links and a dedicated completion directory:

  1. 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.
  2. Point SeedSync at the completion directory.
  3. 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.

Configuration

On first run, access the web UI and configure:

  1. Remote Server: Your seedbox SSH hostname/IP
  2. SSH Credentials: Username and password
  3. Remote Path: Directory on the seedbox to sync from
  4. Local Path: Maps to /downloads in the container

Multiple Path Pairs

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.

SSH Key Authentication

To use password-less SSH key authentication:

  1. Mount your private key into the container (see volume examples above)
  2. In the web UI Settings, enable "Use password-less key-based authentication"
  3. The password field can be left blank when key auth is enabled

Bandwidth Limiting

You can limit download speed in Settings under the Connections section. The Bandwidth Limit field accepts:

  • Numeric values in bytes/sec (e.g., 102400 for 100 KB/s)
  • Values with suffixes: K for KB/s, M for MB/s (e.g., 500K, 2M)
  • 0 or empty for unlimited

Notifications

SeedSync can notify you when downloads or extractions finish. Configure destinations in Settings → Notifications:

  • Discord — paste a webhook URL; events arrive as color-coded embeds
  • Telegram — provide a bot token and chat ID
  • Generic webhook — POST a JSON payload to any HTTP(S) URL

Each destination has a Test button to verify it's working.

Sonarr / Radarr

To trigger automatic imports after downloads complete, configure Settings → Integrations:

  1. Click Add instance, choose Sonarr or Radarr, and enter the base URL and API key
  2. Use Test connection to verify credentials
  3. In the Path Pairs card, attach instances to the path pair(s) where imports should fire

You can mix and match — for example, attach a 4K path pair only to your 4K Radarr instance.

Staging Directory

For setups with fast scratch storage (NVMe/SSD) and slower bulk storage, enable Staging in Settings. Downloads complete on the staging volume first, then move to the final location. Mount your staging path at /staging in the container.

API Key

To require authentication on the web UI and API, set an API Key in Settings → Other Settings. When set, browser clients prompt for the key on first load and API clients send it via the X-API-Key header. Leave it blank to run without auth (fine behind a reverse proxy or on a trusted network).

Building from Source

# Clone the repository
git clone https://github.com/nitrobass24/seedsync.git
cd seedsync

# Build and run
make build
make run

# View logs
make logs

Environment Variables

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)

Volumes

Path Description
/config Configuration and state files
/downloads Download destination directory
/staging Staging directory (optional, mount when staging is enabled)
/home/seedsync/.ssh/id_rsa SSH private key (optional, for key-based auth)

Ports

Port Description
8800 Web UI

Troubleshooting

View Logs

docker logs seedsync

Permission Issues

Ensure your PUID and PGID match your host user:

id  # Shows your UID and GID

SSH Connection Issues

  • 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)

Custom Python Path on Remote Server

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.

Remote Shell Not Found

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/bash

SCP Permission Denied (scanner can't copy to /tmp)

If 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.

Server Script Path Is a Directory

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:

  1. Change Server Script Path to a location outside your sync tree (~ or ~/.local)
  2. Remove the conflicting directory from the remote server: rm -rf /your/sync/path/scanfs
  3. Restart the container

Report an Issue

Please report issues on the issues page. Include container logs: docker logs seedsync

License

SeedSync is distributed under Apache License Version 2.0. See LICENSE.txt for more information.


SeedSync Screenshot

About

SeedSync - Fast seedbox file synchronization. Modernized fork with Docker-only deployment, Python 3.12

Topics

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors