Duplicati is a free, open-source backup tool with a web interface. You configure backup jobs in the browser: what to back up, where to send it (S3, Backblaze B2, SFTP, Google Drive, OneDrive, WebDAV and more), the schedule, and retention. Data is compressed, deduplicated and encrypted before upload. It’s a good fit if you prefer a GUI over command-line tools.

Install with Docker

# /opt/duplicati/compose.yaml
services:
  duplicati:
    image: lscr.io/linuxserver/duplicati:latest
    restart: unless-stopped
    environment:
      PUID: 0                    # root, to read all files you back up (or a user with read access)
      PGID: 0
      TZ: Etc/UTC
      SETTINGS_ENCRYPTION_KEY: "<long random string>"     # encrypts Duplicati's own settings DB
      DUPLICATI__WEBSERVICE_PASSWORD: "<UI password>"
    volumes:
      - ./config:/config
      - /var/www:/source/www:ro
      - /etc:/source/etc:ro
      - /var/backups:/source/backups:ro
    ports:
      - "127.0.0.1:8200:8200"
cd /opt/duplicati && docker compose up -d

Mount the folders you want to back up read-only under /source. Bind the UI to localhost, and reach it through an SSH tunnel:

ssh -L 8200:127.0.0.1:8200 user@your-server
# open http://localhost:8200

See SSH tunnelling. Environment variable names change between Duplicati versions, so check the image’s documentation.

Create a backup job

  1. Add backup → configure a new backup.
  2. General: name, and AES-256 encryption with a strong passphrase. Store the passphrase elsewhere (a password manager): without it, restores are impossible.
  3. Destination: for example S3-compatible storage (bucket, endpoint, keys), Backblaze B2, or SFTP to a backup server. Use “Test connection”. See VPS as a backup server.
  4. Source data: select folders under /source, and add filters (exclude caches, temp files, node_modules).
  5. Schedule: daily at a quiet hour.
  6. Options: retention, for example smart backup retention (keeps daily, weekly and monthly versions), and the remote volume size (50 MB default; larger, like 200 MB, suits big backups).

Run the job once manually, and check the result in the log.

Databases

Duplicati backs up files. For databases, dump them to a file first (with a cron job before the backup window), and back up the dump directory:

0 2 * * * root mysqldump --single-transaction --all-databases | gzip > /var/backups/mysql.sql.gz

See mysqldump and database backup automation.

Restore

Restore → choose the backup job → pick a version (date) → select files → restore to the original location or another folder. Do a test restore after setting up each job, and periodically after that.

If the server is lost, install Duplicati anywhere, choose “Restore directly from backup files”, enter the destination details and the passphrase.

Security checklist

  • UI bound to localhost (or behind a VPN, or a reverse proxy with authentication). Never expose port 8200 publicly.
  • Strong UI password, and a settings encryption key.
  • Destination credentials with access only to the backup bucket or folder.
  • Consider storage-side protections (bucket versioning or object lock), so a compromised server can’t delete old backups.

Duplicati vs restic and Borg

Duplicati restic / Borg
Interface Web UI Command line
Setup Easy Easy for admins
Large data sets Can be slow; database repairs occasionally needed Fast and robust
Best for GUI users, mixed environments, Windows too Servers, automation, scripting

For mission-critical server backups, many admins prefer restic or Borg for their speed and robustness. See restic backup and Borg vs restic.

Quick reference

Item Value
UI port 8200 (localhost only)
Sources Mount read-only under /source
Encryption AES-256 with your passphrase
Retention Smart backup retention
Databases Dump first, back up the dump

Related: backup strategy (3-2-1) and Docker volume backups.

  • Backup
  • Docker
  • Self-Hosting