↓ Перейти к основному содержимому
  1. Posts/
  2. Backup/

Duplicati - резервное копирование с шифрованием для домашнего сервера

Stilicho2011
Автор
Stilicho2011
Пишу о homelab, self-hosting, автоматизации и open-source решениях
Оглавление
Backup - This article is part of a series.
Part : This Article
Tip

Если вам понравилась эта статья, вы можете стать спонсором на Boosty.

Duplicati + Docker - автоматические бэкапы за 10 минут
#

Резервные копии - одна из самых важных частей любой инфраструктуры.
Даже в домашнем Homelab, да и, собственно говоря, везде, потеря данных может стоить очень дорого. Причем речь идет не только о самих данных, но и о времени, которое потребуется на их восстановление. Не исключено, что последнее окажется даже дороже.

Note

У меня на 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)
Important
  • 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 файле.

Экран входа в веб-интерфейс Duplicati - ввод пароля администратора

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

Главный экран Duplicati со списком бэкапов (пока пустой)

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

Экран Add backup: выбор создания нового бэкапа или импорта из файла

Так как нам нужно создать бэкап, выбираем опцию Add new backup.

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

Общие настройки бэкапа: имя, описание и шифрование AES-256

В следующих двух окнах выбираем:

  • место хранения бэкапа
  • используемый сервис

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

Выбор типа хранилища назначения: File system, S3, SSH и другие
Выбор пути в файловой системе для хранения бэкапа

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

Диалог проверки подключения к хранилищу назначения

Если все в порядке, в следующем окне нужно выбрать файлы для резервного копирования.

В нашем случае выбираем директорию source, так как она указана в docker-compose файле:

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

Далее задаем расписание бэкапов.

Настройка расписания бэкапов - ежедневный запуск в 13:00

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

Дополнительные параметры бэкапа: размер тома и политика хранения

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

Созданное задание резервного копирования в списке My backups

Восстановление и проверка бэкапов
#

Бэкап, из которого ни разу не пробовали восстановиться, - это не бэкап, а надежда. Поэтому пройдемся по восстановлению хотя бы кратко, а наглядно весь процесс показан в видео.

Откуда восстанавливать
#

Восстановление запускается из раздела Restore. Вариантов три:

  • Из существующего задания. Если задание есть в списке - просто выбираем его. Это самый быстрый вариант: информацию о файлах Duplicati берет из своей локальной базы, а не выкачивает из хранилища.
  • Restore from configuration - если у вас есть экспортированный файл конфигурации задания (о нем ниже).
  • Direct restore from backup files - вариант на случай, когда сервер умер вместе с Duplicati, и вы ставите его с нуля. Указываем то же хранилище, что и при создании бэкапа, проверяем подключение кнопкой Test connection и вводим пароль шифрования. Работает медленнее: Duplicati приходится скачать и разобрать часть данных из хранилища, чтобы понять, какие там есть версии.
Warning

Без пароля шифрования восстановить зашифрованный бэкап невозможно - никак. Храните его не на том же сервере, который бэкапите, а, например, в менеджере паролей вроде 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, которые умеют вытащить файлы прямо из файлов бэкапа.

Backup - This article is part of a series.
Part : This Article

Related

Zerobyte - автоматизация резервного копирования для self-hosted инфраструктуры

··2181 слово·11 минут· loading · loading
Пошаговое руководство по установке и настройке Zerobyte для автоматизации резервного копирования в self-hosted инфраструктуре и homelab.

Vinchin Backup & Recovery V9.0 SP3 - обзор и практика на Proxmox VE

·4671 слово·23 минут· loading · loading
Разбираю Vinchin Backup & Recovery V9.0 SP3 - платформонезависимое резервное копирование и миграцию для смешанной и импортонезависимой инфраструктуры: архитектуру, установку на голое железо, поддержку Proxmox VE и российских платформ виртуализации (zVirt, РЕД, ROSA, HOSTVM), а также подробное сравнение с Proxmox Backup Server.

Proxmox Backup Server 4.2.0 - установка, настройка и резервное копирование Proxmox VE

··2531 слово·12 минут· loading · loading
Полная инструкция по установке и настройке Proxmox Backup Server 4.2.0 для создания надежной системы резервного копирования виртуальных машин и контейнеров Proxmox VE.