---
title: 'Minimális projekt'
url: 'https://wiki.teletypegames.org/hu/engines/rubbs/minimal-project'
markdown: 'https://wiki.teletypegames.org/hu/engines/rubbs/minimal-project.md'
lang: hu
date: '2026-11-02'
description: 'A legkisebb teljes rubbs-projekt: egy board, ami feltesz két kérdést, és megmondja, jó-e a válasz. Négy fájl, semmi elhagyható. A rubbs 1.1.0 alapján. Ami a minimumon túl van, az az Első lépések oldalon. Fájlok quiz-bbs/ ├── Gemfile ├── bbs.rb ├── Dockerfile └── compose.yaml Gemfile A gem neve bb…'
taxonomy:
  tag:
    - reference
---

# Minimális projekt

> A legkisebb teljes [rubbs](https://wiki.teletypegames.org/hu/engines/rubbs)-projekt: egy board, ami feltesz két kérdést, és megmondja, jó-e a válasz. Négy fájl, semmi elhagyható. A rubbs 1.1.0 alapján. Ami a minimumon túl van, az az [Első lépések](https://wiki.teletypegames.org/hu/engines/rubbs/getting-started) oldalon.

# Fájlok

```text
quiz-bbs/
├── Gemfile
├── bbs.rb
├── Dockerfile
└── compose.yaml
```

## Gemfile

A gem neve `bbs`, és a saját Git-szerverünkről jön, nem a rubygems.org-ról. A `tag` egy kiadáshoz köt.

```ruby
source 'https://rubygems.org'

gem 'bbs', git: 'https://git.teletypegames.org/engines/rubbs.git', tag: 'v1.1.0'
```

## bbs.rb

Ez az egész board. Az `ask` beolvas egy sort a contextbe a megadott néven, a `text` kiírja a blokk visszatérési értékét, és amikor a lépések elfogynak, a szerver bontja a vonalat.

```ruby
require 'bbs'

QUESTIONS = {
  'What is 2 + 2?' => '4',
  'Which year did the C64 come out?' => '1982'
}.freeze

BBS.configure do |c|
  c.flow = BBS::Flow.define do
    big_banner 'Quiz BBS'
    QUESTIONS.each_with_index do |(question, answer), i|
      ask :"answer#{i}", prompt: question
      text { |ctx| ctx[:"answer#{i}"] == answer ? 'Correct!' : "Wrong, it is #{answer}." }
    end
    pause 'Bye!', seconds: 2
  end
end

BBS.start
```

## Dockerfile

A `git` a gem letöltéséhez kell, a `build-base` a `sqlite3` natív kiterjesztésének fordításához, amire a rubbs épít.

```dockerfile
FROM ruby:3.3-alpine
RUN apk add --no-cache git build-base
WORKDIR /app
COPY Gemfile ./
RUN bundle install
COPY bbs.rb ./
EXPOSE 2323
CMD ["bundle", "exec", "ruby", "bbs.rb"]
```

## compose.yaml

A board a konténerben a 2323-on figyel; a `ports` bal oldala a port a saját gépeden.

```yaml
services:
  quiz-bbs:
    build: .
    ports:
      - "2323:2323"
    restart: unless-stopped
```

# Futtatás

## Dockerrel (Windows, Linux, macOS)

Telepítsd a Dockert: Windowson és macOS-en a [Docker Desktop](https://www.docker.com/products/docker-desktop/)-ot (macOS-en az OrbStack is jó), Linuxon a Docker Engine-t a compose pluginnal. Utána a projekt mappájában:

```text
docker compose up -d --build
```

Leállítás: `docker compose down`.

## Docker nélkül (Linux, macOS)

Ruby 3.2 vagy újabb, Git és C-fordító kell.

| OS | Telepítés |
|---|---|
| macOS | `xcode-select --install`, aztán `brew install ruby` |
| Debian / Ubuntu | `sudo apt install ruby-full build-essential git` |

```text
bundle install
bundle exec ruby bbs.rb
```

A `Ctrl-C` leállítja a szervert. Windowson Dockerrel, vagy WSL-ben a linuxos parancsokkal futtasd.

# A board hívása

Bármilyen telnetkliens jó; a cím `localhost`, a port `2323`.

| OS | Kliens |
|---|---|
| Windows | A beépített klienst egyszer be kell kapcsolni: `dism /online /Enable-Feature /FeatureName:TelnetClient` (rendszergazdai parancssorban), aztán `telnet localhost 2323`. Vagy PuTTY, Telnet kapcsolattípussal. |
| macOS | `brew install telnet`, aztán `telnet localhost 2323` |
| Linux | `sudo apt install telnet`, aztán `telnet localhost 2323` |

```text
     ____        _          ____  ____ _____
    / __ \__  __(_)___     / __ )/ __ ) ___/
   / / / / / / / /_  /    / __  / __  \__ \
  / /_/ / /_/ / / / /_   / /_/ / /_/ /__/ /
  \___\_\__,_/_/ /___/  /_____/_____/____/

  What is 2 + 2?: 4
  Correct!
  Which year did the C64 come out?: 1984
  Wrong, it is 1982.

  Bye!
```

# Lásd még

- [Első lépések](https://wiki.teletypegames.org/hu/engines/rubbs/getting-started) — minden konfigurációs kulcs, egy valódi board szerkezete, az éles Dockerfile
- [Flow](https://wiki.teletypegames.org/hu/engines/rubbs/flow) — a párbeszéd-DSL minden lépése
- [rubbs](https://wiki.teletypegames.org/hu/engines/rubbs) — a főoldal

'; 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: [RuBBS](https://wiki.teletypegames.org/hu/engines/rubbs.md)
- Previous: [Első lépések](https://wiki.teletypegames.org/hu/engines/rubbs/getting-started.md)
- Next: [Telnet, session és store](https://wiki.teletypegames.org/hu/engines/rubbs/telnet-and-store.md)
