urMQTT nakon VPS-a: SQLite u korisničkom načinu, usporedba s Mosquittom, konfiguracija kao podatak i graditelj u pregledniku
Što se dogodilo nakon drugog teksta o urMQTT-u: SQLite izoliran izvan jezgre, mjerenja protiv Mosquitta na istom VPS-u (i ono što nije išlo u našu korist), pronađeni uzroci sporog jednog toka, konfiguracija kao podatak uz web graditelj ISO-a i emulator u pregledniku, neobavezni običan MQTT i što još nije dokazano.

Drugi tekst, urMQTT na pravom VPS-u, završio je popisom "Što slijedi": H6 (SQLite izvan jezgre), H7 (sigurnost vremena), X11 (usporedba s Mosquittom na istom VPS-u) i prvo izdanje. Ovaj tekst prati taj popis istim redom i onda dodaje dvije stvari kojih na popisu nije bilo, jer su se pojavile usput: konfiguracija kao podatak, s web graditeljem ISO-a, i neobavezni običan MQTT bez TLS-a. Kao i prije: što smo planirali, što smo izgradili, što nas je iznenadilo i što je otvoreno. U ovom tekstu ima i nekoliko rezultata koji ne idu u korist urMQTT-a; ostavili smo ih jer su dio istine.
Napomena unaprijed ostaje ista: projekt je pred-alfa, prvo izdanje je samo za VPS-ove s KVM-om, a brojke mjere kod, testove i određene pokuse, ne zrelost u produkciji.
Kako je to izgledalo u vremenu
Od prošlog teksta (31.10. u 23:00) do danas (1.11. u 20:41) u repozitoriju je 59 novih commitova, ukupno 178. Svi su nastali u jednom kalendarskom danu, pa vrijedi isto upozorenje kao prije: projekt se gradi uz Claude Code (commitovi nose Co-Authored-By: Claude), plan, kod, testovi i ADR-ovi nastaju u kratkim zatvorenim petljama, a brojke ispod govore o količini koda i provjera, ne o tome koliko je ljudskog rada u njima.
Brojke su izračunate istom metodom kao u prošlom tekstu: svi .rs fajlovi izvan vendor/ i fuzz/, #[test] funkcije, naslovi ## ADR- u docs/DECISIONS.md.
| Trenutak | Commit | Vrijeme | Rust redaka | Testova | ADR-ova |
|---|---|---|---|---|---|
| prošli tekst | 794f607 | 31.10. 23:00 | 89 790 | 739 | 104 |
| H6 gotov | a0423cc | 1.11. 03:59 | 95 078 | 754 | 107 |
| X11 | a29f49b | 1.11. 07:56 | 95 579 | 754 | 108 |
| web graditelj i zrcalo izdanja | 582783f | 1.11. 16:49 | 105 645 | 848 | 122 |
| običan MQTT, dokumentacija | 8f959f1 | 1.11. 19:05 | 112 408 | 926 | 125 |
| danas | d21e3ec | 1.11. 20:41 | 112 408 | 926 | 126 |
Radilo se paralelno na više grana, pa redoslijed commitova nije strogo redoslijed rada. ADR-ovi su numerirani do 232, ali numeracija ima praznina (dio je preimenovan pri spajanju grana); brojimo naslove, ne najveći broj. Izdanja: v0.2.0 (1.11., 18:45 UTC) i v0.2.1 (1.11., 20:22 UTC), oba označena kao pre-release.
H6: SQLite u korisničkom načinu rada
Što smo planirali. SQLite je 254 268 redaka C-a koji parsira bazu, WAL i dnevnik s diska, a disk može biti izrađen ili izmijenjen. Dotad je radio u jezgri, s pravima jezgre. Što smo izgradili (ADR-210 do ADR-212): SQLite, njegovi libc dijelovi i heap premješteni su u zaseban program, dbworker, koji radi na EL0 (aarch64) odnosno ring 3 (x86_64), u vlastitom adresnom prostoru. Jezgra više ne linka SQLite. Radnik s jezgrom razgovara kroz zajednički prozor memorije i dvanaest sistemskih poziva, a svaka duljina i pomak koji se vrate provjeravaju se prije upotrebe. Greška u radniku (nedopušten pristup, nedefinirana instrukcija, prekoračen vremenski proračun od 30 s) završava poziv, radnik se ponovno pokreće i baza se otvara iz WAL-a kao pri podizanju; nakon 5 ponovnih pokretanja u minuti pohrana se proglašava neispravnom, a ne pokreće se u beskraj.
Cijena, izmjerena na aarch64 pod HVF-om, ista VM, jezgra s ugrađenim SQLite-om prema jezgri s radnikom, šest naizmjeničnih pokretanja svake:
| Mjerenje | Prije (u jezgri) | Poslije (radnik) | Razlika |
|---|---|---|---|
| ulazak i izlaz iz korisničkog načina | - | 1,1 us po krugu | |
db-bench, 5 000 umetanja u 50 transakcija, najbolji / medijan |
61,9k / 58,4k op/s | 54,7k / 53,3k op/s | -11,6 % / -8,7 % |
| jedno umetanje po transakciji, najbolji / medijan | 2 319 / 2 148 op/s | 2 307 / 2 126 op/s | -0,5 % / -1 % |
| cijela sigurnosna kopija jednim pozivom (23 MiB) | 514 ms | 635 ms | +23 % |
Zapisi na disk (1 572) i flushevi (319) su identični, kako i mora biti. Nije izolirano ovo: jezgra i dalje vjeruje onome što radnik vrati, nakon provjere oblika. Kompromitirani radnik može lagati (na primjer vratiti praznu listu opozvanih certifikata, a time ih "odopozvati"), ali ne može čitati memoriju jezgre, TLS ključeve ni ključeve tiketa. Nema KPTI-ja, pa curenja tipa Spectre/Meltdown nisu spriječena i ne tvrdimo ništa o njima; PAC ključ dijele EL0 i EL1. Na x86_64 cijenu prebacivanja nismo izmjerili na KVM-u (pod TCG-om bi broj bio besmislen), a samo fuzziranje radnika i protokola nije gotovo. Skup testova za pohranu (79 scenarija, svaki vrti SQLite u radniku) prolazi na aarch64 HVF-u i x86_64 TCG-u, na aarch64 TCG-u 76 (jedan se preskače jer TCG nema MSI-X).
H7 je zatvoren, ali ne onako kako smo najavili. Donja granica vremena (ADR-050) i SNTP s konsenzusom (T1) pokrivaju opseg H7; NTS (RFC 8915) ostaje izvan opsega i zapisan je kao preostali rizik, a ne kao nešto što radi. Ne smatramo da je sigurnost vremena "riješena", nego da je njezin dokaziv dio gotov.
Nova mrežna opcija. Contabo ne daje DHCP prilagođenom ISO-u, pa je VPS dotad tražio drugu sliku od laboratorijske VM. Sada network.mode = "auto" (ADR-214) prvo pita DHCP, a ako zakupa nema u zadanom roku (dhcp_timeout_s, zadano 15 s) ili ga izgubi, primjenjuje zadanu statičku adresu. Isprobano ručno na QEMU-u (s DHCP-om koristi zakup, bez mreže se nakon 5 s vraća na statičku adresu); smoke scenarija za to još nema.
X11: usporedba s Mosquittom na istom VPS-u
Ista vrsta stroja kao u prošlom tekstu (Contabo, 4 vCPU AMD EPYC, 8 GiB), opterećenje s Linux domaćina 15 ms dalje, uzajamni TLS 1.3 s istim certifikatima na obje strane, Mosquitto 2.0.21 na Debianu 13 bez trajnosti. Metoda i odluke su u ADR-213, sirovi podaci u docs/perf-results/. Medijan od tri pokretanja.
| urMQTT | Mosquitto 2.0.21 | |
|---|---|---|
| rukovanja/s, 32 / 64 / 128 klijenata (bench profil) | 169 / 278 / 413 | 82 / 140 / 184 |
| isto, s ograničenjima kakva se isporučuju | 185 / 262 / 333 (pri 128: 202 do 286 grešaka, reseti rukovanja) | - |
| memorija po neaktivnoj vezi (20 000 veza) | 0,50 KB hepa jezgre (0,66 KB pri 5 000) | 26,8 KB rasta procesa |
| latencija p50, QoS 0 / QoS 1, 800 poruka/s, 64 B | 14,0 / 14,8 ms | 21,4 / 39,5 ms |
| QoS 1, 4 800 poruka/s, isporučeno/s (p50) | 4 209 (77 ms) | 4 235 (197 ms) |
| 100 pretplatnika, 50 poruka/s: p50 | 16,6 ms | 99 ms |
| jedan tok, QoS 0, 64 B, objavljeno/s | 2 962 (0 do 7 733) | 22 749 |
Što to znači, a što ne. Rukovanja su donje granice za oba poslužitelja: generator opterećenja je dijeljena VM s 60 do 70 % ukradenog procesorskog vremena i pri 128 niti bio je blizu vlastitog ograničenja, a urMQTT-ove radne jezgre bile su zauzete samo 12 do 13 %. Omjer pri 128 klijenata (oko 2,2 puta) najsmisleniji je; pri 32 i 64 većinom mjeri čekanje klijenata. Brojke memorije ne broje isto (hep jezgre nasuprot RSS-u procesa), pa je "oko 50 puta manje" red veličine, ne precizan omjer. Latencija od 14 ms je jedan krug mreže (oko 15 ms), dakle "nema mjerljivog vremena brokera"; repovi (p99 oko 100 do 200 ms) su kod oba brokera dominirani dijeljenim domaćinima. Razlike ispod oko 20 % ne tvrdimo.
Što nije išlo u našu korist i ostalo je u tablicama: jedan TCP tok kroz urMQTT nosio je 2 do 8 puta manje nego kroz Mosquitto, s promjenama od nule do 7,7 tisuća poruka u sekundi među pokretanjima, a 20 ms watchdog rukovatelja prekidao je žive veze kad je hipervizor zaustavio vCPU (u produkcijskoj postavci action = "drop", 6 do 8 veza po pokretanju pri QoS 0 preplavljivanju). Obje stvari su opisane u sljedećem odjeljku jer su imale uzroke u našem kodu.
Zašto je jedan tok bio spor: uzroci, a ne izgovori
Najlakše bi bilo reći "dijeljeni VPS". Nismo, nego smo uz isti VPS i istu metodu tražili uzroke. Pronađeno je pet uzroka, četiri u putu podataka i jedan u watchdogu (ADR-221 do ADR-224):
| Simptom u X11 | Uzrok u urMQTT-u | Promjena |
|---|---|---|
| jedan tok 1,9k poruka/s, često 0 isporučeno | Izgubljeno buđenje: petlja izlaza vraćala je popis spremnih veza preko upravo ispisanog; pretplatnik čiji se izlazni međuspremnik jednom napunio više nikad nije bio posluživan dok ga PINGRESP nije probudio | popravljeno (ADR-223) |
| nekoliko postotaka gubitka pretvara 48k u 14k poruka/s | svaki segment nakon izgubljenog bio je odbačen (prijem samo po redu), pa je oporavak koštao krug mreže po segmentu | red segmenata izvan redoslijeda, SACK (ADR-222) |
| strop 4,4 MB/s pri 15 ms | 16-bitni prozor, red slanja od 64 KiB i spori start koji je brojao ACK-ove, a ne bajtove | skaliranje prozora, vremenske oznake, brojanje bajtova (ADR-222) |
| svaki krug toka koji stane čeka 0 do 10 ms | dispečer je spavao do sljedećeg otkucaja od 10 ms (virtio-net nema prekid za prijem) | ispitivanje NIC-a svakih 200 us dok postoje veze (ADR-224) |
| 1 do 8 prekinutih veza po pokretanju | watchdog je rukovatelju naplaćivao proteklo vrijeme, a VPS zaustavlja vCPU-e često i dugo | proračun je vrijeme koje je jezgra stvarno radila (ADR-221) |
Zaustavljanja su stvarna: na ovom VPS-u jezgre 0 do 2 imale su medijan 36 do 80 zakašnjelih otkucaja po 5 sekundi, a najgore zaustavljanje u prozoru bilo je medijan oko 70 ms i do 0,9 s (jezgra 3, baza i dnevnik: do 1,55 s), dok domaćin ne javlja ukradeno vrijeme (host steal 0 us). Zato je watchdog trebao drugi sat, ne veći proračun.
| X11 kod (7f9517e) | sada (86a71ff) | Mosquitto | |
|---|---|---|---|
| jedan tok, QoS 0, 64 B, objavljeno / isporučeno u s | 1,9k / 0 | 23,7k / 12,6k | 29,3k / 29,2k |
| jedan tok, QoS 0, 1 KiB | 0 / 0 | 3,9k / 2,3k | 5,4k / 5,4k |
| 16 parova, preplavljivanje, QoS 0, 64 B | 24,7k / 20,0k | 43,2k / 37,4k | 31,4k / 30,7k |
| 16 parova, preplavljivanje, QoS 0, 1 KiB | 3,7k / 2,9k | 5,0k / 4,5k | 5,9k / 5,7k |
| izgubljene veze po pokretanju (16 parova, 64 B) | 13 (7 do 16) | 0 (0 do 0) | 0 |
Watchdog: 148 prekinutih veza u 30 opterećenih pokretanja prije, 0 u 24 pokretanja poslije; na lokalnoj napravi koja odgađa i gubi okvire, pri gubitku od 0,1 % jedan tok od 64 B s 14,3k poruka/s (jezgra X11) sada ima 41,0k, a pri 0,5 % s 5,0k na 17,7k.
Što ovo ne kaže. urMQTT i dalje nije brži od Mosquitta na jednom toku: pri 64 B objavljuje oko 80 % njegove brzine, a isporučuje oko 40 %, jer odbacuje QoS 0 kad je tok pretplatnika sporiji od izdavačeva (Mosquitto bez granice stavlja u red). Pri 1 KiB u 16-parnom preplavljivanju Mosquitto je ispred za oko 15 %, što je unutar šuma. Generator je ponovno bio dijeljena VM s 58 do 77 % ukradenog vremena. Druga runda (zaključavanje heapa izvan puta podataka, SACK na strani slanja i drugo) je na neintegriranoj grani perf-single-flow-wip; njezine brojke još nisu tvrdnje i ovdje ih ne navodimo.
Obećanje koje nismo dali, ali smo ga ispunili: konfiguracija je podatak
Do sada je svaka konfiguracija bila nova gradnja: ključevi i ograničenja bili su ugrađeni u sliku. C1 to okreće (ADR-215 do ADR-219): jezgra se gradi jednom, a konfiguracija je podatak.
- Blob
urmqtt-cfg(C1a): verzionirani, kanonski zapis (polja po rastućim oznakama, SHA-256 otisak, neobavezni odvojeni Ed25519 potpis), 70 polja s zadanim vrijednostima i granicama, dekoder koji odbija sve neispravno. - Jezgra ga čita kao Limine modul (C1b), prije bilo čega drugog, na aarch64 i x86_64. Postoji jedna izdana jezgra za svaki
ENVosimdev(aarch64 ELF-ovi zarelease,prodibenchimaju isti SHA-256; provjereno samo na aarch64). Izdana jezgra odbija razvojnu konfiguraciju, a bez konfiguracije piše "refusing to serve" i ne poslužuje ništa. - Instalirani disk nosi konfiguraciju i ažuriranje je zadržava (C1c).
urmqtt-configi predložak ISO (C1d):pack,show,verify, apack --isozamjenjuje oba primjerka mjesta za konfiguraciju i 24 sažetka modula u gotovom ISO-u. Rezultat je bajt za bajt isti kao ISO kojimkiso.sh --configgradi. Predložak izdanja v0.2.0 ima 63 111 168 bajtova.- Izjava o povjerenju (ADR-219): konfigurirana slika pri podizanju ispisuje otisak konfiguracije (
config: fingerprint ...), a potpis je neobavezan i isključen po zadanom. Izmijenjeni ISO nema službeni sažetak; otisak je način da se vidi što je u njemu.
Graditelj na aldo.tech
Isto što radi urmqtt-config pack --iso, radi i web stranica, istim kodom: biblioteka alata prevedena u WebAssembly (1,06 MB, bez uvoza i bez unsafe bloka). Stranica je na aldo.tech/proizvodi/urmqtt-builder/ i u svih 15 jezika stranice (na primjer en).
- Ništa ne napušta preglednik. Certifikati, privatni ključevi i gotov ISO ostaju na računalu; stranica skida samo datoteke izdanja s ovog sjedišta, nema praćenja ni skripti trećih strana. U testu uživo nijedan zahtjev nije nosio ključni materijal.
- Zrcalo izdanja (ADR-227): sat po sat (systemd timer, nisko prioritetan) kopira izdanja s GitHuba, svako provjerava prije objave, a stranica u pregledniku provjerava potpis
SHA256SUMSključem ugrađenim u stranicu, pa tek onda upisuje konfiguraciju u predložak. Neuspjela provjera blokira preuzimanje. - Jednostavno prema zadanom, napredno po potrebi (ADR-232): prvi zaslon su tri koraka (gdje radi, vaši certifikati, ime slike). Jedno polje za povlačenje datoteka razvrstava certifikat, ključ i CA po sadržaju. Napredni prikaz otvara svako od 70 polja, pretraživanje, uvoz i izvoz TOML-a; oba prikaza uređuju isto stanje. Predložak (63 MB) skida se dok korisnik ispunjava formu. U probi uživo, s probnim zrcalom i probnim ključem, izgradnja ISO-a u pregledniku trajala je 5 do 18 s.


