From cc5e040eed773ffe673d0b3d8b83b5c212ea7c04 Mon Sep 17 00:00:00 2001 From: Administrator Date: Sun, 12 Apr 2026 00:10:59 +0500 Subject: [PATCH] Update file 11-backup.md --- docs/11-backup.md | 284 ++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 262 insertions(+), 22 deletions(-) diff --git a/docs/11-backup.md b/docs/11-backup.md index e734453..23aa510 100644 --- a/docs/11-backup.md +++ b/docs/11-backup.md @@ -10,6 +10,7 @@ - Хранилище 1 TB с дедупликацией и компрессией - Автоматические бэкапы всех критичных систем - Протестированное восстановление +- ✅ Настроены уведомления в Telegram о статусе задач --- @@ -27,6 +28,7 @@ | **Расписание** | ✅ | 2 раза в день (02:30 и 22:30) | | **Retention** | ✅ | 14 последних, 7 ежедневных, 4 недельных, 4 месячных | | **Режим** | ✅ | Snapshot (без остановки сервисов) | +| **Уведомления** | ✅ | Telegram-бот через прокси (XRay + Redsocks) | ### 📊 Архитектура @@ -37,6 +39,7 @@ graph TD A -->|Network| D["Proxmox Backup Server
Olimpbs 192.168.1.199"] D --> E["Datastore: olimpbkp
1 TB LVM"] E --> F["/var/lib/proxmox-backup/olimpbkp"] + D -->|HTTPS via proxy| G["Telegram API
api.telegram.org"] ``` --- @@ -114,7 +117,7 @@ graph TD - **Status**: ✅ Enabled **Backup Job**: -``` +```text Node: Olimp Storage: olimpbkp Schedule: 02:30, 22:30 (daily) @@ -127,7 +130,7 @@ Retention: keep-last=14, keep-daily=7, keep-weekly=4, keep-monthly=4 ### На PBS (Olimpbs) **Datastore**: -``` +```text Name: olimpbkp Path: /var/lib/proxmox-backup/olimpbkp Size: 1 TB (912 GB available) @@ -146,13 +149,13 @@ Prune Schedule: daily ### Просмотр бэкапов **Через веб-интерфейс PBS**: -``` +```text https://192.168.1.199:8007 → Datastore → olimpbkp → Content ``` **Через Proxmox VE**: -``` +```text https://192.168.1.220:8006 → Datacenter → Storage → olimpbkp → Content ``` @@ -247,7 +250,6 @@ ssh root@192.168.1.199 "df -h /var/lib/proxmox-backup/olimpbkp" ### Garbage Collection (очистка) PBS автоматически запускает GC ежедневно. Вручную: - ```bash # На PBS сервере proxmox-backup-manager garbage-collection start olimpbkp @@ -259,7 +261,6 @@ proxmox-backup-manager garbage-collection status olimpbkp ### Prune (удаление старых бэкапов) Автоматически по retention политике. Вручную: - ```bash proxmox-backup-manager prune-job run ``` @@ -277,6 +278,250 @@ proxmox-backup-client verify ct/201/2026-04-11T13:19:03Z \ --- +## 📦 Уведомления в Telegram + +### 🎯 Цель +Получать уведомления в Telegram об успешных/неудачных бэкапах с Proxmox Backup Server, без изменений на гипервизоре. + +### 📋 Предварительные требования +- PBS сервер (192.168.1.199) с доступом в интернет через прокси +- Telegram бот: токен и chat_id +- Прокси: VLESS+Reality на `2.27.50.20:2054` + +### 🔧 Настройка прокси (XRay + Redsocks + iptables) + +**1. Установка XRay клиента** +```bash +# Установка зависимостей +apt update && apt install unzip curl iptables -y + +# Скачиваем XRay +cd /tmp +curl -L -o xray.zip https://github.com/XTLS/Xray-core/releases/latest/download/Xray-linux-64.zip +unzip xray.zip +chmod +x xray +mv xray geoip.dat geosite.dat /usr/local/bin/ + +# Проверка +xray version +``` + +**2. Конфигурация XRay** +```bash +mkdir -p /usr/local/etc/xray + +cat > /usr/local/etc/xray/config.json << 'EOF' +{ + "log": {"loglevel": "warning"}, + "inbounds": [{"port": 1080, "listen": "127.0.0.1", "protocol": "socks", "settings": {"auth": "noauth", "udp": true}}], + "outbounds": [ + { + "protocol": "vless", + "settings": { + "vnext": [{ + "address": "2.27.50.20", + "port": 2054, + "users": [{"id": "68f44a38-396d-48da-b832-79b5dc5716ab", "encryption": "none", "level": 8}] + }] + }, + "streamSettings": { + "network": "xhttp", + "security": "reality", + "realitySettings": { + "serverName": "cloud.zailon.ru", + "publicKey": "TOyddQCTdSpycmO20uiLOqMABuKabpwVhw57tWmvJws", + "shortId": "174fc0", + "spiderX": "/" + }, + "xhttpSettings": { + "host": "", + "path": "/remote.php/dav/upload", + "mode": "stream-one" + } + }, + "tag": "proxy" + }, + {"protocol": "freedom", "tag": "direct"} + ], + "routing": { + "rules": [ + {"type": "field", "ip": ["geoip:private"], "outboundTag": "direct"}, + {"type": "field", "domain": ["api.telegram.org"], "outboundTag": "proxy"} + ] + } +} +EOF +``` + +**3. Запуск XRay как сервис** +```bash +cat > /etc/systemd/system/xray-client.service << 'EOF' +[Unit] +Description=XRay Client +After=network.target + +[Service] +Type=simple +ExecStart=/usr/local/bin/xray run -config /usr/local/etc/xray/config.json +Restart=on-failure +RestartSec=5 + +[Install] +WantedBy=multi-user.target +EOF + +systemctl daemon-reload +systemctl enable --now xray-client +systemctl status xray-client +``` + +**4. Установка и настройка Redsocks** +```bash +# Установка +apt install redsocks -y + +# Конфигурация +cat > /etc/redsocks.conf << 'EOF' +base { + log_debug = off; + log_info = off; + log = stderr; + daemon = on; + redirector = iptables; +} + +redsocks { + bind = "0.0.0.0:12345"; + relay = "127.0.0.1:1080"; + type = socks5; + autoproxy = 0; + timeout = 10; +} +EOF + +# Запуск +systemctl enable --now redsocks +``` + +**5. Настройка iptables для Telegram** +```bash +cat > /usr/local/bin/telegram-proxy.sh << 'EOF' +#!/bin/bash +iptables -t nat -F TELEGRAM_PROXY 2>/dev/null +iptables -t nat -X TELEGRAM_PROXY 2>/dev/null +iptables -t nat -N TELEGRAM_PROXY + +# Telegram IP ranges +iptables -t nat -A TELEGRAM_PROXY -p tcp -d 149.154.160.0/20 -j REDIRECT --to-ports 12345 +iptables -t nat -A TELEGRAM_PROXY -p tcp -d 91.108.4.0/22 -j REDIRECT --to-ports 12345 + +iptables -t nat -A OUTPUT -p tcp --dport 443 -j TELEGRAM_PROXY +EOF + +chmod +x /usr/local/bin/telegram-proxy.sh +/usr/local/bin/telegram-proxy.sh +``` + +**6. Проверка соединения** +```bash +curl -s "https://api.telegram.org/bot/getMe" +``` +*Ожидаемый результат*: JSON с информацией о боте. + +### 🔧 Скрипт уведомлений + +**7. Создание скрипта** +```bash +cat > /usr/local/bin/pbs-backup-notify.sh << 'EOF' +#!/bin/bash + +TOKEN="YOUR_BOT_TOKEN" +CHAT="YOUR_CHAT_ID" +ARCHIVE="/var/log/proxmox-backup/tasks/archive" +STATE="/var/run/pbs-notify-lastline" + +# Получаем последнюю обработанную строку +LAST_LINE=$(cat $STATE 2>/dev/null || echo 0) +CURR_LINE=$(wc -l < $ARCHIVE) + +# Если файл уменьшился - начинаем сначала +if [ "$CURR_LINE" -lt "$LAST_LINE" ]; then + LAST_LINE=0 +fi + +# Читаем новые строки +if [ "$CURR_LINE" -gt "$LAST_LINE" ]; then + tail -n +$((LAST_LINE + 1)) $ARCHIVE | while IFS= read -r line; do + # Только backup задачи + if echo "$line" | grep -q ":backup:"; then + # Извлекаем имя бэкапа (конвертируем \x3a в :) + BACKUP=$(echo "$line" | grep -oP 'backup:\K[^:]+' | sed 's/\\x3a/:/g') + STATUS=$(echo "$line" | grep -oP 'OK|FAILED|ERROR') + TIME=$(date '+%Y-%m-%d %H:%M:%S') + + if [ "$STATUS" = "OK" ]; then + curl -s -X POST "https://api.telegram.org/bot$TOKEN/sendMessage" \ + -H "Content-Type: application/json" \ + -d "{\"chat_id\":\"$CHAT\",\"text\":\"✅ *Backup Success*\\n📦 $BACKUP\\n⏰ $TIME\",\"parse_mode\":\"Markdown\"}" > /dev/null + else + curl -s -X POST "https://api.telegram.org/bot$TOKEN/sendMessage" \ + -H "Content-Type: application/json" \ + -d "{\"chat_id\":\"$CHAT\",\"text\":\"❌ *Backup Failed*\\n📦 $BACKUP\\n⏰ $TIME\\n📝 Status: $STATUS\",\"parse_mode\":\"Markdown\"}" > /dev/null + fi + fi + done +fi + +# Сохраняем позицию +echo $CURR_LINE > $STATE +EOF + +chmod +x /usr/local/bin/pbs-backup-notify.sh +``` + +**8. Настройка Cron (каждые 5 минут)** +```bash +echo "*/5 * * * * root /usr/local/bin/pbs-backup-notify.sh" >> /etc/cron.d/pbs-notify +``` + +**9. Инициализация и тест** +```bash +# Сброс состояния для теста +echo "0" > /var/run/pbs-notify-lastline + +# Запуск вручную +/usr/local/bin/pbs-backup-notify.sh + +# Проверка состояния +cat /var/run/pbs-notify-lastline +wc -l < /var/log/proxmox-backup/tasks/archive +``` + +### 📝 Переменные для замены + +| Переменная | Описание | Пример | +|------------|----------|--------| +| `YOUR_BOT_TOKEN` | Токен Telegram бота | `7657027552:AAHQ6OGDRbm6wtqh_4GOQr7jd6C0BAQMyF4` | +| `YOUR_CHAT_ID` | ID чата для уведомлений | `292909723` | +| `address` | Адрес прокси-сервера | `2.27.50.20` | +| `port` | Порт прокси | `2054` | +| `id` | UUID пользователя VLESS | `68f44a38-396d-48da-b832-79b5dc5716ab` | +| `publicKey` | Публичный ключ Reality | `TOyddQCTdSpycmO20uiLOqMABuKabpwVhw57tWmvJws` | +| `serverName` | Домен для Reality | `cloud.zailon.ru` | + +### 📁 Файлы конфигурации + +| Файл | Назначение | +|------|------------| +| `/usr/local/etc/xray/config.json` | Конфиг XRay прокси | +| `/etc/redsocks.conf` | Конфиг Redsocks | +| `/usr/local/bin/telegram-proxy.sh` | Правила iptables для Telegram | +| `/usr/local/bin/pbs-backup-notify.sh` | Скрипт уведомлений | +| `/var/run/pbs-notify-lastline` | Позиция последнего прочитанного лога | +| `/etc/cron.d/pbs-notify` | Cron задача | + +--- + ## Миграция со старого PBS ### История @@ -309,7 +554,6 @@ systemctl restart proxmox-backup-proxy ### Удаление старого PBS После подтверждения что новые бэкапы работают: - ```bash # На Proxmox VE (Olimp) pvesm remove pbs-ssd @@ -327,20 +571,17 @@ pct destroy 220 ## Безопасность ### Аутентификация - - **PBS пользователи**: `root@pam`, `pve@pbs` - **API токены**: для автоматизации (без паролей) - **Fingerprint**: SHA-256 отпечаток сертификата ### Сетевая безопасность - - **Порт**: 8007 (TCP) - **Шифрование**: TLS 1.3 - **Доступ**: только из локальной сети (192.168.1.0/24) ### Рекомендации - -- ✅ Включить **2FA** для root@pam +- ✅ Включить **2FA** для `root@pam` - ✅ Создать **отдельного пользователя** для бэкапов (не root) - ✅ Настроить **firewall** на PBS сервере - ✅ Регулярно **обновлять** систему (unattended-upgrades) @@ -350,14 +591,12 @@ pct destroy 220 ## Планы на будущее ### 🔵 Краткосрочные (1-2 месяца) - -- [ ] Настроить **уведомления** (email/telegram) о статусе бэкапов +- [x] Настроить **уведомления** (Telegram) о статусе бэкапов - [ ] Включить **2FA** для доступа к PBS - [ ] Настроить **репликацию** в облако (Backblaze B2 / Wasabi) - [ ] Провести **тестовое восстановление** всех критичных ВМ ### 🔵 Долгосрочные (3-6 месяцев) - - [ ] Добавить **второй PBS** для репликации - [ ] Настроить **оффсайт-копии** (внешний диск + облако) - [ ] Внедрить **шифрование** бэкапов на стороне клиента @@ -368,7 +607,6 @@ pct destroy 220 ## Troubleshooting ### Бэкап не запускается - ```bash # Проверить хранилище pvesm status | grep olimpbkp @@ -386,7 +624,6 @@ pvesm add proxmox-backup olimpbkp \ ``` ### Закончилось место на PBS - ```bash # Проверить занятое место proxmox-backup-client datastore stats olimpbkp @@ -400,8 +637,7 @@ proxmox-backup-client prune \ --max-daily 7 --max-weekly 2 ``` -### Ошибка аутентификации - +### Ошибка аутентификации PBS ```bash # Сгенерировать новый токен proxmox-backup-manager user generate-token pve@pbs backup-token @@ -410,12 +646,19 @@ proxmox-backup-manager user generate-token pve@pbs backup-token pvesm update olimpbkp --password <новый_токен> ``` +### Проблемы с уведомлениями в Telegram +| Проблема | Решение | +|----------|---------| +| Не приходят уведомления | Проверить `curl -s https://api.telegram.org/bot/getMe` | +| Ошибка iptables | Перезапустить `/usr/local/bin/telegram-proxy.sh` | +| XRay не запускается | `journalctl -u xray-client -n 20 --no-pager` | +| Дубликат уведомлений | Удалить `/var/run/pbs-notify-lastline` и пересоздать | + --- ## Полезные команды ### На Proxmox VE - ```bash # Список хранилищ pvesm list @@ -432,7 +675,6 @@ qm restore olimpbkp:backup/vm// ``` ### На PBS - ```bash # Список datastore proxmox-backup-manager datastore list @@ -458,7 +700,6 @@ proxmox-backup-manager garbage-collection start olimpbkp ## Метрики и отчётность ### Ежедневная проверка - ```bash # Размер бэкапов за сегодня du -sh /var/lib/proxmox-backup/olimpbkp/data/* @@ -471,7 +712,6 @@ df -h /var/lib/proxmox-backup/olimpbkp ``` ### Еженедельный отчёт - ```bash # Дедупликация proxmox-backup-client datastore stats olimpbkp | grep "Deduplication"