Η αρχιτεκτονική, χωρίς μυστήριαThe architecture, no mystery

Δεν πέφτει επειδή δεν κρέμεται από πουθενά. It does not fall over because it hangs off nothing.

Δεν χρειάζεται να είσαι μηχανικός για να διαβάσεις αυτή τη σελίδα. Είναι εδώ επειδή, όταν εμπιστεύεσαι σε ένα πρόγραμμα τα χρήματα μιας βραδιάς, δικαιούσαι να ξέρεις πώς είναι φτιαγμένο. You do not need to be an engineer to read this page. It exists because when you trust a program with a night's takings, you deserve to know how it is built.

Efaeto architecture: devices on the venue LAN talk to a local server; the cloud is optional ΤΟ ΜΑΓΑΖΙ ΣΟΥYOUR VENUE 192.168.x.x ΤαμείοTill tablet / laptop ΣερβιτόροιWaiters κινητάphones ΚουζίναKitchen οθόνη KDSKDS screen ΕκτυπωτέςPrinters ESC/POS WebSocket ΤΟΠΙΚΟΣ SERVERLOCAL SERVER mini PC · Windows · χωρίς ίντερνετmini PC · Windows · no internet Ουρά παραγγελιώνOrder queue μία τη φορά, πάνταone at a time, always Απόθεμα & τιμολόγησηStock & pricing ατομικές πράξεις, ακέραια λεπτάatomic writes, whole cents Βάση δεδομένωνDatabase ποτέ εκτεθειμένη στο δίκτυοnever exposed to the LAN Ημερολόγιο ελέγχουAudit log αλυσίδα που δεν σπάει σιωπηλάa chain that cannot break quietly Κόψε το καλώδιο του ίντερνετ εδώ. Τίποτα από τα παραπάνω δεν σταματά.Cut the internet cable here. Nothing above stops. προαιρετικόoptional efaeto.cloud Άδεια χρήσηςLicensing Αντίγραφα (κρυπτ.)Backups (encrypted) ΕνημερώσειςUpdates Τεχνικά σφάλματαTechnical errors Καμία παραγγελία,No orders, κανένας πελάτης.no customers.

Ένα διάγραμμα, μία ιδέα: όλη η δουλειά γίνεται μέσα στο πλαίσιο αριστερά. Το πλαίσιο δεξιά είναι βολικό, ποτέ απαραίτητο. One diagram, one idea: all the work happens inside the left box. The right box is convenient, never required.

Οι πέντε αποφάσειςThe five decisions

Πέντε επιλογές που κάνουν όλη τη διαφορά.Five choices that make the whole difference.

Κάθε μία λύνει ένα πρόβλημα που κάποιος πλήρωσε ακριβά πριν λυθεί.Each one solves a problem somebody paid for before it was solved.

1. Ο server ζει μέσα στο μαγαζί1. The server lives in the venue

Οι συσκευές δεν στέλνουν παραγγελίες στην άλλη άκρη της Ευρώπης για να γυρίσουν πίσω. Μιλούν με έναν υπολογιστή που βρίσκεται δέκα μέτρα μακριά, πάνω στο δικό σου WiFi. Γι’ αυτό η καθυστέρηση μετριέται σε χιλιοστά του δευτερολέπτου και όχι σε δευτερόλεπτα, και γι’ αυτό η πτώση του ίντερνετ είναι απλώς μια ενημέρωση στην οθόνη. Devices do not send orders to the other side of Europe and back. They talk to a computer ten metres away on your own WiFi. That is why latency is measured in milliseconds rather than seconds, and why an internet outage is merely a notice on the screen.

2. Ώθηση, όχι ερώτηση2. Push, not polling