Emulator, neobavezno. Pored "Preuzmi ISO" stoji "Isprobaj u emulatoru": QEMU preveden u WebAssembly pokreće upravo izgrađenu sliku u kartici preglednika. Ništa od njega se ne skida prije klika (oko 3 MB prvi put). Emulator je BIOS-only, bez mreže (da promet korisnika ne bi prošao kroz neki posrednik i narušio "ništa ne napušta preglednik"), traži oko 1,5 GB memorije i računalni preglednik (testiran Chrome; Firefox i Safari nisu). U njemu urMQTT stiže do URMQTT READY za oko 8 s (s preskočenim odbrojavanjem) i ispisuje isti otisak konfiguracije kao stranica, što je dokaz da je podignuta upravo ta konfiguracija. Podizanje je oko 2 puta sporije od izvornog QEMU-a na istom Macu (0,82 s prema 1,9 s), a kriptografija oko 58 puta sporija jer su sklopovske instrukcije emulirane. Zato iz emulatora ne izvlačimo nikakve tvrdnje o brzini, a stranica to kaže prije pokretanja. Pri izgradnji je trebalo zakrpati četiri bajta u .wasm-u zbog greške u prijevodu instrukcije POPCNT u izvornom emulatoru (još je nismo prijavili); sam emulator je pod GPL-om, uz ponudu izvornog koda.

