# restic

# Инструкция по настройке restic с MinIO


## Шаг 1: Установка restic

**Ubuntu/Debian:**
```bash
sudo apt update
sudo apt install restic -y
```

**Проверка установки:**
```bash
restic version
```

---

## Шаг 2: Создание пароля для репозитория

Сгенерируйте надежный пароль для шифрования данных:

```bash
# Вариант 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 Создание файла с переменными окружения

Создайте файл для хранения учетных данных:

```bash
sudo nano /etc/restic.env
```

Добавьте следующие строки (замените значения на свои):

```bash
# Учетные данные 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
```

**Пример реальной конфигурации:**
```bash
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 Защита файла с учетными данными

```bash
sudo chmod 600 /etc/restic.env
```

### 3.4 Загрузка переменных окружения

```bash
source /etc/restic.env
```

---

## Шаг 4: Проверка подключения и инициализация репозитория

### 4.1 Проверка доступа к MinIO

Проверьте, что restic видит ваш MinIO:

```bash
restic version
```

Если команда выполняется без ошибок, можно переходить к инициализации.

### 4.2 Инициализация репозитория

Выполните инициализацию репозитория (требуется только один раз):

```bash
restic init
```

При успешной инициализации вы увидите сообщение:
```
created restic repository <уникальный_идентификатор> at s3:http://...
```

### 4.3 Проверка, что бакет в MinIO создан

Убедитесь, что в MinIO появилась папка `restic-repo` или аналогичная с файлами репозитория.

---

## Шаг 5: Создание тестового бэкапа

### 5.1 Тестовый бэкап одного файла

```bash
# Создайте тестовый файл
echo "Тестовый бэкап от $(date)" > ~/test-backup.txt

# Выполните бэкап
restic backup ~/test-backup.txt

# Просмотр созданных снимков
restic snapshots
```

### 5.2 Бэкап нескольких директорий

```bash
restic backup /etc /home /var/www --tag "test-backup"
```

---

## Шаг 6: Создание скрипта для автоматического бэкапа

### 6.1 Создание скрипта

```bash
sudo nano /usr/local/bin/backup-minio.sh
```

```bash
#!/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 Настройка прав и тестирование

```bash
# Сделать скрипт исполняемым
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 для редактирования:

```bash
sudo crontab -e
```

Добавьте строки для автоматического запуска:

```bash
# Ежедневный бэкап в 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:

```bash
sudo nano /etc/systemd/system/restic-backup.service
```

```ini
[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
```

Создайте таймер:

```bash
sudo nano /etc/systemd/system/restic-backup.timer
```

```ini
[Unit]
Description=Run restic backup daily

[Timer]
OnCalendar=daily
Persistent=true

[Install]
WantedBy=timers.target
```

Активируйте таймер:

```bash
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 Найти нужный снимок

```bash
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 Восстановление данных

```bash
# Восстановить весь снимок
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 Исключение ненужных файлов

Создайте файл исключений:

```bash
sudo nano /etc/restic-excludes.txt
```

Добавьте паттерны исключения:
```
*.tmp
*.swp
*.log
/proc/*
/sys/*
/dev/*
/tmp/*
*.cache
*.pid
```

Используйте его в скрипте:
```bash
restic backup / --exclude-file=/etc/restic-excludes.txt
```

### 10.2 Настройка политики хранения

Вместо `--keep-last 7` можно использовать более гибкую политику:

```bash
# Хранить: 7 последних, 4 еженедельных, 6 ежемесячных
restic forget --keep-last 7 --keep-weekly 4 --keep-monthly 6 --prune
```

### 10.3 Мониторинг и уведомления

Добавьте в скрипт отправку уведомлений:

```bash
# Отправка в 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"

**Решение:** Выполните инициализацию:
```bash
restic init
```

### Проблема: "AccessDenied"

**Решение:** Проверьте учетные данные MinIO:
```bash
# Проверка доступности MinIO
curl http://<адрес_minio>:<порт>/minio/health/live
```

### Проблема: "connection refused"

**Решение:** Проверьте, что MinIO запущен и доступен по указанному адресу и порту.

### Проблема: "wrong password"

**Решение:** Убедитесь, что переменная `RESTIC_PASSWORD` загружена корректно:
```bash
echo $RESTIC_PASSWORD
```

### Проблема: "invalid repository"

**Решение:** Проверьте правильность URL репозитория:
```bash
echo $RESTIC_REPOSITORY
# Должно быть: s3:http://ip:port/имя-бакета
```

---

## Проверка работоспособности

Выполните полный цикл проверки:

```bash
# 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. Регулярно проверяйте логи и тестируйте восстановление, чтобы убедиться в надежности бэкапов.