Οι οθόνες δεν ρωτούν κάθε λίγο «έχει τίποτα καινούριο;». Ο server τους στέλνει την αλλαγή τη στιγμή που συμβαίνει, μέσα από μια μόνιμη σύνδεση. Έτσι η κουζίνα βλέπει την παραγγελία πριν προλάβει ο σερβιτόρος να κατεβάσει το χέρι του, και τριάντα συσκευές δεν πνίγουν το δίκτυο με ερωτήσεις. Screens do not keep asking "anything new?". The server pushes the change the instant it happens, over a persistent connection. The kitchen sees the order before the waiter has lowered their hand, and thirty devices do not drown the network in questions.

3. Μία παραγγελία τη φορά3. One order at a time

Είκοσι άνθρωποι μπορούν να πατήσουν «ολοκλήρωση» το ίδιο δευτερόλεπτο. Ο server τις βάζει σε σειρά και εκτελεί μία. Ακούγεται αργό, δεν είναι: η κάθε μία παίρνει χιλιοστά. Είναι όμως ο μόνος τρόπος να μη γίνει η τελευταία μερίδα δύο μερίδες, και να μη βγει το ίδιο νούμερο παραγγελίας δύο φορές. Twenty people can hit "complete" in the same second. The server lines them up and runs one. It sounds slow; it is not, since each takes milliseconds. But it is the only way the last portion never becomes two portions and the same order number never appears twice.

4. Τα χρήματα είναι ακέραια λεπτά4. Money is whole cents

Οι υπολογιστές δεν ξέρουν να προσθέτουν δεκαδικούς με ακρίβεια. Το κλασικό αποτέλεσμα είναι το ταμείο που στο τέλος της βραδιάς λείπει ένα λεπτό, και μετά δύο. Στο Efaeto κάθε ποσό είναι ακέραιος αριθμός λεπτών από την αρχή μέχρι το τέλος. Τα ευρώ υπάρχουν μόνο για να τα διαβάζεις. Computers cannot add decimals precisely. The classic result is a drawer that is one cent short at closing, then two. In Efaeto every amount is a whole number of cents from beginning to end. Euros exist only so you can read them.

5. Η τιμή έρχεται από τη βάση, ποτέ από τη συσκευή5. Price comes from the database, never the device

Το κινητό λέει «θέλω δύο σουβλάκια», όχι «θέλω δύο σουβλάκια προς ένα ευρώ». Η τιμή, οι προσθήκες και ο ΦΠΑ υπολογίζονται στον server από τον επίσημο κατάλογο. Ένα πειραγμένο κινητό ή ένα σφάλμα στην εφαρμογή δεν μπορούν να αλλάξουν ποσό. The phone says "two souvlakia", not "two souvlakia at one euro". Price, add-ons and VAT are computed on the server from the official catalogue. A tampered phone or an app bug cannot change an amount.

+ Η ουρά που σώζει τη βραδιά+ The outbox that saves the night

Αν κοπεί το WiFi στη μέση, η παραγγελία γράφεται πρώτα στη συσκευή του σερβιτόρου και μόνο μετά καθαρίζει το καλάθι. Όταν γυρίσει το σήμα, φεύγουν όλες με τη σειρά που πάρθηκαν, καθεμιά με μοναδικό κλειδί ώστε να μην καταχωρηθεί δύο φορές. Αυτό που δεν κάνει: η κουζίνα δεν βλέπει τίποτα όσο είσαι εκτός. Το λέμε καθαρά, γιατί δεν γίνεται αλλιώς. If the WiFi drops mid-service, the order is written to the waiter's device first and only then does the cart clear. When signal returns they all flush in the order they were taken, each with a unique key so nothing is entered twice. What it does not do: the kitchen sees nothing while you are offline. We say that plainly, because there is no way around it.

Τι τρέχει από κάτωWhat runs underneath

Βαρετές, δοκιμασμένες τεχνολογίες.Boring, proven technology.

Τίποτα πειραματικό σε μηχάνημα που κρατά τα λεφτά μιας βραδιάς.Nothing experimental on a machine holding a night's takings.

