Skip to content

ru ARCHITECTURE

VD $ VD171 @ Priv8 edited this page Nov 4, 2026 · 1 revision

Languages: English | العربية | Čeština | Deutsch | Español | فارسی | Français | हिन्दी | Bahasa Indonesia | Italiano | 日本語 | 한국어 | Nederlands | Polski | Português | Русский | Svenska | ไทย | Türkçe | Tiếng Việt | 中文


Архитектура

VDBackup - это модуль WebUI с правами root. У него три слоя: WebUI (то, что вы видите), shell-бэкенд (то, что выполняет работу, от имени root) и встроенные бинарные файлы (архиваторы и транспорты). Всё работает уже от root, поэтому нет запроса разрешений и нет приложения-компаньона для основных функций.

   ┌──────────────────────────────────────────────────────────┐
   │  WebUI  (module/webroot, vanilla JS)                      │
   │    index.html · scripts.js · i18n.js · styles.css         │
   │    lang/en.js + 21 languages · config.json (CSP, no net)  │
   └───────────────┬──────────────────────────────────────────┘
                   │  ksu.exec("sh scripts/helper.sh <verb> <b64json>")
                   ▼
   ┌──────────────────────────────────────────────────────────┐
   │  scripts/helper.sh  (dispatcher, returns JSON)            │
   │    list-apps · config · dests · backup/restore/import ... │
   │    long ops -> setsid nohup scripts/worker.sh  (detached) │
   └───────────────┬───────────────────────────────┬──────────┘
                   │                               │ progress-<opid>.json (poll)
                   ▼                               ▼
   ┌────────────────────────────────────┐   ┌──────────────────────────┐
   │  scripts/worker.sh (root, detached)│   │  framework helper (opt.) │
   │   force-stop · tar|zstd|age        │   │  app_process + dex       │
   │   pm install · chown/chcon         │   │  perms/appops/ssaid/...  │
   │   transfer · notify                │   │  (dex primary, shell fb) │
   └───────────────┬────────────────────┘   └──────────────────────────┘
                   ▼
   ┌──────────────────────────────────────────────────────────┐
   │  bin/<abi>/  tar · zstd · lz4 · rclone · rsync · ssh · restic │
   └──────────────────────────────────────────────────────────┘
                   ▼
   Destinations: local · SFTP/SCP · SMB · WebDAV · FTP · S3 · 70+ (rclone)
                 rsync · restic repos · Google Drive (opt-in companion)

Ключевые моменты

  • Уже root. Процесс модуля работает от root, поэтому движок - это обычный shell. ~85 % работы - это чистый shell (tar/zstd/age/pm/am/chown/chcon/rclone/...).
  • Отсоединённое выполнение. Резервное копирование/восстановление запускаются через setsid nohup, как независимый процесс root. Закрытие WebUI не прерывает их; интерфейс повторно подключается, читая logs/progress-<opid>.json.
  • Framework-хелпер (~15 %). Тонко настраиваемые разрешения, AppOps, SSAID, StorageStats, значки и привилегированный Wi-Fi требуют фреймворка Android. Небольшой dex, запускаемый через app_process (без установленного приложения), обрабатывает их, с резервным вариантом на shell.
  • Переносимость. Только стандартные форматы; резервные копии открываются на ПК без этого модуля.
  • Состояние хранится в /data/adb/vdbackup/ (конфигурация, задания, назначения, зашифрованные учётные данные, логи, staging). Резервные копии записываются в видимое пользователю хранилище, зашифрованное учётными данными, по пути /sdcard/VDBackup/ (/data/media/<user>/VDBackup, для каждого пользователя), а не в /data/adb (которое зашифровано устройством и доступно для чтения до первой разблокировки).

Гарантия совместимости

Резервная копия должна оставаться восстанавливаемой всегда. Это жёсткое правило, а не стремление по возможности.

Область действия. Гарантия распространяется на резервные копии, записанные начиная с v1.01 (первый официально опубликованный релиз) и только официально опубликованными, выпущенными версиями. v1.00 был сборкой только для тестирования и явно вне области действия; предрелизные сборки и сборки разработки не покрываются. Начиная с первого публичного релиза, обещание ниже абсолютно:

  • Только стандартные форматы. Каждый архив - это обычный tar, сжатый с помощью zstd, gzip или lz4, при необходимости обёрнутый с помощью age. Нет проприетарного контейнера, поэтому резервную копию можно открыть на любом ПК обычными инструментами даже без этого модуля (см. etc/RECOVERY.md). Формат, от которого мы не можем отказаться.
  • Метаданные только для добавления. manifest.json несёт format_version. Схема только растёт: поля могут добавляться, но никогда не удаляться, переименовываться или перепрофилироваться. Восстановление читает каждое поле защитно (отсутствующие необязательные поля возвращаются к значению по умолчанию) и устанавливает APK и извлекает архивы по их имени файла и расширению, а не предполагая фиксированную форму манифеста.
  • Прямо совместимое восстановление. Восстановление никогда не отклоняет резервную копию за то, что она старая, и более старый VDBackup молча пропускает типы элементов, которые ему неизвестны, вместо сбоя. Поэтому более новый VDBackup восстанавливает любую более старую резервную копию, а архивы стандартного формата остаются восстанавливаемыми вручную в любом случае.

Короче говоря: всё, что VDBackup когда-либо записал, каждый будущий VDBackup (и обычный ПК) по-прежнему сможет восстановить. Изменение формата способом, который ломает предыдущую резервную копию, не разрешено; новые возможности добавляются за format_version и новыми, добавляемыми полями.

Полный технический дизайн (формат архива, схема метаданных, конвейеры, криптография, назначения, импортёры) сопровождающие держат в подробных заметках по дизайну; этот файл - это обзор, обращённый к контрибьюторам.

Clone this wiki locally