️ Duplicity — Encrypted Incremental Backups

If you like this project, consider supporting me on Buy Me a Coffee ☕️

Installation & Configuration

Install / Установить

# Debian/Ubuntu
apt install duplicity python3-boto3             # Install duplicity + S3 backend / Установить

# RHEL/AlmaLinux/Rocky
dnf install duplicity python3-boto3             # Install duplicity + S3 backend / Установить

duplicity --version                             # Verify / Проверить

Environment Variables / Переменные окружения

export AWS_ACCESS_KEY_ID=<ACCESS_KEY>           # AWS access key / AWS ключ доступа
export AWS_SECRET_ACCESS_KEY=<SECRET_KEY>       # AWS secret key / AWS секретный ключ
export PASSPHRASE=<PASSWORD>                    # GPG passphrase / Пароль GPG
export FTP_PASSWORD=<PASSWORD>                  # FTP password (if using FTP) / FTP пароль

[!TIP] Store sensitive env vars in a protected file sourced by your scripts, not exported globally in .bashrc.


GPG Key Setup

Generate GPG Key / Сгенерировать ключ GPG

gpg --full-generate-key                         # Generate new key / Сгенерировать новый ключ
gpg --list-keys                                 # List public keys / Список публичных ключей
gpg --list-secret-keys                          # List secret keys / Список секретных ключей

Export/Import Keys / Экспорт/импорт ключей

gpg --export <KEY_ID> > publickey.gpg           # Export public key / Экспортировать публичный ключ
gpg --export-secret-keys <KEY_ID> > secretkey.gpg  # Export secret key / Экспортировать секретный ключ
gpg --import publickey.gpg                      # Import key / Импортировать ключ

[!IMPORTANT] Back up both the public and secret GPG keys to a separate secure location. Without the secret key, all duplicity backups become unrecoverable.


Backup Operations

Full Backup / Полный бэкап

duplicity /data file:///backup                  # Local backup / Локальный бэкап
duplicity /data s3://s3.amazonaws.com/<BUCKET>  # S3 backup / Бэкап в S3
duplicity /data sftp://<USER>@<HOST>/backup     # SFTP backup / SFTP бэкап

Incremental Backup / Инкрементальный бэкап

duplicity incr /data file:///backup             # Force incremental / Принудительно инкрементальный
duplicity /data file:///backup                  # Auto: inc if full exists / Авто: инкр. если есть полный

Advanced Backup Options / Расширенные опции

