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"