7.6 KiB
7.6 KiB
Vault - Project Documentation
About
Resilientní úložiště s redundantní strukturou. Program spravuje 2+ kontejnerů (disk image souborů), které obsahují:
- Souborovou strukturu přístupnou přes FUSE mount
- Metadata o lokacích ostatních kontejnerů
- Informace o verzích
- Synchronizované kopie stejného obsahu napříč všemi kontejnery
Klíčový princip: Aplikace běží jako tray daemon, mountuje vault jako běžnou složku. Uživatel pracuje se svým oblíbeným file managerem (Nautilus, Dolphin, Thunar). Aplikace na pozadí zajišťuje synchronizaci mezi replikami.
Platforma: Pouze Linux (FUSE mount). Windows/Mac možná později.
Specifikace
Formát úložiště
- Kontejner: Raw disk image (.vault) se sparse alokací
- Filesystem: exFAT (cross-platform, bez 4GB limitu)
- Přípona:
.vault - Velikost: Uživatel zadá při vytvoření
- Struktura uvnitř:
myvault.vault (sparse soubor) └── [exFAT filesystem] ├── .vault/ │ ├── manifest.json │ └── lock # Lock soubor pro exkluzivní přístup ├── documents/ │ └── file.txt └── photos/ └── image.jpg
Mount
- Metoda: udisksctl (loop device + mount, bez root)
- Mount point: Automatický (udisksctl) nebo uživatelem zvolený
- Exkluzivní přístup: Lock soubor s fcntl - pouze jedna instance může mít vault otevřený
Čitelnost bez aplikace (bez Vault app)
sudo mount -o loop myvault.vault /mnt/vault
Resize
- Při zaplnění: varování uživateli (notifikace při >90% využití)
- Uživatel rozhodne o zvětšení přes GUI dialog
Umístění kontejnerů
- Kdekoli s RW přístupem (různé disky, síťová umístění, USB, cloud)
- Každý kontejner obsahuje metadata s cestami k ostatním kontejnerům
Synchronizace
- Úroveň: Jednotlivé soubory (NE celé .vault obrazy)
- Interní Python implementace (bez rsync)
- Hash (SHA-256) pro detekci změn obsahu
- Timestamp pro určení master verze (novější vyhrává)
- Předpoklad: většinou budou všechny kontejnery dostupné → synchronní zápis
- Fallback: při nedostupnosti některého kontejneru se při reconnectu synchronizuje podle timestampu
- Chunked copy s progress callbackem pro velké soubory
- Background sync: Změny se detekují přes inotify/watchdog a propagují automaticky
Jak sync funguje:
- Všechny repliky jsou mountnuté současně (každá do jiného temp mount pointu)
- Uživatel vidí pouze hlavní mount point
- Při změně souboru → soubor se zkopíruje do všech mountnutých replik
- Při reconnect nedostupné repliky → porovnání manifestů → kopírování pouze změněných souborů
GUI
- Framework: PySide6
- Typ: System tray aplikace (daemon)
- Jazyk UI: Čeština
- Uživatel pracuje: Se standardním file managerem OS
GUI - System Tray App
Tray ikona - stavy
| Ikona | Stav |
|---|---|
| Zelená | Vault otevřen, vše synchronizováno |
| Modrá | Synchronizace probíhá |
| Žlutá | Některé repliky nedostupné |
| Červená | Chyba (vault zaplněn, sync selhala, atd.) |
| Šedá | Žádný vault otevřen |
Tray menu
My Vault (3/3 replik online) [status]
────────────────────────────────────
Otevřít složku [otevře mount point v file manageru]
────────────────────────────────────
Vytvořit nový vault...
Otevřít vault...
Zavřít vault
────────────────────────────────────
Přidat repliku...
Spravovat repliky...
────────────────────────────────────
Synchronizovat
Zvětšit vault...
────────────────────────────────────
Ukončit
Dialogy
- Nový vault: Název, cesta, velikost (s quick buttony 1/5/10/50 GB)
- Otevřít vault: Výběr .vault souboru
- Spravovat repliky: Tabulka replik se statusem a tlačítkem pro odebrání
- Zvětšit vault: Aktuální využití, nová velikost
- Sync progress: Progress bar, aktuální soubor, log, cancel
Architektura
Vault/
├── Vault.py # Entry point
├── pyproject.toml # Poetry konfigurace
├── src/
│ ├── core/ # Business logika (BEZ UI importů!)
│ │ ├── vault.py # Hlavní třída Vault - orchestrace
│ │ ├── container.py # Mount/unmount přes udisksctl
│ │ ├── image_manager.py # Vytváření/resize sparse .vault souborů
│ │ ├── lock.py # Exkluzivní přístup (fcntl)
│ │ ├── sync_manager.py # Synchronizace mezi replikami
│ │ ├── file_watcher.py # watchdog/inotify pro detekci změn
│ │ ├── file_sync.py # Kopírování souborů s progress callback
│ │ ├── manifest.py # Metadata - lokace, verze, soubory
│ │ └── file_entry.py # Reprezentace souboru (path, hash, timestamp)
│ └── ui/
│ ├── tray_app.py # System tray aplikace + menu
│ ├── notifications.py # System notifikace (notify-send)
│ └── dialogs/
│ ├── new_vault.py
│ ├── open_vault.py
│ ├── manage_replicas.py
│ ├── resize_vault.py
│ └── sync_progress.py
└── tests/
├── test_file_entry.py
├── test_manifest.py
├── test_lock.py
├── test_image_manager.py
├── test_container.py
├── test_file_watcher.py
├── test_file_sync.py
├── test_sync_manager.py
└── test_vault.py
Metadata struktura (.vault/manifest.json)
{
"vault_id": "550e8400-e29b-41d4-a716-446655440000",
"vault_name": "My Vault",
"version": 1,
"created": "2026-01-28T10:30:00Z",
"last_modified": "2026-01-28T15:45:00Z",
"image_size_mb": 10240,
"locations": [
{
"path": "/mnt/disk1/myvault.vault",
"last_seen": "2026-01-28T15:45:00Z",
"status": "active"
},
{
"path": "/mnt/usb/myvault.vault",
"last_seen": "2026-01-28T15:45:00Z",
"status": "active"
}
],
"files": [
{
"path": "documents/file.txt",
"hash": "sha256:e3b0c44...",
"size": 1234,
"created": "2026-01-28T10:30:00Z",
"modified": "2026-01-28T14:20:00Z"
}
]
}
Závislosti
Python (Poetry)
PySide6>=6.10.1 # GUI framework
pyfuse3>=3.4.2 # FUSE binding (nepoužito - udisksctl místo FUSE)
watchdog>=6.0.0 # File system events (inotify)
loguru>=0.7.3 # Logging
python-dotenv>=1.2.1 # Environment variables
# Dev
pytest>=9.0.2
pytest-cov>=7.0.0
ruff>=0.14.14
mypy>=1.19.1
Systémové závislosti (Linux)
sudo apt install udisks2 exfatprogs
Aktuální stav
Fáze 1-5: Dokončeno
- Kompletní core logika (vault, container, image_manager, manifest, file_entry, lock, sync_manager, file_watcher, file_sync)
- System tray GUI s menu, notifikacemi, dialogy
- Správa replik (přidání, odebrání, tabulka se statusy)
- Automatická detekce dostupnosti replik (30s polling) s auto-reconnect
- Resize vault přes GUI dialog
- Detekce zaplnění s varováním při >90%
- Graceful shutdown (SIGINT/SIGTERM)
- 130 testů, vše passing
- ruff + mypy clean