duplicity /data file:///backup \
  --exclude /data/tmp \
  --exclude /data/*.log                         # With excludes / С исключениями

duplicity /data file:///backup \
  --include /data/important \
  --exclude /data/**                            # Include specific path / Только конкретный путь

duplicity /data file:///backup \
  --full-if-older-than 7D                       # Full backup if last full > 7 days / Полный если >7 дней

duplicity /data file:///backup \
  --volsize 100                                 # 100 MB volumes / Тома по 100 МБ

Restore Operations

Full Restore / Полное восстановление

duplicity restore file:///backup /restore       # Restore latest / Восстановить последний
duplicity restore s3://s3.amazonaws.com/<BUCKET> /restore  # From S3 / Из S3

Partial Restore / Частичное восстановление

duplicity restore --file-to-restore var/www file:///backup /restore
duplicity restore --file-to-restore var/www file:///backup /restore/www  # To alt path / В другое место

Time-Based Restore / Восстановление по времени

duplicity restore --time 3D file:///backup /restore           # 3 days ago / 3 дня назад
duplicity restore --time 2024-01-01 file:///backup /restore   # Specific date / Конкретная дата

Collection Management

duplicity collection-status file:///backup      # Show backup chain / Цепочка бэкапов
duplicity collection-status s3://s3.amazonaws.com/<BUCKET>  # S3 collection / S3 коллекция

duplicity list-current-files file:///backup     # Files in latest / Файлы в последнем
duplicity list-current-files --time 7D file:///backup  # Files from 7 days ago / 7 дней назад

duplicity verify file:///backup /data           # Verify backup / Проверить бэкап
duplicity verify --compare-data file:///backup /data  # Deep verify / Глубокая проверка

Retention & Cleanup

Remove Old Backups / Удалить старые бэкапы

[!WARNING] Always use --dry-run first to preview what will be removed.

duplicity remove-older-than 30D --dry-run file:///backup  # Preview / Предпросмотр
duplicity remove-older-than 30D file:///backup            # Remove older than 30 days / >30 дней
duplicity remove-older-than 6M file:///backup             # Remove older than 6 months / >6 месяцев
duplicity remove-all-but-n-full 3 file:///backup          # Keep last 3 full backups / 3 полных
duplicity remove-all-inc-of-but-n-full 2 file:///backup   # Remove inc except last 2 full / инкр. кроме 2 полных

Cleanup Orphans / Очистка потерянных файлов

duplicity cleanup --dry-run file:///backup      # Preview cleanup / Предпросмотр очистки
duplicity cleanup file:///backup                # Cleanup orphaned files / Очистить
duplicity cleanup --force file:///backup        # Force cleanup / Принудительно

Backend URLs

URL Format Reference / Справка по форматам URL

Backend URL Format Notes
Local file:///backup Absolute path
AWS S3 s3://s3.amazonaws.com/<BUCKET> Needs AWS credentials
S3 + region s3://s3.<REGION>.amazonaws.com/<BUCKET> Specific region
MinIO (HTTP) s3+http://<MINIO_HOST>/<BUCKET> S3-compatible
SFTP sftp://<USER>@<HOST>/backup Default port 22
SFTP custom port sftp://<USER>@<HOST>:2222/backup Custom port
FTP ftp://<USER>@<HOST>/backup Insecure
FTPS ftps://<USER>@<HOST>/backup FTP over TLS
WebDAV webdav://<USER>@<HOST>/backup HTTP
WebDAV TLS webdavs://<USER>@<HOST>/backup HTTPS
Google Drive gdocs://<USER>@gmail.com/backup
Dropbox dpbx:///backup

Performance & Encryption

Encryption / Шифрование

duplicity /data file:///backup \
  --encrypt-key <KEY_ID>                        # Encrypt with GPG key / Шифрование GPG ключом

duplicity /data file:///backup \
  --sign-key <KEY_ID>                           # Sign with GPG key / Подпись GPG ключом

duplicity /data file:///backup --no-encryption  # No encryption (not recommended / не рекомендуется)

Compression / Сжатие

duplicity /data file:///backup --compression    # Enable compression (default) / Включить сжатие (по умолч.)
duplicity /data file:///backup --no-compression # Disable compression / Отключить сжатие

Volume Size & Upload / Размер тома и загрузка

duplicity /data file:///backup --volsize 200    # 200 MB volume size / Размер тома 200 МБ
duplicity /data file:///backup --volsize 1024   # 1 GB volumes / 1 ГБ
duplicity /data file:///backup --asynchronous-upload  # Async uploads / Асинхронная загрузка

Sysadmin Operations

Systemd Service / Systemd-сервис

/etc/systemd/system/duplicity-backup.service

[Unit]
Description=Duplicity Backup
After=network.target
Wants=network-online.target

[Service]
Type=oneshot
EnvironmentFile=/etc/duplicity/env
ExecStart=/usr/bin/duplicity \
  --full-if-older-than 7D \
  /data s3://s3.amazonaws.com/<BUCKET>
ExecStartPost=/usr/bin/duplicity \
  remove-older-than 30D --force \
  s3://s3.amazonaws.com/<BUCKET>
ExecStartPost=/usr/bin/duplicity \
  cleanup --force \
  s3://s3.amazonaws.com/<BUCKET>
StandardOutput=append:/var/log/duplicity/backup.log
StandardError=append:/var/log/duplicity/backup.log

[Install]
WantedBy=multi-user.target

/etc/duplicity/env

AWS_ACCESS_KEY_ID=<ACCESS_KEY>
AWS_SECRET_ACCESS_KEY=<SECRET_KEY>
PASSPHRASE=<PASSWORD>
chmod 600 /etc/duplicity/env                    # Restrict permissions / Ограничить права

Systemd Timer / Systemd-таймер

/etc/systemd/system/duplicity-backup.timer

[Unit]
Description=Duplicity Backup Timer
Requires=duplicity-backup.service

[Timer]
OnCalendar=*-*-* 03:00:00
Persistent=true
RandomizedDelaySec=15m

[Install]
WantedBy=timers.target
mkdir -p /var/log/duplicity
systemctl daemon-reload
systemctl enable duplicity-backup.timer
systemctl start duplicity-backup.timer
systemctl status duplicity-backup.timer

Cache Location / Директория кэша

~/.cache/duplicity/        # Default cache / Кэш по умолчанию

Logrotate / Logrotate

/etc/logrotate.d/duplicity

/var/log/duplicity/*.log {
    daily
    rotate 30
    compress
    delaycompress
    missingok
    notifempty
    create 640 root root
}

Troubleshooting

Common Errors / Распространённые ошибки

# "GPG error" / "Ошибка GPG"
gpg --list-keys                                 # Verify key exists / Проверить ключ
gpg --list-secret-keys                          # Verify secret key / Секретный ключ
export PASSPHRASE=<PASSWORD>                    # Set passphrase / Установить пароль

# "Orphaned signature" / "Потерянная подпись"
duplicity cleanup --force file:///backup        # Remove orphaned files / Удалить потерянные

# "No such file or directory" in backup
duplicity collection-status file:///backup      # Check collection / Проверить коллекцию
duplicity verify file:///backup /data           # Verify integrity / Проверить целостность

Verbose Output / Подробный вывод

duplicity -v5 /data file:///backup             # Info level / Уровень info
duplicity -v8 /data file:///backup             # Debug level / Уровень debug
duplicity -v9 /data file:///backup             # Full debug / Полная отладка

Dry Run / Пробный запуск

duplicity --dry-run /data file:///backup        # Simulate backup / Симуляция бэкапа
duplicity remove-older-than 30D --dry-run file:///backup  # Simulate removal / Симуляция удаления

On this page

Installation &amp; Configuration Install / Установить Environment Variables / Переменные окружения GPG Key Setup Generate GPG Key / Сгенерировать ключ GPG Export/Import Keys / Экспорт/импорт ключей Backup Operations Full Backup / Полный бэкап Incremental Backup / Инкрементальный бэкап Advanced Backup Options / Расширенные опции Restore Operations Full Restore / Полное восстановление Partial Restore / Частичное восстановление Time-Based Restore / Восстановление по времени Collection Management Retention &amp; Cleanup Remove Old Backups / Удалить старые бэкапы Cleanup Orphans / Очистка потерянных файлов Backend URLs URL Format Reference / Справка по форматам URL Performance &amp; Encryption Encryption / Шифрование Compression / Сжатие Volume Size &amp; Upload / Размер тома и загрузка Sysadmin Operations Systemd Service / Systemd-сервис Systemd Timer / Systemd-таймер Cache Location / Директория кэша Logrotate / Logrotate Troubleshooting Common Errors / Распространённые ошибки Verbose Output / Подробный вывод Dry Run / Пробный запуск