---
title: 'TTG Blog BBS'
url: 'https://wiki.teletypegames.org/hu/services/ttg-blog-bbs'
markdown: 'https://wiki.teletypegames.org/hu/services/ttg-blog-bbs.md'
lang: hu
date: '2026-10-28'
description: 'A Teletype Games blogja BBS-ként: a legfrissebb posztok és a kategóriák, egy poszt képernyőnként lapozva. A szerkesztők ugyanezen a vonalon lépnek be, és írnak, szerkesztenek, törölnek posztokat. Elérhető: teletypegames.org:2328, böngészőben pedig a bbsweb-en, és a TTG Gate BBS-en át is Áttekinté…'
taxonomy:
  tag:
    - howto
---

# TTG Blog BBS

> A Teletype Games blogja BBS-ként: a legfrissebb posztok és a kategóriák, egy poszt képernyőnként lapozva. A szerkesztők ugyanezen a vonalon lépnek be, és írnak, szerkesztenek, törölnek posztokat.
> 
> **Elérhető: `teletypegames.org:2328`**, böngészőben pedig a [bbsweb](https://bbsweb.teletypegames.org)-en, és a [TTG Gate BBS](https://wiki.teletypegames.org/hu/services/ttg-gate-bbs)-en át is

# Áttekintés

Ruby alkalmazás a [**rubbs**](https://git.teletypegames.org/engines/rubbs) gemre építve, mint a [Teletype BBS](https://wiki.teletypegames.org/hu/services/teletype-bbs), az [Alexandria BBS](https://wiki.teletypegames.org/hu/services/alexandria-bbs) és a [Feedia BBS](https://wiki.teletypegames.org/hu/services/feedia-bbs). Egy porton két arca van, és mindkettő **soralapú**, ablakok nélkül:

- **Modern** — ANSI-színek, legfeljebb 80 oszlop és a hívó ablakmagassága (SyncTERM, NetRunner, PuTTY, bbsweb).
- **Commodore 64** — PETSCII 40×25-ön, C64-es terminálprogramhoz (CCGMS, StrikeTerm) WiFi-modem mögött.

A menük, a listák, a mezők és a teljes képernyős szerkesztő mindkettőn ugyanazok. A hívás a rubbs `BBS::Terminal` kérdésével indul: a RETURN elfogadja a tippet, az `1` a modernt, a `2` a C64-et választja.

# Olvasás

| Billentyű | Művelet |
|---|---|
| `L` | Legfrissebb posztok, a legújabb elöl |
| `C` | Kategóriák a posztszámukkal, aztán a kategória posztjai |
| `G` | Ugrás egy posztra a száma alapján (a weben a poszt mellett látszik) |
| `E` | Szerkesztői belépés |
| `Q` | Kilépés |

A listák számozottak: a szám és RETURN megnyit egy posztot, a RETURN magában lapoz, a `Q` vagy a `←` visszalép. Egy poszt mutatja a címét, kategóriáját, dátumát és szerzőjét, az utolsó módosítás dátumát, az összefoglalót, aztán a törzsét (Markdown), képernyőnként lapozva.

A C64-en minden képernyő kitölti a teljes 40×25-öt: a menük és a listák kurzoros menük (a CRSR mozgatja a sávot, a RETURN választ, a billentyűk is működnek), alul egy inverz **lábléccel**, ami megmondja a képernyő billentyűit. A kezdőlap annyi friss posztot mutat, amennyi kifér. Egy poszt minden oldalán ott marad a lábléc: a RETURN, a `+` vagy a CRSR le lapoz, a `-` vagy a CRSR fel visszalapoz, a `Q` vagy a `←` kilép; szerkesztőnek a lábléc fölötti sorban ott az `E` szerkesztés, a `P` publikálás és a `D` törlés, a kérdések a láblécben jönnek a poszt fölött, és szerkesztés vagy publikálás után a poszt újra megjelenik.

# Írás

Belépés után a menüben ott van az `U` nem publikált posztok, a `W` új poszt, a `P` jelszócsere és az `O` kilépés a szerkesztőből, és minden poszt alatt az `E` szerkesztés, a `P` publikálás vagy visszavonás és a `D` törlés.

Egy új poszt **nem publikált**: csak a szerkesztők látják (a listákban jelölve), az olvasók és a web nem. Egy új poszt mentés után nem publikált marad; a poszt alatti `P` publikálja. Az első publikálás beírja a `published_at`-ot és jelez a Discordra; visszavonás és újrapublikálás után nem jelez még egyszer. Egy új poszt sorban bekéri a címet (legfeljebb 80 karakter), a kategóriát, az egysoros összefoglalót (legfeljebb 280) és a törzset, aztán mutatja a piszkozatot: `T` cím, `C` kategória, `S` összefoglaló, `B` törzs, `V` előnézet, `W` mentés, `Q` kilépés.

## Piszkozatok és autosave

Amit egy szerkesztő ír, az a mentésig **piszkozatként** megmarad, így egy megszakadt kapcsolat sem visz el semmit. A piszkozat minden mező után mentődik, a szerkesztőben 15 másodpercenként, ha változott a szöveg (`TTG_BLOG_BBS_AUTOSAVE_SECONDS`), és bontáskor is. Az első változáskor jön létre, így ha csak megnyitsz egy posztot és kilépsz, nem marad utána piszkozat. A piszkozatot csak a szerkesztés látja: a listák, a számlálók, a `G` és a web nem.

- A `W` ment: egy szerkesztés beíródik a posztjába, és a piszkozat törlődik; egy új poszt piszkozatából maga a poszt lesz, nem publikáltan.
- A `Q` változás után rákérdez: a `K` megtartja a piszkozatot későbbre, a `D` eldobja, a RETURN (C64-en a `back`) visszavisz a piszkozathoz.
- Ha egy posztnak van piszkozata, az `E` egy listával indul; a `W` ugyanígy, ha vannak új posztokhoz tartozó piszkozatok. A lista első sora a poszt mostani állapota (illetve egy új poszt), alatta a piszkozatok idővel és szerzővel, a legutóbbi elöl. A `D` eldob egyet (modern terminálon a `D` után a számát kell beírni). Minden szerkesztő látja az összes piszkozatot; a menüben a `W` mellett látszik, hány új posztos piszkozat vár.
- Ha egy másik szerkesztő a szerkesztésed kezdete óta elmentette a posztot, a `W` rákérdez, mielőtt felülírja az ő mentését.

A név, a jelszavak és a cím a rubbs egy **mezőjében** (`BBS::Field`), az összefoglaló és a törzs a **teljes képernyős szerkesztőjében** (`BBS::Editor`) készül. Mindkettő a meglévő szövegből indul, így egy cím vagy egy poszt szerkeszthető, nem kell újragépelni: a kurzorbillentyűk bárhová mozognak, a gépelés a kurzornál szúr be, a DEL előtte töröl, a szerkesztő pedig gépelés közben tördeli a sorokat. A mező RETURN-re zárul; a RUN/STOP vagy a `←` (Esc) kilép belőle.

| Billentyű a szerkesztőben | Művelet |
|---|---|
| kurzorbillentyűk | Mozgás; fel-le az oszlop marad |
| HOME / END | A képernyősor eleje / vége |
| PgUp / PgDn | Egy képernyőnyit fel / le (modern terminál) |
| RUN/STOP vagy `←` (Esc), majd `S` | Mentés |
| RUN/STOP vagy `←` (Esc), majd `Q` | Kilépés, a szöveg a régi marad |
| F1 (Ctrl-S) | Azonnali mentés (a C64 Ultimate UltimateTermje az F1-et a súgójának tartja meg) |

Az összefoglaló egy bekezdés: a RETURN menti. A törzsben a RETURN új sort, az üres sor új bekezdést kezd (Markdown).

# A weben

A posztok a [teletypegames.org/blog](https://teletypegames.org/blog) blogja, az oldal mindkét nyelvén ugyanazok. Minden poszt mutatja a számát, hogy milyen terminálról gépelték (**ANSI** vagy **C64**), és van egy **C64-képernyő** nézete (`?view=c64`): azok a sorok, amiket egy Commodore 64-es hívó lát, C64-palettával. Mellette egy kártya tárcsázza a boardot böngészőben (bbsweb, modern vagy C64-ként), a telnet-paranccsal és a `G` + posztszámmal. Az oldal RSS-e (`/api/v1/rss/blog`) is ezeket hozza.

A board csak olvasható HTTP-n szolgálja ki őket, ugyanabban a folyamatban, mint a telnetvonalat (`Web::Api`, 8080-as port). A konténer az `interstack` hálózatra is csatlakozik, és az oldal API-ja ott olvassa: `http://ttg-blog-bbs:8080` (`TTG_BLOG_BBS_URL`); a port kifelé nincs publikálva.

| Kérés | Válasz |
|---|---|
| `GET /posts` | a publikált posztok, a legújabb elöl, törzs nélkül |
| `GET /posts/SLUG` | egy poszt: Markdown, HTML (kramdown, GFM) és a C64-képernyő |
| `GET /categories` | a kategóriák a posztszámukkal |
| `GET /health` | `{"ok":true}` |

Egy poszt mentéskor kapja meg a **slugját**: a dátuma és a címe sima ASCII-ben (`2026-10-28-hello-world`). A cím átírásakor nem változik, így a linkek nem törnek el. Ha a stack `.env`-jében van `TTG_BLOG_BBS_DISCORD_WEBHOOK`, egy új poszt a linkjével Discordra is kimegy.

# Kategóriák és szerkesztők

A kategóriák a [`config/categories.yml`](https://git.teletypegames.org/bbs/ttg-blog-bbs/src/branch/master/config/categories.yml)-ből jönnek (`id`, `name`, `about`): News, Devlog, Releases, Retro, Events. A módosítás egy commit ebbe a fájlba; a masterre pusholva élesedik. A poszt az `id`-jével hivatkozik a kategóriára.

A szerkesztők és a posztok egy SQLite-fájlban vannak, a stack `data/ttgblog.sqlite3`-jában (`users`, `posts` a `slug`-gal, `face`-szel, `status`-szal (`draft`, `unpublished`, `published`), `published_at`-tel, `created_at`-tel, `updated_at`-tel, piszkozatnál `original_id`-vel és `base_updated_at`-tel). A jelszavak PBKDF2-SHA256 digestek; három rossz belépés után az adott hívásban nincs több próbálkozás. A szerkesztőket a szerveren kezeled:

```bash
docker exec -it ttg-blog-bbs bin/user add NÉV        # kétszer kéri a jelszót
docker exec -it ttg-blog-bbs bin/user passwd NÉV
docker exec -it ttg-blog-bbs bin/user remove NÉV     # a posztjai maradnak, szerző nélkül
docker exec ttg-blog-bbs bin/user list
```

# A motorháztető alatt

A masterre pusholva Woodpeckerből élesedik (RuboCop, compose-ellenőrzés, `ci-deploy ttg-blog-bbs`); a konténer `ttg-blog-bbs`, a `/srv/stacks/ttg-blog-bbs`-ban, a `data/` megmarad a deployok között. Az entrypoint induláskor frissíti a rubbs-t.

'; var prevLevel = 2; for (var i = 0; i < headings.length; i++) { var h = headings\[i\]; var text = h.textContent.trim(); var slug = text.toLowerCase() .replace(/\[áàâä\]/g,'a').replace(/\[éèêë\]/g,'e').replace(/\[íìîï\]/g,'i') .replace(/\[óòôöő\]/g,'o').replace(/\[úùûüű\]/g,'u') .replace(/\[^a-z0-9\]+/g, '-').replace(/^-|-$/g, ''); if (!slug) slug = 'heading-' + i; if (used\[slug\]) { slug += '-' + i; } used\[slug\] = true; h.id = slug; var level = parseInt(h.tagName.charAt(1)); var cls = level > 2 ? ' class="toc-child"' : ''; html += '- [' + text + '](#'%20+%20slug%20+%20')
'; } html += '
'; toc.innerHTML = html; // Scroll-spy: highlight current heading var links = toc.querySelectorAll('a'); var ids = \[\]; for (var j = 0; j < links.length; j++) ids.push(links\[j\].getAttribute('href').slice(1)); function updateActive() { var current = ''; for (var k = 0; k < ids.length; k++) { var el = document.getElementById(ids\[k\]); if (el && el.getBoundingClientRect().top <= 80) current = ids\[k\]; } for (var m = 0; m < links.length; m++) { links\[m\].parentNode.classList.toggle('active', links\[m\].getAttribute('href') === '#' + current); } } window.addEventListener('scroll', updateActive, { passive: true }); updateActive(); })();

---

## Navigation

- Parent: [Szolgáltatások](https://wiki.teletypegames.org/hu/services.md)
- Previous: [Teletype Orbit](https://wiki.teletypegames.org/hu/services/teletype-orbit.md)
- Next: [TTG Gate BBS](https://wiki.teletypegames.org/hu/services/ttg-gate-bbs.md)
