Если вы видите что-то необычное, просто сообщите мне. Skip to main content

restic

Инструкция по настройке restic с MinIO

Отлично! Поскольку MinIO у вас уже настроен и есть все необходимые данные (адрес, бакет, ключи доступа), перейдем непосредственно к настройке restic.


Шаг 1: Установка restic

Ubuntu/Debian:

sudo apt update
sudo apt install restic -y

Проверка установки:

restic version

Шаг 2: Создание пароля для репозитория

Сгенерируйте надежный пароль для шифрования данных:

# Вариант 1: сгенерировать случайный пароль
openssl rand -base64 32

# Вариант 2: использовать apg (если установлен)
sudo apt install apg -y
apg -a 1 -m 32 -n 1 -M NCL

Важно: Запишите этот пароль в надежном месте! Без него восстановить данные будет невозможно.


Шаг 3: Настройка подключения к MinIO

3.1 Формат подключения

Для MinIO URL репозитория имеет формат:

s3:http://<IP_или_хост>:<порт>/<имя_бакета>

Примеры:

  • Если MinIO запущен локально: s3:http://localhost:9000/restic-backups
  • Если MinIO на другом сервере: s3:http://192.168.1.100:9000/my-bucket
  • Если используется HTTPS: s3:https://minio.example.com:9000/backups

3.2 Создание файла с переменными окружения

Создайте файл для хранения учетных данных:

sudo nano /etc/restic.env

Добавьте следующие строки (замените значения на свои):

# Учетные данные MinIO
export AWS_ACCESS_KEY_ID="<ваш_minio_access_key>"
export AWS_SECRET_ACCESS_KEY="<ваш_minio_secret_key>"

# URL репозитория в формате S3
export RESTIC_REPOSITORY="s3:http://<адрес_minio>:<порт>/<имя_бакета>"

# Пароль для шифрования репозитория
export RESTIC_PASSWORD="<ваш_сгенерированный_пароль>"

# Опционально: отключение проверки SSL (только для http)
export AWS_DISABLE_SSL=true

Пример реальной конфигурации:

export AWS_ACCESS_KEY_ID="minioadmin"
export AWS_SECRET_ACCESS_KEY="minioadmin123"
export RESTIC_REPOSITORY="s3:http://192.168.1.50:9000/backups"
export RESTIC_PASSWORD="MyVeryStrongPassword123!@#"
export AWS_DISABLE_SSL=true

3.3 Защита файла с учетными данными

sudo chmod 600 /etc/restic.env

3.4 Загрузка переменных окружения

source /etc/restic.env

Шаг 4: Проверка подключения и инициализация репозитория

4.1 Проверка доступа к MinIO

Проверьте, что restic видит ваш MinIO:

restic version

Если команда выполняется без ошибок, можно переходить к инициализации.

4.2 Инициализация репозитория

Выполните инициализацию репозитория (требуется только один раз):

restic init

При успешной инициализации вы увидите сообщение:

created restic repository <уникальный_идентификатор> at s3:http://...

4.3 Проверка, что бакет в MinIO создан

Убедитесь, что в MinIO появилась папка restic-repo или аналогичная с файлами репозитория.


Шаг 5: Создание тестового бэкапа

5.1 Тестовый бэкап одного файла

# Создайте тестовый файл
echo "Тестовый бэкап от $(date)" > ~/test-backup.txt

# Выполните бэкап
restic backup ~/test-backup.txt

# Просмотр созданных снимков
restic snapshots

5.2 Бэкап нескольких директорий

restic backup /etc /home /var/www --tag "test-backup"

Шаг 6: Создание скрипта для автоматического бэкапа

6.1 Создание скрипта

sudo nano /usr/local/bin/backup-minio.sh
#!/bin/bash

# Загрузка переменных окружения
source /etc/restic.env

# Переменные для логирования
LOG_FILE="/var/log/restic-backup.log"
DATE=$(date '+%Y-%m-%d %H:%M:%S')

echo "=== Backup started at $DATE ===" >> $LOG_FILE

# Выполнение бэкапа
# Добавьте нужные директории для бэкапа
restic backup /etc /home /var/www \
    --tag "daily-backup" \
    --exclude="*.tmp" \
    --exclude="*.log" \
    >> $LOG_FILE 2>&1

# Проверка статуса
if [ $? -eq 0 ]; then
    echo "Backup completed successfully" >> $LOG_FILE
else
    echo "Backup FAILED" >> $LOG_FILE
fi

# Очистка старых снимков (оставить последние 7)
restic forget --keep-last 7 --prune >> $LOG_FILE 2>&1

# Проверка целостности репозитория (опционально, выполняется раз в неделю)
# if [ $(date +%u) -eq 7 ]; then
#     restic check >> $LOG_FILE 2>&1
# fi

echo "=== Backup finished at $(date '+%Y-%m-%d %H:%M:%S') ===" >> $LOG_FILE
echo "" >> $LOG_FILE

6.2 Настройка прав и тестирование

# Сделать скрипт исполняемым
sudo chmod +x /usr/local/bin/backup-minio.sh

# Запустить скрипт вручную для тестирования
sudo /usr/local/bin/backup-minio.sh

# Проверить лог
cat /var/log/restic-backup.log

Шаг 7: Настройка автоматического запуска (cron)

7.1 Добавление в crontab

Откройте crontab для редактирования:

