nessie

Napravljeno u EU, i gde se nalaze vaši podaci

Gde se Nessie pravi, gde se nalaze vaši podaci i šta kontrolišete kada ga hostujete sami.

Ko ga pravi i po kom pravu

Nessie pravi UnlikeOtherAI s.r.o., kompanija registrovana u Češkoj Republici koja posluje po češkom pravu.

Ova stranica opisuje kako je softver napravljen i gde radi. Ona nije izjava o usklađenosti: Nessie nema nijedan sertifikat bezbednosti i ništa ovde ne treba čitati kao da ga ima. Koji se lični podaci obrađuju i na kom osnovu, tema je politike privatnosti, koja je posebna stranica.

Gde radi hostovani proizvod

Nessie Cloud radi kod evropskih provajdera hostinga — Scaleway, Hetzner i drugih. Biramo najbolju uslugu koju svaki provajder nudi, pa različiti delovi proizvoda mogu da rade kod različitih provajdera, svi u Evropi.

Sve preciznije od toga — konkretna lokacija, grad ili data centar — ovde namerno nije navedeno, jer bi zastarelo a da niko to ne primeti.

Samostalnim hostovanjem izbor je u vašim rukama

Gde radi samostalno hostovana instanca jeste podešavanje instalacije, a ne podešavanje proizvoda. Put za jednu mašinu je Docker Compose stek koji postavljate na mašinu koju sami izaberete. U Terraform strukturi za upravljani oblak region je ulazni parametar bez ikakve podrazumevane vrednosti: ništa se tu ne može pogađati, pa ništa tu nema podrazumevanu vrednost, a baza podataka, bucket za skladištenje objekata i servisi prate region koji navedete.

Za isto pitanje važna su još dva strukturna detalja. Red čekanja i transport u realnom vremenu su oba PostgreSQL — na putu nema ni Redisa ni brokera poruka, pa nema trećeg sistema koji treba negde smestiti. A skladište objekata je kompatibilno sa S3, a nije vezano za jednog proizvođača; referentna instalacija pokreće MinIO u kontejneru na privatnoj mreži, bez sopstvenog ulaza spolja. Delovi koji moraju negde da žive su baza podataka, skladište objekata i dva Node servisa, i svi oni žive tamo gde ih vi postavite. Kako se to postavlja, pročitajte na stranici o instalaciji.

Šta Nessie čuva — a šta namerno ne čuva

Identitet se ne kopira

Uz prijavu preko UnlikeOtherAI, provajder identiteta upravlja identitetom ljudi i čuva ga — faktore autentifikacije, profile, članstvo u organizaciji i timu i pozivnice. Nessie je strana koja se na provajdera oslanja (relying party), a ne drugi sistem identiteta. To je podjednako odluka o podacima i o arhitekturi: identitet koji Nessie nikad ne čuva jeste identitet koji ne može da procuri, da se izgubi ili da ostane neobrisan.

Tabela users zapravo čuva stabilni identifikator korisnika kod provajdera — ključ preko kog se razrešava sve ostalo — imejl adresu, neautoritativnu kopiju prikazanog imena i avatara, te polja lokalna za proizvod (podešavanja, zamenice, verziju tokena koja služi za opozivanje sesija). Kopija postoji samo zato da se ime i slika mogu prikazati bez zahteva za svaki red, a ponovo se usklađuje sa proverenim tvrdnjama provajdera pri prijavi, pri promeni tima i pri osvežavanju sesije. Ništa se ne izmišlja: osoba koju provajder nije imenovao nosi svoju imejl adresu dok to ne učini. Heš lozinke postoji samo za početnog vlasnika instalacije koja uopšte nema provajdera identiteta.

Isto važi i za strukturu. Jedna organizacija kod provajdera je jedna organizacija u Nessie, povezana ID-jem organizacije kod provajdera; tim bez veze sa provajderom odgovara 404 TEAM_NOT_LINKED umesto da se vrati na lokalno nagađanje, a čitanje spiska članova uživo ide provajderu identiteta i ništa ne čuva.

Dve kopije još nisu uklonjene i bilo bi nepošteno nagoveštavati suprotno. Nazivi organizacije i tima i dalje se čuvaju lokalno pored ID-jeva veze, a lokalni zapisi o članstvu i dalje autorizuju obične zahteve između sinhronizacija. Uklanjanje oba je otvoren, evidentiran posao u repozitorijumu, a ne nešto što je već završeno.

Ništa komercijalno

