mirror of
https://github.com/CodeSeeed/sbackup.git
synced 2026-10-02 18:32:58 +08:00
v2.0.0: 多目标备份 + S3云存储 + 完整性校验 + 9语言国际化
feat: v2.0.0 — 多目标备份 + S3云存储 + 审计日志 + 9语言国际化
This commit is contained in:
1 parent
c8c704a9c6
commit
8f2bcdf8fa
89 files changed
+37677
-1387
No files matched your search
@@ -0,0 +1,665 @@
|
||||
# Sbackup
|
||||
|
||||
[](https://www.python.org/)
|
||||
[](../../LICENSE)
|
||||
[](https://pypi.org/project/sbackup-cli/)
|
||||
[](../../.github/workflows/ci.yml)
|
||||
[]()
|
||||
|
||||
> Лёгкий и эффективный инструмент резервного копирования папок с поддержкой командной строки, позволяющий удобно управлять стратегиями бэкапов.
|
||||
|
||||
[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 г.*
|
||||
Reference in new issue
Block a user