Update file 11-backup.md
This commit is contained in:
parent
9a6412ca0d
commit
cc5e040eed
@ -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<br/>Olimpbs 192.168.1.199"]
|
||||
D --> E["Datastore: olimpbkp<br/>1 TB LVM"]
|
||||
E --> F["/var/lib/proxmox-backup/olimpbkp"]
|
||||
D -->|HTTPS via proxy| G["Telegram API<br/>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 <job-id>
|
||||
```
|
||||
@ -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<YOUR_BOT_TOKEN>/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<TOKEN>/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 <new-vmid> olimpbkp:backup/vm/<vmid>/<timestamp>
|
||||
```
|
||||
|
||||
### На 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"
|
||||
|
||||
Loading…
Reference in New Issue
Block a user