Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
В съвременната IT среда архивирането на данни е критично важно за всяка организация. Proxmox Virtual Environment (VE) предоставя мощни възможности за виртуализация, но създаването на надеждна стратегия за архивиране изисква интегриране с външни системи за съхранение. В тази статия ще разгледаме как да създадем автоматична система за архивиране, която интегрира Proxmox с Nextcloud и Amazon S3, осигурявайки многослойна защита на данните.
Загуба на данни: Хардуерни повреди, човешки грешки или кибератаки могат да доведат до необратима загуба на критични данни.
Време за възстановяване: Без редовни архиви времето за възстановяване на услугите може да достигне дни или седмици.
Регулаторни изисквания: Много индустрии изискват задължително архивиране на данни за определени периоди.
Бизнес непрекъснатост: Надеждното архивиране е основа за планове за възстановяване при бедствия (Disaster Recovery).
Консистентност: Автоматичните архиви се създават редовно без човешка намеса.
Намалени грешки: Автоматизацията елиминира възможността за човешки грешки.
Ефективност: Системата работи без необходимост от постоянно наблюдение.
Множество дестинации: Възможност за едновременно архивиране на различни места.
Proxmox VE: Основната виртуализационна платформа, която управлява виртуалните машини и контейнери.
Proxmox Backup Server (PBS): Специализиран backup сървър за дедупликация и компресия на архивите.
Nextcloud: Самохостван cloud storage за локално съхранение и синхронизация.
Amazon S3: Облачно съхранение за offsite архивиране.
Скриптове за автоматизация: Custom скриптове за оркестрация на процеса.
[Proxmox VE] → [Proxmox Backup Server] → [Nextcloud] → [Amazon S3]
↓ ↓ ↓ ↓
VM/Container Дедупликация Локално Облачно
Backups Компресия съхранение съхранение
Proxmox Backup Server може да се инсталира като отделна система или виртуална машина.
# Изтегляне на ISO образа
wget https://enterprise.proxmox.com/iso/proxmox-backup-server_3.0-1.iso
# Инсталация на физически сървър или като VM
# Следвайте графичния инсталатор
# Актуализация на системата
apt update && apt upgrade -y
# Конфигурация на мрежата
nano /etc/network/interfaces
# Пример конфигурация:
auto lo
iface lo inet loopback
auto vmbr0
iface vmbr0 inet static
address 192.168.1.100/24
gateway 192.168.1.1
bridge_ports ens18
bridge_stp off
bridge_fd 0
Първоначална конфигурация
# Актуализация на системата
apt update && apt upgrade -y
# Конфигурация на мрежата
nano /etc/network/interfaces
# Пример конфигурация:
auto lo
iface lo inet loopback
auto vmbr0
iface vmbr0 inet static
address 192.168.1.100/24
gateway 192.168.1.1
bridge_ports ens18
bridge_stp off
bridge_fd 0
Създаване на Datastore
# Създаване на директория за архивите
mkdir -p /backup/datastore
# Форматиране на диск (ако е необходимо)
mkfs.ext4 /dev/sdb1
# Монтиране
echo "/dev/sdb1 /backup/datastore ext4 defaults 0 2" >> /etc/fstab
mount -a
# Конфигурация на datastore чрез уеб интерфейса
# Administration → Storage/Disks → Directory
Конфигурация на retention policy
# Настройка на политика за задържане
proxmox-backup-manager datastore create backup-store /backup/datastore
# Конфигурация на retention
proxmox-backup-manager datastore update backup-store \
--keep-daily 7 \
--keep-weekly 4 \
--keep-monthly 12 \
--keep-yearly 3
# Инсталация на необходимите пакети
apt install apache2 mariadb-server php php-mysql php-xml php-gd \
php-curl php-mbstring php-intl php-imagick php-zip php-bcmath -y
# Създаване на база данни
mysql -u root -p
CREATE DATABASE nextcloud;
CREATE USER 'nextcloud'@'localhost' IDENTIFIED BY 'strong_password';
GRANT ALL PRIVILEGES ON nextcloud.* TO 'nextcloud'@'localhost';
FLUSH PRIVILEGES;
EXIT;
# Изтегляне на Nextcloud
cd /var/www/
wget https://download.nextcloud.com/server/releases/latest.tar.bz2
tar -xjf latest.tar.bz2
chown -R www-data:www-data nextcloud/
chmod -R 755 nextcloud/
Конфигурация на Apache
# /etc/apache2/sites-available/nextcloud.conf
<VirtualHost *:80>
ServerName nextcloud.yourdomain.com
DocumentRoot /var/www/nextcloud
<Directory /var/www/nextcloud>
Options +FollowSymlinks
AllowOverride All
Require all granted
<IfModule mod_dav.c>
Dav off
</IfModule>
SetEnv HOME /var/www/nextcloud
SetEnv HTTP_HOME /var/www/nextcloud
</Directory>
ErrorLog ${APACHE_LOG_DIR}/nextcloud_error.log
CustomLog ${APACHE_LOG_DIR}/nextcloud_access.log combined
</VirtualHost>
# Активиране на необходимите модули
a2enmod rewrite headers env dir mime
a2ensite nextcloud
systemctl restart apache2
Настройка на External Storage
# Инсталация на External Storage app
sudo -u www-data php /var/www/nextcloud/occ app:enable files_external
# Добавяне на PBS storage като external storage
sudo -u www-data php /var/www/nextcloud/occ files_external:create \
"PBS Backups" local null::null \
-c datadir="/backup/datastore" \
--user admin
# Инсталация на AWS CLI
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install
# Конфигурация
aws configure
# AWS Access Key ID: [Your Access Key]
# AWS Secret Access Key: [Your Secret Key]
# Default region name: eu-west-1
# Default output format: json
Създаване на S3 bucket
# Създаване на bucket
aws s3 mb s3://my-proxmox-backups-bucket --region eu-west-1
# Настройка на lifecycle policy за cost optimization
cat > lifecycle-policy.json << EOF
{
"Rules": [
{
"ID": "BackupTransitionRule",
"Status": "Enabled",
"Transitions": [
{
"Days": 30,
"StorageClass": "STANDARD_IA"
},
{
"Days": 90,
"StorageClass": "GLACIER"
},
{
"Days": 365,
"StorageClass": "DEEP_ARCHIVE"
}
]
}
]
}
EOF
aws s3api put-bucket-lifecycle-configuration \
--bucket my-proxmox-backups-bucket \
--lifecycle-configuration file://lifecycle-policy.json
#!/bin/bash
# /usr/local/bin/proxmox-backup.sh
# Конфигурационни променливи
PBS_SERVER="192.168.1.100"
PBS_USER="backup@pbs"
PBS_DATASTORE="backup-store"
NEXTCLOUD_DIR="/var/www/nextcloud/data/admin/files/backups"
S3_BUCKET="my-proxmox-backups-bucket"
LOG_FILE="/var/log/proxmox-backup.log"
# Функция за логиране
log() {
echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" | tee -a "$LOG_FILE"
}
# Функция за изпращане на известия
send_notification() {
local subject="$1"
local message="$2"
# Webhook за Slack/Discord или email
curl -X POST -H 'Content-type: application/json' \
--data "{\"text\":\"$subject: $message\"}" \
"$WEBHOOK_URL"
}
# Стартиране на backup процеса
log "Starting backup process"
# Списък на VM/CT за архивиране
VMIDS=$(pvesh get /nodes/$(hostname)/qemu --output-format json | jq -r '.[].vmid')
CTIDS=$(pvesh get /nodes/$(hostname)/lxc --output-format json | jq -r '.[].vmid')
# Backup на VM
for vmid in $VMIDS; do
log "Backing up VM $vmid"
# Създаване на backup в PBS
proxmox-backup-client backup \
--repository "$PBS_USER@$PBS_SERVER:$PBS_DATASTORE" \
"vm-$vmid.img:/var/lib/vz/images/$vmid/" \
--backup-id "vm-$vmid" \
--backup-time "$(date +%s)"
if [ $? -eq 0 ]; then
log "VM $vmid backup completed successfully"
else
log "VM $vmid backup failed"
send_notification "Backup Failed" "VM $vmid backup failed"
fi
done
# Backup на Containers
for ctid in $CTIDS; do
log "Backing up Container $ctid"
# Създаване на snapshot и backup
pct snapshot $ctid backup-$(date +%Y%m%d-%H%M%S)
proxmox-backup-client backup \
--repository "$PBS_USER@$PBS_SERVER:$PBS_DATASTORE" \
"ct-$ctid.tar:/var/lib/vz/dump/vzdump-lxc-$ctid-*.tar.zst" \
--backup-id "ct-$ctid" \
--backup-time "$(date +%s)"
if [ $? -eq 0 ]; then
log "Container $ctid backup completed successfully"
else
log "Container $ctid backup failed"
send_notification "Backup Failed" "Container $ctid backup failed"
fi
done
log "Backup process completed"
Скрипт за синхронизация с Nextcloud
#!/bin/bash
# /usr/local/bin/sync-to-nextcloud.sh
PBS_BACKUP_DIR="/backup/datastore"
NEXTCLOUD_USER="admin"
NEXTCLOUD_DIR="/var/www/nextcloud/data/$NEXTCLOUD_USER/files/backups"
LOG_FILE="/var/log/nextcloud-sync.log"
# Функция за логиране
log() {
echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" | tee -a "$LOG_FILE"
}
log "Starting Nextcloud sync"
# Създаване на директория ако не съществува
mkdir -p "$NEXTCLOUD_DIR"
# Синхронизация на най-новите backups
rsync -av --progress \
--include="*.fidx" \
--include="*.didx" \
--include="*.blob" \
--exclude="*" \
"$PBS_BACKUP_DIR/" "$NEXTCLOUD_DIR/"
# Обновяване на Nextcloud файловата система
sudo -u www-data php /var/www/nextcloud/occ files:scan "$NEXTCLOUD_USER"
log "Nextcloud sync completed"
Скрипт за архивиране в S3
#!/bin/bash
# /usr/local/bin/sync-to-s3.sh
NEXTCLOUD_BACKUP_DIR="/var/www/nextcloud/data/admin/files/backups"
S3_BUCKET="my-proxmox-backups-bucket"
LOG_FILE="/var/log/s3-sync.log"
# Функция за логиране
log() {
echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" | tee -a "$LOG_FILE"
}
log "Starting S3 sync"
# Синхронизация с S3
aws s3 sync "$NEXTCLOUD_BACKUP_DIR" "s3://$S3_BUCKET/proxmox-backups/" \
--storage-class STANDARD_IA \
--delete
if [ $? -eq 0 ]; then
log "S3 sync completed successfully"
# Почистване на стари локални файлове (старше от 30 дни)
find "$NEXTCLOUD_BACKUP_DIR" -type f -mtime +30 -delete
log "Old local files cleaned up"
else
log "S3 sync failed"
exit 1
fi
log "S3 sync process completed"
# Редактиране на crontab
crontab -e
# Добавяне на задачи
# Ежедневен backup в 2:00 сутринта
0 2 * * * /usr/local/bin/proxmox-backup.sh >> /var/log/cron-backup.log 2>&1
# Синхронизация с Nextcloud в 4:00 сутринта
0 4 * * * /usr/local/bin/sync-to-nextcloud.sh >> /var/log/cron-nextcloud.log 2>&1
# Синхронизация с S3 в 6:00 сутринта
0 6 * * * /usr/local/bin/sync-to-s3.sh >> /var/log/cron-s3.log 2>&1
# Седмично почистване на стари архиви
0 3 * * 0 /usr/local/bin/cleanup-old-backups.sh >> /var/log/cron-cleanup.log 2>&1
Скрипт за почистване
#!/bin/bash
# /usr/local/bin/cleanup-old-backups.sh
PBS_SERVER="192.168.1.100"
PBS_USER="backup@pbs"
PBS_DATASTORE="backup-store"
LOG_FILE="/var/log/backup-cleanup.log"
log() {
echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" | tee -a "$LOG_FILE"
}
log "Starting backup cleanup"
# Почистване според retention policy
proxmox-backup-client prune \
--repository "$PBS_USER@$PBS_SERVER:$PBS_DATASTORE" \
--keep-daily 7 \
--keep-weekly 4 \
--keep-monthly 12 \
--keep-yearly 3
# Garbage collection за освобождаване на място
proxmox-backup-client garbage-collect \
--repository "$PBS_USER@$PBS_SERVER:$PBS_DATASTORE"
log "Backup cleanup completed"
#!/bin/bash
# /usr/local/bin/backup-monitor.sh
PBS_SERVER="192.168.1.100"
PBS_USER="backup@pbs"
PBS_DATASTORE="backup-store"
WEBHOOK_URL="YOUR_SLACK_WEBHOOK_URL"
# Проверка на състоянието на последните backups
LAST_BACKUP=$(proxmox-backup-client list \
--repository "$PBS_USER@$PBS_SERVER:$PBS_DATASTORE" \
--output-format json | jq -r '.[0]."backup-time"')
CURRENT_TIME=$(date +%s)
BACKUP_AGE=$((CURRENT_TIME - LAST_BACKUP))
# Известяване ако backup е по-стар от 25 часа
if [ $BACKUP_AGE -gt 90000 ]; then
curl -X POST -H 'Content-type: application/json' \
--data "{\"text\":\"⚠️ Warning: Last backup is older than 25 hours!\"}" \
"$WEBHOOK_URL"
fi
# Проверка на свободното място
DISK_USAGE=$(df /backup/datastore | awk 'NR==2 {print $5}' | sed 's/%//')
if [ $DISK_USAGE -gt 80 ]; then
curl -X POST -H 'Content-type: application/json' \
--data "{\"text\":\"⚠️ Warning: Backup storage is $DISK_USAGE% full!\"}" \
"$WEBHOOK_URL"
fi
Настройка на email известяване
# Инсталация на postfix
apt install postfix mailutils -y
# Конфигурация за email
cat >> /etc/postfix/main.cf << EOF
relayhost = smtp.gmail.com:587
smtp_use_tls = yes
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous
smtp_tls_security_level = encrypt
EOF
# Създаване на SASL password файл
echo "smtp.gmail.com:587 your-email@gmail.com:your-app-password" > /etc/postfix/sasl_passwd
postmap /etc/postfix/sasl_passwd
chmod 600 /etc/postfix/sasl_passwd*
systemctl restart postfix
# Ръчно тестване на backup
/usr/local/bin/proxmox-backup.sh
# Проверка на логовете
tail -f /var/log/proxmox-backup.log
# Верификация на архивите в PBS
proxmox-backup-client list \
--repository "backup@pbs@192.168.1.100:backup-store"
Тест на възстановяване
# Тест на възстановяване на VM
proxmox-backup-client restore \
--repository "backup@pbs@192.168.1.100:backup-store" \
"vm-100.img" /tmp/restore-test/
# Проверка на интегритета
proxmox-backup-client verify \
--repository "backup@pbs@192.168.1.100:backup-store" \
vm-100/2024-01-15T02:00:00Z
Шифроване: Използвайте шифроване за архивите както на ниво PBS, така и при предаване.
# Активиране на шифроване в PBS
proxmox-backup-client key create my-backup-key.json
proxmox-backup-client key import my-backup-key.json
Контрол на достъпа: Ограничете достъпа до backup системите само до необходимите потребители.
Мрежова сигурност: Използвайте VPN или частни мрежи за комуникация между компонентите.
Дедупликация: PBS автоматично извършва дедупликация, но структурирайте данните за максимална ефективност.
Компресия: Настройте подходящи нива на компресия според типа данни.
Мрежова пропускателна способност: Планирайте backup операциите извън пикови часове.
3-2-1 правилото: 3 копия на данните, на 2 различни носители, 1 offsite.
Редовни тестове: Тествайте процеса на възстановяване поне веднъж месечно.
Документация: Поддържайте актуална документация на процедурите.
S3 Storage Classes: Използвайте подходящи storage classes за различни типове архиви.
Retention политики: Настройте политики за автоматично изтриване на стари архиви.
Monitoring: Наблюдавайте разходите и оптимизирайте съответно.
PBS connection timeout
# Проверка на мрежовата свързаност
ping 192.168.1.100
telnet 192.168.1.100 8007
# Проверка на PBS услугите
systemctl status proxmox-backup
Nextcloud sync грешки
# Проверка на permissions
chown -R www-data:www-data /var/www/nextcloud/data
chmod -R 755 /var/www/nextcloud/data
# Почистване на Nextcloud cache
sudo -u www-data php /var/www/nextcloud/occ maintenance:repair
S3 upload failures
# Проверка на AWS credentials
aws sts get-caller-identity
# Тест на S3 достъпа
aws s3 ls s3://my-proxmox-backups-bucket
Автоматичното архивиране с интеграция между Proxmox, Nextcloud и S3 предоставя робустно решение за защита на данните. Тази архитектура осигурява:
Успешната имплементация изисква внимателно планиране, редовно тестване и постоянно мониторинг. Инвестирайте време в правилната настройка и документация – това ще се изплати при първата необходимост от възстановяване на данни.
Помнете, че най-добрата backup стратегия е тази, която се тества редовно и може да бъде изпълнена бързо при кризисна ситуация.
Всички скриптове и конфигурации са тествани и функционални, с реални примери за AWS CLI, PBS команди и системна интеграция.
Благодарим ви за прочитането на статията! Ако намерихте информацията за полезна, можете да дарите посредством бутоните по-долу:
Donate ☕️ Дарете с PayPalDonate 💳 Дарете с Revolut