#!/bin/bash # Бэкап VPS Миран (telegram-helper-bot): БД, voice_users и контент из S3 (Miran). # Запускать на хосте Proxmox под root. # Требуется: SSH без пароля с хоста к deploy@185.147.80.190 -p 15722 (ключ в ~/.ssh). # Для S3: установить aws cli и задать креды в /root/.vps-miran-s3.env (см. ниже). # Результат: /mnt/backup/vps/miran/{db,voice_users,s3}. set -e VPS_HOST="185.147.80.190" VPS_USER="deploy" VPS_PORT="15722" VPS_SSH="${VPS_USER}@${VPS_HOST}" SSH_OPTS=(-o ConnectTimeout=15 -o BatchMode=yes -p "$VPS_PORT") RSYNC_SSH="ssh -p $VPS_PORT" REMOTE_DB="/home/prod/bots/telegram-helper-bot/database/tg-bot-database.db" REMOTE_VOICE="/home/prod/bots/telegram-helper-bot/voice_users" BACKUP_ROOT="/mnt/backup/vps/miran" RETENTION_DAYS=14 # S3 (опционально): задать в /root/.vps-miran-s3.env: # S3_ACCESS_KEY=... # S3_SECRET_KEY=... # S3_BUCKET_NAME=telegram-helper-bot S3_ENV="/root/.vps-miran-s3.env" S3_ENDPOINT="https://api.s3.miran.ru" if [ "$(id -u)" -ne 0 ]; then echo "Запускайте под root." exit 1 fi mkdir -p "$BACKUP_ROOT/db" "$BACKUP_ROOT/voice_users" "$BACKUP_ROOT/s3" # ---- 1) Копирование БД с VPS ---- DATE=$(date +%Y%m%d) DB_DEST="$BACKUP_ROOT/db/tg-bot-database-$DATE.db" if rsync -az -e "$RSYNC_SSH" --timeout=60 "${VPS_SSH}:${REMOTE_DB}" "$DB_DEST" 2>/dev/null; then echo "БД скопирована: $DB_DEST ($(du -h "$DB_DEST" | cut -f1))" else echo "Предупреждение: не удалось скопировать БД с VPS (проверьте SSH и путь)." fi find "$BACKUP_ROOT/db" -name 'tg-bot-database-*.db' -mtime +$RETENTION_DAYS -delete # ---- 2) Копирование voice_users с VPS ---- if rsync -az -e "$RSYNC_SSH" --timeout=600 "${VPS_SSH}:${REMOTE_VOICE}/" "$BACKUP_ROOT/voice_users/" 2>/dev/null; then echo "voice_users обновлён: $BACKUP_ROOT/voice_users/" else echo "Предупреждение: не удалось скопировать voice_users с VPS." fi # ---- 3) Выгрузка S3 (Miran) в локальную копию ---- if [ -f "$S3_ENV" ]; then # shellcheck source=/dev/null source "$S3_ENV" if [ -n "$S3_ACCESS_KEY" ] && [ -n "$S3_SECRET_KEY" ] && [ -n "$S3_BUCKET_NAME" ]; then if command -v aws >/dev/null 2>&1; then export AWS_ACCESS_KEY_ID="$S3_ACCESS_KEY" export AWS_SECRET_ACCESS_KEY="$S3_SECRET_KEY" if aws s3 sync "s3://${S3_BUCKET_NAME}" "$BACKUP_ROOT/s3/" --endpoint-url "$S3_ENDPOINT" --no-progress 2>/dev/null; then echo "S3 синхронизирован: $BACKUP_ROOT/s3/" else echo "Предупреждение: aws s3 sync завершился с ошибкой." fi else echo "Предупреждение: aws cli не установлен — S3 не бэкапится. Установите: apt install awscli." fi else echo "Предупреждение: в $S3_ENV заданы не все переменные (S3_ACCESS_KEY, S3_SECRET_KEY, S3_BUCKET_NAME)." fi else echo "Подсказка: для бэкапа S3 создайте $S3_ENV с S3_ACCESS_KEY, S3_SECRET_KEY, S3_BUCKET_NAME." fi