sudo crontab -e

Добавьте строки для автоматического запуска:

# Ежедневный бэкап в 2:00 ночи
0 2 * * * /usr/local/bin/backup-minio.sh

# Проверка репозитория каждое воскресенье в 3:00
0 3 * * 0 restic --repository-file /etc/restic.env check

7.2 Альтернатива: использование systemd таймера

Создайте службу для systemd:

sudo nano /etc/systemd/system/restic-backup.service
[Unit]
Description=Restic backup to MinIO
After=network.target

[Service]
Type=oneshot
EnvironmentFile=/etc/restic.env
ExecStart=/usr/local/bin/backup-minio.sh
User=root

Создайте таймер:

sudo nano /etc/systemd/system/restic-backup.timer
[Unit]
Description=Run restic backup daily

[Timer]
OnCalendar=daily
Persistent=true

[Install]
WantedBy=timers.target

Активируйте таймер:

sudo systemctl daemon-reload
sudo systemctl enable restic-backup.timer
sudo systemctl start restic-backup.timer

Шаг 8: Полезные команды для работы

Команда Описание
restic snapshots Показать все снимки (бэкапы)
restic snapshots --latest 1 Показать последний снимок
restic stats Показать статистику репозитория
restic check Проверить целостность репозитория
restic restore <snapshot_ID> --target /путь/восстановления Восстановить данные
restic forget --keep-last 10 --prune Оставить последние 10 снимков, остальные удалить
restic diff <snapshot1> <snapshot2> Сравнить два снимка

Шаг 9: Восстановление данных

9.1 Найти нужный снимок

source /etc/restic.env
restic snapshots

Пример вывода:

ID        Time                 Host        Tags        Paths
------------------------------------------------------------------------
a1b2c3d4  2024-03-21 02:00:01  myserver    daily-backup /etc /home /var/www
e5f6g7h8  2024-03-20 02:00:01  myserver    daily-backup /etc /home /var/www

9.2 Восстановление данных

# Восстановить весь снимок
restic restore a1b2c3d4 --target /tmp/restore

# Восстановить только конкретную директорию
restic restore a1b2c3d4 --target /tmp/restore --include "/etc/nginx"

# Восстановить конкретный файл
restic restore a1b2c3d4 --target /tmp/restore --include "/etc/nginx/nginx.conf"

Шаг 10: Оптимизация и лучшие практики

10.1 Исключение ненужных файлов

Создайте файл исключений:

sudo nano /etc/restic-excludes.txt

Добавьте паттерны исключения:

*.tmp
*.swp
*.log
/proc/*
/sys/*
/dev/*
/tmp/*
*.cache
*.pid

Используйте его в скрипте:

restic backup / --exclude-file=/etc/restic-excludes.txt

10.2 Настройка политики хранения

Вместо --keep-last 7 можно использовать более гибкую политику:

# Хранить: 7 последних, 4 еженедельных, 6 ежемесячных
restic forget --keep-last 7 --keep-weekly 4 --keep-monthly 6 --prune

10.3 Мониторинг и уведомления

Добавьте в скрипт отправку уведомлений:

# Отправка в Telegram (пример)
if [ $? -eq 0 ]; then
    curl -s "https://api.telegram.org/bot<TOKEN>/sendMessage" \
        -d "chat_id=<CHAT_ID>" \
        -d "text=✅ Backup completed successfully for $(hostname)"
else
    curl -s "https://api.telegram.org/bot<TOKEN>/sendMessage" \
        -d "chat_id=<CHAT_ID>" \
        -d "text=❌ Backup FAILED for $(hostname)"
fi

Устранение неполадок

Проблема: "repository does not exist"

Решение: Выполните инициализацию:

restic init

Проблема: "AccessDenied"

Решение: Проверьте учетные данные MinIO:

# Проверка доступности MinIO
curl http://<адрес_minio>:<порт>/minio/health/live

Проблема: "connection refused"

Решение: Проверьте, что MinIO запущен и доступен по указанному адресу и порту.

Проблема: "wrong password"

Решение: Убедитесь, что переменная RESTIC_PASSWORD загружена корректно:

echo $RESTIC_PASSWORD

Проблема: "invalid repository"

Решение: Проверьте правильность URL репозитория:

echo $RESTIC_REPOSITORY
# Должно быть: s3:http://ip:port/имя-бакета

Проверка работоспособности

Выполните полный цикл проверки:

# 1. Загрузка переменных
source /etc/restic.env

# 2. Инициализация (если еще не делали)
restic init

# 3. Создание тестового бэкапа
echo "Test backup $(date)" > /tmp/test.txt
restic backup /tmp/test.txt

# 4. Просмотр снимков
restic snapshots

# 5. Получение ID последнего снимка
LAST_SNAPSHOT=$(restic snapshots --latest 1 --json | grep -o '"short_id":"[^"]*"' | head -1 | cut -d'"' -f4)

# 6. Восстановление в другую директорию
restic restore $LAST_SNAPSHOT --target /tmp/restore-test

# 7. Проверка восстановленного файла
ls -la /tmp/restore-test/

# 8. Удаление тестовых данных
rm -rf /tmp/restore-test /tmp/test.txt

Готово! Restic настроен для работы с вашим MinIO. Регулярно проверяйте логи и тестируйте восстановление, чтобы убедиться в надежности бэкапов.