Node.js
Ο server. Ένα νήμα, χιλιάδες ταυτόχρονες συνδέσεις, χωρίς κατανάλωση μνήμης ανά συσκευή.The server. One thread, thousands of concurrent connections, no memory cost per device.
Socket.IO
Η μόνιμη σύνδεση με αυτόματη επανασύνδεση, δοκιμασμένη σε κακό WiFi και σε iOS που κλειδώνει οθόνη.The persistent link with automatic reconnect, proven on bad WiFi and on iOS screen lock.
MongoDB
Η βάση. Ατομικές αυξομειώσεις αποθέματος σε επίπεδο βάσης, ώστε να μη χρειάζεται η εφαρμογή να «προσέχει».The database. Atomic stock increments at database level, so the application never has to "be careful".
React
Το περιβάλλον χρήσης. Ανοίγει στον browser κάθε συσκευής, χωρίς εγκατάσταση και χωρίς app store.The interface. Opens in the browser of any device, with no install and no app store.
Windows Service
Το σύστημα ξεκινά με το μηχάνημα και επανεκκινεί μόνο του, χωρίς να χρειάζεται κάποιος να ανοίξει παράθυρο.The system starts with the machine and restarts itself, with nobody needing to open a window.
ESC/POS + CP737
Το πρωτόκολλο των θερμικών εκτυπωτών, με τη σωστή κωδικοσελίδα ώστε τα ελληνικά να είναι ελληνικά.The thermal printer protocol, with the correct codepage so Greek prints as Greek.
Ed25519 / X25519
Υπογραφές για τις ενημερώσεις και τις άδειες, κρυπτογράφηση για τα αντίγραφα ασφαλείας.Signatures for updates and licences, encryption for backups.
Caddy
Η μοναδική δημόσια πόρτα, με πιστοποιητικά που ανανεώνονται μόνα τους. Το μαγαζί δεν εκτίθεται ποτέ.The single public door, with certificates that renew themselves. The venue is never exposed.
ΑσφάλειαSecurity

Τι σημαίνει «ασφαλές» εδώ, στην πράξη.What "secure" actually means here.

Η επιφάνεια επίθεσης είναι ένα τοπικό δίκτυοThe attack surface is one local network

Το σύστημα δεν έχει δημόσια διεύθυνση. Για να το πλησιάσει κάποιος, πρέπει πρώτα να μπει στο WiFi του μαγαζιού σου. Η βάση δεδομένων δεν είναι προσβάσιμη ούτε από εκεί: ζει σε εσωτερικό δίκτυο που δεν βλέπουν τα tablet. The system has no public address. To reach it, someone must first be on your venue WiFi. The database is not reachable even from there: it lives on an internal network the tablets cannot see.

Κάθε σύνδεση ελέγχεται πριν σταλεί δεδομένοEvery connection is checked before data flows

Η μόνιμη σύνδεση πραγματικού χρόνου περνά από έλεγχο ταυτότητας πριν λάβει το πρώτο byte. Ένας διαχειριστής μπορεί να πετάξει έξω μια συσκευή αμέσως, χωρίς να περιμένει να λήξει κάποιο κλειδί. The persistent real-time connection passes authentication before receiving its first byte. An admin can eject a device immediately, without waiting for any token to expire.

Τα ευαίσθητα σημεία δεν αλλάζουν εύκολαSensitive code does not change casually

Η πιστοποίηση, η ουρά παραγγελιών, η αρίθμηση, το απόθεμα και η αλυσίδα ενημερώσεων είναι σημειωμένα ως προστατευμένες ζώνες. Καμία αλλαγή σε αυτά δεν περνά χωρίς ξεχωριστό έλεγχο, και κάθε μία έχει δικούς της αυτοματοποιημένους ελέγχους που τρέχουν σε κάθε αλλαγή του κώδικα. Authentication, the order queue, numbering, stock and the update chain are marked as protected zones. No change to them passes without a separate review, and each has its own automated tests that run on every code change.

