Files

666 lines
43 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Sbackup
[![Python](https://img.shields.io/badge/Python-3.10+-3776AB?logo=python&logoColor=white)](https://www.python.org/)
[![License](https://img.shields.io/badge/License-GPL--3.0-green)](../../LICENSE)
[![PyPI](https://img.shields.io/pypi/v/sbackup-cli?color=blue)](https://pypi.org/project/sbackup-cli/)
[![Tests](https://img.shields.io/badge/tests-940%20passed-brightgreen)](../../.github/workflows/ci.yml)
[![Platform](https://img.shields.io/badge/platform-Windows%20%7C%20macOS%20%7C%20Linux-lightgrey)]()
> Лёгкий и эффективный инструмент резервного копирования папок с поддержкой командной строки, позволяющий удобно управлять стратегиями бэкапов.
[English](../../README.md) | [Deutsch](README_de.md) | [Espanol](README_es.md) | [Francais](README_fr.md) | [Portugues](README_pt.md) | [Pycckuu](README_ru.md) | [日本語](README_ja.md) | [한국어](README_ko.md) | [中文](README_zh.md)
- [Введение](#введение)
- [Возможности](#возможности)
- [Быстрый старт](#быстрый-старт)
- [Установка](#установка)
- [Использование](#использование)
- [Файл конфигурации](#файл-конфигурации)
- [Пример конфигурации](#пример-конфигурации)
- [Удалённое резервное копирование через SFTP](#удалённое-резервное-копирование-через-sftp)
- [Удалённое резервное копирование через WebDAV](#удалённое-резервное-копирование-через-webdav)
- [Принцип работы](#принцип-работы)
- [Руководство для разработчиков](#руководство-для-разработчиков)
- [Запуск тестов](#запуск-тестов)
- [Структура кода](#структура-кода)
- [Часто задаваемые вопросы](#часто-задаваемые-вопросы)
- [Руководство по участию в разработке](#руководство-по-участию-в-разработке)
- [Лицензия](#лицензия)
- [Автор](#автор)
---
## Введение
Sbackup -- это лёгкий инструмент резервного копирования папок, позволяющий добавлять, удалять и просматривать стратегии бэкапов через командную строку. Он определяет необходимость резервного копирования на основе времени последнего изменения папки, гарантируя, что ваши данные всегда остаются актуальными.
## Возможности
- **Инкрементальное резервное копирование**: копируются только изменённые папки, что экономит время и дисковое пространство
- **Поддержка множества форматов**: семь форматов упаковки -- ZIP, tar, tar.gz, tar.bz2, tar.xz, tar.zst, 7z; можно задавать как глобально, так и для каждого элемента отдельно
- **Удалённое резервное копирование через SFTP**: на базе библиотеки paramiko, поддержка аутентификации по паролю/SSH-ключу, автоматическое определение ключа по умолчанию
- **Удалённое резервное копирование через WebDAV**: на базе стандартной библиотеки urllib, без дополнительных зависимостей; поддержка Jianguoyun/NextCloud/Synology
- **Облачное хранилище S3**: на базе библиотеки minio, совместимо со всеми S3-хранилищами (AWS/MinIO/Aliyun OSS и др.)
- **Параллельное копирование в несколько направлений**: одновременное резервное копирование на локальный диск и несколько удалённых хранилищ
- **Восстановление из бэкапа**: распаковка и восстановление в указанную директорию с возможностью выборочного восстановления
- **Очистка старых бэкапов**: автоматическое удаление с поддержкой стратегий по количеству/времени/ежедневному хранению
- **Шифрование**: парольное шифрование для формата 7z + шифрование PBKDF2 для всех форматов
- **Планирование**: автоматическое выполнение по расписанию, поддержка мониторинга файловой системы в реальном времени (watchdog)
- **История резервных копий**: запись времени, размера и контрольной суммы SHA256 каждого бэкапа для удобного отслеживания
- **Журнал аудита**: запись всех событий резервного копирования и восстановления
- **Pre/Post Hook**: выполнение пользовательских команд до и после резервного копирования
- **Профили конфигурации**: сохранение, переключение, импорт и экспорт нескольких конфигураций
- **Поиск по архивам**: поиск совпадающих имён файлов в нескольких бэкапах
- **Целостность данных**: генерация и проверка контрольных сумм SHA256, корректирующие коды Рида-Соломона
- **Валидация конфигурации**: автоматическая проверка параметров конфигурации, обнаружение несанкционированных изменений
- **Очередь задач**: управление очередью задач резервного копирования с возможностью добавления, выполнения и отмены
- **Бенчмарк сжатия**: сравнение производительности различных форматов и уровней сжатия
- **Оценка дискового пространства**: предварительный расчёт размера бэкапа по типам файлов с проверкой места на диске
- **Интернационализация**: поддержка девяти языков -- китайский, английский, французский, испанский, русский, немецкий, японский, португальский, корейский
- **Автодополнение в оболочке**: bash/zsh/fish/powershell
- **Лёгкость и эффективность**: малый размер, быстрый запуск, низкое потребление ресурсов
- **Кроссплатформенность**: поддержка Windows, macOS и Linux
## Быстрый старт
### Установка
#### Установка через pip
```bash
pip install sbackup-cli
```
После установки доступна команда `sbackup` (имя пакета на PyPI -- `sbackup-cli`, имя CLI-команды -- `sbackup`).
#### Установка из исходного кода
```bash
git clone https://github.com/xiatianxuan/sbackup.git
cd sbackup
uv sync
```
### Использование
#### Основной синтаксис
```bash
uv run python main.py <command> [options]
```
#### Доступные команды
| Команда | Описание |
|---------|----------|
| `add` | Добавить стратегию резервного копирования |
| `rm` / `remove` | Удалить стратегию резервного копирования |
| `edit` | Редактировать существующую стратегию |
| `all` | Показать все стратегии резервного копирования |
| `save` | Выполнить резервное копирование |
| `watch` | Запустить резервное копирование по расписанию |
| `restore` | Восстановить из файла резервной копии |
| `info` | Показать подробную информацию о файле резервной копии |
| `diff` | Сравнить исходную директорию с резервной копией |
| `verify` | Проверить целостность файла резервной копии |
| `search` | Поиск файлов в резервной копии |
| `xsearch` | Поиск по нескольким архивам резервных копий |
| `versions` | Показать историю версий резервных копий |
| `sftp` | Управление удалённым резервным копированием через SFTP |
| `webdav` | Управление удалённым резервным копированием через WebDAV |
| `remote` | Управление удалёнными файлами (list/rm) |
| `task` | Управление очередью задач резервного копирования |
| `audit` | Запрос журнала аудита |
| `hooks` | Ручной запуск Pre/Post Hook |
| `profile` | Управление профилями конфигурации |
| `rotate` | Ротация резервных копий |
| `clean` | Очистка старых резервных копий |
| `diskcheck` | Оценка дискового пространства |
| `benchmark` | Бенчмарк форматов сжатия |
| `integrity` | Проверка целостности директории резервных копий |
| `dry-run` | Предварительный просмотр выбора файлов |
| `export` / `import` | Экспорт/импорт стратегий резервного копирования |
| `ignore` | Генерация файла .sbackupignore |
| `schedule` | Экспорт конфигурации планировщика |
| `webhook` | Настройка предустановок Webhook |
| `config` | Шифрование/проверка конфигурации |
| `report` | Генерация отчёта о резервном копировании |
| `completion` | Генерация скрипта автодополнения для оболочки |
| `wizard` | Интерактивный мастер настройки |
| `status` | Панель состояния резервного копирования |
| `version` | Показать информацию о версии |
| `help` | Показать справку |
#### Глобальные параметры
| Параметр | Описание |
|----------|----------|
| `--lang zh_CN` / `en_US` / `fr_FR` / `es_ES` / `ru_RU` / `de_DE` / `ja_JP` / `pt_BR` / `ko_KR` | Установить язык интерфейса (сохраняется в config.json) |
| `--format zip` / `tar` / `tar.gz` / `tar.bz2` / `tar.xz` / `tar.zst` / `7z` | Установить формат упаковки (сохраняется в config.json) |
| `--debug` | Включить отладочное логирование |
#### Добавление стратегии резервного копирования
```bash
uv run python main.py add <source> <dest> [-i ignore_patterns]
```
Параметры:
- **source**: путь к исходной папке для резервного копирования
- **dest**: путь к директории для хранения резервных копий
- **-i, --ignore**: имена файлов или папок, которые следует игнорировать, через запятую (по умолчанию: `.git,__pycache__`)
- **--format**: формат упаковки на уровне элемента (применяется только к данной стратегии; если не указан, используется глобальный по умолчанию): `zip` / `tar` / `tar.gz` / `tar.bz2` / `tar.xz` / `tar.zst` / `7z`
Примеры:
```bash
# Добавить стратегию с форматом по умолчанию
uv run python main.py add F:/my_folder F:/backup -i node_modules,.git
# Указать формат tar.gz для данной стратегии (каждый бэкап этой папки будет в формате tar.gz)
uv run python main.py add F:/my_folder F:/backup --format tar.gz
# Указать формат 7z (только для этой папки)
uv run python main.py add F:/my_folder F:/backup --format 7z
```
#### Удаление стратегии резервного копирования
```bash
uv run python main.py rm <path>
```
Параметры:
- **path**: путь к исходной папке, стратегию которой нужно удалить
Пример:
```bash
uv run python main.py rm F:/my_folder
```
#### Просмотр всех стратегий резервного копирования
```bash
uv run python main.py all
```
Отображает все текущие настроенные стратегии резервного копирования.
#### Выполнение резервного копирования
```bash
# С использованием формата по умолчанию (ZIP)
uv run python main.py save
# С использованием формата tar.gz
uv run python main.py --format tar.gz save
# Сохранить последние 5 резервных копий, автоматически удалить старые
uv run python main.py save --keep 5
# Использовать формат 7z с шифрованием
uv run python main.py --format 7z save --password mysecret
# Английский интерфейс + формат tar.xz
uv run python main.py --lang en_US --format tar.xz save
```
**Параметры команды save:**
| Параметр | Значение по умолчанию | Описание |
|----------|----------------------|----------|
| `--keep N` | `0` | Сохранять N последних резервных копий; 0 -- не удалять старые |
| `--password PASSWORD` | `""` | Пароль шифрования (только для формата 7z) |
| `--sftp` | `false` | Загрузить на SFTP-сервер после завершения резервного копирования |
| `--webdav` | `false` | Загрузить на WebDAV-сервер после завершения резервного копирования |
Автоматическое резервное копирование изменённых папок в соответствии с настроенными стратегиями.
#### Планирование резервного копирования
```bash
# Выполнять резервное копирование каждые 60 минут
uv run python main.py watch --interval 60
# Каждые 2 часа, сохранять последние 10 файлов
uv run python main.py watch --interval 120 --keep 10
# Планирование + шифрование 7z
uv run python main.py --format 7z watch --interval 60 --password mysecret
```
**Параметры команды watch:**
| Параметр | Значение по умолчанию | Описание |
|----------|----------------------|----------|
| `--interval MINUTES` | `60` | Интервал резервного копирования (в минутах) |
| `--keep N` | `0` | Сохранять N последних резервных копий |
| `--password PASSWORD` | `""` | Пароль шифрования (только для формата 7z) |
| `--sftp` | `false` | Загружать на SFTP-сервер после каждого бэкапа |
| `--webdav` | `false` | Загружать на WebDAV-сервер после каждого бэкапа |
Нажмите `Ctrl+C`, чтобы остановить планирование.
#### Восстановление из резервной копии
```bash
uv run python main.py restore <backup_file> <target_dir>
```
Параметры:
- **backup_file**: путь к файлу резервной копии (поддерживаются форматы .zip / .tar / .tar.gz / .tar.bz2 / .tar.xz / .tar.zst / .7z)
- **target_dir**: целевая директория для восстановления
Примеры:
```bash
uv run python main.py restore F:/backup/my_folder.tar.gz F:/restored
uv run python main.py restore F:/backup/my_folder.7z F:/restored
uv run python main.py restore F:/backup/my_folder.tar.zst F:/restored
```
#### Удалённое резервное копирование через SFTP
```bash
# ============ Быстрый старт (рекомендуется) ============
# 1. Настроить SFTP (автоматическое определение SSH-ключа, без ручного указания)
sbackup sftp config --host 192.168.1.100 --user admin --remote-path /backups
# 2. Проверить соединение
sbackup sftp test
# 3. Выполнить резервное копирование и загрузить
sbackup save --sftp
# ============ Способы аутентификации ============
# Способ 1: Автоматическое определение ключа (рекомендуется)
# Система автоматически проверяет ~/.ssh/id_ed25519 -> id_rsa -> id_ecdsa
sbackup sftp config --host 192.168.1.100 --user admin
# Способ 2: Аутентификация по паролю
sbackup sftp config --host 192.168.1.100 --user admin --password secret
# Способ 3: Указание конкретного ключа
sbackup sftp config --host 192.168.1.100 --user admin --key-file ~/.ssh/id_rsa
# Способ 4: Ключ + парольная фраза (интерактивный ввод)
sbackup sftp config --host 192.168.1.100 --user admin --key-file ~/.ssh/id_rsa
# Способ 5: Ключ + парольная фраза (через командную строку)
sbackup sftp config --host 192.168.1.100 --user admin --key-file ~/.ssh/id_rsa --key-passphrase mykeypass
# ============ Сценарии использования ============
# Сценарий 1: Разовое резервное копирование с загрузкой
sbackup save --sftp
# Сценарий 2: Планирование с автоматической загрузкой (каждые 60 минут)
sbackup watch --interval 60 --sftp
# Сценарий 3: Указание формата + загрузка
sbackup --format tar.gz save --sftp
# Сценарий 4: Шифрованное резервное копирование + загрузка
sbackup --format 7z save --password mysecret --sftp
# Сценарий 5: Сохранение последних 5 копий + загрузка
sbackup save --keep 5 --sftp
# ============ Расширенное использование ============
# Интерактивная настройка (пошаговый ввод всех параметров)
sbackup sftp config
# Неинтерактивная настройка (все параметры через командную строку)
sbackup sftp config --host 192.168.1.100 --port 22 --user admin --password secret --remote-path /backups
# Проверка соединения с подробным логом
sbackup --debug sftp test
```
**Подкоманды sftp:**
| Подкоманда | Описание | Пример |
|------------|----------|--------|
| `sftp config` | Настройка параметров подключения SFTP (host/port/user/password/key_file/key_passphrase/remote_path) | `sbackup sftp config --host 192.168.1.100 --user admin` |
| `sftp test` | Проверка доступности SFTP-соединения | `sbackup sftp test` |
**Способы аутентификации:**
| Способ | Параметры | Описание | Пример |
|--------|-----------|----------|--------|
| **Автоопределение** | Без указания параметров аутентификации | Автоматическая проверка `~/.ssh/id_ed25519` -> `id_rsa` -> `id_ecdsa` (рекомендуется) | `sbackup sftp config --host ... --user ...` |
| Пароль | `--password` | Вход по паролю | `sbackup sftp config --host ... --user ... --password secret` |
| Приватный ключ | `--key-file` | Вход с использованием указанного SSH-ключа | `sbackup sftp config --host ... --user ... --key-file ~/.ssh/id_rsa` |
| Ключ + фраза | `--key-file` + `--key-passphrase` | Для ключа с парольной фразой | `sbackup sftp config --host ... --user ... --key-file ~/.ssh/id_rsa --key-passphrase mypass` |
Поддерживаемые форматы ключей: RSA, Ed25519, ECDSA.
**Кроссплатформенная поддержка путей:**
| Платформа | Пример пути к ключу | Описание |
|-----------|---------------------|----------|
| Linux/macOS | `~/.ssh/id_rsa` | Автоматически раскрывается в `/home/user/.ssh/id_rsa` |
| Windows | `~/.ssh/id_rsa` | Автоматически раскрывается в `C:\Users\username\.ssh\id_rsa` |
| Все платформы | Абсолютный путь | Используется полный путь напрямую |
Конфигурация SFTP сохраняется в поле `sftp` файла `config.json`, параметры можно задать через командную строку или интерактивно.
#### Просмотр информации о версии
```bash
sbackup version
```
## Файл конфигурации
Sbackup поддерживает пользовательскую настройку через файл `config.json`. Файл конфигурации должен находиться в корневой директории проекта.
### Описание параметров конфигурации
```json
{
"compression_format": "ZIP",
"compression": {
"algorithm": "ZIP_DEFLATED",
"level": 6
},
"skip_patterns": [".git", "__pycache__"],
"data_file": "sbackup.json",
"lang": "zh_CN",
"password": "",
"sftp": {
"host": "",
"port": 22,
"user": "",
"password": "",
"key_file": "",
"key_passphrase": "",
"remote_path": "/",
"enabled": false
}
}
```
| Параметр | Тип | Значение по умолчанию | Описание |
|----------|-----|----------------------|----------|
| `compression_format` | string | `"ZIP"` | Формат упаковки; допустимые значения: `ZIP`, `TAR`, `TAR_GZ`, `TAR_BZ2`, `TAR_XZ`, `TAR_ZST`, `7Z` |
| `compression.algorithm` | string | `"ZIP_DEFLATED"` | Алгоритм сжатия ZIP; допустимые значения: `ZIP_DEFLATED`, `ZIP_STORED`, `ZIP_BZIP2`, `ZIP_LZMA` |
| `compression.level` | int | `6` | Уровень сжатия, диапазон 0-9 (0 -- без сжатия, 9 -- максимальное сжатие) |
| `skip_patterns` | list | `[".git", "__pycache__"]` | Шаблоны игнорируемых файлов или папок (поддержка fnmatch-подстановок и сопоставления путей) |
| `data_file` | string | Путь по умолчанию для платформы | Путь к файлу данных стратегий резервного копирования |
| `lang` | string | `"zh_CN"` | Язык интерфейса; допустимые значения: `zh_CN`, `en_US`, `fr_FR`, `es_ES`, `ru_RU`, `de_DE`, `ja_JP`, `pt_BR`, `ko_KR` |
| `password` | string | `""` | Пароль шифрования для формата 7z |
| `sftp.host` | string | `""` | Адрес SFTP-сервера |
| `sftp.port` | int | `22` | Порт SFTP |
| `sftp.user` | string | `""` | Имя пользователя SFTP |
| `sftp.password` | string | `""` | Пароль SFTP (используется при аутентификации по паролю) |
| `sftp.key_file` | string | `""` | Путь к файлу приватного SSH-ключа (используется при аутентификации по ключу, рекомендуется) |
| `sftp.key_passphrase` | string | `""` | Парольная фраза ключа (при наличии) |
| `sftp.remote_path` | string | `"/"` | Путь к удалённой директории назначения |
| `sftp.enabled` | bool | `false` | Включить или отключить SFTP |
### Пример конфигурации
Резервное копирование с высокой степенью сжатия в формате tar.bz2:
```json
{
"compression_format": "TAR_BZ2",
"compression_level": 9,
"skip_patterns": [".git", "__pycache__", "node_modules", "*.log"],
"data_file": "backup_strategies.json",
"lang": "zh_CN"
}
```
### Сравнение форматов упаковки
| Формат | Расширение | Степень сжатия | Скорость | Зависимости | Применение |
|--------|------------|----------------|----------|-------------|------------|
| ZIP | .zip | Средняя | Высокая | Стандартная библиотека | Универсальный, лучшая совместимость с Windows |
| tar | .tar | Нет | Очень высокая | Стандартная библиотека | Чистая архивация, для внешнего сжатия |
| tar.gz | .tar.gz | Средняя | Высокая | Стандартная библиотека | Универсальный для Linux/macOS |
| tar.bz2 | .tar.bz2 | Высокая | Средняя | Стандартная библиотека | Архивация с высокой степенью сжатия |
| tar.xz | .tar.xz | Максимальная | Низкая | Стандартная библиотека | Долгосрочное архивирование, экономия места |
| tar.zst | .tar.zst | Средне-высокая | Очень высокая | zstandard | Современный формат, баланс скорости и сжатия |
| 7z | .7z | Очень высокая | Низкая | py7zr | Максимальное сжатие, поддержка шифрования |
#### Удалённое резервное копирование через WebDAV
WebDAV -- это файловый протокол на основе HTTP, поддерживаемый такими сервисами, как Jianguoyun, NextCloud, Synology и другими. Использует стандартную библиотеку Python `urllib`, **без дополнительных зависимостей**.
```bash
# ============ Быстрый старт ============
# 1. Настроить WebDAV
sbackup webdav config --url https://dav.jianguoyun.com/dav/ --user user@example.com --password secret
# 2. Проверить соединение
sbackup webdav test
# 3. Выполнить резервное копирование и загрузить
sbackup save --webdav
# ============ Сценарии использования ============
# Сценарий 1: Разовое резервное копирование с загрузкой
sbackup save --webdav
# Сценарий 2: Планирование с автоматической загрузкой (каждые 60 минут)
sbackup watch --interval 60 --webdav
# Сценарий 3: Указание удалённой поддиректории
sbackup webdav config --url https://dav.jianguoyun.com/dav/ --user user@example.com --remote-path /backups/sbackup
# Сценарий 4: Одновременная загрузка на SFTP и WebDAV
sbackup save --sftp --webdav
# ============ Типичные адреса WebDAV-сервисов ============
# Jianguoyun: https://dav.jianguoyun.com/dav/
# NextCloud: https://your-server/remote.php/dav/files/username/
# Synology: https://your-synology:5006/webdav/
```
**Подкоманды webdav:**
| Подкоманда | Описание | Пример |
|------------|----------|--------|
| `webdav config` | Настройка параметров подключения WebDAV (url/user/password/remote_path) | `sbackup webdav config --url ... --user ...` |
| `webdav test` | Проверка доступности WebDAV-соединения | `sbackup webdav test` |
| Параметр | Значение по умолчанию | Описание |
|----------|----------------------|----------|
| `--url URL` | `""` | Адрес WebDAV-сервера (например, `https://dav.jianguoyun.com/dav/`) |
| `--user USER` | `""` | Имя пользователя WebDAV (обычно адрес электронной почты) |
| `--password PASS` | `""` | Пароль WebDAV (для Jianguoyun необходимо сгенерировать пароль приложения в настройках) |
| `--remote-path PATH` | `/` | Путь к удалённой директории назначения |
## Принцип работы
Sbackup реализует резервное копирование следующим образом:
1. **Хранение стратегий**: стратегии резервного копирования хранятся в файле JSON и содержат пути к папкам, время последнего изменения, пути назначения, шаблоны игнорирования и формат упаковки на уровне элемента.
2. **Инкрементальное копирование**: путём сравнения времени последнего изменения папки копируются только изменённые папки.
3. **Множественные форматы сжатия**: используются встроенные модули Python `zipfile` и `tarfile`, а также сторонние библиотеки `zstandard` и `py7zr` для поддержки семи форматов упаковки.
4. **Формат на уровне элемента**: каждая стратегия может иметь собственный формат упаковки (`add --format`), который имеет приоритет над глобальным параметром `--format`; при отсутствии используется значение по умолчанию.
5. **Очистка бэкапов**: после успешного резервного копирования автоматически сканируется целевая директория, файлы сортируются по времени изменения и удаляются старые копии, превышающие лимит хранения.
6. **Шифрование**: формат 7z поддерживает шифрование LZMA2 через параметр `--password` или настройку в `config.json`.
7. **Планирование**: команда `watch` выполняет резервное копирование в цикле с указанным интервалом, для безопасного выхода используется `Ctrl+C`.
8. **История бэкапов**: после каждого резервного копирования записываются временная метка, размер файла и количество файлов; хранятся последние 100 записей.
9. **Удалённое копирование через SFTP**: на базе библиотеки paramiko реализован SFTP-клиент с поддержкой проверки соединения, автоматического создания удалённых директорий и загрузки файлов с индикатором прогресса.
### Формат файла данных
```json
{
"/path/to/source/folder": [
1719235200.0,
"/path/to/target/folder",
[".git", "__pycache__"],
""
],
"/path/to/another/folder": [
1719235200.0,
"/path/to/another/target",
[".git"],
"TAR_GZ"
],
"_history": [
{
"time": "2026-05-01T12:00:00",
"source": "/path/to/source/folder",
"size_mb": 12.5,
"files_count": 150
}
]
}
```
Каждая запись стратегии резервного копирования представляет собой список из 4 элементов: `[mtime, target, skip_patterns, compression_format]`
| Поле | Описание |
|------|----------|
| `mtime` | Время последнего изменения исходной папки (для определения необходимости инкрементального копирования) |
| `target` | Путь к директории для хранения резервных копий |
| `skip_patterns` | Список шаблонов игнорируемых файлов/папок |
| `compression_format` | Формат упаковки на уровне элемента (пустая строка означает использование глобального значения по умолчанию) |
## Руководство для разработчиков
### Запуск тестов
```bash
uv run coverage run -m unittest discover -s tests -t . && uv run coverage report -m
```
### Структура кода
```
sbackup/
├── main.py # Точка входа программы
├── sbackup/
│ ├── __init__.py # Экспорт основных функций
│ ├── __main__.py # Точка входа python -m sbackup
│ ├── cli.py # Разбор аргументов CLI и маршрутизация команд (30+ команд)
│ ├── config.py # Загрузка конфигурации, шифрование, настройки Webhook/SMTP
│ ├── auto_save.py # Основной движок BackupManager
│ ├── compression.py # Движок сжатия/распаковки для 7 форматов
│ ├── i18n.py # Интернационализация (9 языков)
│ ├── sftp.py # SFTP-клиент для удалённого копирования (paramiko)
│ ├── webdav.py # WebDAV-клиент для удалённого копирования (без зависимостей)
│ ├── cloud_storage.py # S3-клиент для облачного хранилища (minio)
│ ├── multi_dest.py # Параллельное копирование в несколько направлений
│ ├── handlers.py # Обработчики команд SFTP/WebDAV/Remote/Schedule
│ ├── hooks.py # Выполнение Pre/Post Hook
│ ├── audit.py # Система журналирования аудита
│ ├── profile.py # Управление профилями конфигурации
│ ├── selective.py # Выборочное восстановление
│ ├── cross_search.py | Поиск по архивам
│ ├── integrity.py # Контрольные суммы SHA256
│ ├── rotation.py # Стратегии ротации резервных копий
│ ├── dryrun.py # Предварительный просмотр (dry-run)
│ ├── diskcheck.py # Оценка дискового пространства
│ ├── task_queue.py # Система очереди задач
│ ├── schema.py # Валидатор конфигурации
│ ├── benchmark.py # Бенчмарк сжатия
│ ├── chunked_backup.py# Блочное инкрементальное копирование
│ ├── dedup.py # Дедупликация файлов по SHA256
│ ├── export.py # Экспорт метаданных (CSV/JSON)
│ ├── monitor.py # Мониторинг файловой системы (watchdog)
│ ├── lock.py # Кроссплатформенная блокировка процессов
│ ├── retry.py | Повторные попытки с экспоненциальной задержкой
│ ├── ratelimiter.py | Ограничитель скорости (алгоритм токен-ведра)
│ ├── keychain.py | Интеграция с системной связкой ключей
│ ├── parity.py | Корректирующие коды Рида-Соломона
│ ├── completion.py | Автодополнение для оболочки
│ ├── wizard.py | Интерактивный мастер настройки
│ └── locales/ # Файлы перевода на 9 языков
└── tests/
└── sbackup/
└── test_*.py # 30 тестовых файлов, покрывающих все модули
```
### Добавление нового функционала
1. Создайте новый файл модуля в директории `sbackup/`
2. Импортируйте функции нового модуля в `sbackup/__init__.py`
3. Добавьте обработку новой команды в функцию `run()`
4. Добавьте соответствующий тестовый файл в директорию `tests/`
## Часто задаваемые вопросы
### В: Что делать, если файл стратегий резервного копирования был случайно удалён?
О: Стратегии хранятся в файле данных. Если файл был удалён, просто заново добавьте стратегии с помощью команды `add`.
### В: Как изменить ранее добавленную стратегию?
О: Используйте команду `sbackup edit`: `sbackup edit <source> --dest <new_dest> --ignore <patterns> --format <fmt>`.
### В: Поддерживается ли удалённое резервное копирование?
О: Да! Предоставляются три способа удалённого копирования:
- **SFTP**: настройка через `sbackup sftp config`, загрузка через `sbackup save --sftp`
- **WebDAV**: настройка через `sbackup webdav config`, загрузка через `sbackup save --webdav` (поддержка Jianguoyun/NextCloud/Synology)
- **Облачное хранилище S3**: настройка поля `cloud` в `config.json`, загрузка через `sbackup save --cloud`
- Можно включить несколько способов одновременно: `sbackup save --sftp --webdav --cloud`
### В: В чём разница между tar.gz и ZIP?
О: tar.gz чаще используется в Linux/macOS и обеспечивает немного лучшее сжатие; ZIP более универсален на Windows и обладает лучшей совместимостью. tar.bz2 и tar.xz обеспечивают более высокую степень сжатия, но работают медленнее. tar.zst -- современный алгоритм с высокой скоростью и хорошим сжатием. 7z обеспечивает максимальное сжатие и поддерживает шифрование.
### В: Как зашифровать резервную копию?
О: Используйте формат 7z с паролем: `uv run python main.py --format 7z save --password yourpassword`. Пароль также можно указать в поле `password` файла `config.json`.
### В: Как автоматически очищать старые резервные копии?
О: Используйте параметр `--keep`: `uv run python main.py save --keep 5` сохранит только 5 последних резервных копий. При планировании тоже поддерживается: `uv run python main.py watch --interval 60 --keep 10`.
### В: Как настроить автоматическое резервное копирование по расписанию?
О: Используйте команду `watch`: `uv run python main.py watch --interval 60` -- резервное копирование каждые 60 минут. Нажмите `Ctrl+C` для остановки.
### В: Безопасно ли хранение паролей?
О: Пароли SFTP и шифрования 7z в файле `config.json` хранятся в **открытом виде**. Убедитесь, что доступ к файлу `config.json` имеют только доверенные пользователи (например, `chmod 600 config.json`). Не добавляйте файл `config.json`, содержащий пароли, в систему контроля версий.
## Руководство по участию в разработке
Приветствуются Issues и Pull Requests!
1. Сделайте форк репозитория
2. Создайте ветку для новой функции (`git checkout -b feature/AmazingFeature`)
3. Внесите изменения (`git commit -m 'Add some AmazingFeature'`)
4. Отправьте в ветку (`git push origin feature/AmazingFeature`)
5. Создайте Pull Request
### Стиль кодирования
Проект следует стандартам PEP 8 и Google Python Style Guide. Убедитесь, что ваш код:
- Использует аннотации типов
- Следует Google-стилю docstrings
- Проходит все модульные тесты
## Лицензия
Проект распространяется под лицензией GNU GPL v3.0. Подробности см. в файле [LICENSE](../../LICENSE).
## Автор
**xiatianxuan** (CodeSeed)
- [Gitee](https://gitee.com/xiatianxuan)
- [Личная страница](https://xnors-codeseed.pages.dev/)
## Благодарности
- [Xnors Studio](https://xnors.github.io/)
## Связь с нами
По вопросам и предложениям обращайтесь по электронной почте: xiatianxuan2025@163.com
---
*Последнее обновление: 19 июня 2026 г.*