Если вам понравилась эта статья, вы можете стать спонсором на Boosty.
Duplicati + Docker - автоматические бэкапы за 10 минут#
Резервные копии - одна из самых важных частей любой инфраструктуры.
Даже в домашнем Homelab, да и, собственно говоря, везде, потеря данных может стоить очень дорого. Причем речь идет не только о самих данных, но и о времени, которое потребуется на их восстановление. Не исключено, что последнее окажется даже дороже.
У меня на YouTube-канале есть ролик про установку и настройку Proxmox Backup Server. Но это решение специфическое, и не все используют Proxmox в Homelab. Если вам ближе более гибкая архитектура на базе restic - взгляните также на Zerobyte.
В этой статье разберем:
- что такое Duplicati
- как установить его на сервер
- как настроить автоматические бэкапы
- как хранить резервные копии локально и в облаке
- как восстановить данные и убедиться, что бэкап вообще рабочий
Что такое Duplicati#
Duplicati - это open-source система резервного копирования, которая поддерживает:
- шифрование AES-256
- дедупликацию
- инкрементальные бэкапы
- хранение в облаках
- web-интерфейс управления
Поддерживаемые хранилища:
- S3
- Backblaze B2
- Google Drive
- WebDAV
- FTP / SFTP
- локальные диски
- NAS
Это делает его отличным решением для Homelab и self-hosted инфраструктуры, так как поддерживает все что надо обычному хоумлабберу.
Основные возможности#
Из основных возможностей, наверное, стоит обратить внимание на:
Шифрование#
Все данные могут шифроваться на стороне клиента перед отправкой.
Поддерживаются:
- AES-256
- passphrase-защита
Это означает, что даже облачный провайдер не сможет прочитать ваши данные. То есть можно быть относительно спокойным за бэкапы в облаке и за то, что никто не будет тренировать свои ИИ-модели на ваших данных.
Инкрементальные бэкапы#
Duplicati хранит данные блоками.
Это позволяет:
- сохранять только изменения
- уменьшать объем хранилища
- ускорять резервное копирование
Так как система сохраняет только ту информацию, которая изменилась, то все происходит очень быстро, а нам проще планировать объем дискового пространства.
Web-интерфейс#
После установки вы получаете удобную web-панель.
Через нее можно:
- создавать задания
- управлять расписанием
- восстанавливать файлы
- проверять состояние бэкапов
Тут, в общем-то, все понятно. Конечно, администраторы со стажем могут кривить рот - мол, графический интерфейс это «пошло». Но не поддавайтесь на провокации. Интерфейс - это нормально. Если, конечно, его не школьник рисовал.
Установка - docker-compose файл из видео#
За основу я взял образ (сборку) от linuxserver.io как наиболее user-friendly вариант для homelab.
services: # Раздел для описания всех сервисов Docker
duplicati: # Имя сервиса
image: lscr.io/linuxserver/duplicati:latest # Образ Docker, последняя версия Duplicati от LinuxServer
container_name: duplicati # Имя контейнера в Docker
hostname: duplicati # Имя хоста внутри контейнера
entrypoint: # Переопределение точки входа контейнера
- /init # Используется скрипт /init, предоставляемый образом LinuxServer
#ports: # Публикация портов контейнера на хосте
# - 8200:8200 # MGMT UI - интерфейс управления Duplicati будет доступен на порту 8200
#expose: # Порт, который будет виден другим контейнерам в сети Docker
# - 8200
environment: # Переменные окружения для контейнера
- PUID=0 # UID пользователя внутри контейнера (0 = root, обычно для теста/администрирования)
- PGID=1000 # GID группы внутри контейнера (должен соответствовать вашей группе на хосте)
- TZ=Europe/Moscow # Часовой пояс для контейнера
- SETTINGS_ENCRYPTION_KEY=<длинная_случайная_строка> # Ключ шифрования настроек Duplicati (обязателен)
- DUPLICATI__WEBSERVICE_PASSWORD=<пароль_веб_интерфейса> # Пароль для веб-интерфейса (изменить обязательно!)
restart: unless-stopped # Контейнер автоматически перезапустится, если он упадет, кроме явной остановки
volumes: # Монтирование директорий хоста в контейнер
- /home/stilicho/docker/duplicati/backups:/backups # Директория для хранения бэкапов
- /home/stilicho/docker/duplicati/config:/config # Конфигурация и настройки Duplicati
- /home/stilicho/docker:/source # Директория с исходными файлами для бэкапа (можно изменить)
networks: # Сеть Docker, в которой будет работать контейнер
- proxy
labels: # Метки для Traefik (обратного прокси)
- "traefik.enable=true" # Включить обработку Traefik для этого контейнера
- "traefik.docker.network=proxy" # Использовать сеть proxy для Traefik
- "traefik.http.routers.duplicati.entrypoints=web" # Входной пункт Traefik (порт 80)
- "traefik.http.routers.duplicati.rule=Host(`duplicati.stilicho.ru`)" # Домен, по которому доступен сервис
- "traefik.http.middlewares.duplicati-https-redirect.redirectscheme.scheme=https" # Перенаправление HTTP -> HTTPS
- "traefik.http.routers.duplicati.middlewares=duplicati-https-redirect" # Подключаем middleware для редиректа
- "traefik.http.routers.duplicati-secure.entrypoints=websecure" # HTTPS маршрут Traefik (порт 443)
- "traefik.http.routers.duplicati-secure.rule=Host(`duplicati.stilicho.ru`)" # Домен HTTPS
- "traefik.http.routers.duplicati-secure.tls=true" # Включаем TLS
- "traefik.http.routers.duplicati-secure.tls.certresolver=cloudflare" # Используем Cloudflare для генерации сертификата
- "traefik.http.routers.duplicati-secure.service=duplicati" # Назначаем сервис для маршрута
- "traefik.http.services.duplicati.loadbalancer.server.port=8200" # Порт сервиса внутри контейнера для Traefik
#- traefik.http.routers.duplicati.middlewares=ipwhitelist@file # (закомментировано) пример ограничения по IP
networks: # Раздел для описания сетей
proxy: # Сеть с именем proxy
external: true # Используем внешнюю сеть Docker, созданную заранее (например для Traefik)- PUID=0 означает root в контейнере. Для production лучше использовать непривилегированного пользователя.
- SETTINGS_ENCRYPTION_KEY и DUPLICATI__WEBSERVICE_PASSWORD обязательно нужно менять на свои, иначе данные и веб-интерфейс небезопасны.
SETTINGS_ENCRYPTION_KEYшифрует базу настроек Duplicati (там хранятся в том числе пароли к хранилищам и ключи шифрования бэкапов), по требованиям образа - не короче 8 символов, только буквы и цифры. Сгенерировать подходящий можно командойopenssl rand -hex 32. - Секция
entrypoint: /initнеобязательна: у образов linuxserver.io/initи так является точкой входа по умолчанию. - Бэкап «на живую» папки с базами данных (PostgreSQL, MariaDB и т.п.) может оказаться несогласованным. Для таких сервисов надежнее делать дамп базы перед бэкапом или останавливать контейнер - в Duplicati для этого есть параметры
--run-script-beforeи--run-script-after. - /source монтируется весь
/home/stilicho/docker, если не нужно все бэкапить - лучше сузить путь до конкретных папок. - Traefik labels управляют HTTPS и редиректами. Если Traefik еще не настроен - их можно удалить до настройки прокси.
- Пароли и другие чувствительные данные желательно выносить в отдельный файл окружения
.env.
Работа с приложением#
Так как у меня есть видеообзор, в этой статье я остановлюсь только на ключевых деталях.
После установки приложения переходим по поддоменному имени. Откроется окно приветствия, где нужно ввести пароль администратора, указанный в docker-compose файле.

