Бэкапы без боли за 40 евро

Зачем вообще заморачиваться с бэкапами?

Если ты хоть раз терял данные, то уже знаешь, что бэкапы — это не роскошь, а вопрос выживания. Диски умирают, шифровальщики шифруют, пользователи умудряются удалить что-то важное без малейшего понимания последствий. Ну и сейчас как будто с таким количеством информации в компании уже трудно дышать без надёжного хранилища бэкапов.

Почему MinIO?

MinIO — это S3-совместимое хранилище без каких либо тарифов крупных облаков. Open-Source, поднимается где угодно, масштабируется в три клика, поддерживает шифрование, репликацию, версии файлов.

К тому же, MinIO показывает отличную производительность. Мы протестировали производительность на реальной задаче по копированию бекапов на наш сервер: 750 ГБ данных бэкапятся за ~3 часа. Это довольно хороший результат.

I/O метрики во время загрузки
I/O метрики во время загрузки

Как это заставить работать?

  1. С централизованного хранилища бекапов периодически копируются бекапы через rclone.

  2. MinIO принимает их, сжимает, шифрует и кладёт к себе.

  3. Через веб интерфейс можно посмотреть содержимое бакета.

  4. Всё автоматизировано — настроил раз и забыл.

Настроить процесс можно под любые нужды: хочешь делать инкрементальные бэкапы — пожалуйста, нужно архивировать старые версии — легко.

Что ещё можно хранить?

  • Логи серверов (иногда они говорят больше, чем твои админы)

  • Дамп базы (вдруг кто-то случайно дропнет прод?)

  • Файлы пользователей (если у тебя сервис, где это критично)

  • Архивы проектов (клиенты любят откатываться на версию 5 летней давности)

  • Контент медиа-сервисов (если у тебя видеохостинг или облачное хранилище)

Как развернуть MinIO с Docker

Если у тебя ещё нет Docker, установи его:

curl -fsSL https://get.docker.com -o get-docker.sh
sh get-docker.sh

Далее создаём сертификаты. Можно использовать Let«s Encrypt или самоподписанные:

Let«s Encrypt:

apt install certbot
certbot certonly --standalone -d 
mkdir -p /opt/minio/certs
ln -s /etc/letsencrypt/live/minio.oracix.ru/fullchain.pem /opt/minio/certs/minio.crt
ln -s /etc/letsencrypt/live/minio.oracix.ru/privkey.pem /opt/minio/certs/minio.key

Самоподписанный сертификат:

mkdir -p /opt/minio/certs
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
  -keyout /opt/minio/certs/minio.key -out /opt/minio/certs/minio.crt \
  -subj "/C=RU/ST=State/L=City/O=Organization/OU=IT/CN="

Теперь создаём docker-compose.yml:

services:
  minio:
    image: quay.io/minio/minio:latest
    container_name: minio
    restart: always
    ports:
      - "9000:9000"
      - "9001:9001"
    volumes:
      - /opt/minio/data:/data
      - /opt/minio/certs/minio.crt:/certs/public.crt:ro
      - /opt/minio/certs/minio.key:/certs/private.key:ro
    environment:
      MINIO_ROOT_USER: "admin"
      MINIO_ROOT_PASSWORD: "StrongPassword123"
    command: server /data --console-address ":9001" --certs-dir /certs

Запускаем MinIO:

docker-compose up -d

MinIO доступен по https:/:9001.

Копируем бекапы в MiniO

Для автоматизации сброса бекапов я использую rclone + cron со стороны сервера где хранятся бекапы.

Установим rclone:

curl https://rclone.org/install.sh | sudo bash

Настройка MinIO как удаленного хранилища в rclone:

rclone config
  • Создать новое подключениеNew Remote

  • Введите имяminio

  • Выберите тип хранилищаs3

  • Ввести endpoint https://your-minio-server:9000

  • Ввести access_key и secret_key

  • Оставить пустым region (если MinIO не требует региона)

  • Выбрать ACL (обычно private)

  • Сохранить конфигурацию (y → Enter)

Запуск копирования в MinIO:

rclone copy /local/path minio:mybucket --transfers=10 --checkers=10 --progress

Где:

  • -transfers=10 — число параллельных потоков загрузки (настраивается)

  • -checkers=10 — число потоков проверки файлов

  • -progress — отображение прогресса передачи

Немного про автоматизацию:

Автоматизация с помощью cron:

Используем rclone для периодического копирования бэкапов.

Создайте файл /usr/local/bin/upload_backups.sh:

#!/bin/bash

LOGFILE="/var/log/minio_backup.log"
echo "$(date): Started copy" >> "$LOGFILE"

BACKUP_DIR="/local/path"

BUCKET="minio:mybucket"

rclone copy "$BACKUP_DIR" "$BUCKET" --transfers=10 --checkers=10 --progress --log-file "$LOGFILE" --log-level INFO

echo "$(date): Upload finished" >> "$LOGFILE"
chmod +x /usr/local/bin/upload_backups.sh

Далее добавим задачу в cron:

crontab -e
0 2 * * * /usr/local/bin/upload_backups.sh

Если нужно удалять старые файлы (например, старше 90 дней), можно добавить команду:

rclone delete --min-age 90d minio:mybucket --progress

Сколько стоит?

40 евро в месяц за 4 TB Storage VPS. Гибкие тарифы, лёгкая масштабируемость, безопасность уровня банковского хранилища (ну почти). Если нужно больше объёма или резервные копии на отдельные сервера — всё обсуждаемо.

Почему именно у нас?

  • Никаких сюрпризов в тарифах

  • Помощь в установке

  • Быстрый доступ, без перегруженных дата-центров

  • Локация в российских дата-центрах

  • Гарантированное сохранение данных

  • Техподдержка, которая не будет предлагать «перезагрузить компьютер»

  • Проверенная скорость — 750 ГБ за ~3 часа без нагрузки на систему

Сравнение цен с облачными провайдерами

Провайдер

Цена за 4Т

Дополнительные расходы

Наше предложение

~3500

Фиксированная стоимость, без скрытых платежей

Croc

~4500

Дополнительные расходы на трафик

Selectel

~4500

Дополнительные расходы на трафик

Yandex.Cloud

~8000

Дополнительная плата за трафик и запросы

© Habrahabr.ru