| Bérlő neve | Státusz | Regisztráció | Műveletek |
|---|---|---|---|
| Betöltés... | |||
| Cég / bérlő | Kapcsolattartó | Csomag | Előfizetés | Használat | Regisztráció | Műveletek |
|---|---|---|---|---|---|---|
| Betöltés... | ||||||
| Csomag | Verzió | Limitek | Funkciók | Havi / éves ár | Előfizetők | Állapot | Művelet |
|---|---|---|---|---|---|---|---|
| Betöltés... | |||||||
| Kép/Videó | Hirdetés Név | Típus | Célcsoport (Cég) | Időtartam | Státusz | Műveletek |
|---|---|---|---|---|---|---|
| Betöltés... | ||||||
| Bérlő (Cég) | Eszköz Név | Kapcsolat | Player / Deployment | Kívánt → aktív kiadás | Haladás | Utolsó Életjel | Művelet |
|---|---|---|---|---|---|---|---|
| Betöltés... | |||||||
| Időpont | Bérlő | Felhasználó | Művelet | Típus | Részletek |
|---|---|---|---|---|---|
| Betöltés... | |||||
1. Többnyelvű Tartalom és HTML5 Sablonok Kezelése
Ez az útmutató leírja, hogyan lehet dinamikus, többnyelvű HTML5 sablonokat, illetve nyelvenként eltérő kép-, videó- és HTML média-változatokat beállítani a KioskPilot V3 rendszerben.
Működési Elv
A KioskPilot V3 egyetlen verziózott tartalommodellt használ. A többnyelvűség ugyanabban a ContentVersion rekordban, nyelvenkénti ContentVersionAsset kapcsolatokkal működik. HTML5 tartalomnál ugyanaz a fájl hash alapú nyelvátadást is kezelhet; képhez, videóhoz és HTML-hez nyelvenként külön média is rendelhető.
- A) Egyetlen HTML sablon: Egy adott kiállításhoz vagy szállodai információhoz elegendő egy darab HTML fájlt feltölteni. A képek, videók és a dizájn közösek, a szövegeket pedig maga a sablon vagy a sablonba ágyazott adat tartalmazza.
- Hash alapú nyelvátadás: A TV Player a sablon iframe címe végére fűzi az aktív nyelvet hashként, például
#lang=en. A sablon JavaScriptje figyeli ahashchangeeseményt, így a szöveg villódzás nélkül vált. - B) Nyelvenkénti média-változat: Kép, videó és HTML tartalom esetén a tartalomblokkhoz nyelvenként külön médiafájl rendelhető. Példa: magyar képhez angol kép, magyar videóhoz angol videó, magyar HTML-hez angol HTML.
- Típushelyes változatok: A szerkesztő képhez képet, videóhoz videót, HTML-hez HTML-t kínál nyelvi változatként. Ez azért fontos, mert a Player a bázis média típusához illeszkedő megjelenítő elemet használ.
A HTML5 Sablon Kód Felépítése
Minden többnyelvű sablonnak az alábbi JavaScript szerkezetet kell tartalmaznia a nyelvi váltás kezelésére:
<script>
// 1. Fordítási adatszerkezet
const translations = {
hu: {
title: "Üdvözöljük a Szállodánkban!",
desc: "Kérjük, válasszon nyelvet a mobilján."
},
en: {
title: "Welcome to Our Hotel!",
desc: "Please select a language on your mobile."
},
de: {
title: "Willkommen in unserem Hotel!",
desc: "Bitte wählen Sie eine Sprache auf Ihrem Mobiltelefon."
}
};
// 2. Nyelv beállítása a felületen
function applyLanguage() {
const hash = window.location.hash || '';
const match = hash.match(/lang=([a-z]{2})/);
const lang = (match && match[1]) ? match[1] : 'hu';
const data = translations[lang] || translations['hu'];
document.getElementById('title').textContent = data.title;
document.getElementById('desc').textContent = data.desc;
}
// 3. Eseményfigyelők regisztrációja
window.addEventListener('DOMContentLoaded', applyLanguage);
window.addEventListener('hashchange', applyLanguage);
</script>
Verziózott Tartalom és Nyelvi Assetek
A 020_template_content_versions.sql migráció bevezette a változtathatatlan kp_template_versions és kp_content_versions rekordokat, valamint a normalizált kp_content_version_assets nyelvi médiakapcsolatot. A nyelvi kép, videó, hang vagy HTML ebben a modellben nem fájlútvonalként, hanem tenant-scope-os media_id, locale és szerep alapján tartozik a tartalomverzióhoz. A négy rendszer-sablon publikált v1 verziója elkészült.
A Tenant App és a Content API kizárólag ezt a verziózott modellt írja. A gyökér kp_contents rekord az identitást és a draft/published mutatókat tartja; a tényleges tartalomadat a kp_content_versions.data_json, a média pedig a kp_content_version_assets.media_id kapcsolatban van. Fájlútvonalat nem mentünk fordításként.
Kanonikus API Példa
{
"name": "Múzeumi bemutató",
"templateVersionId": "publikalt-template-verzio-id",
"defaultLocale": "hu",
"fallbackLocale": "hu",
"channels": ["PLAYER"],
"dataJson": {
"fields": {},
"presentation": { "orientation": "PORTRAIT" }
},
"assets": [
{ "locale": "hu", "role": "PRIMARY", "mediaId": "magyar-media-id", "sortOrder": 0 },
{ "locale": "en", "role": "PRIMARY", "mediaId": "angol-media-id", "sortOrder": 0 },
{ "locale": "he", "role": "PRIMARY", "mediaId": "heber-media-id", "sortOrder": 0 }
]
}
Ha egy HTML fájl maga tartalmazza az összes fordítást, elegendő egy alapnyelvi PRIMARY asset. A Player az aktív nyelvet #lang=xx hashként adja át. Ha nyelvenként külön HTML készült, minden nyelv saját mediaId assetet kap.
A szerkesztői HTML előnézetek sandboxolt iframe-ben futnak (allow-scripts, referrer nélkül), hogy az egyedi HTML5 tartalom tesztelhető maradjon, de ne kapjon teljes szerkesztői oldal-hozzáférést. Teljes CSP/template CMS policy külön hardening döntés marad.
Visitor Remote Nyelvváltás
A látogatói távirányító csak akkor mutat nyelvválasztót, ha a visitor profilban engedélyezett a SWITCH_LANGUAGE action, és a tenant vagy device profil több támogatott nyelvet ad vissza.
A kpGo nyelvválasztó zászlóként jeleníti meg a támogatott nyelveket, a zászló alatt rövid locale-kóddal. Az aktív nyelv lime kiemelést, a folyamatban lévő váltás pulzáló keretet kap. HU, EN, DE, UA/UK, FR, ES, IT, RU, PL, EL, HE, SK, RO és ZH saját zászlóval rendelkezik; ismeretlen locale-nál földgömb látható. A teljes nyelvnév tooltipben és aria-label attribútumban megmarad, az aktív állapotot pedig aria-pressed is jelzi.
Nyelvváltáskor a kpGo PWA SWITCH_LANGUAGE parancsot küld, az API ellenőrzi az engedélyezett nyelveket, a Player pedig vagy nyelvi média-változatra vált, vagy HTML iframe esetén továbbadja a #lang=xx hash értéket.
A nyelvváltás nem optimista: a mobil a választott nyelvgombot folyamatban állapotban mutatja, de az aktív nyelvet csak a Player APPLIED ACK-ja után módosítja. Az API az alkalmazott eseményt az eredeti SENT payloadhoz kapcsolja, ezért a kért locale adatbázisban is megmarad. A sikeres snapshot egyszerre frissíti a kijelző tartalmi nyelvét, a Remote aktív nyelvgombját, a profil rendszergombjait és a Remote HU/EN kezelőfelületét. Folyamatban lévő nyelvparancsnál rövid, 800 ms-os célzott poll működik legfeljebb 12 másodpercig; utána a normál 10 másodperces állapotpoll marad. Automatizált ellenőrzés: npm run test:visitor-language-ack és npm run verify:surface-contract.
A POST /visitor/join és GET /visitor/session válasz kompatibilis felső szintű mezők mellett snapshot objektumot is ad: version, sequence, serverTime, state, currentLanguage, lastAction, controllerLease, controllerQueue és profile. A kpGo PWA ezt használja oldalfrissítés vagy hálózati reconnect után a nyelv, vezérlési jog, várólista és utolsó parancs állapotának visszaállítására.
A publikus visitor API alap védelmet is kapott: a POST /visitor/join IP-alapon 5 perces ablakban legfeljebb 20 próbálkozást enged, a POST /visitor/actions pedig visitor controllerenként 250 ms cooldown-t és 60 másodperces ablakban 90 parancsot enged. Limit esetén 429 és Retry-After fejléc érkezik.
A parancsok replay-védettek: a kpGo PWA minden POST /visitor/actions kéréshez clientActionId-t küld. Ugyanaz a clientActionId ugyanazzal a payload-dal idempotens választ ad (replayed: true), más payload-dal pedig 409 CLIENT_ACTION_REPLAY_MISMATCH választ kap, így egy hálózati újraküldés nem indítja el kétszer ugyanazt a kijelző-parancsot.
A staff beavatkozások auditáltak: a /visitor/sessions/:sessionId/pause, /resume és /end műveletek VISITOR_SESSION_PAUSED, VISITOR_SESSION_RESUMED és VISITOR_SESSION_ENDED_BY_STAFF audit eseményt írnak. A payload tartalmazza a sessiont, kijelzőt, előző és új állapotot, valamint a művelet staff forrását.
A Visitor Remote módok MVP-ben explicit scope-oltak: jelenleg csak a SINGLE_CONTROLLER támogatott, rövid lease-szel és várólistás átadással. A későbbi FREE_FOR_ALL, SHARED_CONTROL, VOTING, TEAM és COMPANION módok nem menthetők; az API 422 MODE_NOT_SUPPORTED választ ad. A profilválaszok modeCapabilities mezőben jelzik az effektív módot és képességeket.
A Visitor Remote regressziós smoke futtatható: npm run smoke:visitor-remote. Ez lefedi a TST-019..023 automatizált API/state/security kapukat, a TST-024 alap PWA/statikus előfeltételeit, a TST-025 navigációt és a TST-026 két böngésző-session közötti lejárt-lease átadást. A script futásonként izolált smoke kliens IP-t használ, hogy a saját join rate limit védelmünk ne zavarja a regressziós futást. A valós iOS/Android böngésző, zoom, képernyőolvasó és billentyűzet ellenőrzés továbbra is manuális kapu, amíg nincs Playwright vagy más böngésző runner telepítve.
Vezérlői lease és háttérben maradt böngésző: a GET /visitor/session állapotlekérés önmagában nem hosszabbítja meg a vezérlést. Így egy háttérben futó, de már nem használható régi böngésző nem tarthatja korlátlanul fogva a kijelzőt. A lease-t tényleges Remote parancs újítja meg; lejáratkor a várólista első még élő sessionje tranzakciósan, sorrendhelyesen lép elő. A régi vezérlő pollja nem ugorhat a várakozó elé. Ha nincs várakozó, a következő tényleges parancs újra megszerezheti a vezérlést. A Player a lease lejárata után visszaállítja a QR-kódot.
Kapcsolódási átmenet: a Player 3.0.15 a HTML-tartalomnak külön jelzi az új vezérlő tényleges átvételét és az alkalmazott Remote-parancsot. A MikroCsodák Sales Showcase 1.4.0 „A kijelző most a te kezedben van” visszajelzése legfeljebb 3 másodpercig látható, az első APPLIED parancsra azonnal eltűnik, és egy aktív lease alatti iframe- vagy nyelvi újratöltés nem indítja újra. Ez vizuális átmenet; nem maga a vezérlői jogosultság és nem hosszabbít lease-t.
Vegyes nyelv elkerülése: három külön réteget kell lokalizálni. A Player tulajdona a QR-kártya címe és Showcase CTA-ja; ezek HU/EN rendszer-fallbackje Vezesd a kijelzőt / Control the display és OLVASD BE MOST / SCAN NOW. A publikált Remote Profile headline-, helper- és rendszergomb-címkéi locale-mapek, a hiányzó érték a profil deklarált fallback nyelvét követi. A HTML-tartalom saját látható szövegeit maga a sablon váltja: a Sales Showcase 1.4.0-ban a telefon-grafika, a TV öt miniatűr ikonja, a QR biztonsági díszfelirata és a dokumentumcím is HU/EN. A Player által rajzolt QR-t nem szabad a tartalom HTML-jébe másolni.
A Tenant App tartalomblokk előnézete a verzió assets listájából dolgozik: több PRIMARY locale esetén nyelvválasztót mutat, és kép/videó/HTML esetén az adott nyelvhez rendelt mediaId tartalmát jeleníti meg.
MikroCsodák álló látogatói pilot
Az Álló totem oszlop 1080×1920-as kijelző alapképernyője a kétnyelvű MikroCsodák – Álló látogatói pilot 1.0.0. A lapozásmentes HU/EN bemutató három rövid lépésben magyarázza el a használatot: QR beolvasása, élmény választása a telefonon, majd megjelenítés a nagy kijelzőn. A petrol–arany oldal három meglévő múzeumi műtárgyképet és a hivatalos logót használja újra; új képduplikáció nem készül. A Player saját, élő COMPACT_CARD QR-kártyája az álló nézet jobb alsó biztonsági zónájában jelenik meg.
A Múzeumi látogatói távirányító v5 a mobilon HU/EN zászlóválasztót és kéthasábos, nagy érintési célokat mutat. A négy tartalomgomb: Kezdőképernyő / Home, Múzeumi történetek / Museum stories, Online kiállítás / Online exhibition és Rajzverseny / Drawing contest. Mindegyik SWITCH_RELEASE parancs: a Home újraindítja a pilot első elemét, a másik három a kiválasztott, publikált élményt tölti be. A nyelvi action külön gombként nem ismétlődik meg, mert a zászlós választó kezeli.
A vezérlői foglalás 45 másodperc, várólistával. Csak tényleges parancs hosszabbítja meg; a háttérben maradt telefon nem tartja korlátlanul fogva a kijelzőt. A session lezárásakor vagy lejáratakor a Player visszaáll az eredetileg hozzárendelt álló pilotra, nullázza az első elemet és ismét megjeleníti a QR-kódot. Helyszíni UAT: HU→EN zászló és teljes Remote-felület; mind a négy gomb APPLIED; második telefon várólista; 45 másodperces elengedés; QR-visszatérés; valamint olvashatóság és QR-beolvasás 2–3 méterről. Automatizált kapu: npm run test:museum-portrait-pilot.
MikroCsodák Rajzverseny 2025 galéria
A MikroCsodák – Rajzverseny 2025 (teljes galéria) publikált műsorterv 203 magyar, görgetésmentes diából áll: egy bevezető, három korcsoportos szakmai nyertes-dia, egy közönségkedvenc-dia és 198 egyedi pályamű. Az aktuális 1.3.0 Premium Gallery a MikroCsodák sales showcase petrol–arany designnyelvét használja egységes tipográfiával, finom glow/shimmer/sparkle mozgással és reduced-motion támogatással. A rajzok teljes egészükben, világos múzeumi keretben maradnak a főszereplők; fekvőben kép–információ osztott nézet, állóban képközpontú vertikális kompozíció jelenik meg.
A négy eredménylapon az eredeti pályaművek háromképes dobogóként jelennek meg: fekvőben három oszlopban, állóban három sorban. A közönség sorrendje: Vörös Vince – 705, Kiss Kiara Zorka – 519, Szemán Hanna Sára – 455 szavazat. A Player és a Visitor Remote Előző/Következő paranccsal lapoz; a Remote közvetlen indítási listájában csak az öt összefoglaló fejezet jelenik meg, így 198 külön gomb nem terheli a mobilfelületet.
A forrás 198 nyilvános, jóváhagyott pályaműrekordja került át. Kapcsolattartói név, e-mail és telefonszám nem része a KioskPilot tartalomnak. Az eredeti 156 MiB képanyagból legfeljebb 1600×1600 pixeles, 80%-os WebP derivatívák készültek; az aktív 203 HTML + 198 kép 19,18 MiB. A közönségkedvenc-dia ugyanazokat az optimalizált képeket használja újra. Ez a régi LG TV-khez kialakított low-resource profil, miközben az egész alkotás object-fit: contain megjelenítéssel látható marad.
Az aktuális publikált release: MikroCsodák – Rajzverseny 2025 v1.3.0, 203 itemmel és 401 checksum-ellenőrzött egyedi assettel. A 198 optimalizált rajzot újrahasználja, így képduplikáció 0; csak 203 új HTML-verzió készült. A v1.2.0, v1.1.0 és v1.0.0 rollbackhez megmaradt. A kiadás nincs automatikusan kijelzőhöz rendelve; 9:16/16:9 előnézet után a Tenant App Tartalomváltás felületén küldhető ki. Regresszió: npm run test:museum-premium-gallery és npm run verify:drawing-contest.
MikroCsodák Online kiállítás – Premium Gallery
Az aktuális MikroCsodák – Online kiállítás 2.1.3 17 műtárgyat és mind a kilenc támogatott nyelv teljes tartalmát őrzi. Fekvő kijelzőn elegáns, egyképernyős műtárgy-adatlap jelenik meg: balra arany optikai keretben a mű, alatta cím, év és bevezető; jobbra legfeljebb öt tematikus blokk homogén mikroszkóp–vonalzó–kéz–könyv–fény ikonokkal. A 6-nál több tartalmi egységű műtárgyak további blokkjai ugyanennek az adattáblának automatikus következő oldalán jelennek meg, így nincs levágás vagy olvashatatlan szövegzsugorítás.
Álló kijelzőn a fekvő adatlap vizuális rendje folytatódik: felül balra cím, év és bevezető, felül jobbra arany optikai körben az alkotás, alatta a petrol–arany elválasztású öt teljes tematikus blokk. A műtárgykép csak finom, elmosott ambient háttérként van jelen, ezért a szöveg olvasható marad. A QR a Player tulajdona, és mindkét tájolásban a sablon jobb alsó, erre fenntartott RIGHT_BOTTOM területére kerül. Player 3.0.12 / LG 3.0.12-lg.1 kezeli ezt az elhelyezést.
A 2.1.3 release 34/34 assetje méret- és checksum-ellenőrzött: 17 új HTML és 17 meglévő műtárgykép, 0 képduplikáció. A 2.1.2, 2.1.1, 2.1.0, 2.0.9 és 2.0.8 kiadások rollbackként megmaradtak. A kiadás kijelzőhöz rendelése tenant-művelet, ezért a dokumentáció nem írhatja felül a később kiválasztott tartalmat. A 2026-08-24 03:51-i állapot szerint a Projektor Fully online, BROWSER 3.0.15 Playerrel és a lokalizált Sales Showcase 1.4.0 kiadással ACTIVE, 5/5 asset, 100%, hibakód nélkül. Az LG TV korábbi 1.2.0 kiadása és a többi kijelző tartalma nem változott. Az Online kiállítás vagy további Remote UAT próbája csak külön UAT-hozzárendeléssel indítandó.
Fejlesztési állapot: a szerkesztés, validálás, publikálás, műsortervverzió és média-védelem kanonikus. Release csak publikált műsortervverzióból készülhet. A változtathatatlan release snapshot minden nyelvi kép-, videó-, hang- és HTML assetet, a render payloadot, sorrendet, méretet és checksumot rögzíti; a régi alapnyelvi manifest út már nem létezik.
A release készítése a tényleges médiafájl létezését, méretét és SHA-256 checksumját is ellenőrzi. Eltérés esetén a kiadás blokkolt. A Player az összes snapshot assetet letölti, a nyelvváltás pedig a snapshot localized_assets adataiból történik. A kétfázisú cache/verify/activate/rollback folyamat elkészült: a Player csak teljes letöltés és checksum-ellenőrzés után aktivál, hiba esetén pedig megtartja vagy visszaállítja a last-known-good kiadást.
Médiatár fájlkezelő, tárhely és duplikáció
A Tenant App Médiatár nézetében a Projekt Mappák valódi szűrőként működnek: a megnyitott mappában csak az oda tartozó médiák látszanak. Minden mappagomb fájldarabot és összméretet mutat, a felső tárhelypanel pedig külön jelzi a tényleges szerverhasználatot, az egyedi checksumú tartalmat, a régi fizikai duplikációt és a csomag tárhelykeretét. A fájlkártyán látható a fájlméret és az azonos tartalom/megosztott fizikai fájl jelzése.
Új kép-, videó- és HTML-feltöltésnél az API SHA-256 checksumot számol. Ha ugyanaz a bájtsorozat ennél a bérlőnél már megvan, új médiarekord létrejöhet más névvel vagy mappában, de új fizikai fájl nem készül és a tárhelyhasználat 0 bájttal nő. Ugyanez érvényes a HTML Tartalom Varázslóra és a Canvas Studióra. A kvóta a különálló fizikai fájlutakat számolja, nem a release-ek logikai asset-hivatkozásait.
A média törlése csak referencia nélkül engedélyezett. ContentVersionAsset vagy ReleaseAsset használatnál 409 MEDIA_IN_USE érkezik a használati darabszámokkal. Megosztott fizikai fájlnál egy médiarekord törlése nem törli a még használt fájlt; az utolsó referencia törlésekor a lemezfájl is eltűnik, és a Tenant App megmutatja a felszabadított bájtokat. A régi, adatbázison kívüli orphan fájlokhoz továbbra is a dry-run alapú npm run audit:media-retention használható.
Közös mappás MediaPicker a Varázslóban és Canvas Studioban
A Tenant App Sablon Varázslója, Canvas Studioja és a Tartalomvezérő asset-szerkesztője ugyanazt a MediaPicker 1.2 komponenst használja. A párbeszédablakban külön választható az összes média, a mappa nélküli állományok vagy bármely projektmappa; a keresés fájlnévre, mappanévre, MIME-típusra, locale-ra és asset-szerepre működik. A választó az adott mezőhöz csak kompatibilis fájlt kínál.
A kártyán látható az előnézet, fájlnév, projektmappa, MIME-típus, fizikai méret, képméret vagy videóhossz, feldolgozási állapot és a megosztott/azonos fájl jelzése. Csak READY média választható; PENDING, PROCESSING és FAILED fájl látható marad a diagnosztikához, de nem helyezhető a sablonba. A kiválasztás meglévő médiarekordot hivatkozik, nem készít fizikai másolatot.
A ↑ Feltöltés ide egyszerre több fájlt is fogad. Konkrét projektmappában az új média abba a mappába kerül; az Összes média vagy Mappa nélkül nézetből indítva mappa nélküli lesz. Feltöltés után automatikusan kijelölhető, és ha a szerveren ugyanaz a bájtsorozat már megvan, a felület jelzi, hogy az SHA-256 deduplikáció miatt új fizikai másolat nem készült. A + Új mappa saját név/leírás/szín űrlapot nyit, majd létrehozás után az új mappába vált.
A komponens támogat opcionális többes kijelölést és darabkorlátot; ilyenkor a kijelölés mappaváltáskor is megmarad, a lábléc pedig darabszámot és összméretet mutat. A Varázsló és Canvas jelenlegi mezői tudatosan egyszeres módban maradnak. A Varázsló meglévő legördülő listái kompatibilitási tartalékként megmaradtak; a mellettük lévő 📁 Tallózás nyitja a vizuális MediaPickert. A Canvas Studio Kép a Mappákból művelete ugyanezt a komponenst nyitja. Automatizált ellenőrzés: npm run verify:shared-media-picker és npm run test:tenant-file-manager.
A Tartalomvezérő alapmédia és idegen nyelvű média-változat sorai locale/fallback módban nyitják a pickert. Az Asset nyelve és Fallback a hivatkozás tulajdonsága, nem a fájlé; mentéskor a kanonikus ContentVersionAsset rekordba kerül. Fordítási média esetén csak az alapfájllal azonos típusú és kompatibilis tájolású állomány választható. A kártyák HU/EN stb. locale-jelzést, asset-szerepet és korlátozott hivatkozási részleteket is mutatnak.
A 🔒 Védett jelzés ugyanazt a szabályt követi, mint a DELETE API: bármely ContentVersionAsset vagy immutable ReleaseAsset hivatkozás blokkolja a törlést. Külön badge mutatja a draft, publikált, release és RECALLED archív használatot. PENDING, PROCESSING és FAILED fájl továbbra sem választható. Automatizált ellenőrzés: npm run verify:shared-media-picker, npm run test:media-usage-contract és npm run test:tenant-file-manager.
Műsortervlista, verzióelőzmény és Azonnali tesztküldés
A Tenant App Műsortervek & Tartalom listája gyökérműsortervenként egy sort mutat. Az aktív verzió mellett külön látható a teljes verziószám, az elemszám és a létrehozott kiadások száma. Név vagy projekt szerint kereshető, illetve típus és publikálási állapot alapján szűrhető. A Verziók gomb külön előzményben mutatja a piszkozat, publikált és korábbi immutable verziókat; ezek nem külön műsortervek.
Az eddigi „gyors küldés” neve Azonnali tesztküldés. Ez egy médiából automatikusan készít tartalomblokkot, egyetlen elemes műsortervet és publikált kiadást, majd hozzárendeli a kiválasztott kijelzőhöz. Nem normál tartalomépítési út, hanem rövid kijelzőpróba, ezért az ilyen műsortervek külön, alapból összecsukott szakaszban jelennek meg.
Minden tesztküldés QUICK_SEND eredetjelölést és kijelző-eredetkulcsot kap. Sikeres új küldés után a rendszer csak azokat a régi tesztküldéseket archiválja, amelyek egyik kiadását sem használja kijelző aktív/előző/letöltési állapota, ütemezés vagy Remote SWITCH_RELEASE gomb. Az archiválás visszaállítható listaművelet: a kiadási snapshot, verziótörténet és audit megmarad, a közös médiafájl nem törlődik és nem duplikálódik. Automatizált ellenőrzés: npm run verify:playlist-library.
Teljesítmény baseline 2026-08-24: a MikroCsodák tenant 793 médiarekordja usage metaadatokkal 1,56 MB-os JSON és helyben 431 ms. A következő kapu a szerveroldali lapozás/keresés, lusta thumbnail-betöltés és valós böngészős E2E; ezt nagyobb ügyfélállomány előtt le kell zárni.
Kiadás törlése és archiválása
A DRAFT kiadás törölhető. A publikált release változtathatatlan, ezért nem hard-delete-elhető: kijelzők, Proof of Play, offline cache és rollback hivatkozhat rá. A Tenant App kiadástáblája megmutatja a logikai csomagméretet, a kijelző- és ütemezéshasználatot. Használaton kívüli PUBLISHED kiadás az Archiválás gombbal RECALLED állapotba tehető; új hozzárendelésben nem választható, de a snapshot és audit bizonyíték megmarad. Bármely assigned/desired/downloading/verified/active/previous kijelzőhivatkozás vagy schedule esetén az API 409 RELEASE_IN_USE választ ad.
A release „csomagméret” logikai letöltési méret, nem újabb szervermásolat. Több release ugyanazokat a kp_media fájlokat használja; például a Rajzverseny 1.0.0/1.1.0/1.2.0 nem háromszor tárolja a 198 képet. Tényleges tárhely csak médiafájl eltávolításával szabadul fel, ami kizárólag minden verzió- és release-referencia megszüntetése után biztonságos.
Élményindító 16:9 közös sablon
A Tenant App Médiatár → HTML Tartalom Varázsló felületén elérhető az Élményindító 16:9 első közös sablon. Múzeum, látogatóközpont, bemutatóterem vagy más interaktív helyszín fekvő kijelzőjére készült. Szerkeszthető a főcím és annak kiemelt szava, alcím, márkanév, fő kép, QR-panel címe, három csatlakozási lépés, öt szolgáltatáskártya, alsó magyarázat, publikus webcím, valamint az arany és türkiz akcentusszín.
A fő kép a közös MediaPickerrel bármely Projekt Mappából vagy a mappa nélküli médiák közül kiválasztható, kereséssel és fájlmetaadatokkal. Mentéskor a sablon önálló HTML5 médiafájllá fordul, ezért a jelenlegi release- és Player-láncban azonnal használható. A generált HTML nem használ külső fontot vagy JavaScript-könyvtárat, a szövegek hosszkorlátosak és HTML-escape-eltek, a layout pedig 1920×1080, modern böngésző és Chromium 53/LG flexbox fallback esetén is görgetésmentes.
A jobb oldali QR-terület nem statikus QR-kép. A sablon RIGHT_CENTER safe area és allowlistelt FEATURED változatot deklarál; a Player saját session URL-jéből rajzol nagy élő QR-kódot. Tartalomváltáskor automatikusan visszaáll a normál COMPACT mód. A gyors V1 Varázsló-kimenet önálló HTML média; teljes offline múzeumi csomaghoz a képeket BACKGROUND assetként kell a ContentVersionhöz kapcsolni. A V2 referencia-kiadás ezt már kanonikusan megteszi, base64-duplikáció nélkül.
Automatizált ellenőrzés: npm run test:experience-launcher-template, npm run verify:player-low-memory, npm run build:lg-player && npm run verify:lg-player.
QR Elhelyezés a Playeren
A Visitor QR helyét a publikált tartalom render_payload.content.data.presentation.qrPlacement mezője szabályozhatja. A Player 3.0.12 zárt allowlistje orientációnként RIGHT_CENTER, LEFT_BOTTOM és RIGHT_BOTTOM értéket fogad el. Ha nincs explicit beállítás, sablontípus- és orientációfüggő biztonságos alapértéket használ. A Premium Online Gallery álló és fekvő nézetben is kompakt jobb-alsó QR-t kap, pontosan a sablon dekoratív QR-helyén; ehhez a kijelzőnek a friss Player-verziót kell betöltenie.
Verziózott Remote Profile és műsorterv-felülbírálás
A konfiguráció precedenciája: rendszer alapérték → tenant publikált Remote Profile → publikált műsortervverzió → opcionális kijelzőfelülbírálás. A hiányzó vagy null mező öröklést jelent; a false, 0 és üres lista explicit érték. A 026-os additív séma profilverziót, rendezett/típusos és többnyelvű gombokat, QR/session/language override-ot, valamint release-be fagyasztott remote snapshotot tárol. A publikált profil immutable; módosításhoz új draft verzió készül.
A Tenant App Beállítások → Remote Profile & QR Studio felületén újrafelhasználható profil hozható létre. A draftban állítható a QR láthatósága, sablonja, álló/fekvő pozíciója, érvényessége, magyar címsora és útmutatója, továbbá a mobil rendszer-gombok sorrendje, nyelvenkénti felirata, ikonja, színe és engedélyezése. A Nyelvek mező módosításakor a gombsor azonnal létrehozza az egyes locale-mezőket; sok nyelvnél a feliratcsoport vízszintesen görgethető. Az Ellenőrzés szerveroldali allowlistet és tenant-scope-ot használ, az Előnézet biztonságos normalizált konfigurációból készül.
A Tenant App Műsortervek & Tartalom → Mobil távirányító és QR paneljén a kiválasztott műsorterv külön publikált Remote Profile-t használhat. Felülírható a QR láthatósága, sablonja, álló/fekvő helye, magyar címsora és útmutatója, valamint a támogatott nyelvek. A profil gombjai örökölhetők, és mellettük saját, rendezhető, engedélyezhető rendszerparancs-gombok adhatók hozzá. A saját gombok feliratmezői az effektív vagy felülbírált nyelvlistát követik. A kpGo felirat-fallbackje: aktuális nyelv → profil fallback locale → magyar → angol → rendszerfelirat. Az Öröklés visszaállítása törli a draft egyedi override-ját.
Tartalmat betöltő saját gomb: kattints a + Saját gomb lehetőségre, a parancsnál válaszd a SELECT_ITEM értéket, majd a mellette megjelenő Céltartalom listából jelöld ki a betöltendő műsorterv-elemet. Adj magyar feliratot, állítsd be a színt, majd mentsd a beállítást. A cél csak az adott műsorterv egyik eleme lehet; hiányzó vagy idegen célt az API elutasít. Publikálás és kiadás készítésekor a rendszer a célt a kiadás saját, változtathatatlan elemére fordítja, ezért a mobil gomb mindig az ugyanabba a kiadásba fagyasztott tartalmat indítja. A módosítás csak az új kiadás kijelzőhöz rendelése és ACTIVE állapota után jelenik meg a telefonon.
Másik műsorterv/kiadás indítása: a saját gomb parancsa legyen SWITCH_RELEASE, majd a Célkiadás listából válassz egy publikált kiadást. Ez a teljes kijelzőt átváltja a kiválasztott élményre; nem csupán az aktuális műsorterv következő elemére ugrik. A szerkesztő kizárólag a bérlő publikált kiadásait kínálja, az API pedig mentéskor ismét ellenőrzi a tenant-határt és a publikált állapotot. A telefonon a gombnyomás után a Player elindítja a kiadásváltási és letöltési folyamatot; nagy csomagnál a kijelzőn letöltési állapot jelenhet meg. Remote-gomb által célzott kiadás addig nem archiválható, amíg a hivatkozást el nem távolítják; a Kiadások táblázat külön mutatja a Remote-gomb hivatkozások számát.
Publikált műsorterv közvetlenül nem változik: a panel mentése automatikusan új szerkeszthető műsortervverziót készít. Publikáláskor a Remote beállítás is immutable lesz. Kiadás létrehozásakor a rendszer a teljes effektív konfigurációt a remote_snapshot_json mezőbe fagyasztja és külön SHA-256 checksumot tárol; release validáláskor és publikáláskor ezt újraszámolja.
A Draft mentése optimista verziózárat használ: párhuzamos módosításnál újratöltést kér, nem ír felül csendben más szerkesztést. A Publikálás után a verzió változtathatatlan; további munkához a publikált verzióból új draft készíthető. Csak publikált, aktív profil lehet tenant-alapértelmezett, és az alapértelmezett profil nem archiválható. Új verzió publikálásakor az alapértelmezett hivatkozás atomikusan az új verzióra emelkedik. Minden lifecycle művelet auditált.
Látogatói nyelv és tartalomindítás – 2026-09-10
A telefonos távirányító tíz nyelvű kezelőfelülete a QR-belépő útvonalról is betöltődik. A nyelv a kijelző sikeres visszaigazolása után vált; a gombfeliratokat a Remote Profile nyelvenkénti mezőiben kell megadni. Profilváltozás után új kiadás szükséges. A pillanatnyi állapot lekérdezése megőrzi a gombokat és a fókuszt.
A tartalom első megnyitásakor a letöltés hosszabb ideig tarthat. A telefon a végrehajtás visszaigazolásáig betöltési jelzést mutat, és megelőzi az ismételt indítást. A Player 3.0.19 az azonos tartalomra érkező párhuzamos kéréseket egyesíti, az eltérő kiadások előkészítését sorban végzi. Sikertelen indításnál hibaüzenet jelenik meg; nyelvet váltani a tartalom elindításához nem szükséges.
Az Online kiállítás 2.1.6 egyetlen oldalon mutatja a műtárgy képét, bevezetőjét és összes tartalmi blokkját, automatikus részoldalváltás nélkül. A héber elrendezés jobbról balra halad; az eredeti szövegek és képek megmaradnak. A Player 3.0.21 először csak az első műtárgy ellenőrzött fájljaira vár; a további műtárgyakat a háttérben tölti le.
A Heritage képes nyitóképernyő a működő Múzeumi történetek, Online kiállítás és Rajzverseny élményeket mutatja petrolzöld–arany kártyákon, eredeti múzeumi képekkel. A kijelző továbbra is telefonról vezérelhető. Player 3.0.20-tól kizárólag ennél a nyitóképernyőnél nagyobb élő QR-kód illeszkedik az alsó kapcsolódási panelbe; más tartalom QR-elhelyezése változatlan.
Kiadásba fagyasztott Remote Snapshot – runtime működés
A runtime cutover aktív a Player 3.0.12 és LG 3.0.12-lg.1 verziótól; az aktuális Player 3.0.15 / LG 3.0.15-lg.1. A kijelző mindig a teljesen letöltött és ACTIVE állapotú kiadás remote_snapshot_json konfigurációját használja; a még csak desired/downloading/verified kiadás nem változtatja meg a QR-t vagy a távirányítót. Így a tartalom, QR-sablon, gombkészlet, nyelvek és session policy egyszerre, atomi módon váltanak.
A Player a snapshot alapján alkalmazza a QR láthatóságát, lokalizált címsorát és útmutatóját, a join-kód láthatóságát, lejáratát, álló/fekvő helyét és a COMPACT_CARD, BOTTOM_BANNER, RIGHT_SIDEBAR, ALTERNATING_ANIMATED vagy HERO_CARD sablont. A COMPACT_CARD kis helyigényű petrol–arany múzeumi kártya: álló és fekvő kijelzőn a konfigurált safe area-ban marad, a QR pixeltérképet nem animálja, és a hosszabb adatlapból minimális területet vesz el. A Player a kódot biztonsági tartalékkal a lejárat előtt megújítja; a join kód legfeljebb az aktuális visitor session végéig érvényes. Aktív snapshotnál ez a műsorterv-szintű beállítás megelőzi a régi HTML-tartalom QR-metaadatát; snapshot nélküli legacy kiadásnál a tartalmi safe area továbbra is működik. A kpGo mobilfelület az engedélyezett, sorrendezett és lokalizált rendszer-gombokat rajzolja ki; a némítás/hangosítás és szünet/lejátszás párok egyetlen váltógombként jelennek meg. A Player a VOLUME_UP/VOLUME_DOWN parancsokat 10%-os lépésekben alkalmazza. Az API minden parancsnál ugyanebből az aktív snapshotból ellenőrzi az allowlistet és a nyelveket. A controllerLeaseSeconds és queueEnabled beállítás szintén futásidőben érvényesül.
Élő MikroCsodák referencia: a MikroCsodák – Online kiállítás – Remote UAT 2.0.29 kiadás 17 elemmel és 34 változatlan assettel ACTIVE az 01 kijelzőn. Remote checksum: bb307a7d2734e292b5dd0ff0bf7fc67d0acc5f000135e5665d5942794ecf79c6. A snapshot COMPACT_CARD, jobb alsó álló/fekvő hely, HU/EN/HE nyelv, 25 másodperces lease, várólista, valamint Előző/Szünet/Következő/Nyelv gombokat tartalmaz. Az élő Next, Prev, Pause, Resume, EN, HE és HU parancs mind APPLIED; bontás után az új QR-session automatikusan létrejött. A korábbi Online kiállítás 2.1.3 a kijelző previous_release_id rollbackje.
A checksum minden használatkor ellenőrzött. Hiányzó, régi vagy hibás snapshot esetén a rendszer nem áll le, hanem a kijelző régi kp_visitor_remote_profiles profiljára vált vissza. A válasz runtimeSource, releaseId, snapshotChecksum és fallbackReason mezői support-diagnosztikára használhatók; tipikus okok: REMOTE_SNAPSHOT_MISSING, REMOTE_SNAPSHOT_CHECKSUM_MISMATCH és REMOTE_SNAPSHOT_INVALID. A legacy fallback megtartja a régi mobil gombelrendezést.
A device release API az Android/HDMI-stick kliens számára remoteSnapshot és remoteSnapshotChecksum mezőt is ad. Az Android kliens letöltheti és ellenőrizheti, de csak a kiadás ACTIVE állapota után használhatja. Ellenőrzések: npm run test:remote-runtime, npm run test:playlist-remote-overrides, npm run smoke:visitor-remote, npm run verify:player-low-memory és npm run verify:lg-player. A szerkesztő továbbra sem fogad szabad URL-t, JavaScriptet vagy nyers HTML/modal payloadot. A teljes contract: REMOTE_PROFILE_PROGRAM_OVERRIDE_CONTRACT_V1.md.
Adatbázis-ellenőrzés: npm run verify:content-version-db és npm run verify:program-release-db. A teljes kanonikus lánc csak olvasó auditja: npm run audit:content-pipeline. A backfill alapból read-only: npm run backfill:content-versions. Az apply csak sikeres preflight után használható, és többértelmű médiaútvonal, hibás locale vagy cross-tenant hivatkozás esetén blokkol.
MikroCsodák Visitor Experience V2
Az új múzeumi látogatói rendszer külön projektben és külön kiadásokban készül, ezért nem keveredik a jelenlegi Legacy műsortervekkel. Futó, visszaállítási vagy Remote-hivatkozással védett kiadást csak az új V2 helyszíni aktiválása után szabad archiválni. A használaton kívüli korábbi kiadások RECALLED állapotban maradnak, snapshotjuk és a más tartalom által is használt médiafájlok megőrzésével.
Aktuális P0 runtime hiba
A 2026-09-10-i helyszíni audit két külön jelenséget talált. A Felfedező 2.0.5 43 assetes csomagja teljes, de több párhuzamos sync/reload/reconnect hívás ugyanazt a candidate cache-t törölte és újrakezdte. Ezt a Player 3.0.16 / LG 3.0.16-lg.1 single-flight mutexe javítja: az új kérés a már futó letöltéshez csatlakozik. A közben aktív, régi egy-HTML-es Digitális élményloop 2.0.27 nem csomagolta a HTML-ben használt backstage képet, ezért külön PLY_ERR_MEDIA_PRELOAD érkezett. Ez nem tárhelyhiba. A Player a last-known-good kiadást megtartja; valóban hibás csomagokra még véges retry/backoff és teljes HTML-forrás validáció szükséges.
Az elkülönített új munkaterület neve MikroCsodák – Visitor Experience V2. Új Online, Rajzverseny és Szelfi tartalom, valamint az ArenaLive Quiz integráció konfigurációja kizárólag ebbe a projektbe kerüljön; Legacy tartalmat nem mozgatunk bele.
Jóváhagyott Heritage Gold vizuális irány
A Visitor Experience V2 hivatalos iránya a mély petrolzöld vagy éjkék alap, elefántcsont tipográfia, visszafogott arany hierarchia, elegáns serif címbetű, egységes arany vonalikonok, vékony keretek és nyugodt CSS/SVG mikroanimációk. A mobilfelület nagy érintési célokat, rövid szöveget és képdomináns élménykártyákat használ.
Kötelező médiaeredet-szabály: műtárgyat, alkotót, látogatót, múzeumi teret vagy programot csak ellenőrzött, eredeti MikroCsodák-kép ábrázolhat. Generált vagy stock kép nem publikálható valódi múzeumi tartalomként; az AI-látványtervek kizárólag kompozíciós referenciák. Ugyanazt az eredeti assetet nyelvenként és műsortervenként újra kell használni, nem lemásolni.
Tervezett látogatói belépő és főmenü
A Remote belépőjén a múzeum neve, az aktív kapcsolat, a zászlós nyelvválasztó és egyetlen Élmények megnyitása CTA látható. A Mit szeretnél felfedezni? főmenü nyolc kártyája: Alkotások közelről, Minden alkotás, Hogyan készült?, A művész, Híres látogatók, Rajzverseny 2025, Randi a múzeumban és Küldj szelfit. A Kezdőlap a bemutató/reklám állandó navigációs célja, a nyelvválasztó pedig vezérlő, nem külön tartalomkártya.
Az Előző, Következő és Szünet csak az adott élményen belül jelenik meg. Minden parancs betöltési, alkalmazott vagy sikertelen visszajelzést ad; a Kezdőlap mindig elérhető. A közös műtárgy-részletnézet eredeti képet, nagyítást, betűméretet, felolvasást és biztos visszalépést kínál.
Nyelvek és későbbi bővítés
A célzott közös nyelvkészlet: HU, EN, DE, FR, IT, ES, PL, UA és HE. A szlovák nyelv csak valódi fordítással publikálható, mert a korábbi forrás magyar másolatot adott. Egy új nyelvet ugyanahhoz a logikai tartalomhoz kell hozzáadni; a közös képet vagy videót nem szabad nyelvenként lemásolni. A tervezett admin lefedettségi mátrixa élményenként TELJES, RÉSZLEGES vagy HIÁNYZIK állapotot mutat. Fallback: kért nyelv → angol → magyar; új nyelv publikálása mindig új immutable release.
Online kiállítás és Rajzverseny
Az Online kiállítás mind a 17 műtárgyat és a 9 ellenőrzött fordítást megtartja, de portrait-first, görgetésmentes TV-nézetet és telefonos műtárgykatalógust kap. A Rajzverseny 198 pályaműve nem 198 főgombként jelenik meg: korcsoport, nyertesek, közönségkedvencek, összes mű és véletlen felfedezés alapján lehet választani, majd a TV egyetlen képközpontú alkotást mutat.
Szelfi állapota
Az Álló totem oszlop kamerája jelenleg READY, az eszközszintű DEVICE_CAMERA mód engedélyezett és az aktív Totem Szelfi élmény létezik. A V2-ben még szükséges a CAMERA_START Remote-gomb, a többnyelvű és verziózott hozzájárulás, a múzeumi keretek, valamint a capture/retake/accept/download fizikai E2E. A kép megőrzése 24 óra, a letöltési link 60 perc. Kamera-hiba nem állíthatja meg a többi tartalmat.
Quiz állapota
A korábbi „Kvíz bemutatása” csak diás bemutató volt, nem működő játék. A végleges termékdöntés szerint a Quiz tartalmát, pontozását és játékmenetét az ArenaLive szolgáltatja. A KioskPilot feladata a tenant/site/zone mapping, a rövid életű display- és participant-token, az aktuális locale átadása, a Player és telefonos handoff, valamint a kilépés vagy hiba utáni biztos visszatérés a Kezdőlapra.
Aktív Quiz Remote-gomb csak teljes, egészséges ArenaLive capability és sikeres end-to-end UAT után jelenhet meg. Addig alapértelmezetten rejtett; külön marketingbeállítással inaktív Hamarosan kártya mutatható, amely nem indít hibás vagy félkész élményt.
Átállási sorrend
- Külön V2 projekt, archív nézet és új Remote információs architektúra.
- Dinamikus nyelvkatalógus és lefedettségi mátrix.
- Online kiállítás V2, majd a már előkészített eszközkamerás Szelfi.
- Rajzverseny V2, majd stabil contract esetén ArenaLive Quiz integráció.
- Helyszíni Browser/HDMI-stick UAT, aktiválás, Legacy recall és 14 napos stabilitás.
A részletes végrehajtási terv fájlja:
MIKROCSODAK_VISITOR_EXPERIENCE_V2_PLAN_2026-09-10.md.
Múzeumi Sales Showcase és Élményloop 16:9
Két külön célú megoldás létezik. A Múzeumi élményloop 16:9 V2 a későbbi, szerkeszthető közös sablon. A MikroCsodák Sales Showcase 16:9 szándékosan nem szerkeszthető, márka-specifikus értékesítési referencia: a feltöltött mintához igazodó fix kompozíciót, egységes vonalas ikonrendszert, valódi múzeumi képeket, finom fényeket, csillogást és lassú animációkat használ.
UX-alapelv: a nagy kijelző adja az élményt, a telefon csak vezérli azt.
Hol található és hogyan használható?
- A Tenant App Médiatár oldalán nyisd meg a HTML Tartalom Varázslót; a képeket később a közös MediaPickerben bármely projektmappából kiválaszthatod.
- Válaszd a HTML Tartalom Varázsló → Múzeumi élményloop 16:9 V2 sablont.
- Válassz külön WOW nyitóképet, kiemelt műtárgyképet és Tudtad?-részletképet. Mindhárom mező mappás tallózást, keresést, előnézetet és fájlmetaadatokat kínál.
- Szerkeszd a főcímet, WOW-mondatokat, két rövid tényt, műtárgycímet/hordozót, visszavezető CTA-t, három csatlakozási lépést és az akcentusszíneket.
- Mentsd a HTML-t, készíts belőle verziózott tartalmat és publikált műsortervet. Offline lejátszáshoz minden hivatkozott kép és logó legyen
BACKGROUNDasset.
Jelenetek és mozgás
Az alap loop 78 másodperc és hét jelenet: makró WOW-nyitás, Tudtad?, QR-csatlakozás, három lépés, szolgáltatások, kiemelt műtárgy, majd túra/játék CTA. A mozgás csak GPU-barát transform és opacity animációkat használ; nincs agresszív flash, külső font vagy külső JavaScript. A prefers-reduced-motion beállítás kikapcsolja a folyamatos animációt.
A QR jobb-középső safe area végig szabad marad. A QR pixeltérkép nem mozog és nem torzul; csak a Player kártyájának környezete kap finom glow-t. A jelenetek és kompozíció változása burn-in ellen is segít.
Élő QR és kapcsolódott állapot
A HTML nem generál saját QR-kódot. A Player 3.0.9 / LG 3.0.9-lg.1 a kijelző aktuális visitor sessionjéből rajzolja az élő QR-t. A fix referencia külön SHOWCASE QR-módot kér: a jobb oldali, hangsúlyos üvegkártyába nagy, mozdulatlan és jól olvasható QR kerül. Közvetlen beolvasáskor nincs PIN; a kpgo.pro kézi megnyitásakor a TV-n látható kódot kell megadni.
Kapcsolódáskor a Player KIOSKPILOT_VISITOR_STATE üzenetet küld kizárólag az aktív HTML iframe-nek. A V2 loop ilyenkor megáll, elrejti a QR-t és „A kijelző most a te kezedben van” állapotot mutat. Bontáskor automatikusan visszaáll az idle loop és az élő QR.
MikroCsodák értékesítési referenciapéldány
A MikroCsodák – Értékesítési referenciaélmény 1.2.0 PUBLISHED / VALID kiadás az aktuális bemutatópéldány. Egyetlen, 24 órás fix képernyő: felül nagy „Keltsd életre a kijelzőt!” cím; balra telefon és TV valódi műtárgyképekkel; középen három kapcsolódási lépés; jobbra élő QR; alul öt szolgáltatáskártya és márkázott footer. A HU/EN nyelvváltás és a kapcsolódott állapot működik. Nincs automatikusan kijelzőhöz rendelve.
A csomag a meglévő Karaván, Virágzó ág, aranybolha és hivatalos wordmark fájlokat használja újra, ezért a kiadás egyetlen új fizikai fájlja a 20 850 byte-os HTML; képduplikáció: 0. Az 1.1.0 hétjelenetes V2 és az 1.0.0 első változat immutable rollbackként megmaradt. Regresszió: npm run test:museum-sales-showcase, npm run verify:player-low-memory, npm run verify:lg-player.
HDMI stick és LG
Értékesítési és éles telepítéshez a javasolt út a KioskPilot által kezelt HDMI stick modern Chromium/WebView runtime-mal: stabilabb animáció, több memória és kiszámíthatóbb offline tárhely. Az LG lgplayer.html továbbra is használható otthoni kompatibilitási tesztre; Chromium 53 célra fordított bundle-t kap, és a sablon régebbi motoron is olvasható fade/statikus fallbacket biztosít.
Ellenőrzések: npm run test:museum-experience-loop-template, npm run test:museum-sales-showcase, npm run verify:player-low-memory, npm run build:lg-player, npm run verify:lg-player. Az 1.2.0 publikáló alapból dry-run; apply csak explicit UPGRADE_MIKROCSODAK_SALES_REFERENCE_SHOWCASE megerősítéssel indítható.
2. Android TV & Kioszk Integráció
Ez a dokumentum a TV-alkalmazás (Android TV app) és a mobilalkalmazás számára írja le a központi API és WebSocket csatlakozási és kommunikációs protokollját.
Csatlakozás és Hitelesítés
A csatlakozás a szerverhez biztonságos WebSocket (wss://) protokollon keresztül történik:
- Kapcsolódási végpont:
wss://api.kioskpilot.cloud/ws/device/{deviceToken} - Hitelesítés: A hitelesítés a URL-ben megadott
deviceTokenalapján automatikusan megtörténik.
Sikeres hitelesítés után a szerver a kijelző státuszát automatikusan ONLINE állapotba állítja az adatbázisban, és a következő választ küldi vissza:
{
"event": "auth_success",
"deviceId": "UUID_AZONOSÍTÓ",
"message": "Eszköz hitelesítve!"
}
Kijelző párosítása és hibaellenőrzése
Browser Player megjegyzés: a kezelőfelületi „Tartalom újraszinkronizálása” / reload alias a Browser Playerben device.reload-ra normalizálódik, és az immutable release manifestet szinkronizálja; nem tölti újra a Player HTML alkalmazást. Új Player-verzió érvényesítéséhez device.restart szükséges. A siker a következő heartbeat appVersion mezőjében ellenőrizendő. A device.clear_cache csak sérült helyi release-cache hibakeresésére való, normál verziófrissítéshez nem szükséges.
- A Player
POST /v1/devices/pairing-codekéréssel 10 percig érvényesKP-XXXXXXkódot és ideiglenes device UUID-t kér. - A Tenant App jogosult adminja a
POST /v1/devices/pairvégponton elküldi a kódot, nevet, helyet és display profilt. - Az API egy tranzakcióban létrehozza a kijelzőt, a kanonikus
kp_device_release_statessort, credentialt és device tokent. - A Player pollinggal egyszer veszi át a secretet, tokent és display profilt; az API ezután törli a pairing kódot.
Sikertelen admin-próbánál a Tenant App fókuszált, képernyőolvasóval is érzékelhető panelen mutatja a felhasználói üzenetet, a stabil hibakódot és a rövid hivatkozási azonosítót. Ugyanezt a pairing rekordból a Player pollingja is megkapja, és piros státuszsávban megjeleníti a kijelzőn. A technikai stack nem kerül klienshez; csak a szervernaplóban kereshető vissza a hivatkozási ID alapján. A kód lejártáig újra lehet próbálni, siker esetén a korábbi hiba törlődik.
A teljes regresszió: npm run test:device-pairing-api. A teszt saját kódot generál, végigviszi a tenant-párosítást és az egyszeri Player credential-átvételt, ellenőrzi az IDLE release-state sort, majd kontrollált duplikált eszközhibával igazolja a közös DEVICE_PAIRING_FAILED Tenant/Player feedback contractot. Végül eltávolít minden ideiglenes eszköz-, pairing- és auditadatot. A 2026-08-12-én javított ensureDeviceReleaseState is not defined backendhiba hiányzó route-import volt; a párosítás tranzakciója helyesen rollbackelt, ezért félkész kijelző nem maradt.
LG webOS böngészős Player
LG TV beépített böngészőjében a https://kpgo.pro/lgplayer.html útvonalat kell használni. Ez külön, Babellel Chromium 53 szintre fordított Player bundle; a modern player.html változatlan marad. A legacy oldal ES5 bootstrap hibapanelt és flexbox layout fallbacket is tartalmaz, ezért bundle-betöltési vagy indulási hiba esetén a kijelzőn konkrét LG_PLAYER_BOOT_FAILED vagy LG_PLAYER_BOOT_TIMEOUT kód jelenik meg.
Támogatási cél: webOS TV 4.x vagy újabb. Az LG hivatalos motorlistája szerint ez Chromium 53-tól indul; webOS 5 Chromium 68, webOS 6 Chromium 79. A webOS 3 és régebbi motorokra nincs production garancia. A kanonikus forrás továbbra is a player.html; minden Player-módosítás után kötelező npm run build:lg-player, majd npm run verify:lg-player. A teljes npm run build:all automatikusan újragenerálja az LG változatot.
Az LG Player API- és WebSocket-forgalma azonos eredetű átjárón közlekedik: https://kpgo.pro/v1/* és wss://kpgo.pro/ws továbbít a belső API-nak. Így a régi webOS motor nem kapcsolódik közvetlenül az api.kioskpilot.cloud domainhez, és nem akad el cross-origin TLS/CORS korlátozáson. Ha a böngészőben nincs natív fetch, az LG bootstrap XMLHttpRequest-alapú tartalékot biztosít. A PAIRING_CODE_NETWORK_ERROR azt jelzi, hogy a Player a párosítási kód kérésekor egyáltalán nem kapott HTTP-választ; ilyenkor frissítsd teljesen az LG oldalt, ellenőrizd, hogy a Player verzió legalább 3.0.7-lg.1, majd nézd meg a kpgo és API PM2-folyamatot. Az átjáró szerverhibája külön KPGO_API_PROXY_FAILED kódot és HTTP 502 választ ad.
A webOS beépített böngésző Cache Storage API-ja egyes TV-ken hiányzik vagy 0%-nál válasz nélkül marad. Az LG Player ezért a release fájljait saját IndexedDB-alapú cache-rétegben tárolja; támogatja a Player által használt open, put, match, keys és delete műveleteket. A 3.0.5-lg.3 verziótól a letöltés nem használ natív window.caches hívást. Ha a szinkronizáció mégis sikertelen, a Player előbb FAILED / PLY_ERR_SYNC_FAILED állapotot és konkrét hibaüzenetet küld a szervernek, csak utána próbálja törölni a félkész cache-t; így a diagnosztika nem marad néma PENDING 0% állapotban.
A 3.0.5-lg.4 verzió a release média URL-jeit is same-origin címre írja át: az api.kioskpilot.cloud/uploads/... forrásból kpgo.pro/uploads/... lesz. A kpgo /uploads útvonala a kanonikus apps/api/uploads médiatárat szolgálja ki. Ez megszünteti azt a régi webOS cross-origin hibát, amely az első fájlnál Failed to fetch üzenettel állította le a letöltést. A MikroCsodák LG-re kijelölt release-ének publikus ellenőrzése 34/34 fájlnál HTTP 200, pontos méret és helyes SHA-256 checksum eredményt adott.
A 3.0.5-lg.5 verzió a crypto.subtle.digest nélküli régi webOS motorokhoz tiszta JavaScript SHA-256 fallbacket ad. A Cannot read property 'digest' of undefined hiba Web Crypto kompatibilitási probléma, nem tárhelyhiány. A Player a gyors Web Crypto ágat használja, ha elérhető, különben automatikusan fallbackre vált. A MikroCsodák kijelölt release-ének mind a 34 fájlja sikeresen átment a publikus HTTP/méret ellenőrzésen és a fallback SHA-256 validáción is.
A 3.0.7-lg.1 memória-kímélő, két rétegű lejátszást használ: egyszerre csak a most látható és a következőként előkészülő média van a DOM-ban. A jelenlegi kép vagy HTML addig látható marad, amíg a következő elem load, videónál canplay eseményt nem ad; ezután rövid áttűnés következik, a régi réteg pedig felszabadul. Az első elemig márkázott előkészítő képernyő látszik fekete oldal helyett. A 20 másodpercen belül be nem tölthető elem PLY_ERR_MEDIA_PRELOAD eseményt jelent; ha van működő aktuális elem, az képernyőn marad, a hibás elemet a Player átugorja.
Platform Admin kijelző-hibadiagnosztika
Az Eszközök & Diagnosztika nézet bérlőnként és kijelzőnként mutatja a kapcsolatot, a kívánt és aktív release-t, a százalékos/fájlszintű előrehaladást és a Player hibakódját. A felső kártyák összesítik az online, telepítés alatt álló és beavatkozást igénylő kijelzőket. A rendszer a FAILED/ROLLED_BACK állapot mellett azt is hibának jelöli, ha egy eltérő kívánt release PENDING, DOWNLOADING, VERIFYING, READY vagy ACTIVATING állapotban több mint 10 perce nem frissült.
A Diagnosztika gomb megmutatja a TV-n látható normalizált hibakódot – például PLY_ERR_SYNC_FAILED –, a nyers backendkódot, hibaüzenetet, release-állapotot, fájlszámot, időpontokat, heartbeatet, Player/runtime verziót, IP/latency és erőforrásadatokat, valamint célzott teendőjavaslatot. Az elmúlt 30 perc Proof of Play FAILED eseményei – köztük a PLY_ERR_MEDIA_PRELOAD – friss lejátszási hibaként akkor is láthatók, ha a release maga aktív maradt. Az Összefoglaló másolása gomb telefonos vagy ticketes ügyfélszolgálati átadáshoz készít egységes szöveget. A régi RELEASE_SYNC_FAILED rekordokat a felület visszafelé kompatibilisen PLY_ERR_SYNC_FAILED TV-kódként jeleníti meg; az új Player már közvetlenül ezt a kódot jelenti.
Érvénytelen párosítás kezelése
Ha a Player bármely device-auth végponton 401 választ kap - például heartbeat, release manifest lekérés vagy aktív release visszajelzés közben -, akkor a kijelzőt törölt vagy érvénytelenített párosításként kezeli. Ilyenkor törli a helyi párosítási adatokat (deviceId, secret, deviceToken, display profil, aktív release azonosító), leállítja a futó időzítőket/WebSocketet, majd visszatölti a párosítási képernyőt.
Release ütemezés és telephelyi idő
Az ütemezés kizárólag publikált, változtathatatlan release-re mutat. A korábbi műsorterv-gyökér alapú schedule út megszűnt, ezért egy műsorterv későbbi publikálása nem módosítja észrevétlenül a már időzített tartalmat.
A Player és a Visitor Remote ugyanazt a szerveroldali resolvert használja. A helyi napot és időt a kijelző telephelyének IANA időzónája határozza meg. A resolver kezeli a dátumtartományt, heti napokat, egész napos és éjfélen átnyúló idősávot, valamint a device > zone > site specificitást és az 1-10 prioritást.
A Tenant App csak publikált kiadást kínál az Ütemezés nézetben, megmutatja az effektív időzónát, és mentés előtt jelzi az azonos célponton átfedő szabályokat. Ellenőrzés: npm run verify:schedule-db és npm run test:schedule-timezone.
Meglévő kijelző telephelye és zónája utólag a Tenant App Kijelzők → Hely & zóna gombjával módosítható. A zónalistában csak a kiválasztott telephely zónái jelennek meg. Az API tenant-scope-ban ellenőrzi mindkettőt, DEVICE_LOCATION_UPDATE auditot ír, újraszámolja a közvetlen kijelző → zóna → telephely ütemezési precedenciát, majd online Playernek device.sync_release jelzést küld.
Szervertől érkező parancsok fogadása
A TV alkalmazásnak végre kell hajtania a WebSocket csatornán érkező következő parancsokat:
A kanonikus üzenetboríték mind a type, mind a command mezőt tartalmazza azonos parancsnévvel, továbbá kötelező commandId-t és beágyazott payload objektumot ad. Az Android kliens a type mezőt használja elsődlegesen, a Browser Player mindkettővel kompatibilis.
{
"type": "device.set_language",
"command": "device.set_language",
"commandId": "UUID",
"payload": { "lang": "en", "timeoutSeconds": 3600 }
}
- URL betöltése / módosítása (
device.open_url): A kijelző kezdőoldalának beállítása vagy távoli módosítása.{ "command": "device.open_url", "url": "https://kioskpilot.cloud/..." } - Tartalom újraszinkronizálása (
device.reload): A Browser Player újraolvassa és szükség szerint szinkronizálja a desired/active release manifestet. Natív kliens implementációja újratöltheti a WebView-t, de erre a szerver nem támaszkodik.{ "command": "device.reload" } - Gyorsítótár törlése (
device.clear_cache): Törölje a WebView gyorsítótárát, majd töltse újra az oldalt.{ "command": "device.clear_cache" } - Képernyőkép kérése (
device.screenshot): Készítsen képernyőképet a futó WebView-ról, majd küldje be base64 JPEG-ként az API-nak.{ "command": "device.screenshot" } - Release szinkron (
device.sync_release): Kérje le és aktiválja a kijelző effektív desired release-ét. - Nyelvváltás (
device.set_language): Ideiglenes nyelvi felülíráslangéstimeoutSecondspayload-dal. - Hangerő és fényerő:
device.set_volume, illetvedevice.set_brightness0-100 közöttivaluemezővel. - Player újraindítása (
device.restart): A Player/WebView újratöltése terminális ACK után; Browser Player-verzióváltáshoz ezt kell használni. - Vészleállítás (
device.emergency_stop): Az aktuális lejátszás megszakítása és biztonságos fallback megjelenítése.
Release Állapotjelentés
A Player a PENDING → DOWNLOADING → VERIFYING → READY → ACTIVATING → ACTIVE fázisokat jelenti. A desired és active release külön mező; az ACTIVE csak sikeres helyi atomikus aktiválás után küldhető. Hiba esetén FAILED vagy ROLLED_BACK érkezik hibakóddal, miközben a korábbi aktív kiadás megmarad. A párhuzamos heartbeat/release-state írásokat a szerver rendezett zárolással és legfeljebb három deadlock/lock-timeout tranzakciós próbával kezeli. A hibás manifest checksum elvárt 409 MANIFEST_CHECKSUM_MISMATCH kliensválasz, nem szerverhiba; az 5xx hibák továbbra is a PM2 error logba kerülnek.
Player pilot preflight és fizikai UAT
A MikroCsodák pilot szerveroldali kapuja a npm run audit:player-pilot -- --device=01 --output=audit/player-pilot-preflight.json paranccsal ellenőrizhető. Az audit read-only: desired/active/previous release, deployment, minden release-fájl létezése, mérete és checksumja, Proof of Play lefedettség, függő parancs, Player-verzió, natív Android forrás és headless böngésző jelenléte kerül a riportba.
Az automatizált preflight nem helyettesíti a fizikai tesztet. A kijelzőnek ONLINE állapotban kell lennie, majd online hidegindítás, hálózat nélküli cache-elt hidegindítás, reconnect, parancs-ACK, kétirányú release-váltás és dedikált hibás teszt-release rollback szükséges. Valós aktív release assetet tilos a rollback-teszthez megrongálni. A részletes jegyzőkönyv: PLAYER_PILOT_UAT_2026-08-12.md.
Auth pool tranzakciós biztonság
Az érvénytelen refresh token 401-es ága minden megkezdett tranzakciót rollbackel, mielőtt a kapcsolat visszakerül a poolba. Enélkül a kapcsolat REPEATABLE READ snapshotja későbbi API-kérésekben elrejthette a frissen párosított eszközt vagy credentialt. Regresszió: npm run test:auth-refresh-transaction; 12 párhuzamos invalid refresh után a friss eszköz- és device-auth rekordnak azonnal láthatónak kell lennie.
3. Ubuntu 24.04 + HestiaCP Szerver-beállítások
Ez az útmutató segít beállítani és optimalizálni a HestiaCP alapú Ubuntu 24.04-es szervert a modern fejlesztési és éles munkafolyamatokhoz.
SSH Hozzáférés és Biztonság
A biztonságos SSH eléréshez szerkeszd a szerveren a /etc/ssh/sshd_config fájlt:
PasswordAuthentication no PubkeyAuthentication yes PermitRootLogin no
FONTOS: Az SSH démon újraindítása előtt (
sudo systemctl restart ssh) mindig nyiss meg egy másik terminált és teszteld az új beállításokkal való belépést, nehogy kizárd magad!
Telepítések a Szerverre
Lépj be SSH-n keresztül, és telepítsd a következő alapvető fejlesztési függőségeket:
- NVM (Node Version Manager):
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash source ~/.bashrc nvm install --lts
- Composer (PHP csomagkezelő):
sudo apt update && sudo apt install composer -y
Teljesítmény finomhangolása (OPcache & Redis)
A villámgyors válaszidőkért engedélyezd a PHP OPcache-t és telepítsd a Redis szervert:
sudo apt install redis-server php-redis -y sudo systemctl enable redis-server
4. Camera Experience
A Camera Experience a látogatói fotózási folyamatot kezeli a Visitor Remote sessionhöz kötve. A séma telepítve van: kp_camera_experiences, kp_camera_sessions, kp_camera_captures, kp_camera_download_tokens, kp_camera_events.
Elérhetőség és Jogosultság
A kamera nem automatikusan elérhető minden bérlőnél és minden kijelzőn. Az effektív kameraelérhetőség három egymásra épülő kapu eredménye:
- Előfizetés: a bérlő előfizetése aktív, és a csomagverzió vagy tenant override engedélyezi a
feature_camera_expfunkciót. - Telepítés: az adott tenant, telephely, zóna vagy eszköz konfigurációja engedélyezi a kamerát és a használható módot (
VISITOR_CAMERA,DEVICE_CAMERAvagy mindkettő). - Futásidejű képesség: kijelzőkamera esetén az eszköz ténylegesen rendelkezik kamerával, és a kameraengedély használható.
A funkció csak akkor indítható, ha mindhárom szükséges kapu engedélyezett. A kliens géppel kezelhető állapotot kap, például SUBSCRIPTION_DISABLED, INSTALLATION_DISABLED, CAPTURE_MODE_DISABLED, NO_CAMERA, PERMISSION_DENIED, DISCONNECTED, TIMEOUT vagy READY.
A telepítési konfigurációt a kp_camera_installation_settings tárolja. A feloldási sorrend DEVICE > ZONE > SITE > TENANT; a legkonkrétabb létező beállítás nyer, új telepítés pedig alapból tiltott. A Player által jelentett futásidejű állapot a kp_device_camera_capabilities táblába kerül. Kapcsolódó végpontok: GET /camera/access, GET/PUT /camera/installations, GET /camera/devices/config és POST /camera/devices/capability.
Telepítés: database/migrations/019_camera_installation_settings.sql. A migráció az aktív kameraélménnyel már rendelkező tenantok működését tenant-szintű engedéllyel őrzi meg; minden új konfiguráció kifejezett engedélyezést igényel.
Capture Módok
- VISITOR_CAMERA: a látogató telefonja készíti és tölti fel a képet a kpGo PWA-ból.
- DEVICE_CAMERA: a látogató hozzájárulása után a kijelző vagy kioszk készíti és tölti fel a képet device authentikációval.
A Visitor Remote profilban a CAMERA_START egyetlen, felhasználóbarát kameraengedély. Szerveroldalon umbrella-jogként engedélyezi a teljes kamera-életciklust: CAMERA_CAPTURE, CAMERA_RETAKE, CAMERA_ACCEPT és CAMERA_CANCEL. Ezeket nem kell külön admin checkboxként kezelni.
Hozzájárulás és Letöltés
A látogató a kpGo felületen fogadja el az élményhez tartozó consent_title és consent_text szöveget. A capture után az API letöltési tokent hoz létre a kp_camera_download_tokens.token_hash mezőben, a publikus fotó URL pedig a kpgo.pro/photo/{token} útvonalon nyílik.
DEVICE_CAMERA módban a letöltési token a capture azonosítóból szerveroldali HMAC-kel újraépíthető, ezért a látogatói GET /camera/visitor/sessions/:id válasz API restart után is vissza tudja adni a download URL-t. Régi, memóriában tartott session download map továbbra is kompatibilis, de nem szükséges az új device-camera flow-hoz.
Regressziós Ellenőrzés
A DB séma ellenőrzése: npm run verify:camera-db. A device-camera letöltési lánc restart-határral együtt tesztelhető: CAMERA_SMOKE_RESTART=1 npm run smoke:camera-device. A smoke ideiglenes entitlement override-ot, eszközszintű telepítési engedélyt, kamera-képességet, kameraélményt és teszt capture-t hoz létre, majd visszaállítja az eredeti állapotot.
Valós Browser Player hardverpróba 2026-07-24: az InkognitóAblakTeszt kijelző kamera API támogatást, jelen lévő kamerát, GRANTED engedélyt és effektív READY állapotot jelentett. A tartós teszt fixture ismételhető parancsa: npm run setup:camera-test.
5. Előfizetési és Szerepkör Jogosultságok
Egy funkció akkor használható, ha a felhasználó szerepköre és a tenant effektív előfizetési jogosultsága is engedélyezi. Az effektív entitlement a csomagverzióból és az opcionális tenant override-ból áll elő; inaktív előfizetésnél a feature tiltott.
Feature Kulcsok
feature_visitor_remote: Visitor QR session, profil és látogatói vezérlés.feature_staff_remote: Staff Remote eszközlista, kijelzőparancsok és visitor session beavatkozások.feature_camera_exp: Camera Experience, a külön telepítési és hardverkapukkal együtt.feature_analytics: Proof of Play riport, statisztika és export.feature_api_access: API-kulcsok és inbound integrációs parancsok.feature_webhooks: webhook végpontok és kézbesítési naplók.feature_white_label: tenant arculat módosítása.feature_sso: fenntartott entitlement; az SSO runtime még nincs implementálva.
Szerepkörök és API Kapuk
A Staff Remote felületet STAFF, STAFF_MANAGER és TENANT_ADMIN használhatja, de csak aktív feature_staff_remote mellett. A visitor profilokat kizárólag tenant adminisztrátor kezelheti. A VIEWER nem küldhet kijelzőparancsot és nem avatkozhat visitor sessionbe.
A feature-rel védett végpont tiltáskor 403 FEATURE_NOT_AVAILABLE választ ad a feature kulccsal. A Platform Admin override-listája ugyanazt a nyolc feature kulcsot használja, mint a Tenant App előfizetési nézete és az API entitlement feloldója.
Platform Technikai Tenant
A PLATFORM_SUPER_ADMIN tagság adatbázis-integritás miatt egy külön KioskPilot Platform technikai tenanthoz tartozik. Ez nem előfizető, nincs előfizetése vagy ügyféltartalma, és az API kizárja az előfizetői listából. A csomagváltási végpont is tiltja: 403 TECHNICAL_TENANT_FORBIDDEN. Új ügyfelet mindig a Platform Admin előfizető-létrehozási folyamatával kell felvenni.
Visitor Remote Tartalomvezérlés
A Tenant App kijelzőnkénti Távirányító beállításában külön engedélyezhető az Előző (PREV), Következő (NEXT) és Diaválasztás (SELECT_ITEM). A kpGo csak az engedélyezett vezérlőket jeleníti meg, az API pedig minden műveletnél újra ellenőrzi a profil allowlistjét.
Az aktív kiadás tartalmaihoz ugyanebben az ablakban saját látogatói gombfelirat, ikon és láthatóság állítható. A gomb kizárólag az adott kijelző aktív manifestjében szereplő médiát indíthatja. A többnyelvű médiafájlok egy logikai tartalomgombként jelennek meg; a kiválasztott látogatói nyelvet a Player alkalmazza. Tetszőleges külső URL látogatói gombként nem engedélyezett.
A metadata a kp_media.visitor_remote_visible, visitor_remote_title és visitor_remote_icon mezőkben él. A profilválasz items listája csak az aktív kiadás biztonságosan indítható tartalmaiból épül fel. Regresszió: TST-025 ellenőrzi a PREV, NEXT és SELECT_ITEM Player ACK láncot.
Csomagverziók, Limitek és Árak
A Csomagok & Limitek nézetben új csomag hozható létre, illetve módosítható a csomag neve, leírása, aktív állapota, hat limitje, nyolc szolgáltatása, valamint havi és éves HUF ára. A csomag slugja létrehozás után nem változtatható.
Minden mentett módosítás új, megváltoztathatatlan kp_plan_versions verziót készít. Az új előfizetés és a későbbi kézi csomagváltás mindig a legfrissebb verziót kapja; a meglévő előfizetők nem kerülnek automatikusan új árra vagy limitekre. Ez megakadályozza a csendes szerződésmódosítást. A verzióelőzmény a szerkesztőablakban látható.
Inaktivált csomag új előfizetéshez nem választható, de a már azon lévő előfizetők és korábbi verzióik megmaradnak. A létrehozás PLAN_CREATED, a módosítás PLAN_VERSION_CREATED audit eseményt ír. Kapcsolódó végpontok: GET/POST /platform/plans, PUT /platform/plans/:planId és GET /platform/plans/:planId/versions.
Fejlesztési Frissítési Szabály
Új vagy módosított feature esetén együtt kell frissíteni az API entitlement contractot, a Platform Admin csomag- és override nézetét, a Tenant App elérhetőségi állapotát, az érintett kpGo/Player/Staff felületet, az automatizált contract ellenőrzést, ezt a súgót és a user_task_list.md élő teendőlistát.
6. PM2 Futáskörnyezet & Háttérfolyamatok
A KioskPilot V3 monorepó szolgáltatásai a háttérben PM2 folyamatkezelő alatt futnak.
Aktív PM2 Folyamatok
| Szolgáltatás Neve | Alkalmazás Útvonala | Port | Státusz |
|---|---|---|---|
kioskpilot-api | apps/api/index.js | 3214 | online |
kioskpilot-tenant-app | apps/tenant-app/index.js | 3211 | online |
kioskpilot-kpgo | apps/kpgo/index.js | 3215 | online |
kioskpilot-platform-admin | apps/platform-admin/index.js | 3212 | online |
kioskpilot-marketing | apps/marketing/index.js | 3210 | online |
kioskpilot-staff-remote | apps/staff-remote/index.js | 3213 | online |
kioskpilot-worker | apps/worker/index.js | háttérfolyamat | online |
Háttérmunkás (Worker) indítása
A médiafeldolgozást, a Camera Experience retention takarítását és a webhook kézbesítést a háttérben futó worker kezeli. A Proof of Play eseményeket az API fogadja és tárolja; azok nem worker-jobként érkeznek. A worker indítása a projekt gyökérkönyvtárából:
pm2 start ecosystem.worker.config.js pm2 status kioskpilot-worker
Adatbázis Migrációk
Éles környezetben az API nem futtat automatikus DDL műveleteket. A verziózott database/migrations/*.sql fájlokat root vagy külön DBA/migration felhasználó telepíti, az alkalmazás kpilot_app felhasználója pedig szándékosan csak SELECT, INSERT, UPDATE és DELETE jogot kap. A dedikált kpilot_migrate kizárólag a kpilot_core sémán kap DDL-jogot. A npm run migrate automatikusan betölti a ~/.config/kioskpilot/migration.env 600-as jogosultságú hitelesítését; egyedi hely a KIOSKPILOT_MIGRATION_ENV változóval adható meg. Runtime route nem hozhat létre és nem módosíthat táblát.
A migration history és az élő séma egyezése a projekt gyökeréből a npm run verify:manual-migrations paranccsal ellenőrizhető. Az ellenőrzés alapból read-only. A --apply kapcsoló kizárólag teljes oszlop-, index-, idegenkulcs- és backfill-fingerprint egyezésnél írhat hiányzó history sort; DDL-t nem futtat és üzleti adatot nem módosít. A 2026-07-24-i DB-REC-01 rendezés után a kézzel telepített 016_visitor_action_events.sql, 017_visitor_controller_state.sql, 018_media_visitor_settings.sql és 019_camera_installation_settings.sql history-bejegyzése konzisztens.
A projektmappa-séma 024_projects_and_folders.sql migrációja naplózott. A korai 025_seed_totem02_flow.sql hibás, verziózás előtti teszt seed volt; most dokumentált történeti no-op, ezért migráció soha nem hoz létre tenant üzleti tartalmat. A valós múzeumi fixture csak az explicit reset:museum-content, import:backstage-museum és import:online-exhibition munkafolyamatokkal kezelhető.
A runtime séma-szerződés ellenőrzése: npm run verify:runtime-schema-contract. Ez igazolja, hogy aktív API route nem futtat projekt-DDL-t, nem hivatkozik a megszűntetett kp_playlist_items táblára, és a médiahasználat a kanonikus ContentVersion/PlaylistVersion/Release/Schedule láncon oldódik fel.
Runtime titkok és JWT rotáció
Productionben a JWT_SECRET kötelező, erős, egyedi környezeti titok. Az API 2026-08-12 óta fail-closed: hiányzó vagy 64 karakternél rövidebb kulccsal nem indul el, és nincs forráskódbeli fallback. A rotáció a projekt gyökeréből az npm run security:rotate-jwt -- --confirm=ROTATE_KIOSKPILOT_JWT_SECRET paranccsal végezhető. A segéd 0600-as rollback másolatot készít, kriptográfiai kulcsot generál annak kiírása nélkül, atomikusan frissíti a .env-et és törli a kp_sessions refresh sessionöket.
A rotáció minden aktív Admin/Tenant munkamenetet megszakít, ezért utána pm2 reload all --update-env, teljes újrabejelentkezés és auth-smoke szükséges. A 2026-08-12-i első éles rotáció 58 refresh sessiont vont vissza; a régi fallback token 403, az új teszttoken 200, a visszavont refresh token 401 eredményt kapott. A titok értéke naplóba, dokumentumba vagy verziókezelt fájlba nem kerülhet.
Kódfrissítés és Ellenőrzés
Kódmódosítás után a szerveren minden PM2 folyamatot újra kell tölteni, majd ellenőrizni kell az API health végpontot és a hét folyamat állapotát:
ssh root@80.211.223.119 "su - kpilot -c 'cd /home/kpilot/web && pm2 reload all'" curl -fsS https://api.kioskpilot.cloud/health pm2 status
Ha a távoli root SSH kulcshitelesítés hibás, a reload nem tekinthető igazoltnak. A szerveren helyben, kpilot felhasználóként kell futtatni a cd /home/kpilot/web && pm2 reload all parancsot, majd külön health check és 7/7 online ellenőrzés szükséges.
7. Perzisztens Parancsok és Offline Működés
A kijelzőparancs nem egyszerű WebSocket-üzenet: minden kérés tartós kp_commands ledgerrekordot és kp_command_history állapottörténetet kap. Így az offline kijelzőre küldött, illetve hálózatváltás közben megszakadt művelet követhető és korlátozottan újraküldhető.
Állapotgép
Új parancs mindig PENDING. Csak sikeres WebSocket-küldési kísérletkor lesz SENT. A kijelző ACKNOWLEDGED, majd EXECUTING, végül COMPLETED vagy FAILED állapotot küldhet. Lejárt vagy a kézbesítési keretet kimerítő parancs EXPIRED. Terminális állapotból nincs visszalépés.
PENDING → SENT → ACKNOWLEDGED → EXECUTING → COMPLETED
└──────────────→ FAILED
PENDING / SENT / EXECUTING ──────────→ EXPIRED
Offline Sor és Újrakézbesítés
- Alapértelmezett parancs-érvényesség: 5 perc.
- Legfeljebb 3 kézbesítési kísérlet; a próbák a
SENThistory bejegyzésekből számolódnak. - Újracsatlakozáskor a gateway rövid ACK-várakozás után csak a nem terminális, még érvényes parancsot küldi újra.
- A
commandIdidempotencia-azonosító: ugyanazt a műveletet a Player nem hajthatja végre kétszer.
Player ACK Outbox és Deduplikáció
A Browser Player a terminális eredményt előbb helyi, tartós outboxba menti, és csak utána küldi WebSocketen. Reload vagy kapcsolatvesztés után az outboxot újraküldi, amíg a szerver command_status_ack választ nem ad. Az utolsó 100 terminális commandId receipttel deduplikál: ismételt kézbesítésnél a korábbi eredményt küldi vissza, a parancsot nem futtatja újra.
{
"event": "command_status",
"commandId": "UUID",
"status": "COMPLETED",
"payload": { "result": "ok" }
}
A szerver csak ahhoz az eszközhöz tartozó parancs státuszát fogadja el, amelyik a WebSocketen hitelesítette magát. Ismeretlen azonosító, érvénytelen státusz, terminális állapot felülírása vagy állapot-visszalépés elutasított.
Regressziós Ellenőrzés
npm run test:command-delivery valós adatbázison és WebSocket gateway-en ellenőrzi az online kézbesítést, offline queue-t, megszakított EXECUTING állapot utáni újraküldést, terminális ACK-ot és azt, hogy a következő reconnectkor nincs újrajátszás. A release-state konkurenciateszt: npm run test:device-release-state-api; ez 12 egyidejű ACTIVE jelentést is küld.