Pokud chcete vést pěstební deník na jednom telefonu, sledovat senzory z druhého a nechat starý telefon hlídat tent v Hub módu, potřebujete jeden mechanismus, který udrží všechna zařízení v synchronizaci. V GrowVPD Pro tuto roli plní třívrstvý systém zvaný Witness.
Cílem této architektury je jednoduchý kompromis: žádný centrální server nikdy nevidí váš deník v čitelné podobě, a přesto vám funguje synchronizace i mimo domácí Wi-Fi.
Soukromí v jedné větě. Witness Cloudflare Worker nikdy nedešifruje vaše zprávy. Šifrování probíhá end-to-end mezi vašimi telefony pomocí libsodium (Ed25519 podpisy + X25519 výměna klíčů + AEAD). Server vidí pouze hashe veřejných klíčů a opaque payloady.
Obsah
1. Přehled architektury
| Vrstva | Použití | Latence | Internet? |
|---|---|---|---|
| 1. LAN (mDNS/NSD) | Oba na stejné Wi-Fi | < 1 s | Ne |
| 2. Cloud Relay (Cloudflare Worker) | Telefony mimo společnou LAN | 1–3 s | Ano |
| 3. FCM Push Trigger | Probudit spící telefon | 5–30 s | Ano |
Aplikace volí vrstvu sama: nejdřív LAN, pak Cloud Relay, pak FCM jako budicí signál.
2. Vrstva 1 — Lokální LAN (preferovaná)
Když jsou oba telefony na stejné Wi-Fi, Witness používá mDNS/NSD pro discovery. Každý spárovaný telefon zaregistruje službu _growvpd-sync._tcp a periodicky vysílá heartbeat. Druhý peer okamžitě sestaví TCP spojení.
Šifrování:
- Ed25519 — dlouhodobý podpisový klíč. Autentizace.
- X25519 — efemérní klíče pro shared secret.
- AEAD (XChaCha20-Poly1305) — payload šifrování.
Knihovna libsodium. Klíče v Android Keystore / iOS Keychain.
Praktická poznámka. LAN vrstva nezná internet. Vypadne ISP? Dvojice telefonů na vaší Wi-Fi si stále vyměňují data.
3. Vrstva 2 — Cloud Relay (záloha)
Jeden telefon doma, druhý v práci — NAT brání přímé TCP spojení. Witness přepne na Cloud Relay na relay.growvpd.pro.
Worker (~600 řádků TypeScript) dělá:
- Drží HMAC-podepsané párovací tokeny v Cloudflare KV.
- Směruje podle
fromPeerHash → toPeerHash. - Nikdy nedešifruje payload.
- Vyhazuje zprávy starší 24 h.
~5 USD/měsíc při tisíci párech. Pro vás zdarma.
Self-heal endpointy (2026-05-06)
/auth/tuya/refresh-device/{id}— rotace stale local_key z Tuya cloudu./tuya/device-status/{id}— REST cloud fallback. Throttle 5 min/zařízení.
4. Vrstva 3 — FCM Push Trigger
Bateriové senzory (Tuya wsdcg TH, co2bj CO2) běží přes cloud. Když přijde nová hodnota a telefon spí, Witness pošle FCM sync_pending. Telefon se probudí, stáhne data, předá peerům.
Politika šířky pásma: Wi-Fi defaultně povoleno; mobilní data opt-in.
5. Párovací postup přes QR
Otevřete párovací obrazovku
Telefon A: Nastavení → Synchronizace více zařízení → Přidat zařízení.
QR obsahuje 4 položky
- Párovací token (32 B, TTL 5 min).
- Ed25519 veřejný klíč A (32 B).
- LAN adresu (
192.168.0.42:8765). - Cloud Relay URL.
Naskenovat QR
Telefon B: Skenovat QR. Fotoaparát detekuje automaticky.
X25519 výměna klíčů
B odvodí shared secret, pošle A pair_complete.
Vzájemná autentizace
Oba drží hash veřejného klíče toho druhého. Bez hesla, bez PINu.
První plná synchronizace
Default 30 dní backfill. Změna v Nastavení → Synchronizace → Rozsah backfillu.
QR je jednorázový. Token expiruje po 5 minutách.
6. Co se synchronizuje (a co ne)
Každý záznam má časové razítko HLC (hybrid logical clock). Konfliktní rezoluce CRDT-lite:
- Jednoduchá pole: last-writer-wins.
- Vícehodnotová pole (tagy): set-merge.
- Logy událostí: append-only.
Synchronizované tabulky (15)
- grows, grow_entries, grow_rooms, grow_tents
- smart_devices — bez creds
- sensor_readings — posledních 7 dní
- automation_rules
- diary photos — rsync-style, 5 MB/min limit na mobile
- strain_database, equipment_database — user customizace
- app prefs, theme, language
Nesynchronizováno
- Raw logy a diagnostické dumpy.
- Přihlašovací údaje (Tuya, AC Infinity creds zůstávají per-device).
- BLE bond keys.
7. Hub-as-relay topologie
S Hub módem — hvězdicová topologie, hub = source of truth.
| Topologie | Mesh | Hvězda (Hub) |
|---|---|---|
| Zdroj pravdy | Nejnovější HLC | Hub |
| Max telefonů | ~3 | 1 hub + 5 primárních |
8. Bezpečnost
- Cloudflare kompromitovaný → útočník vidí jen ciphertext. Bez klíčů nedešifruje.
- Únik QR tokenu → 5 min platnost, pak bezcenný.
- Ztráta telefonu → Nastavení → Zařízení → Zrušit spárování.
- GrowVPD jako firma skončí → Cloud Relay zmizí, LAN sync funguje dál.
9. Šířka pásma a kvóty
| Položka | Typický objem/den |
|---|---|
| LAN sync | ~50 KB / telefon |
| Cloud Relay (šifrované) | ~50 KB / telefon |
| Foto-sync (Wi-Fi) | Bez limitu |
| Foto-sync (mobile) | 5 MB/min limit |
| FCM push wake | ~5–15 zpráv/den |
10. Řešení problémů
QR sken proběhne, párování selže
VLAN segmenty. Router → AP Isolation: OFF. Mesh systémy (Eero, Google Wifi) izolují klienty defaultně.
LAN funguje, Cloud Relay ne
Nastavení → Synchronizace → Test cloud relay. Zelená = OK. Červená = ISP blokuje doménu.
Některé záznamy chybí
Force resync (~10 s pro 30 dní).
Zastaralé odečty
Telefon A musí být dostupný na LAN. „Hub status" pilulka v Nastavení → Zařízení musí být zelená.