Plaćanjima upravlja centralni servis za naplatu. Nessie ne čuva kupca kod provajdera plaćanja, pretplatu, fakturu, cenu, stanje kredita, pravilo dopune, saglasnost za plaćanje, izvod ili stanje otkazivanja, i ne obračunava tarife. Čita vrednosti spremne za prikaz i prikazuje ih.

Tajne

Za čuvanje bilo koje tajne obavezan je podešen sef. Namerno nema rezervne varijante u bazi podataka niti putanje sa golim tekstom: bez sefa čuvanje, rotiranje i opoziv tajne vraćaju grešku umesto da se pretvore u nešto manje bezbedno. Nessie-jevi sopstveni zapisi o tajni ne sadrže vrednost, šifrat, ključ ni token sefa — samo neprozirnu referencu i njene metapodatke — a putanje u sefu grade se isključivo od strukturnih identifikatora, nikad od naziva organizacije, tima, projekta ili imena osobe.

Pristupne podatke koje Nessie mora sam da drži da bi delovao kao OAuth klijent — podatke za konektore i poštanska sandučad, tajne webhook-ova, materijal za osvežavanje sesija, sadržaj izvršilaca — zapečaćuje u AES-256-GCM omotnicama vezanim za namenu, pod verzionisanim prstenom ključeva koji je poseban koren u odnosu na tajnu za potpisivanje sesija, uz dokumentovan postupak rotacije.

Postoji i pravilo o modelima: može se znati da tajna postoji i može se odobriti njena upotreba, ali sadržaj tajne ne sme da uđe u kontekst modela, upite, argumente alata, rezultate alata, memoriju, embeddinge, pretragu, logove ni poruke. Agentu se može dodeliti mogućnost da tajnu koristi. Nikad mu se ne može dodeliti mogućnost da je otkrije.

Da li su diskovi ispod šifrovani, svojstvo je mašine na kojoj instalacija radi. Repozitorijum ne utvrđuje šifrovanje na nivou volumena za volumene baze podataka i skladišta objekata, pa ova stranica to ne tvrdi.

Izolacija zakupaca

Nessie je po dizajnu višezakupački: jedna baza podataka, u kojoj svaki red pripada tačno jednoj organizaciji i svaka zavisna tabela nosi kolonu organization_id. Izolacija se sprovodi na dva mesta — klauzulom opsega koju nosi svaki upit i pravim stranim ključevima na toj koloni, koji su dodati kroz četrdeset dva ograničenja nakon što je interna revizija utvrdila da kolona postoji ali nije ograničena na desetinama tabela.

Paket testova usaglašenosti drži taj invarijant na mestu na HTTP granici. On postavlja maksimalno privilegovanog napadača — punog vlasnika sopstvene organizacije — i proverava da svako kanonsko čitanje resursa druge organizacije vraća 403, 404 ili prazan odgovor, a da se svaka kanonska izmena odbija bez dodirivanja reda druge organizacije. Pokriva kanale, odobrenja, evidenciju revizije, okidače, agente i njihove veze, izvršavanja, projekte, zadatke, niti, veze, instalacije tokova rada, MCP instance, bazu znanja i upozorenja.

Da budemo precizni oko mehanizma: ovo je sprovođenje na nivou aplikacije plus strani ključevi, a ne PostgreSQL zaštita na nivou reda (row-level security). Nema RLS politike ni zaštite sa strane baze podataka, a paket testova usaglašenosti radi nad vernom memorijskom pohranom, a ne nad živom bazom, pa dokazuje klauzule opsega koje kod piše, a ne SQL koji server izvršava. Repozitorijum to kaže u dokumentaciji samog paketa testova, a kaže i ova stranica.

Evidencija revizije

Beleži se svaka bitna radnja: ko je delovao i u kojoj ulozi — osoba, agent, servis — šta je uradio, nad kojim resursom, u kojoj organizaciji, projektu, timu ili kanalu, da li je uspelo ili je odbijeno, zašto, te ID zahteva, adresa i korisnički agent sa kojima je stigao.

Dnevnik je po dizajnu samo za dopisivanje i ne postoji način da se u njega piše spolja: POST /api/audit-log ne postoji i to je namerno. Zapisi su ulančani — svaki nosi SHA-256 digest sopstvenih kanonskih polja plus digest prethodnog zapisa te organizacije — pa izmenjen ili uklonjen red prekida lanac i to se može otkriti. Vlasnik ili administrator organizacije može da prođe kroz taj lanac kad god želi i dobija podatak gde se prvi put prekinuo, ako jeste.

