Ako si postavit vlastne BBS na Raspberry Pi Zero 2 W a pripojit sa z Atari XE/XL

Prečo BBS na ATARI v roku 2026?

V osemdesiatych rokoch boli BBS-ky centrom digitálneho života. Ľudia vytáčali modemom číslo, pripájali sa na lokálne nástenky, čítali správy, stiahli si hru, podpísali sa do guestbooku. Potom prišiel internet a BBS-ky zmizli.

Ale čo ak si jednu postavíte znova — nie ako nostalgickú hračku, ale ako reálny server, na ktorý sa dá pripojiť z pôvodného hardvéru? Presne to som spravil. Moj BBS beží na Raspberry Pi Zero 2 W (za cca 17 EUR), počúva na porte 6502 a každý s Atari XE/XL sa na ňu môže pripojiť cez telnet.


Krok 1: Základná inštalácia Pi Zero 2

Naflashujte OS

Použite Raspberry Pi Imager, zvoľte Raspberry Pi OS Lite (64-bit). V nastaveniach:

  • Zapnite SSH
  • Nastavte WiFi (SSID + heslo)
  • Nastavte username (napr. user) a heslo

Vložiť SD kartu do Pi, zapnúť, počkať pár minút a pripojiť sa:

ssh user@<IP_adresa_Pi>

IP adresu nájdete v admin rozhraní vášho routera, alebo použite:

# z iného počítača v sieti:
ping raspberrypi.local

Základné nastavenie

sudo apt update && sudo apt upgrade -y
sudo apt install -y python3 lighttpd msmtp msmtp-mta ufw fail2ban

Krok 2: BBS server v Pythone

BBS je jednoduchý telnet server napísaný v Pythone. Počúva na porte 6502.

Vytvorte súbor /home/user/bbs.py:

#!/usr/bin/env python3
"""
USER BBS - Lightweight Bulletin Board System
For FujiNet Atari XE/XL via telnet
"""

import socket
import threading
import time
import os
import json
from datetime import datetime

BBS_PORT = 6502
BBS_DIR = "/home/user/bbs"
MESSAGES_FILE = f"{BBS_DIR}/messages.json"
GUESTBOOK_FILE = f"{BBS_DIR}/guestbook.json"
STATS_FILE = f"{BBS_DIR}/stats.json"
MAX_CONNECTIONS = 4

# ANSI codes (FujiNet compatible)
CLEAR = "\033[2J\033[H"
BOLD = "\033[1m"
RED = "\033[31m"
GREEN = "\033[32m"
YELLOW = "\033[33m"
CYAN = "\033[36m"
WHITE = "\033[37m"
RESET = "\033[0m"
CRLF = "\r\n"

active_users = []
lock = threading.Lock()

Server má tieto funkcie:

  • Message Board — čítanie a písanie správ (ukladá do messages.json)
  • Guestbook — podpis návštevníkov s lokalizáciou
  • System Info — teplota Pi, uptime, pamäť, počet loginov
  • Who Is Online — kto je práve pripojený (max 4 súčasne)
  • About — info o serveri

Kľúčové je správne spracovanie telnet protokolu — BBS musí:

  1. Čítať vstup po znakoch (nie po riadkoch) a správne spracovať backspace
  2. Ignorovať telnet IAC sekvencie (byty 0xFF nasledované 2 bytmi)
  3. Používať CRLF (\r\n) namiesto samotného \n
  4. Nastaviť timeout (5 minút) aby zombie spojenia neblokovali sloty
  5. Používať ASCII encoding pre kompatibilitu s Atari terminálmi
def recv_line(conn, echo=True, max_len=60):
    """Read a line from telnet client."""
    buf = ""
    while True:
        data = conn.recv(1)
        if not data:
            return None
        ch = data.decode("ascii", errors="replace")

        # Handle telnet IAC sequences
        if data == b"\xff":
            conn.recv(2)
            continue

        if ch in ("\r", "\n"):
            if ch == "\r":
                # consume trailing \n or \0
                conn.settimeout(0.1)
                try:
                    conn.recv(1)
                except:
                    pass
                conn.settimeout(300)
            send(conn, CRLF)
            return buf

        if ch == "\x08" or ch == "\x7f":  # backspace
            if buf:
                buf = buf[:-1]
                send(conn, "\x08 \x08")
            continue

        if len(buf) < max_len and ch.isprintable():
            buf += ch
            if echo:
                send(conn, ch)

Toto je srdce BBS — funkcia ktorá číta vstup od užívateľa. Na reálnom Atari cez FujiNet posielate znaky jeden po jednom a server ich echo-uje naspäť. Backspace funguje správne, timeout odpojí neaktívnych.


Krok 3: Systemd služba

