Φτιαγμένο στην ΕΕ, και πού βρίσκονται τα δεδομένα σας
Πού κατασκευάζεται το Nessie, πού φυλάσσονται τα δεδομένα σας και τι ελέγχετε όταν το φιλοξενείτε μόνοι σας.
Ποιος το δημιουργεί και με ποιο δίκαιο
Το Nessie δημιουργείται από την UnlikeOtherAI s.r.o., εταιρεία εγγεγραμμένη στην Τσεχική Δημοκρατία που λειτουργεί σύμφωνα με το τσεχικό δίκαιο.
Η σελίδα αυτή περιγράφει πώς είναι κατασκευασμένο το λογισμικό και πού εκτελείται. Δεν αποτελεί δήλωση συμμόρφωσης: το Nessie δεν διαθέτει καμία πιστοποίηση ασφάλειας και τίποτα εδώ δεν πρέπει να διαβαστεί ως τέτοια. Ποια προσωπικά δεδομένα επεξεργάζονται και με ποια νομική βάση, αυτό αποτελεί αντικείμενο της πολιτικής απορρήτου, η οποία είναι ξεχωριστή σελίδα.
Πού εκτελείται το φιλοξενούμενο προϊόν
Το Nessie Cloud εκτελείται σε ευρωπαϊκούς παρόχους φιλοξενίας — Scaleway, Hetzner και άλλους. Επιλέγουμε την καλύτερη υπηρεσία που προσφέρει ο καθένας, ώστε διαφορετικά μέρη του προϊόντος να τρέχουν σε διαφορετικούς παρόχους, όλους στην Ευρώπη.
Οτιδήποτε πιο συγκεκριμένο — ένας συγκεκριμένος χώρος, μια πόλη ή ένα κέντρο δεδομένων — δεν αναφέρεται εδώ σκόπιμα, επειδή θα έπαυε να ισχύει χωρίς να το πάρει κανείς είδηση.
Με την αυτοφιλοξενία η επιλογή είναι στα χέρια σας
Το πού εκτελείται μια εγκατάσταση αυτοφιλοξενίας είναι ρύθμιση της ανάπτυξης (deployment), όχι ρύθμιση του προϊόντος. Η διαδρομή για ένα μόνο μηχάνημα είναι μια στοίβα Docker Compose που τοποθετείτε σε μηχάνημα της επιλογής σας. Στο δέντρο Terraform για διαχειριζόμενο cloud, η περιοχή είναι είσοδος χωρίς καμία προεπιλογή: τίποτα εκεί δεν μπορεί να μαντευτεί, άρα τίποτα εκεί δεν έχει προεπιλογή, και η βάση δεδομένων, ο κάδος αποθήκευσης αντικειμένων και οι υπηρεσίες ακολουθούν όλα την περιοχή που θα ορίσετε.
Δύο δομικές λεπτομέρειες έχουν σημασία για το ίδιο ερώτημα. Η ουρά και η μεταφορά πραγματικού χρόνου είναι και οι δύο PostgreSQL — δεν υπάρχει Redis ούτε broker μηνυμάτων στη διαδρομή, άρα δεν υπάρχει τρίτο σύστημα να τοποθετηθεί. Και η αποθήκευση αντικειμένων είναι συμβατή με S3 και δεν δένεται με έναν μόνο προμηθευτή· η υλοποίηση αναφοράς εκτελεί το MinIO σε container σε ιδιωτικό δίκτυο, χωρίς δική του είσοδο από έξω. Τα μέρη που πρέπει να βρίσκονται κάπου είναι η βάση δεδομένων, ο χώρος αποθήκευσης αντικειμένων και οι δύο υπηρεσίες Node, και όλα βρίσκονται εκεί όπου τα τοποθετείτε εσείς. Πώς στήνεται αυτό περιγράφεται στη σελίδα εγκατάστασης.
Τι κρατά το Nessie — και τι σκόπιμα δεν κρατά
Η ταυτότητα δεν αντιγράφεται
Με τη σύνδεση UnlikeOtherAI, ο πάροχος ταυτότητας διαχειρίζεται και αποθηκεύει την ανθρώπινη ταυτότητα — παράγοντες ελέγχου ταυτότητας, προφίλ, συμμετοχή σε οργανισμούς και ομάδες, και προσκλήσεις. Το Nessie είναι relying party, όχι δεύτερο σύστημα ταυτότητας. Είναι απόφαση για τα δεδομένα όσο και αρχιτεκτονική απόφαση: μια ταυτότητα που το Nessie δεν αποθηκεύει ποτέ είναι μια ταυτότητα που δεν μπορεί να διαρρεύσει, να χαθεί ή να μη διαγραφεί.
Ο πίνακας users κρατά στην πράξη το σταθερό αναγνωριστικό χρήστη του παρόχου — το κλειδί μέσω του οποίου επιλύονται όλα τα υπόλοιπα —, τη διεύθυνση email, ένα μη κυρίαρχο αντίγραφο του ονόματος εμφάνισης και της εικόνας προφίλ, και πεδία τοπικά για το προϊόν (προτιμήσεις, αντωνυμίες, μια έκδοση token που χρησιμεύει στην ανάκληση συνεδριών). Το αντίγραφο υπάρχει μόνο ώστε να εμφανίζονται όνομα και εικόνα χωρίς αίτημα ανά γραμμή, και ανασυγχρονίζεται από τους επαληθευμένους ισχυρισμούς (claims) του παρόχου κατά τη σύνδεση, κατά την αλλαγή ομάδας και κατά την ανανέωση της συνεδρίας. Τίποτα δεν κατασκευάζει τιμές: ένα άτομο που ο πάροχος δεν έχει ονομάσει εμφανίζεται με τη διεύθυνση email του, μέχρι να το κάνει. Ένα hash κωδικού υπάρχει μόνο για τον αρχικό κάτοχο (bootstrap owner) μιας εγκατάστασης χωρίς κανέναν πάροχο ταυτότητας.
Το ίδιο ισχύει και για τη δομή. Ένας οργανισμός του παρόχου αντιστοιχεί σε έναν οργανισμό Nessie, δεμένο με το αναγνωριστικό οργανισμού του παρόχου· μια ομάδα χωρίς σύνδεση με τον πάροχο απαντά με 404 TEAM_NOT_LINKED αντί να καταφύγει σε τοπική εικασία, και η ζωντανή ανάγνωση του καταλόγου μελών απευθύνεται στον πάροχο ταυτότητας και δεν αποθηκεύει τίποτα.
Δύο αντίγραφα δεν έχουν καταργηθεί ακόμη, και θα ήταν ανέντιμο να υπονοήσουμε το αντίθετο. Τα ονόματα των οργανισμών και των ομάδων αποθηκεύονται ακόμη τοπικά δίπλα στα αναγνωριστικά σύνδεσης, και οι τοπικές εγγραφές συμμετοχής εξακολουθούν να εξουσιοδοτούν τα συνηθισμένα αιτήματα ανάμεσα στους συγχρονισμούς. Η κατάργηση και των δύο είναι ανοιχτή, καταγεγραμμένη εργασία στο αποθετήριο και όχι κάτι που έχει ήδη ολοκληρωθεί.
Τίποτα εμπορικό
Την πληρωμή των χρεώσεων διαχειρίζεται η κεντρική υπηρεσία χρέωσης. Το Nessie δεν αποθηκεύει καμία κατάσταση παρόχου πληρωμών — πελάτη, συνδρομή, τιμολόγιο, τιμή, υπόλοιπο πίστωσης, πολιτική αναπλήρωσης (top-up), συγκατάθεση πληρωμής, κατάσταση κινήσεων ή ακύρωση — και δεν υπολογίζει χρεώσεις. Διαβάζει έτοιμες προς εμφάνιση τιμές και τις εμφανίζει.
Μυστικά
Για να αποθηκευτεί οποιοδήποτε μυστικό απαιτείται ρυθμισμένο vault. Σκόπιμα δεν υπάρχει εφεδρική λύση στη βάση δεδομένων ούτε διαδρομή σε απλό κείμενο: χωρίς vault, η αποθήκευση, η εναλλαγή και η ανάκληση ενός μυστικού επιστρέφουν σφάλμα αντί να υποβαθμιστούν σε κάτι λιγότερο ασφαλές. Οι δικές του εγγραφές του Nessie για ένα μυστικό δεν περιέχουν τιμή, κρυπτογραφημένο κείμενο, κλειδί ή token του vault — μόνο μια αδιαφανή αναφορά και τα μεταδεδομένα της — και οι διαδρομές στο vault κατασκευάζονται μόνο από δομικά αναγνωριστικά, ποτέ από το όνομα οργανισμού, ομάδας, έργου ή ατόμου.
Τα διαπιστευτήρια που το Nessie πρέπει να κρατά το ίδιο για να ενεργεί ως πελάτης OAuth — διαπιστευτήρια συνδέσεων και γραμματοκιβωτίων, μυστικά webhook, υλικό ανανέωσης συνεδριών, φορτία εκτελεστή — σφραγίζονται σε φακέλους AES-256-GCM δεσμευμένους σε συγκεκριμένο σκοπό, υπό μια κλειδοθήκη με εκδόσεις που είναι ξεχωριστή ρίζα από το μυστικό υπογραφής των συνεδριών, με τεκμηριωμένη διαδικασία εναλλαγής.
Υπάρχει και ένας κανόνας για τα μοντέλα: ένα μυστικό μπορεί να είναι γνωστό ότι υπάρχει και μπορεί να έχει εξουσιοδοτηθεί για χρήση, αλλά το υλικό του μυστικού δεν επιτρέπεται να εισέλθει στο context του μοντέλου, στα prompts, στα ορίσματα εργαλείων, στα αποτελέσματα εργαλείων, στη μνήμη, στα embeddings, στην αναζήτηση, στα αρχεία καταγραφής ή στα μηνύματα. Ένας πράκτορας μπορεί να λάβει την ικανότητα να χρησιμοποιεί ένα μυστικό. Δεν μπορεί ποτέ να λάβει την ικανότητα να αποκαλύπτει ένα.
Το αν οι υποκείμενοι δίσκοι είναι κρυπτογραφημένοι είναι ιδιότητα του μηχανήματος στο οποίο εκτελείται μια ανάπτυξη. Το αποθετήριο δεν τεκμηριώνει κρυπτογράφηση σε επίπεδο τόμου για τους τόμους της βάσης δεδομένων και της αποθήκευσης αντικειμένων, γι' αυτό η σελίδα δεν ισχυρίζεται κάτι τέτοιο.
Απομόνωση ενοικιαστών (tenants)
Το Nessie είναι εκ σχεδιασμού πολυ-ενοικιαστικό (multi-tenant): μία βάση δεδομένων, όπου κάθε γραμμή ανήκει σε ακριβώς έναν οργανισμό και κάθε θυγατρικός πίνακας φέρει ένα organization_id. Η απομόνωση επιβάλλεται σε δύο σημεία — στη ρήτρα εμβέλειας που φέρει κάθε ερώτημα και στα πραγματικά ξένα κλειδιά (foreign keys) πάνω σε αυτή τη στήλη, που προστέθηκαν με σαράντα δύο περιορισμούς αφού ένας εσωτερικός έλεγχος διαπίστωσε ότι η στήλη υπήρχε αλλά δεν είχε περιορισμούς σε δεκάδες πίνακες.
Μια σουίτα συμμόρφωσης (conformance) κρατά αυτό το αναλλοίωτο στη θέση του στο όριο HTTP. Δημιουργεί έναν επιτιθέμενο με μέγιστα προνόμια — πλήρη κάτοχο του δικού του οργανισμού — και ελέγχει ότι κάθε κανονική ανάγνωση πόρων άλλου οργανισμού απαντά 403, 404 ή κενό, και ότι κάθε κανονική μεταβολή απορρίπτεται χωρίς να αγγιχτεί η γραμμή του άλλου οργανισμού. Καλύπτει κανάλια, εγκρίσεις, το ίχνος ελέγχου, triggers, πράκτορες και τις συνδέσεις τους, εκτελέσεις, έργα, εργασίες, νήματα, συνδέσεις, εγκαταστάσεις ροών εργασίας, στιγμιότυπα MCP, τη βάση γνώσεων και ειδοποιήσεις.
Για να είμαστε ακριβείς ως προς τον μηχανισμό: πρόκειται για επιβολή σε επίπεδο εφαρμογής συν ξένα κλειδιά, όχι για ασφάλεια σε επίπεδο γραμμής (row-level security) της PostgreSQL. Δεν υπάρχει πολιτική RLS ούτε δίχτυ ασφαλείας από την πλευρά της βάσης δεδομένων, και η σουίτα συμμόρφωσης εκτελείται σε μια πιστή αποθήκη στη μνήμη και όχι σε ζωντανή βάση δεδομένων, επομένως αποδεικνύει τις ρήτρες εμβέλειας που γράφει ο κώδικας και όχι την SQL που εκτελεί ένας διακομιστής. Το αποθετήριο το αναφέρει στη δική του τεκμηρίωση της σουίτας, και το ίδιο κάνει και αυτή η σελίδα.
Το ίχνος ελέγχου
Κάθε σημαντική ενέργεια καταγράφεται: ποιος ενήργησε και με ποια ιδιότητα — άνθρωπος, πράκτορας, υπηρεσία — τι έκανε, σε ποιον πόρο, σε ποιον οργανισμό, έργο, ομάδα ή κανάλι, αν πέτυχε ή απορρίφθηκε, γιατί, καθώς και το αναγνωριστικό αιτήματος, τη διεύθυνση και τον user agent με τα οποία έφτασε.
Το αρχείο είναι εκ σχεδιασμού μόνο για προσθήκη (append-only) και δεν υπάρχει τρόπος να γραφτεί σε αυτό απ’ έξω: το POST /api/audit-log δεν υπάρχει, και αυτό είναι σκόπιμο. Οι εγγραφές είναι αλυσιδωτές — καθεμία φέρει ένα αποτύπωμα (digest) SHA-256 των δικών της κανονικοποιημένων πεδίων συν το αποτύπωμα της προηγούμενης εγγραφής για τον ίδιο οργανισμό — έτσι μια τροποποιημένη ή αφαιρεμένη γραμμή σπάει την αλυσίδα και ανιχνεύεται. Ένας ιδιοκτήτης ή διαχειριστής του οργανισμού μπορεί να διατρέξει την αλυσίδα όποτε θέλει και ενημερώνεται πού έσπασε για πρώτη φορά, αν έσπασε.
Δύο ειλικρινείς επιφυλάξεις. Η αλυσίδα κάνει το αρχείο ανιχνεύσιμο ως προς την παραποίηση, όχι άτρωτο σε αυτήν: δεν υπάρχει ανάκληση δικαιώματος εγγραφής σε επίπεδο βάσης δεδομένων ούτε αποθήκευση write-once πίσω από αυτό, επομένως η εγγύηση είναι ανίχνευση και όχι πρόληψη. Και οι εγγραφές διατηρούνται επ' αόριστον από προεπιλογή — η ρυθμιζόμενη διατήρηση με εξαγωγή πριν από τη διαγραφή έχει σχεδιαστεί, δεν έχει υλοποιηθεί. Οι εγγραφές απαγορεύεται επίσης να φέρουν μυστικά ή πλήρη σώματα αιτημάτων, και ένα σταθερό σύνολο ευαίσθητων ονομάτων πεδίων μεταδεδομένων αποκρύπτεται κατά την εισαγωγή.
Το καθολικό κόστους
Κάθε κλήση μοντέλου καταγράφεται στον οργανισμό, καθώς και στον χρήστη, την ομάδα, το έργο, το κανάλι, τον πράκτορα και την εκτέλεση από την οποία προήλθε, με τα tokens που κατανάλωσε, ενώ το κόστος που δήλωσε ο πάροχος και η δική του εκτίμηση του Nessie διατηρούνται δίπλα-δίπλα. Μια μετρική που ο πάροχος δεν δηλώνει αποθηκεύεται ως null και όχι ως εικασία. Οι αναφορές είναι αναγνώσιμες από έναν ιδιοκτήτη ή διαχειριστή του οργανισμού.
Το καθολικό αυτό είναι λειτουργική τηλεμετρία — τι ξόδεψε ένας οργανισμός και για λογαριασμό ποιου. Δεν είναι τιμολόγιο και δεν αποτελεί αρχή χρέωσης.
Τρίτα μέρη, όταν χρησιμοποιείτε το φιλοξενούμενο προϊόν
Μια φιλοξενούμενη ανάπτυξη επικοινωνεί με ένα μικρό, σταθερό σύνολο υπηρεσιών. Η κίνηση προς τα μοντέλα και η αναζήτηση στον ιστό δεν πηγαίνουν απευθείας στους παρόχους: και τα δύο εξέρχονται μέσω μιας πύλης που λειτουργεί η UnlikeOtherAI, όπου βρίσκονται οι πάροχοι μοντέλων και αναζήτησης. Η σύνδεση και η χρέωση πηγαίνουν στον authenticator της UnlikeOtherAI. Το vault μυστικών αυτοφιλοξενείται δίπλα στην εφαρμογή. Οι σύνδεσμοι βιντεοκλήσεων που δημιουργεί ο διακομιστής χρησιμοποιούν από προεπιλογή τη δημόσια υπηρεσία Jitsi.
Σχεδόν όλα τα υπόλοιπα είναι απενεργοποιημένα μέχρι να τα ρυθμίσει ένας διαχειριστής, και το δηλώνουν ρητά αντί να αποτυγχάνουν σιωπηλά: συνδεδεμένοι λογαριασμοί Google, Microsoft και Slack· email πράκτορα μέσω Amazon SES, το οποίο μια ανάπτυξη εκτελεί στον δικό της λογαριασμό χωρίς ενδιάμεσο· push για κινητά και προγράμματα περιήγησης· συνδέσεις έρευνας και πηγών πίνακα· προγράμματα περιήγησης στο cloud. Δύο λεπτομέρειες αξίζει να αναφερθούν, επειδή αλλάζουν το πού πηγαίνουν τα δεδομένα:
- Τα συνδεδεμένα γραμματοκιβώτια μένουν στον πάροχό σας. Η αλληλογραφία διαβάζεται ζωντανά από τον πάροχό σας, μέσω IMAP και SMTP ή της δικής του σύνδεσης· το Nessie αποθηκεύει το σφραγισμένο διαπιστευτήριο και τίποτα άλλο για τον λογαριασμό. Ένα γραμματοκιβώτιο που συνδέετε στα εισερχόμενα Clients αποτελεί εξαίρεση: ζητάτε οι συνομιλίες του να φυλάσσονται μαζί με κάθε πελάτη, γι’ αυτό αντιγράφονται.
- Οι φωνητικές κλήσεις στην εφαρμογή δεν περνούν από το Nessie. Το API μεσολαβεί για ένα διαπιστευτήριο και ο πελάτης ανοίγει ο ίδιος τη σύνδεση ήχου. Η υπαγόρευση και οι τηλεφωνικές κλήσεις διαφέρουν: ο ήχος τους περνά μέσω του Nessie προς τους παρόχους ομιλίας και μοντέλων που τον επεξεργάζονται.
Μια λεπτομέρεια για την εξαγωγή συμπερασμάτων (inference) ακολουθεί την ίδια αρχή: οι υπογεγραμμένες κεφαλίδες ταυτότητας του καλούντος στέλνονται μόνο στον ρυθμισμένο κεντρικό υπολογιστή συνομιλίας (chat host), ώστε η στόχευση των embeddings σε διαφορετικό endpoint να μη δίνει ποτέ σε εκείνο το endpoint μια δήλωση εξουσιοδότησης για το άτομο του οποίου το κείμενο μετατρέπεται σε embeddings.
Το φιλοξενούμενο προϊόν χρησιμοποιεί διάφορους παρόχους inference και επιλέγει ανάμεσά τους με κριτήριο το κόστος και την ποιότητα. Ένας οργανισμός θα μπορεί να επιλέγει στο Admin ποιους παρόχους επιτρέπεται να χρησιμοποιούν οι πράκτορές του: μόνο δυτικούς, μόνο ευρωπαϊκούς, μόνο κινεζικούς ή χωρίς προτίμηση — τον πιο αποδοτικό πάροχο για κάθε εργασία. Μια εγκατάσταση αυτοφιλοξενίας επιλέγει μόνη της.
Αν το τρέξετε μόνοι σας, όλα αυτά αλλάζουν
Κάθε τρίτο μέρος παραπάνω είναι επιλογή ρύθμισης σε μια εγκατάσταση αυτοφιλοξενίας. Η εξαγωγή συμπερασμάτων μπορεί να στραφεί σε οποιοδήποτε endpoint συμβατό με OpenAI, ακόμη και σε ένα που βρίσκεται στο δικό σας υλικό. Οι συνδέσεις είναι απενεργοποιημένες εκτός αν τις ενεργοποιήσετε. Η σύνδεση UnlikeOtherAI είναι η υποστηριζόμενη διαδρομή, και μια ανάπτυξη χωρίς κανέναν πάροχο ταυτότητας λειτουργεί ως ένας μόνο μη δεσμευμένος οργανισμός με έναν αρχικό κάτοχο.
Αυτό είναι όλο το νόημα της διάταξης: το λογισμικό είναι το ίδιο, και οι αποφάσεις για το πού εκτελείται και σε τι μπορεί να φτάσει ανήκουν σε όποιον το εκτελεί. Η σελίδα εγκατάστασης εξηγεί πώς.