A Predor, az Attendance Manager, meg az enterprise-szintű munkaidő-nyilvántartók pontos árát sose láttad egy honlapon. A pitch-deckjüket igen, a „kérjen árajánlatot" gombot is — és utána három hét kalkuláció meg 40 oldalas szerződés, mielőtt az első dolgozó lehúzhatná a kártyáját. Egy 8 fős ügyvédi iroda vagy egy 15 fős fogorvosi rendelő ezt végig se csinálja. Excel-táblát vezet. Vagy semmit.

Ezért építettem a Csekkert. Fix ár, fix funkció, egy hét alatt telepítjük, és minden ügyfél adatai a saját irodájában maradnak. On-prem. Nincs cloud. Nincs „kinek az AWS-én van a dolgozóid adata" kérdés.

Az alapfeladat röviden

A dolgozó odamegy a terminálhoz az ajtónál, a kártyáját hozzáérinti a panelhez, a készülék sípol, a képernyő „Szia Kovács Anna, 8:12" kiírja. Ennyi. A háttérben a rendszer elintézi, hogy:

Az admin-web böngészőben nyílik — a főnök láthatja élesben hogy éppen ki van bent, szerkesztheti a dolgozókat, műszakokat, kártyákat, és letöltheti a havi összesítőt. Ennyi az egész funkció-terjedelem. Ami van, az jól van. Ami nincs, az azért nincs, mert nem kell.

Hardware amit megfizethet

Minden ügyfélhez két dolog megy:

  1. Egy Raspberry Pi 5 szerver — 8 GB RAM, NVMe HAT, 256 GB SSD, UPS HAT, egyedi 3D nyomtatott ház. A Pi fut Ubuntu Server-en, rajta egy Docker Compose stack (PostgreSQL, FastAPI backend, Caddy reverse proxy, Mosquitto MQTT). Anyagköltség ~60-80 000 Ft.
  2. 1-2 ESP32-P4 terminál az ajtóhoz — Guition JC4880P443C fejlesztőpanel, 4.8" 480×480 IPS kijelzővel, GT911 érintőpanellel, PN532 NFC olvasóval I2C-n, ESP32-C6 WiFi co-processzorral. Anyagköltség ~15-20 000 Ft/db.
89k
Ft egyszeri ár a 10 fős csomagnál
1 hét
alatt telepítve, működve
50 fő
maximum létszám egy csomagban

Miért ESP32-P4?

Ez egy új MCU az Espressif-től — 400 MHz dual-core RISC-V, MIPI DSI kijelző-interfész (nincs többé SPI-s pixel-shovelés), és egy külső ESP32-C6 WiFi co-processzor SDIO-n, mert a P4-ben magában nincs WiFi. Első ránézésre bonyolult, de cserébe kap az ember egy valódi kijelzős UX-et amit LVGL-lel szabadon rajzolhatsz, és egy nagyjából zavaratlan fő-CPU-t a logikához.

A WiFi co-processor trükkös része az esp_hosted protokoll — az ESP-IDF v5.5 hivatalosan támogatja, és SDIO-n keresztül a C6 ugyanúgy viselkedik, mintha egy soros WiFi modul lenne a P4 oldalán. A sdkconfig-ban pár flaget bekapcsolsz, és működik. Ezt 2024-ben még nem lehetett így kényelmesen csinálni.

A telepítés onboarding nélkül

Ügyfélnél a terminált bekapcsoljuk. Mivel még nincs WiFi konfig, automatikusan captive portál AP módba megy — a telefonoddal csatlakozol rá (SSID: csekker-setup), megnyílik a beállító lap, beírod a hálózat SSID-jét, jelszót, és opcionálisan a szerver IP-jét (ha nem akarod az mDNS-re bízni). A terminál elmenti NVS flash-be, újraindul.

A Pi szerver ezalatt avahi-n hirdeti magát az mDNS-en (csekker.local). A terminál bootkor először megpróbálja a mDNS-discovery-t, 5 próbálkozás után fallback-el az NVS-ben lementett IP-re. Ez a „csak működjön" beállítás — nem kell az ügyfélnek hálózati tudás, nem kell DHCP reservation.

Tanulság

A mDNS + NVS fallback kombó azért jó, mert ha az ügyfél LAN-ja átkonfigurálódik (router csere, új IP tartomány), a terminál magától megtalálja a szervert az új címen. És ha az mDNS mégsem megy valami miatt (vannak router-ek amik blokkolják a multicastet), akkor is van fallback.

NFC — a MIFARE okos elég

A PN532 olvasó I2C-n beszél a P4-el. MIFARE Classic kártyák UID-jét olvassa ki — nem használok semmilyen belső szektor-adatot, csak a 4 vagy 7 byte-os UID-t. Ez elég, mert a szerver oldalon a UID-hoz tartozó dolgozó a DB-ben van bekötve.

A biztonsági szempontból kritikus dolog ilyenkor: a MIFARE Classic UID klónozható. Egy támadó elkaphatja és duplikálhatja a kártyát. Ezért ez nem egy beléptető rendszer — nem arra való, hogy szigorúan eltiltsa a bejutást a páncélszobába. Egy munkaidő-nyilvántartó. Ha valaki hamisít, akkor is a saját kártyáját fogja hamisítani — mert ugyan minek hamisítaná a kollégáét?

Ez fontos distinkció, és a pitch-deckben is ezt tisztázom: a Csekker egy riport-szintű rendszer, nem egy biztonsági rendszer.

A Docker Compose egyetlen komfort-döntés

A teljes backend egy docker compose up -d parancs — PostgreSQL, FastAPI (Python 3.12), Caddy, Mosquitto, admin-web (React + Vite). Az ügyfélnek annyit kell csinálnia:

git clone https://github.com/gaberun24/csekker.git /opt/csekker
cd /opt/csekker
cp .env.example .env
nano .env   # ügyfél adatok
docker compose up -d

A Caddy automatikusan intéz egy Let's Encrypt certet a saját domain-jére (pl. csekker.ugyvediodr.hu), ha van domain-je, vagy marad HTTP LAN-on belül. A backend async SQLAlchemy-val fut, a frontend egy egyszerű SPA Vite build-del.

Árazás ami átlátszó

Mivel az a legnagyobb bosszúságom a versenytársakkal, a honlapon kint van az összes csomag minden díja, előre:

Minden csomag ugyanazt a funkcionalitást tudja. A létszám-limit a DB-ben van, a funkciók nem. Nincs „de a havi export már az Iroda+ csomagban van" trükközés.

Amit nem építek bele

Legalább annyi fontos meghatározni mit nem tud a Csekker. Nem fog:

Ez direkt szűk fókusz. A kis iroda azért nem használ Predort, mert nem kell neki 99% a funkcionalitásából. Akkor nem is adom el neki.

Kinek lehet érdekes?

Zalaegerszeg és környéke az indulópont — könyvelőirodák, ügyvédi és mérnöki irodák, fogorvosi rendelők, magánklinikák, kis IT cégek. Ha ilyen vagy és most excel-táblát használsz hozzá, vagy körbekérdezed a kollégát „mikor jöttél be?" — írj egy emailt. Elviszem a hardvert, feltelepítem, megtanítom a kezelést egy délelőtt alatt.

A kis cégek nem rossz ügyfelek. Csak senki nem épít nekik olyat, amit meg tudnak fizetni és fel tudnak használni.