Duplicati — резервное копирование с шифрованием и дедупликацией, которым можно управлять из браузера. Он хранит данные блоками, умеет писать в S3, Backblaze B2, WebDAV, SFTP, на сетевую папку и в облачные диски, а на сервере держит только небольшую базу. Это удобно, когда бэкап нужен без отдельного агента и сложной инфраструктуры, но требует аккуратности: потеря пароля означает потерю данных, а без локальной базы восстановление затянется.
Как устроено хранилище
Каждый файл режется на блоки, блоки хешируются, и в хранилище попадают только новые. Архив состоит из томов dblock с данными, dindex с индексами и dlist с описанием версии. Локальная база SQLite хранит карту блоков и историю; без неё восстановление возможно, но потребует пересборки базы и времени. Шифрование AES-256 включается парольной фразой, ключ из которой выводится на стороне клиента.
Облачный провайдер видит только зашифрованные тома и имена файлов, поэтому проверка восстановления обязательна. Пароль не хранится нигде, кроме вашей памяти или менеджера секретов: сбросить его нельзя.
Установка и запуск службы
Пакеты .deb и .rpm лежат на сайте проекта. В Debian и Ubuntu удобнее ставить скачанный пакет через apt, чтобы подтянулись зависимости.
sudo apt install ./duplicati_*_linux-x64.deb
sudo systemctl enable --now duplicati
systemctl status duplicati --no-pager
ss -tlnp | grep 8200
По умолчанию служба слушает 127.0.0.1:8200. Занятый порт — типичная причина, по которой интерфейс не открывается: проверьте вывод ss и параметры в /etc/default/duplicati. Каталог /var/lib/duplicati должен быть доступен пользователю службы, иначе первое задание закончится ошибкой прав.
Первый бэкап в веб-интерфейсе
Откройте http://127.0.0.1:8200. При первом запуске мастер попросит задать пароль администратора, если он ещё не задан. Дальше путь такой:
- Add backup и создание нового задания.
- Имя задания, парольная фраза и её повтор.
- Выбор хранилища: S3, B2, WebDAV, SFTP или локальный путь.
- Путь назначения и тест подключения.
- Исходные каталоги и исключения.
- Расписание и политика хранения версий.
- Размер тома, по умолчанию 50 МБ.
- Сохранение и первый запуск.
Парольную фразу интерфейс показывает один раз и не сохраняет в открытом виде. Сразу положите её в менеджер секретов и проверьте, что копия доступна с другого устройства.
То же задание из командной строки
CLI удобен для cron, первичной проверки и восстановления на другом сервере. Параметры должны совпадать с заданием в интерфейсе, иначе будет создана другая база и другая цепочка версий.
export DUP_PASS="$(cat /etc/duplicati/passphrase)"
duplicati-cli backup "b2://bucket/host01" /home/user \
--encryption-module=aes --passphrase="$DUP_PASS" \
--compression-module=zip --dblock-size=100MB \
--retention-policy="1W:1D,4W:1W,12M:1M" \
--dbpath=/var/lib/duplicati/home.sqlite
Обратите внимание на —dbpath: база должна лежать на постоянном диске и входить в резервную копию конфигурации. Если запускать CLI от другого пользователя, путь и права нужно согласовать со службой. Строка подключения для S3 выглядит как s3://bucket/prefix с параметрами авторизации, для WebDAV — webdav://user@host/path. Пароль виден в списке процессов, поэтому не храните фразу в истории команд.
Расписание и хранение версий
Задания из веб-интерфейса планируются внутри службы. Для CLI-заданий нужен cron или systemd timer: обёртка читает пароль и вызывает duplicati-cli, а вывод пишет в лог.
17 3 * * * /usr/local/bin/duplicati-home.sh >> /var/log/duplicati-home.log 2>&1
Политика 1W:1D,4W:1W,12M:1M означает ежедневные версии за неделю, еженедельные за месяц и ежемесячные за год. Для файлов, которые меняются редко, этого достаточно; для баз данных нужен отдельный подход с выгрузкой в согласованное состояние. Не ставьте два задания на одну базу одновременно: SQLite заблокируется, и второе упадёт с ошибкой database is locked.
Проверка и восстановление
Бэкап без проверки — это надежда, а не резервная копия. Команда test читает тома и сверяет хеши, list показывает доступные версии, restore раскладывает файлы в отдельный каталог.
duplicati-cli test "b2://bucket/host01" --passphrase="$DUP_PASS"
duplicati-cli list "b2://bucket/host01" --passphrase="$DUP_PASS"
duplicati-cli restore "b2://bucket/host01" --restore-path=/tmp/restore \
--passphrase="$DUP_PASS" --overwrite=true
Восстанавливайте не только отдельный файл, но и целый каталог, чтобы проверить структуру и права. Сравните результат с оригиналом через diff -r, а для баз данных обязательно запустите приложение на восстановленной копии. Раз в квартал прогоняйте тест на чистой машине: это единственный способ убедиться, что пароль и база действительно рабочие.
Безопасность веб-интерфейса
Интерфейс без пароля — это удалённое управление бэкапами, включая просмотр путей и запуск восстановления. Слушайте только loopback и задавайте отдельный пароль, не совпадающий с паролем системы.
DAEMON_OPTS="--webservice-interface=loopback --webservice-port=8200 --webservice-password=ДЛИННЫЙ_ПАРОЛЬ"
Файл /etc/default/duplicati читается службой при старте. Если нужен доступ с ноутбука, не открывайте 8200 наружу, а используйте туннель: ssh -L 8200:127.0.0.1:8200 user@server. Обратный прокси с TLS допустим, но тогда добавьте ограничение по IP и отдельную аутентификацию. После смены пароля перезапустите службу и проверьте, что старые сессии закрылись.
Типичные ошибки и диагностика
- journalctl -u duplicati -n 100 — ошибки службы и запуска.
- Show log в интерфейсе — подробный журнал конкретного задания.
- df -h — место для временных файлов и локальной базы.
- Расхождение часов ломает подпись запросов к S3 и B2.
- database is locked — параллельный запуск или копия базы.
- 401 и 403 — ключи, права бакета или истёкший токен.
Если задание падает на этапе подключения, проверьте не только ключи, но и DNS, а также системное время. Ошибка «no files were found» обычно означает неверный путь или фильтр исключений. При нехватке места Duplicati сначала пишет во временный каталог, поэтому смотрите не только размер хранилища, но и свободное место на диске сервера.
Итог
Duplicati закрывает нишу простого шифрованного бэкапа в облако без отдельного сервера. Установите пакет, задайте пароль интерфейса, создайте задание с политикой хранения и сразу проверьте восстановление в /tmp. Держите копию парольной фразы и базы отдельно от сервера, следите за расписанием и раз в квартал запускайте test. Тогда облачный архив останется не только зашифрованным, но и действительно восстановимым.