TITLE=Nyilvános oldal ROUTE=/services/public-site LOCALE=hu MODIFIED=1792417593 URL=https://wiki.teletypegames.org/hu/services/public-site L=1 https://git.teletypegames.org/services/teletypegames L=2 #22 q│ A Teletype Games nyilvános platformja: egyetlen monorepó q│ (1cservices/teletypegamesq) a katalógus-backenddel (Catalog API) és a retró q│ stílusú frontenddel, Docker Compose-zal futtatva. 1A monorepó felépítése 1═════════════════════ p apps/ p frontend/ # Vue 3 + Vite + TypeScript + Tailwind p api/ # Rails 8 API + ActiveAdmin A cdocker compose up -d0 elindítja a fejlesztői környezetet. Mindkét alkalmazás egy domain alatt van: t┌──────────────┬──────────────────┐ t│h Útvonal t│h Mit szolgál ki t│ t├──────────────┼──────────────────┤ t│0 c/0 t│0 frontend t│ t│0 c/api0 t│0 Catalog API t│ t│0 c/admin0 t│0 ActiveAdmin t│ t│0 c/api/swagger0 t│0 API-dokumentáció t│ t└──────────────┴──────────────────┘ Lintelés: bRuboCop0 (rubocop-rails-omakase) a backendhez, bESLint 90 (flat config, Vue + TypeScript) a frontendhez. 1Catalog API 1═══════════ Rails 8 + MySQL. ActiveAdmin felület (blaze téma, Devise-hitelesítés), Blueprinter-szerializálók, apipie-rails dokumentáció böngészhető Swagger UI-jal. Ez az egyetlen igazságforrás a szoftver-metaadatokhoz, kiadásokhoz, tagokhoz, eseményekhez és letöltési naplókhoz, és ez szolgálja ki a képeket és binárisokat. 2Domainmodell 2──────────── A cSoftware0 (name, title, author, desc, story, license, platform, status, highlighted; soft delete) sok cRelease0 és cExternalLink0 elemhez tartozik, valamint képekhez a cSoftwareImage0 táblán keresztül (alapértelmezett jelző + sorrend). Egy cRelease0 tárolja a verziót, valamint a kazetta / forrás / HTML-mappa / dokumentációs mappa útvonalait. Minden letöltés egy cDownload0 sor (IP, user agent, referer, kiadás), ami cdownloadCount0 / ctotalDownloads0 néven jelenik meg az API-válaszokban. 2Végpontok 2───────── t┌─────────────────────────────────────┬──────────────────────────────────────┐ t│h Végpont t│h Mire való t│ t├─────────────────────────────────────┼──────────────────────────────────────┤ t│0 cGET /api/software0 t│0 Katalóguslista: szoftver + rendezett t│ t│0 t│0 kiadások + clatestRelease0 (a cdev-0 t│ t│0 t│0 kihagyásával) + cwebPlayableRelease0 + t│ t│0 t│0 ctotalDownloads0 t│ t├─────────────────────────────────────┼──────────────────────────────────────┤ t│0 cGET /api/software/highlighted0 t│0 Kiemelt szoftverek t│ t├─────────────────────────────────────┼──────────────────────────────────────┤ t│0 cGET /api/events0 t│0 Közösségi események t│ t├─────────────────────────────────────┼──────────────────────────────────────┤ t│0 cGET /api/members0 t│0 Csapattagok t│ t├─────────────────────────────────────┼──────────────────────────────────────┤ t│0 cGET /api/stores0 t│0 Áruház-nyilvántartás (lásd lentebb) t│ t├─────────────────────────────────────┼──────────────────────────────────────┤ t│0 cGET /api/image/:id0 t│0 Képkiszolgálás t│ t├─────────────────────────────────────┼──────────────────────────────────────┤ t│0 cGET0 t│0 Wiki-proxy: a Grav ccustom/pages.json0 t│ t│0 c/api/wiki/0 t│0 végpontját kéri le a cWIKI_GRAV_URL0 t│ t│0 cpages?tag=blog\|howto[&limit][&body0 t│0 alapján, így a frontend soha nem t│ t│0 c=1][&lang=en\|hu]0 t│0 beszél közvetlenül a wikivel t│ t├─────────────────────────────────────┼──────────────────────────────────────┤ t│0 cGET /api/rss/blog0 t│0 RSS a cblog0 címkéjű wikioldalakról t│ t├─────────────────────────────────────┼──────────────────────────────────────┤ t│0 cGET /api/rss/releases0 t│0 RSS a legfrissebb kiadásokról t│ t├─────────────────────────────────────┼──────────────────────────────────────┤ t│0 cGET /api/download?path=…0 t│0 Naplózott letöltés (rögzíti az IP / t│ t│0 t│0 UA / referer adatokat, majd t│ t│0 t│0 kiszolgál) t│ t├─────────────────────────────────────┼──────────────────────────────────────┤ t│0 cGET /api/swagger0 t│0 apipie-dokumentáció t│ t├─────────────────────────────────────┼──────────────────────────────────────┤ t│0 cGET /file/*path0 t│0 Közvetlen fájlletöltés; az t│ t│0 t│0 API-válaszok kiadásútvonalai ide t│ t│0 t│0 mutatnak t│ t├─────────────────────────────────────┼──────────────────────────────────────┤ t│0 cPOST /build/upload0 t│0 Artifact-feltöltés, kérésenként egy t│ t│0 t│0 fájl; alkalmazástoken cupload0 t│ t│0 t│0 jogosultsággal t│ t├─────────────────────────────────────┼──────────────────────────────────────┤ t│0 cPOST /build/publish0 t│0 Kiadás publikálása; alkalmazástoken t│ t│0 t│0 cupdate0 jogosultsággal, a CI hívja t│ t│0 t│0 feltöltés után t│ t└─────────────────────────────────────┴──────────────────────────────────────┘ A tokeneket a 2WarpEngine cikk írja le. bAz áruház-nyilvántartás0 (cGET /api/stores0) megmondja, mely katalógusokból telepíthet egy kliens, és hol van az egyes áruházak konfigurációja. Nyilvános, mert az asztali kliens első indításkor olvassa, és nincs kinek belépnie. Egy sor három mező (cname0, ccatalog_url0, cstore_repository_url0), az ActiveAdmin ▸ 🛒 Stores alatt szerkeszthető. A hosztalkalmazásban él, nem a WarpEngine-ben: a motor egyetlen katalógust szolgál ki, és nem tudja, ki szállít hozzá áruházakat. 2Publikálási pipeline 2──────────────────── A c/build/publish0 platform szerint továbbít egy cPlatforms0 szolgáltatásnak (ctic800, clove0, cebitengine0, cc640, cplus40, cgodot0, cbevy0, cphaser0). Mindegyik felveszi a feltöltött artifactokat (C64 és Plus/4 esetén c-.prg0 + c-.metadata.json0, az EmulatorJS c.html.zip0 és a yapeSDL c-linux-x640, c-win-x640, c-mac-universal0 zipek), a metaadatból upserteli a cSoftware0 rekordot, a csite0 mezőből hozzáad egy iSource Code0 külső linket, és létrehozza a cRelease rekordot. A Gitea + Woodpecker oldal az Üzembe helyezés cikkben van. 1Frontend 1════════ Vue 3 SPA, Vitével építve, TypeScriptben: vue-router (oldalanként egy modul), Pinia-store-ok domainenként (software, events, members, git, blog, howtos, youtube, ui), vue-i18n, valamint Tailwind CSS + TuiCSS a retró terminál-kinézethez. A Traefik ugyanazon az alapdomainen proxyzza, mint az API-t. Oldalak: chome0, ccatalog0 (lista + részletek), cblog0, ccode0, chowtos0, cteam0, ccontact0. A katalógus részletoldalán képnagyító, kiadáslista, letöltésszámlálók és böngészőben játszható kiadások vannak. Forrásonként egy kliensmodul a csrc/api/0 alatt: t┌─────────────────────────────────────┬──────────────────────────────────────┐ t│h Modul t│h Forrás t│ t├─────────────────────────────────────┼──────────────────────────────────────┤ t│0 csoftware.api.ts0, cevent.api.ts0, t│0 Catalog API t│ t│0 cmember.api.ts0 t│0 t│ t├─────────────────────────────────────┼──────────────────────────────────────┤ t│0 cwiki.api.ts0 t│0 A Catalog API wiki-proxyja (cblog0 / t│ t│0 t│0 chowto0 címkék), a felület nyelvét t│ t│0 t│0 clang0 paraméterként átadva. A t│ t│0 t│0 cVITE_WIKI_BASE0 csak a Gravra mutató t│ t│0 t│0 külső linkek felépítéséhez kell t│ t├─────────────────────────────────────┼──────────────────────────────────────┤ t│0 cgit.api.ts0 t│0 Gitea REST API v1 t│ t│0 t│0 (cWEBAPP_GITEA_TOKEN0 token) a iCode0 t│ t│0 t│0 oldalhoz t│ t├─────────────────────────────────────┼──────────────────────────────────────┤ t│0 cyoutube.api.ts0 t│0 YouTube Data API: a csatorna t│ t│0 t│0 legutóbbi videója és t│ t│0 t│0 megtekintésszáma t│ t└─────────────────────────────────────┴──────────────────────────────────────┘ bAnalitika.0 A cuseMatomo0 egyszer állítja fel a Matomo-trackert, és oldalmegtekintést csak a router cafterEach0-e mér, így egy látogatás egy oldalmegtekintés (korábban kettő volt). Az első navigáció megtartja a külső referrert, ahelyett hogy a saját c/0 írná felül. A mérés sütimentes (cdisableCookies0, nincs c_pk_id0, nem kell hozzájárulás), és egy heartbeat-időzítő az egyoldalas látogatások idejét is rögzíti. A Gitea-fejléc ugyanezt a trackert kapja. 1CI 1══ t┌────────────────────────┬─────────────────────────┬─────────────────────────┐ t│h Workflow t│h Mikor fut t│h Mit csinál t│ t├────────────────────────┼─────────────────────────┼─────────────────────────┤ t│0 c.woodpecker/deploy.0 t│0 push a cmaster0re, kézzel t│0 a crubocop0 és a t│ t│0 cyaml0 t│0 t│0 ctest-host0 párhuzamosan, t│ t│0 t│0 t│0 a cdeploy0 mindkettőt t│ t│0 t│0 t│0 megvárja; a deploy egy t│ t│0 t│0 t│0 SSH-hívás a szerveren a t│ t│0 t│0 t│0 cci-deploy teletypegames0 t│ t│0 t│0 t│0 parancsra t│ t├────────────────────────┼─────────────────────────┼─────────────────────────┤ t│0 c.woodpecker/warp_0 t│0 a clibs/ruby/warp_engine0 t│0 verzióellenőrzések, t│ t│0 cengine.yaml0 t│0 változásai t│0 crubocop0 + ctest-engine0, t│ t│0 t│0 t│0 majd a split-mirror az t│ t│0 t│0 t│0 cengines/warp_engine0-be t│ t│0 t│0 t│0 és a gem publikálása t│ t├────────────────────────┼─────────────────────────┼─────────────────────────┤ t│0 c.woodpecker/ci-images.0 t│0 a cci/**0 vagy a gemeket t│0 megépíti az alábbi t│ t│0 cyaml0 t│0 meghatározó fájlok t│0 CI-image-eket t│ t│0 t│0 változása a cmaster0en, t│0 t│ t│0 t│0 kézzel, éjszakai cron t│0 t│ t└────────────────────────┴─────────────────────────┴─────────────────────────┘ Egyik lépés sem kap hoszt-mappát vagy docker socketet, így semmihez nem kell ctrusted: volumes0 (a régi c/srv/ci-cache0 volume megszűnt): az eszközök és a gemek bsaját CI-image-einkben0 vannak, amelyeket a cci/*.Dockerfile0 fájlokból a bkaniko0 épít (privileged mód és docker socket nélkül), és a Gitea registrybe pushol a cgit.teletypegames.org/build/…0 alá: t┌─────────────────────────────────────┬──────────────────────────────────────┐ t│h Image t│h Ki használja t│ t├─────────────────────────────────────┼──────────────────────────────────────┤ t│0 cteletypegames-ci:api-ruby3.30 t│0 a cdeploy.yaml0 rubocop + test-host t│ t│0 t│0 lépése (ruby 3.3, a mysql2 t│ t│0 t│0 build-függőségei, az capps/api0 t│ t│0 t│0 gemjei) t│ t├─────────────────────────────────────┼──────────────────────────────────────┤ t│0 cteletypegames-ci:warp_engine-ruby3.0 t│0 a cwarp_engine.yaml0 rubocop + t│ t│0 c20 t│0 test-engine lépése t│ t├─────────────────────────────────────┼──────────────────────────────────────┤ t│0 cdeploy-ssh:alpine3.220 t│0 minden repó minden cssh deploy@0 t│ t│0 t│0 deploy/store lépése, digest szerint t│ t│0 t│0 hivatkozva t│ t├─────────────────────────────────────┼──────────────────────────────────────┤ t│0 cdos-ci:bookworm0 t│0 a cdos/*0 repók test lépése (Open t│ t│0 t│0 Watcom, DOSBox, DOSBox Staging, t│ t│0 t│0 Wine, clang-format) t│ t├─────────────────────────────────────┼──────────────────────────────────────┤ t│0 cci-tools:alpine3.220 t│0 segédlépések: git, git-subtree, jq, t│ t│0 t│0 curl, zip, lua, luacheck, ldoc — a t│ t│0 t│0 WarpEngine ctools0 image-e minden t│ t│0 t│0 játék-pipeline-hoz (digest szerint), t│ t│0 t│0 a release lépések, a split-mirror t│ t├─────────────────────────────────────┼──────────────────────────────────────┤ t│0 cpyftpdlib:3.130 t│0 az cinfra/ftp-server0 test lépése t│ t├─────────────────────────────────────┼──────────────────────────────────────┤ t│0 cwarp-engine-client-ci:node220 t│0 a cstores/warp-engine-client0 check t│ t│0 t│0 lépése, előre telepített t│ t│0 t│0 cnode_modules0-szal t│ t├─────────────────────────────────────┼──────────────────────────────────────┤ t│0 cebitengine-ttg:latest0 t│0 a WarpEngine ebitengine-buildere: az t│ t│0 t│0 cebitengine-builder0 a TTG összes t│ t│0 t│0 Go-projektjének moduljaival t│ t├─────────────────────────────────────┼──────────────────────────────────────┤ t│0 cbevy-ttg:latest0 t│0 a WarpEngine bevy-buildere: a t│ t│0 t│0 cbevy-builder0 a TTG összes t│ t│0 t│0 Rust-projektjének crate-jeivel t│ t└─────────────────────────────────────┴──────────────────────────────────────┘ Minden image kap egy mozgó és egy commithoz kötött taget (c…-0), és csak akkor épül újra, ha a cmaster0en a saját Dockerfile-ja vagy a gemjeit meghatározó fájlok változnak, vagy kézzel. Kivétel a cwarp-engine-client-ci0, az cebitengine-ttg0 és a cbevy-ttg0, amelyek függőségei más repókban vannak: ezeket az éjszakai cci-images-nightly0 cron is nézi, és csak akkor épít, ha az aktuális függőségekre még nincs image (clock-0 a kliens cpackage-lock.json0-jára; cdeps-0 a cci/collect-deps.sh0 által a cgames0, cdemos0 és cengines0 org minden ágáról összegyűjtött cgo.mod0/cgo.sum0 és cCargo.toml0/cCargo.lock0 fájlokra, plusz a builder digestjére). Egy új függőséget a build ugyanúgy letölt, mint eddig. A workflow egy secretet kér: cforge_token0 (cpackage:write0).