S3-совместимое хранилище удобно тем, что один протокол понимают restic, rclone, Velero и десятки других инструментов. MinIO реализует этот протокол локально: данные лежат на вашем диске, доступ идёт по HTTP API, а не по FTP или SMB. Для резервных копий это даёт версионирование, защиту объектов от удаления и прозрачные политики хранения. Ниже — установка, разграничение доступа и проверка восстановления на одном узле, без кластера и лишней инфраструктуры.
Зачем бэкапам объектное хранилище
Обычная папка на NAS проста, но у неё нет версий и блокировок. Скрипт с ошибкой в пути может удалить вчерашнюю копию, а шифровальщик — перезаписать все архивы. В S3-хранилище включают versioning и object lock: старая версия остаётся доступной, а удаление в период удержания блокируется на стороне сервера.
Второй плюс — единый интерфейс. Приложение пишет в S3, и вы можете перенести бакет в другое хранилище без переписывания кода. Для домашней лаборатории и небольшого офиса этого достаточно. Один узел остаётся единой точкой отказа, поэтому диск и питание должны быть надёжными, а копия — уезжать на второй носитель.
Установка: Docker Compose и отдельный диск
MinIO не стоит ставить на тот же раздел, где лежат бэкапы других систем, и тем более на корень. Выделите отдельный диск или LVM-том: так проще считать место и ограничить последствия сбоя. Каталог данных монтируется в контейнер, конфигурация хранится в переменных окружения.
services:
minio:
image: quay.io/minio/minio:latest
restart: unless-stopped
command: server /data --console-address ":9001"
environment:
MINIO_ROOT_USER: ${MINIO_USER}
MINIO_ROOT_PASSWORD: ${MINIO_PASS}
volumes:
- /srv/minio/data:/data
ports:
- "127.0.0.1:9000:9000"
- "127.0.0.1:9001:9001"
Порты привязаны к localhost: наружу хранилище должно смотреть только через обратный прокси с TLS. Пароль root-пользователя задайте длинным и случайным, а .env закройте правами 600. Для рабочего контура фиксируйте конкретный тег образа, а не latest, иначе обновление может изменить поведение.
В 2025 году проект менял модель поставки и состав бесплатной сборки. Перед выбором проверьте актуальные условия лицензии и наличие нужных функций в вашей версии; если чего-то не хватает, альтернативы — Garage, SeaweedFS или Ceph.
Первичная настройка и учётные записи
Работать под root-пользователем постоянно нельзя. Создайте отдельного пользователя для бэкапов и выдайте ему политику только на нужные бакеты. Клиент mc хранит подключения в своём конфиге и позволяет переключаться между серверами.
mc alias set backup http://127.0.0.1:9000 "$MINIO_USER" "$MINIO_PASS"
mc admin user add backup backupuser "$BACKUP_PASS"
mc admin policy create backup backup-rw backup-rw.json
mc admin policy attach backup backup-rw --user backupuser
Политика описывает действия и ресурсы в JSON: разрешите s3:PutObject, s3:GetObject, s3:ListBucket и s3:DeleteObject только для бакета restic. Не выдавайте s3:* на все ресурсы: ошибка в скрипте тогда сможет удалить лишнее.
Бакет, версии и защита от удаления
Бакет с object lock создаётся один раз и с флагом --with-lock. После этого включается версионирование, а политика удержания задаёт срок, в течение которого объект нельзя перезаписать или удалить.
mc mb --with-lock backup/restic
mc version enable backup/restic
mc retention set --default GOVERNANCE 30d backup/restic
mc ls --versions backup/restic
Режим GOVERNANCE разрешает снять удержание пользователю с соответствующими правами, COMPLIANCE — нет, даже администратору. Для бэкапов обычно достаточно GOVERNANCE: он защищает от случайного удаления, но оставляет выход при ошибке в политике. Срок выбирайте по частоте бэкапов и требованиям к хранению.
Подключение restic и rclone
restic понимает S3 через переменные окружения. Репозиторий создаётся один раз, дальше выполняются обычные backup и forget. Пароль репозитория храните отдельно от ключей доступа.
export AWS_ACCESS_KEY_ID="$BACKUP_USER"
export AWS_SECRET_ACCESS_KEY="$BACKUP_PASS"
export RESTIC_REPOSITORY="s3:http://127.0.0.1:9000/restic"
restic init
restic backup /etc /home --exclude-caches
Для простого зеркалирования каталогов подойдёт rclone или сам mc. Удалённое хранилище в rclone сначала описывают командой rclone config, а mc mirror умеет следить за изменениями и удалять лишнее на приёмнике. Поэтому сначала прогоните его с --dry-run и проверьте список файлов.
rclone sync /srv/data remote:restic/daily --dry-run
mc mirror --overwrite /srv/data backup/restic/daily
mc mirror --watch /srv/data backup/restic/daily
Политики доступа и TLS
По умолчанию новый бакет приватный, и это правильно. Публичный доступ включайте только осознанно, например для раздачи статики, и никогда — для бэкапов. Проверить политику можно командой mc anonymous get.
TLS удобнее завершать на обратном прокси: Nginx или Caddy принимают сертификат, а MinIO слушает только localhost. Если прокси нет, MinIO умеет работать с сертификатами из каталога ~/.minio/certs, но тогда обновление сертификата ложится на вас.
Диагностика и обслуживание
Состояние кластера, дисков и версии ПО показывает mc admin info. Если клиент получает ошибки, включите трассировку: она показывает запросы и коды ответов, но содержит чувствительные данные, поэтому не оставляйте её включённой надолго.
mc admin info backup
mc admin trace -v backup
curl -s -o /dev/null -w '%{http_code}\n' http://127.0.0.1:9000/minio/health/live
mc admin heal -r backup
Проверка живости /minio/health/live подходит для systemd или прокси. Команда heal полезна после сбоя диска, но на одиночном узле она не заменяет восстановление из резервной копии. Для больших бакетов mc admin heal выполняйте в непиковое время: операция читает объекты и нагружает диск.
Чек-лист перед вводом в эксплуатацию
- данные лежат на отдельном диске, а не на корневом разделе;
- root-пользователь используется только для администрирования;
- для бэкапов создан отдельный пользователь с узкой политикой;
- включены versioning и удержание, срок согласован с политикой хранения;
- доступ снаружи идёт только по HTTPS, порт 9000 не открыт в интернет;
- настроен мониторинг свободного места и здоровья сервиса;
- восстановление из копии проверено на тестовом каталоге;
- версия образа зафиксирована, обновление проходит по плану.
Итог
MinIO превращает обычный диск в S3-хранилище, с которым умеют работать современные системы резервного копирования. Главное — не сама установка, а дисциплина: отдельный пользователь, узкая политика, версионирование, удержание и регулярная проверка восстановления. Начните с одного бакета и restic, а расширяйте схему только после успешного теста.