Običan MQTT, samo za mreže kojima vjerujete
Običan MQTT (TCP 1883, bez TLS-a) vrlo je čest u IoT-u: zadano je u Mosquittu, u većini firmwarea za Arduino i ESP, u Tasmoti, Zigbee2MQTT-u i Home Assistantu, a koristi se i unutar segmentiranih industrijskih mreža, iza VPN-a i na privatnim LAN-ovima, pa i na uređajima bez sata (certifikati traže datum), bez dovoljno flasha ili procesora za TLS. Preko nepouzdane mreže nije prihvatljiv: tko je na putu, čita i mijenja promet. Zato je P1 (ADR-229 do ADR-231) izričit, ograničen izbor, isključen po zadanom, a TLS port ostaje; TLS se ovim ne isključuje, običan port dolazi uz njega.
- Popis dopuštenih mreža je obavezan (
allow_from, CIDR-ovi) i provjerava se pri SYN-u: izvan popisa nema SYN-ACK-a ni stanja. Cijeli internet (0.0.0.0/0) traži zasebnu izričitu opciju. - Tri načina prijave: lozinka (zadano kad je uključeno; PBKDF2-HMAC-SHA-256, sol, 10 000 iteracija, usporedba u stalnom vremenu, zaključavanje po adresi), anonimno (jedan konfiguriran identitet s vlastitim ACL-om) i po adresi (
ip). Graditelj lozinku raspršuje u pregledniku i u memoriji drži samo sažetak. - Manje prava nego mTLS: običan klijent nikad nema servisna, operatorska ni upravljačka prava, nema
$SYSni konzole, ima vlastite sesije ($plain/<identitet>/<id klijenta>, samo čiste), vlastita ograničenja i registar dopuštenih ga i dalje obvezuje. - Što se gubi, piše u
SECURITY.md: povjerljivost, cjelovitost, autentičnost brokera i ponavljanje snimljene prijave. To se konfiguracijom ne može popraviti; tako je kad nema TLS-a.
Izmjereno na laptopu (Apple silicon, HVF, QEMU korisnička mreža), 16 parova, 64 B, tri pokretanja od 10 s: pri 8 000 poruka u sekundi TLS i običan put isporučuju sve poruke s istom latencijom (p50 0,17 ms prema 0,13 do 0,18 ms), nove veze po sekundi: TLS oko 2 600 do 2 750, anonimni običan oko 4 900 do 7 800, a prijava lozinkom je skupi dio: jedan PBKDF2 stoji oko 2,5 ms, pa se broj novih prijava ograničuje na oko 200 po jezgri podataka u sekundi (izmjereno 308 do 342 na dvije jezgre). Preplavljivanje na tom stroju nije stabilan instrument (20k do 440k isporučenih u sekundi među pokretanjima) i iz njega ne izvlačimo zaključak. Usporedba običnog puta s Mosquittom na VPS-u još nije napravljena. Testovi: smoke skupina plaintext 7 od 7 na aarch64 HVF-u i na x86_64 TCG-u, novi fuzz cilj plain_input (2,3 milijuna pokretanja bez nalaza).
Greške koje je pronašao rad uživo
Dvije stvari nisu ulovili testovi, nego prvo uključenje na pravom sjedištu:
- Stranica je datoteke izdanja tražila jedan direktorij previsoko, pa je svaka provjera potpisa odgovorila 404 (ispravak 13af301). Test je koristio probno zrcalo na drugoj putanji.
- Tipkovnica emulatora nikad nije stigla do gosta: uzrok nije bio loš prijevod tipki, nego to što dijalog uopće nije slušao tipke (ispravak u ADR-232, uz unos za podizanje bez tipki).
Lekcije
- Tražite uzrok, ne okrivljavajte okolinu. Većina slabosti jednog toka i sve prekinute veze bile su naše; hipervizor je stvaran, ali ga je trebalo mjeriti, ne pretpostavljati.
- Usporedba s drugim proizvodom mora uključiti i gubitke. Tablica u kojoj su samo naše pobjede ne bi bila usporedba.
- Mjerni instrument ima granice. Dijeljeni generator s 60 do 70 % ukradenog vremena mijenja što brojke znače; zato pišemo "donja granica" i ne tvrdimo razlike ispod 20 %.
- Izolacija nije dokaz. SQLite u EL0 smanjuje što greška u njemu može, ne ono što može lagati.
- Stvarna instalacija nalazi ono što testovi ne traže: putanju koja je krivo složena i tipke koje nitko ne sluša.
Što još nije dokazano
- Potpisni ključ izdanja za sada je probni ključ; v0.2.0 i v0.2.1 su pre-release, a slike uz njih razvojne uz probne certifikate (osim predloška, koji je bez konfiguracije).
- 13 prijevoda stranice graditelja (i ovog teksta) napisao je AI i provjerili su ih testovi i uzorci, ne izvorni govornici.
- Usporedba s Mosquittom je jedna sjednica, jedan put i jedan dijeljeni generator, na dijeljenom VPS-u; razlike ispod 20 % nisu tvrdnje.
- Običan put nije mjeren na VPS-u ni protiv Mosquitta.
- Lighthouse na novom jednostavnom prikazu nije potvrđen (stari prikaz: pristupačnost 95 ili više).
- Bare metal, x86_64 cijena radnika na KVM-u, Firefox i Safari za emulator: nije mjereno.
Što slijedi
- D1: javni demo broker. Emulator iz preglednika ne možemo učiniti javnim: živi u kartici jednog posjetitelja, 20 do 100 puta je sporiji od KVM-a, nema dolazne mreže i nestaje sa zatvaranjem kartice; preusmjeravanje interneta u tuđi preglednik bilo bi i zlouporaba. Moguć je pravi demo broker: urMQTT na VPS-u iza imena na aldo.tech, s objavljenim probnim CA-om, strogim ACL-om i malim ograničenjima. To je zasad samo ideja, ne gradnja, i treba izričit pristanak za javno izlaganje.
- Druga runda za jedan tok (grana
perf-single-flow-wip): tek kad je izmjerena na VPS-u i spojena. - Običan put protiv Mosquitta na VPS-u, prijava i opoziv računa za običan MQTT preko potpisanog upravljačkog kanala.
- Poslije izdanja: bare metal (X12 do X16), IOMMU i Secure Boot, šifriranje diska.
Kod je na github.com/zeljan-alduk/urMQTT, a docs/PROGRESS.md i dalje je jedini izvor istine o tome što stvarno radi, docs/PERFORMANCE.md o tome što je izmjereno. Pred-alfa, kao i prije; prijave grešaka i sigurnosne prijave po uputama u SECURITY.md dobrodošli su.
Komentari
Pravila komentiranja