Dve poštene napomene. Lanac čini dnevnik vidljivim u slučaju neovlašćene izmene, a ne otpornim na nju: iza njega nema opoziva prava pisanja na nivou baze podataka ni skladišta u koje se piše samo jednom, pa je garancija otkrivanje, a ne sprečavanje. A zapisi se podrazumevano čuvaju neograničeno — podesivo čuvanje sa izvozom pre brisanja je osmišljeno, ali nije napravljeno. Zapisima je takođe zabranjeno da nose tajne ili celo telo zahteva, a fiksni skup naziva osetljivih polja metapodataka briše se pri upisu.

Knjiga troškova

Svaki poziv modela beleži se na teret organizacije, a i na korisnika, tim, projekat, kanal, agenta i izvršavanje iz kojih potiče, uz potrošene tokene i uz trošak koji prijavljuje provajder i Nessie-jevu sopstvenu procenu, držane jedno pored drugog. Metrika koju provajder ne prijavljuje čuva se kao null, a ne kao pogođena vrednost. Izveštaje može da čita vlasnik ili administrator organizacije.

Ova knjiga je operativna telemetrija — šta je organizacija potrošila i u čije ime. Nije faktura niti autoritet za naplatu.

Treće strane, kada koristite hostovani proizvod

Hostovana instalacija komunicira sa malim, fiksnim skupom servisa. Saobraćaj modela i veb pretraga ne idu direktno provajderima: oba izlaze kroz jedan gejtvej kojim upravlja UnlikeOtherAI, a iza njega su provajderi modela i pretrage. Prijava i naplata idu autentifikatoru kompanije UnlikeOtherAI. Trezor tajni je samostalno hostovan uz aplikaciju. Linkovi za video pozive koje generiše server podrazumevano vode na javni Jitsi servis.

Gotovo sve ostalo je isključeno dok ga operator ne podesi, i to jasno kaže umesto da tiho ne uspe: povezani Google, Microsoft i Slack nalozi; imejl agenata preko Amazon SES, koji instalacija pokreće u sopstvenom nalogu, bez posrednika; mobilni i pregledački push; konektori za istraživanje i izvore tabli; cloud pregledači. Dva detalja vredi navesti jer menjaju gde podaci idu:

  • Povezana poštanska sandučad ostaju kod vašeg provajdera. Pošta se čita uživo od vašeg provajdera, preko IMAP-a i SMTP-a ili prijave kod samog provajdera; Nessie čuva zapečaćen akreditiv i ništa drugo o nalogu. Poštansko sanduče koje povežete sa prijemnim sandučetom kupaca je izuzetak: tražite da se njegovi razgovori čuvaju uz svakog kupca, pa se kopiraju.
  • Glasovni pozivi u aplikaciji ne prolaze kroz Nessie. API posreduje akreditiv, a klijent sam otvara audio vezu. Diktiranje i telefonski pozivi su drugačiji: njihov zvuk ide preko Nessie-ja do provajdera govora i modela koji ga obrađuju.

Jedan detalj o inferenciji sledi isti princip: potpisana zaglavlja sa identitetom pozivaoca šalju se samo podešenom hostu za čet, pa usmeravanje embeddinga na drugi endpoint tom endpointu nikad ne predaje tvrdnju o delegiranju za osobu čiji se tekst ugrađuje.

Hostovani proizvod koristi više provajdera inferencije i među njima bira prema ceni i kvalitetu. Organizacija će u administraciji moći da izabere koje provajdere njeni agenti smeju da koriste: samo zapadne, samo evropske, samo kineske ili bez preferencije — najefikasniji provajder za svaki posao. Samostalno hostovana instanca bira sopstvene.

Ako ga sami pokrećete, sve ovo se menja

Svaka treća strana gore navedena je izbor konfiguracije na samostalno hostovanoj instanci. Inferencija se može usmeriti na bilo koji endpoint kompatibilan sa OpenAI-jem, uključujući onaj na vašem hardveru. Konektori su isključeni dok ih ne uključite. Prijava preko UnlikeOtherAI je podržani put, a instalacija bez ijednog provajdera identiteta radi kao jedna nepovezana organizacija sa početnim vlasnikom.

U tome je suština ovog dogovora: softver je isti, a odluke o tome gde radi i do čega sme da dopre pripadaju onome ko ga pokreće. Kako, objašnjava stranica o instalaciji.