infra/@yandex-disk.storage/management/OPERATIONS.md

Операционные процедуры Яндекс.Диск

Ежедневные операции

Создание бэкапа

# Бэкап с 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

Dry run (предварительный просмотр)

# Посмотреть что будет изменено
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

Автоматизация

Cron задачи

# Открыть 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

Bash скрипт для комплексного бэкапа

#!/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

Использование в Python проектах

Пример интеграции

#!/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: Потеря данных на сервере

# 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

Сценарий 2: Откат к предыдущей версии

# 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

Мониторинг через Python

#!/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