Δεν χρειάζεται HTTPS μέσα στο μαγαζί, και εξηγούμε γιατίNo HTTPS inside the venue, and here is why

Ένα tablet στο 192.168.1.20 δεν μπορεί να πάρει πιστοποιητικό, γιατί κανείς δεν εκδίδει πιστοποιητικά για ιδιωτικές διευθύνσεις. Αντί να προσποιηθούμε ασφάλεια με αυτο-υπογεγραμμένα πιστοποιητικά που εκπαιδεύουν το προσωπικό να πατά «συνέχεια παρά τον κίνδυνο», κρατάμε το τοπικό δίκτυο απλό και βάζουμε τη σκληρή ασφάλεια εκεί που έχει νόημα: στην πόρτα προς το ίντερνετ, όπου όλα είναι κρυπτογραφημένα και επιβεβλημένα. A tablet at 192.168.1.20 cannot obtain a certificate, because nobody issues certificates for private addresses. Rather than fake security with self-signed certificates that train staff to click "proceed anyway", we keep the LAN simple and put the hard security where it counts: at the door to the internet, where everything is encrypted and enforced.

Τι φεύγει από το μαγαζί σου, ακριβώς:
· παλμός άδειας χρήσης (αναγνωριστικό εγκατάστασης, έκδοση, ώρα)
· τεχνικά σφάλματα, περασμένα από φίλτρο που αφαιρεί ονόματα, τηλέφωνα και διευθύνσεις
· κρυπτογραφημένα αντίγραφα ασφαλείας, αν τα ενεργοποιήσεις

Τι δεν φεύγει ποτέ: παραγγελίες, ονόματα πελατών, ποσά, στοιχεία προσωπικού, διευθύνσεις συσκευών.
Exactly what leaves your venue:
· a licence heartbeat (install id, version, timestamp)
· technical errors, filtered to strip names, phone numbers and addresses
· encrypted backups, if you enable them

What never leaves: orders, customer names, amounts, staff records, device addresses.
Τι χρειάζεσαιWhat you need

Ο εξοπλισμός, χωρίς μαγικά.The hardware, with no magic.

Ένας μικρός υπολογιστήςOne small computer

Windows 11, 8 GB μνήμη, δίσκος SSD. Ένα mini PC των τριακοσίων ευρώ αρκεί για μαγαζί με τριάντα συσκευές. Ιδανικά με UPS, ώστε μια στιγμιαία διακοπή να μη σβήσει τίποτα.Windows 11, 8 GB of memory, an SSD. A three-hundred-euro mini PC handles a venue with thirty devices. Ideally on a UPS, so a momentary cut turns nothing off.

Ένα καλό routerOne decent router

Αποκλειστικό WiFi για τη δουλειά, ξεχωριστό από αυτό των πελατών. Σε μεγάλο χώρο, δύο σημεία πρόσβασης. Δεν χρειάζεται σύνδεση στο ίντερνετ για να δουλέψει.A dedicated work WiFi, separate from the guest one. In a large space, two access points. No internet connection is required for it to work.

Ό,τι συσκευές έχεις ήδηWhatever devices you own

Κινητά, tablet, laptop, οθόνη αφής. Οτιδήποτε έχει σύγχρονο browser. Προαιρετικά, θερμικοί εκτυπωτές δικτύου για τα δελτία και τις αποδείξεις.Phones, tablets, laptops, a touchscreen. Anything with a modern browser. Optionally, network thermal printers for tickets and receipts.

Θέλεις να το δεις να τρέχει;Want to see it running?

Στην επίδειξη κόβουμε επίτηδες το δίκτυο μπροστά σου και συνεχίζουμε να παίρνουμε παραγγελίες. Είναι το πιο πειστικό μέρος της συζήτησης. In the demo we deliberately cut the network in front of you and keep taking orders. It is the most convincing part of the conversation.