Aby BBS bežala stále (aj po reštarte Pi), vytvorte systemd unit:

sudo nano /etc/systemd/system/user-bbs.service
[Unit]<br>Description=USER BBS<br>After=network.target<br><br>[Service]<br>Type=simple<br>User=user<br>ExecStart=/usr/bin/python3 /home/user/bbs.py<br>Restart=always<br>RestartSec=5<br><br>[Install]<br>WantedBy=multi-user.target
sudo systemctl daemon-reload<br>sudo systemctl enable user-bbs<br>sudo systemctl start user-bbs

Krok 4: Firewall a bezpečnosť

# Základný firewall
sudo ufw allow 22/tcp      # SSH
sudo ufw allow 6502/tcp    # BBS
sudo ufw allow 80/tcp      # Web dashboard (voliteľne)
sudo ufw enable

# Fail2ban proti brute-force SSH útokom
sudo systemctl enable fail2ban
sudo systemctl start fail2ban

Fail2ban v default konfigurácii zablokuje IP po 3 neúspešných SSH pokusoch na 24 hodín. Na malom Pi Zero 2 je to dôležité — nechcete, aby vám boti zahltili procesor.


Krok 5: Port forwarding na routeri

Aby bola vaša BBS dostupná z internetu, nastavte na routeri port forwarding:

NázovProtokolExterný portLokálna IPLokálny port
bbsTCP6502192.168.x.x (IP vášho Pi)6502
sshTCP22192.168.x.x22

Ak máte dynamickú IP, použite DDNS službu alebo si napíšte skript na detekciu zmeny WAN IP:

#!/bin/bash<br># wan_ip_monitor.sh - detekcia zmeny WAN IP<br>CURRENT=$(curl -s --max-time 10 ifconfig.me)<br>SAVED=$(cat /home/user/wan_ip_last 2>/dev/null)<br><br>if [ "$CURRENT" != "$SAVED" ] && [ -n "$CURRENT" ]; then<br>    echo "$CURRENT" > /home/user/wan_ip_last<br>    echo -e "Subject: WAN IP sa zmenila!\n\nNová IP: ${CURRENT}\nStará IP: ${SAVED}" | msmtp vas@email.com<br>fi

Pridajte do cronu (crontab -e):

*/30 * * * * /home/user/wan_ip_monitor.sh

Krok 5: Pripojenie z Atari XE/XL

Varianta A: FujiNet (najjednoduchšia)

  1. Vypnite Atari, zapojte FujiNet do SIO portu
  2. Zapnite Atari — FujiNet sa pripojí na vašu WiFi
  3. Nahrajte terminálový program (napr. BOB-Term alebo ICE-T XE) — buď z TNFS servera alebo z SD karty cez FujiNet
  4. V termináli nastavte:
  • Host: tnfs.vasweb.sk (alebo vaša doména/IP)
  • Port: 6502
  • Protokol: Telnet
  1. Spojte sa — uvíta vás USER BBS header a výzva na zadanie mena

Varianta B: SIO2PC + APE

  1. Pripojte SIO2PC USB kábel medzi Atari SIO port a PC
  2. Na PC spustite APE (Atari Peripheral Emulator)
  3. V APE aktivujte R: handler (emulácia 850 interface)
  4. Na Atari nahrajte terminál (napr. BOB-Term)
  5. Použite AT príkazy:
   ATDT tnfs.vasweb.sk:6502

Varianta C: AspeQt / RespeQt

  1. Pripojte SIO2PC kábel
  2. Na PC spustite RespeQt (open source, multiplatformný)
  3. Aktivujte R: handler device
  4. Na Atari použite terminál s AT príkazmi rovnako ako vo Variante B

Varianta D: R-Verter + Lantronix MSS100 (bez PC!)

Toto je „hardcore“ varianta pre puristov — žiadny PC v reťazci:

  1. R-Verter sa zapojí do SIO portu Atari — poskytuje RS-232 port a R: handler
  2. Sériovým káblom prepojte R-Verter s Lantronix MSS100 (serial-to-Ethernet bridge)
  3. Lantronix pripojte ethernetom do siete
  4. Nakonfigurujte Lantronix (cez web interface) na transparentný serial-TCP bridge
  5. Na Atari v termináli vytočte:
   ATDT tnfs.vasweb.sk:6502
  1. Lantronix preloží AT príkaz na TCP spojenie a ste pripojení!

Záver

Celý setup stojí menej než 20 EUR (Pi Zero 2 W) + cena FujiNetu alebo SIO2PC kábla. Výsledkom je plne funkčná BBS-ka, na ktorú sa dá pripojiť z pôvodného Atari 800XL z roku 1983.

Leave a Reply

Vaša e-mailová adresa nebude zverejnená. Vyžadované polia sú označené *