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.

1. Přehled architektury

VrstvaPoužitíLatenceInternet?
1. LAN (mDNS/NSD)Oba na stejné Wi-Fi< 1 sNe
2. Cloud Relay (Cloudflare Worker)Telefony mimo společnou LAN1–3 sAno
3. FCM Push TriggerProbudit spící telefon5–30 sAno

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

Krok 1

Otevřete párovací obrazovku

Telefon A: Nastavení → Synchronizace více zařízení → Přidat zařízení.

Krok 2

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.
Krok 3

Naskenovat QR

Telefon B: Skenovat QR. Fotoaparát detekuje automaticky.

Krok 4

X25519 výměna klíčů

B odvodí shared secret, pošle A pair_complete.

Krok 5

Vzájemná autentizace

Oba drží hash veřejného klíče toho druhého. Bez hesla, bez PINu.

Krok 6

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.

TopologieMeshHvězda (Hub)
Zdroj pravdyNejnovější HLCHub
Max telefonů~31 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 telefonuNastavení → 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žkaTypický 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á.

11. Časté dotazy

Potřebuje synchronizace internet?
Ne pro LAN. Ano pro Cloud Relay a FCM.
Mohou má data někdo zachytit?
Ne. End-to-end libsodium. Cloudflare vidí jen ciphertext.
Kolik stojí Cloud Relay?
Pro vás zdarma. Pro nás ~5 USD/měsíc.
Co když ztratím telefon?
Zrušit spárování. Relay odmítá zprávy z revoke hashe.
Tři a více telefonů?
Ano. 2–3 mesh, 4+ via Hub Mode.
iPhone jako primární?
Ano. iOS-as-hub nepodporujeme.
Jak rychle se data objeví?
LAN pod 1 s. Cloud Relay 1–3 s. FCM 5–30 s.
Záloha jinak?
Nastavení → Export — JSON + ZIP, lokální nezávislá záloha.
Co když firma skončí?
Data jsou lokálně. LAN sync funguje dál. Plánujeme opensource protokolu Witness.