# Бэкап с timestamp
python3 solution/scripts/yd_backup.py create \
--source /opt/myproject \
--destination backups/myproject \
--timestamp
# Результат: ydisk:backups/myproject/backup-20251116-143000/
# Список всех бэкапов
python3 solution/scripts/yd_backup.py list \
--path backups/myproject
# Информация о хранилище
rclone about ydisk:
# Восстановить последний бэкап
python3 solution/scripts/yd_backup.py restore \
--source backups/myproject \
--destination /opt/myproject-restored
# Восстановить конкретный бэкап
python3 solution/scripts/yd_backup.py restore \
--source backups/myproject \
--name backup-20251116-143000 \
--destination /opt/myproject-restored
# Синхронизация директории
python3 solution/scripts/yd_sync.py \
--local /opt/myproject \
--remote backups/myproject-sync
# С исключениями
python3 solution/scripts/yd_sync.py \
--local /opt/myproject \
--remote backups/myproject-sync \
--exclude "*.log" \
--exclude "tmp/*" \
--exclude ".git/*"
# Синхронизация с облака локально
python3 solution/scripts/yd_sync.py \
--remote backups/myproject-sync \
--local /opt/myproject \
--direction download
# Посмотреть что будет изменено
python3 solution/scripts/yd_sync.py \
--local /opt/myproject \
--remote backups/myproject-sync \
--dry-run
# Простая загрузка
python3 solution/scripts/yd_write.py \
--local /path/to/file.txt \
--remote path/on/ydisk/file.txt
# С перезаписью
python3 solution/scripts/yd_write.py \
--local /path/to/file.txt \
--remote path/on/ydisk/file.txt \
--overwrite
# Скачать в файл
python3 solution/scripts/yd_read.py \
--remote path/on/ydisk/file.txt \
--local /path/to/save/file.txt
# Вывести в stdout
python3 solution/scripts/yd_read.py \
--remote path/on/ydisk/file.txt
# Список файлов в директории
python3 solution/scripts/yd_read.py \
--list \
--remote path/on/ydisk/
# Оставить последние 7 бэкапов
python3 solution/scripts/yd_backup.py rotate \
--path backups/myproject \
--keep 7
# С автоподтверждением
python3 solution/scripts/yd_backup.py rotate \
--path backups/myproject \
--keep 7 \
--force
# Удалить конкретный бэкап
rclone purge ydisk:backups/myproject/backup-20251101-120000
# Удалить все бэкапы старше 30 дней
rclone delete ydisk:backups/myproject \
--min-age 30d \
--rmdirs
# Размер конкретной директории
rclone size ydisk:backups/myproject
# Размер всех бэкапов
rclone size ydisk:backups
# Детальная информация
rclone about ydisk: --json
# Сравнение локальной и удалённой версии
rclone check /opt/myproject ydisk:backups/myproject-sync
# Показать различия
rclone check /opt/myproject ydisk:backups/myproject-sync --one-way
# С подробными логами
python3 solution/scripts/yd_backup.py create \
--source /opt/myproject \
--destination backups/myproject \
--timestamp \
--verbose
# Сохранить логи в файл
python3 solution/scripts/yd_backup.py create \
--source /opt/myproject \
--destination backups/myproject \
--timestamp \
--verbose 2>&1 | tee /var/log/ydisk-backup.log
# Открыть crontab
crontab -e
# Ежедневный бэкап (2:00)
0 2 * * * /usr/bin/python3 $WORKSPACE/projects/infra-yandex-disk/solution/scripts/yd_backup.py create --source /opt/myproject --destination backups/myproject --timestamp >> /var/log/ydisk-backup.log 2>&1
# Еженедельная ротация (воскресенье, 3:00)
0 3 * * 0 /usr/bin/python3 $WORKSPACE/projects/infra-yandex-disk/solution/scripts/yd_backup.py rotate --path backups/myproject --keep 7 --force >> /var/log/ydisk-rotate.log 2>&1
# Ежедневная синхронизация медиа (4:00)
0 4 * * * /usr/bin/python3 $WORKSPACE/projects/infra-yandex-disk/solution/scripts/yd_sync.py --local /var/www/html/sites/default/files --remote backups/drupal-media --exclude "css/*" --exclude "js/*" >> /var/log/ydisk-sync.log 2>&1
#!/bin/bash
# /opt/scripts/daily-backup.sh
set -e
PROJECT_NAME="myproject"
SOURCE_DIR="/opt/${PROJECT_NAME}"
BACKUP_BASE="backups/${PROJECT_NAME}"
LOG_FILE="/var/log/ydisk-daily-backup.log"
echo "=== Backup started: $(date) ===" >> "${LOG_FILE}"
# 1. Создать бэкап БД
echo "Creating database backup..." >> "${LOG_FILE}"
sqlite3 "${SOURCE_DIR}/data.db" ".backup /tmp/${PROJECT_NAME}.db"
# 2. Загрузить БД на Яндекс.Диск
echo "Uploading database..." >> "${LOG_FILE}"
python3 $WORKSPACE/projects/infra-yandex-disk/solution/scripts/yd_write.py \
--local "/tmp/${PROJECT_NAME}.db" \
--remote "${BACKUP_BASE}/db/$(date +%Y%m%d).db" \
--overwrite >> "${LOG_FILE}" 2>&1
# 3. Синхронизация файлов
echo "Syncing files..." >> "${LOG_FILE}"
python3 $WORKSPACE/projects/infra-yandex-disk/solution/scripts/yd_sync.py \
--local "${SOURCE_DIR}" \
--remote "${BACKUP_BASE}/files" \
--exclude "*.log" \
--exclude "tmp/*" >> "${LOG_FILE}" 2>&1
# 4. Создать полный бэкап раз в неделю
if [ $(date +%u) -eq 7 ]; then
echo "Creating weekly full backup..." >> "${LOG_FILE}"
python3 $WORKSPACE/projects/infra-yandex-disk/solution/scripts/yd_backup.py create \
--source "${SOURCE_DIR}" \
--destination "${BACKUP_BASE}/weekly" \
--timestamp >> "${LOG_FILE}" 2>&1
fi
# 5. Очистка
rm -f "/tmp/${PROJECT_NAME}.db"
echo "=== Backup completed: $(date) ===" >> "${LOG_FILE}"
Сделать скрипт исполняемым:
chmod +x /opt/scripts/daily-backup.sh
Добавить в cron:
0 2 * * * /opt/scripts/daily-backup.sh
#!/usr/bin/env python3
"""Пример использования YDiskClient в проекте"""
import sys
from pathlib import Path
# Добавить путь к библиотеке
sys.path.insert(0, '$WORKSPACE/projects/infra-yandex-disk/solution/lib')
from ydisk_client import YDiskClient, YDiskClientError
def backup_database(db_path: str, remote_path: str):
"""Создать бэкап базы данных"""
try:
client = YDiskClient()
client.write_file(db_path, remote_path)
print(f"Database backed up: {remote_path}")
except YDiskClientError as e:
print(f"Backup failed: {e}")
raise
def sync_media(local_dir: str, remote_dir: str):
"""Синхронизация медиа файлов"""
try:
client = YDiskClient()
client.sync(
source=local_dir,
destination=remote_dir,
exclude=["*.tmp", ".DS_Store"]
)
print(f"Media synced: {remote_dir}")
except YDiskClientError as e:
print(f"Sync failed: {e}")
raise
if __name__ == "__main__":
backup_database(
"/opt/myproject/data.db",
"backups/myproject/daily.db"
)
sync_media(
"/opt/myproject/media",
"backups/myproject/media"
)
# 1. Проверить доступность Яндекс.Диска
rclone lsd ydisk:backups
# 2. Список доступных бэкапов
python3 solution/scripts/yd_backup.py list \
--path backups/myproject
# 3. Восстановить последний бэкап
python3 solution/scripts/yd_backup.py restore \
--source backups/myproject \
--destination /opt/myproject
# 4. Проверить целостность
ls -lah /opt/myproject
# 1. Создать бэкап текущего состояния
python3 solution/scripts/yd_backup.py create \
--source /opt/myproject \
--destination backups/myproject \
--name backup-before-rollback
# 2. Восстановить старую версию
python3 solution/scripts/yd_backup.py restore \
--source backups/myproject \
--name backup-20251110-120000 \
--destination /opt/myproject
# 3. Перезапустить сервисы
sudo systemctl restart myproject
# Cron задача для проверки целостности (ежедневно)
0 5 * * * rclone check /opt/myproject ydisk:backups/myproject-sync --one-way >> /var/log/ydisk-check.log 2>&1
# Проверка с детальным выводом
rclone check /opt/myproject ydisk:backups/myproject-sync \
--one-way \
--combined - 2>&1 | tee /tmp/check-result.txt
# Проверка только размеров
rclone check /opt/myproject ydisk:backups/myproject-sync \
--size-only
# Использовать параллельную загрузку
rclone copy /opt/myproject ydisk:backups/myproject \
--transfers 8 \
--checkers 16
# Проверить использование
rclone about ydisk:
# Найти большие файлы
rclone size ydisk:backups --by-size
# Удалить старые бэкапы
python3 solution/scripts/yd_backup.py rotate \
--path backups/myproject \
--keep 3 \
--force
# Rclone автоматически продолжит прерванную загрузку
# при повторном запуске той же команды
python3 solution/scripts/yd_sync.py \
--local /opt/myproject \
--remote backups/myproject-sync
#!/usr/bin/env python3
"""Мониторинг состояния бэкапов"""
import sys
sys.path.insert(0, '$WORKSPACE/projects/infra-yandex-disk/solution/lib')
from ydisk_client import YDiskClient
def check_backup_status():
client = YDiskClient()
# Проверить место
info = client.get_info()
used_percent = (info['used'] / info['total']) * 100
if used_percent > 90:
print(f"WARNING: Disk usage at {used_percent:.1f}%")
# Проверить последний бэкап
files = client.list_files("backups/myproject")
if not files:
print("ERROR: No backups found!")
return False
latest = max(files, key=lambda x: x.get('ModTime', ''))
print(f"Latest backup: {latest['Path']} at {latest['ModTime']}")
return True
if __name__ == "__main__":
sys.exit(0 if check_backup_status() else 1)
Последнее обновление: 2025-11-16