Нас встречает довольно минималистичное меню с «выжигающим роговицу» светлым режимом. Ночной режим можно включить в разделе Settings.

В разделе Add backup можно выбрать нужное действие: создать новый бэкап или восстановить его из конфигурационного файла (если он у вас есть).

Так как нам нужно создать бэкап, выбираем опцию Add new backup.
В появившемся меню задаем необходимые параметры. При желании можно включить шифрование бэкапа.

В следующих двух окнах выбираем:
- место хранения бэкапа
- используемый сервис
В видео я выбрал File system, так как бэкапил демонстрационные файлы на примонтированное через fstab хранилище.


Приложение предложит протестировать соединение.

Если все в порядке, в следующем окне нужно выбрать файлы для резервного копирования.
В нашем случае выбираем директорию source, так как она указана в docker-compose файле:

/home/stilicho/docker:/source # Директория с исходными файлами для бэкапа (можно изменить)Далее задаем расписание бэкапов.

В следующем окне настраиваются дополнительные параметры: размер томов, количество хранимых копий и так далее.

После завершения настройки в разделе Home появятся ваши задания для резервного копирования.

Восстановление и проверка бэкапов#
Бэкап, из которого ни разу не пробовали восстановиться, - это не бэкап, а надежда. Поэтому пройдемся по восстановлению хотя бы кратко, а наглядно весь процесс показан в видео.
Откуда восстанавливать#
Восстановление запускается из раздела Restore. Вариантов три:
- Из существующего задания. Если задание есть в списке - просто выбираем его. Это самый быстрый вариант: информацию о файлах Duplicati берет из своей локальной базы, а не выкачивает из хранилища.
- Restore from configuration - если у вас есть экспортированный файл конфигурации задания (о нем ниже).
- Direct restore from backup files - вариант на случай, когда сервер умер вместе с Duplicati, и вы ставите его с нуля. Указываем то же хранилище, что и при создании бэкапа, проверяем подключение кнопкой
Test connectionи вводим пароль шифрования. Работает медленнее: Duplicati приходится скачать и разобрать часть данных из хранилища, чтобы понять, какие там есть версии.
Без пароля шифрования восстановить зашифрованный бэкап невозможно - никак. Храните его не на том же сервере, который бэкапите, а, например, в менеджере паролей вроде Vaultwarden. Иначе получится классика: пароль от сейфа лежит внутри сейфа.
Выбор версии, файлов и параметров#
Дальше Duplicati показывает список версий бэкапа (по умолчанию - самую свежую). Выбираем нужную версию, отмечаем файлы или папки и переходим к параметрам восстановления:
- восстановить файлы на исходное место или в другую папку;
- если целевая папка не пустая - можно не перезаписывать файлы, а сохранить рядом копии с меткой времени в имени;
- права доступа к файлам по умолчанию не восстанавливаются: пользователей и групп с исходной машины на новой может не оказаться.
Для Docker-сервисов надежнее восстанавливать не поверх рабочих файлов, а в отдельную папку, например в /backups/restore (на хосте это /home/stilicho/docker/duplicati/backups/restore), и уже оттуда переносить нужное. А если все-таки восстанавливаете на исходное место - сначала остановите контейнер, файлы которого возвращаете, иначе сервис может перезаписать их прямо в процессе.
Экспорт конфигурации задания#
Конфигурацию каждого задания стоит сохранить отдельно от сервера. Раскрываем задание в списке, нажимаем Export... и выбираем To File. В файл попадают и доступы к хранилищу, и пароль шифрования бэкапа, поэтому при экспорте либо снимаем галочку Export passwords (и тогда храним пароли отдельно), либо шифруем сам файл надежным паролем. Восстановить задание из такого файла можно через Add backup → Import from file.
Проверка бэкапов#
После каждого бэкапа Duplicati скачивает из хранилища несколько случайных файлов и проверяет их целостность. По умолчанию это по одному файлу каждого типа, количество меняется параметрами --backup-test-samples и --backup-test-percentage.
Но такая проверка говорит только о том, что файлы в хранилище не повреждены, а не о том, что из них соберутся ваши данные. Поэтому раз в какое-то время стоит делать пробное восстановление: взять пару папок, восстановить их в отдельную папку и убедиться, что внутри то, что нужно. Это пара минут, которые однажды сэкономят очень много нервов.
На совсем плохой случай, когда сам Duplicati запустить не получается, у проекта есть отдельные инструменты аварийного восстановления - Python-скрипт и консольная утилита RecoveryTool, которые умеют вытащить файлы прямо из файлов бэкапа.




