{"id":4700,"date":"2026-03-19T13:30:53","date_gmt":"2026-03-19T12:30:53","guid":{"rendered":"https:\/\/www.turiecfoto.sk\/atari\/?p=4700"},"modified":"2026-03-19T13:39:58","modified_gmt":"2026-03-19T12:39:58","slug":"ako-si-postavit-vlastne-bbs-na-raspberry-pi-zero-2-w-a-pripojit-sa-z-atari-xe-xl","status":"publish","type":"post","link":"https:\/\/www.turiecfoto.sk\/atari\/ako-si-postavit-vlastne-bbs-na-raspberry-pi-zero-2-w-a-pripojit-sa-z-atari-xe-xl\/","title":{"rendered":"Ako si postavit vlastne BBS na Raspberry Pi Zero 2 W a pripojit sa z Atari XE\/XL"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">Pre\u010do BBS na ATARI v roku 2026?<\/h2>\n\n\n\n<p>V osemdesiatych rokoch boli BBS-ky centrom digit\u00e1lneho \u017eivota. \u013dudia vyt\u00e1\u010dali modemom \u010d\u00edslo, prip\u00e1jali sa na lok\u00e1lne n\u00e1stenky, \u010d\u00edtali spr\u00e1vy, stiahli si hru, podp\u00edsali sa do guestbooku. Potom pri\u0161iel internet a BBS-ky zmizli.<\/p>\n\n\n\n<p>Ale \u010do ak si jednu postav\u00edte znova &#8212; nie ako nostalgick\u00fa hra\u010dku, ale ako re\u00e1lny server, na ktor\u00fd sa d\u00e1 pripoji\u0165 z p\u00f4vodn\u00e9ho hardv\u00e9ru? Presne to som spravil. Moj BBS be\u017e\u00ed na Raspberry Pi Zero 2 W (za cca 17 EUR), po\u010d\u00fava na porte 6502 a ka\u017ed\u00fd s Atari XE\/XL sa na \u0148u m\u00f4\u017ee pripoji\u0165 cez telnet.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Krok 1: Z\u00e1kladn\u00e1 in\u0161tal\u00e1cia Pi Zero 2<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Naflashujte OS<\/h3>\n\n\n\n<p>Pou\u017eite <strong>Raspberry Pi Imager<\/strong>, zvo\u013ete <strong>Raspberry Pi OS Lite (64-bit)<\/strong>. V nastaveniach:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Zapnite SSH<\/li>\n\n\n\n<li>Nastavte WiFi (SSID + heslo)<\/li>\n\n\n\n<li>Nastavte username (napr. <code>user<\/code>) a heslo<\/li>\n<\/ul>\n\n\n\n<p>Vlo\u017ei\u0165 SD kartu do Pi, zapn\u00fa\u0165, po\u010dka\u0165 p\u00e1r min\u00fat a pripoji\u0165 sa:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\nssh user@&lt;IP_adresa_Pi&gt;\n<\/pre><\/div>\n\n\n<p>IP adresu n\u00e1jdete v admin rozhran\u00ed v\u00e1\u0161ho routera, alebo pou\u017eite:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\n# z in\u00e9ho po\u010d\u00edta\u010da v sieti:\nping raspberrypi.local\n<\/pre><\/div>\n\n\n<h3 class=\"wp-block-heading\">Z\u00e1kladn\u00e9 nastavenie<\/h3>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\nsudo apt update &amp;&amp; sudo apt upgrade -y\nsudo apt install -y python3 lighttpd msmtp msmtp-mta ufw fail2ban\n<\/pre><\/div>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Krok 2: BBS server v Pythone<\/h2>\n\n\n\n<p>BBS je jednoduch\u00fd telnet server nap\u00edsan\u00fd v Pythone. Po\u010d\u00fava na porte <strong>6502<\/strong>.<\/p>\n\n\n\n<p>Vytvorte s\u00fabor <code>\/home\/user\/bbs.py<\/code>:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\n#!\/usr\/bin\/env python3\n&quot;&quot;&quot;\nUSER BBS - Lightweight Bulletin Board System\nFor FujiNet Atari XE\/XL via telnet\n&quot;&quot;&quot;\n\nimport socket\nimport threading\nimport time\nimport os\nimport json\nfrom datetime import datetime\n\nBBS_PORT = 6502\nBBS_DIR = &quot;\/home\/user\/bbs&quot;\nMESSAGES_FILE = f&quot;{BBS_DIR}\/messages.json&quot;\nGUESTBOOK_FILE = f&quot;{BBS_DIR}\/guestbook.json&quot;\nSTATS_FILE = f&quot;{BBS_DIR}\/stats.json&quot;\nMAX_CONNECTIONS = 4\n\n# ANSI codes (FujiNet compatible)\nCLEAR = &quot;\\033&#x5B;2J\\033&#x5B;H&quot;\nBOLD = &quot;\\033&#x5B;1m&quot;\nRED = &quot;\\033&#x5B;31m&quot;\nGREEN = &quot;\\033&#x5B;32m&quot;\nYELLOW = &quot;\\033&#x5B;33m&quot;\nCYAN = &quot;\\033&#x5B;36m&quot;\nWHITE = &quot;\\033&#x5B;37m&quot;\nRESET = &quot;\\033&#x5B;0m&quot;\nCRLF = &quot;\\r\\n&quot;\n\nactive_users = &#x5B;]\nlock = threading.Lock()\n<\/pre><\/div>\n\n\n<p>Server m\u00e1 tieto funkcie:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Message Board<\/strong> &#8212; \u010d\u00edtanie a p\u00edsanie spr\u00e1v (uklad\u00e1 do <code>messages.json<\/code>)<\/li>\n\n\n\n<li><strong>Guestbook<\/strong> &#8212; podpis n\u00e1v\u0161tevn\u00edkov s lokaliz\u00e1ciou<\/li>\n\n\n\n<li><strong>System Info<\/strong> &#8212; teplota Pi, uptime, pam\u00e4\u0165, po\u010det loginov<\/li>\n\n\n\n<li><strong>Who Is Online<\/strong> &#8212; kto je pr\u00e1ve pripojen\u00fd (max 4 s\u00fa\u010dasne)<\/li>\n\n\n\n<li><strong>About<\/strong> &#8212; info o serveri<\/li>\n<\/ul>\n\n\n\n<p>K\u013e\u00fa\u010dov\u00e9 je spr\u00e1vne spracovanie telnet protokolu &#8212; BBS mus\u00ed:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u010c\u00edta\u0165 vstup po znakoch<\/strong> (nie po riadkoch) a spr\u00e1vne spracova\u0165 backspace<\/li>\n\n\n\n<li><strong>Ignorova\u0165 telnet IAC sekvencie<\/strong> (byty <code>0xFF<\/code> nasledovan\u00e9 2 bytmi)<\/li>\n\n\n\n<li><strong>Pou\u017e\u00edva\u0165 CRLF<\/strong> (<code>\\r\\n<\/code>) namiesto samotn\u00e9ho <code>\\n<\/code><\/li>\n\n\n\n<li><strong>Nastavi\u0165 timeout<\/strong> (5 min\u00fat) aby zombie spojenia neblokovali sloty<\/li>\n\n\n\n<li><strong>Pou\u017e\u00edva\u0165 ASCII encoding<\/strong> pre kompatibilitu s Atari termin\u00e1lmi<\/li>\n<\/ol>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\ndef recv_line(conn, echo=True, max_len=60):\n    &quot;&quot;&quot;Read a line from telnet client.&quot;&quot;&quot;\n    buf = &quot;&quot;\n    while True:\n        data = conn.recv(1)\n        if not data:\n            return None\n        ch = data.decode(&quot;ascii&quot;, errors=&quot;replace&quot;)\n\n        # Handle telnet IAC sequences\n        if data == b&quot;\\xff&quot;:\n            conn.recv(2)\n            continue\n\n        if ch in (&quot;\\r&quot;, &quot;\\n&quot;):\n            if ch == &quot;\\r&quot;:\n                # consume trailing \\n or \\0\n                conn.settimeout(0.1)\n                try:\n                    conn.recv(1)\n                except:\n                    pass\n                conn.settimeout(300)\n            send(conn, CRLF)\n            return buf\n\n        if ch == &quot;\\x08&quot; or ch == &quot;\\x7f&quot;:  # backspace\n            if buf:\n                buf = buf&#x5B;:-1]\n                send(conn, &quot;\\x08 \\x08&quot;)\n            continue\n\n        if len(buf) &lt; max_len and ch.isprintable():\n            buf += ch\n            if echo:\n                send(conn, ch)\n<\/pre><\/div>\n\n\n<p>Toto je srdce BBS &#8212; funkcia ktor\u00e1 \u010d\u00edta vstup od u\u017e\u00edvate\u013ea. Na re\u00e1lnom Atari cez FujiNet posielate znaky jeden po jednom a server ich echo-uje nasp\u00e4\u0165. Backspace funguje spr\u00e1vne, timeout odpoj\u00ed neakt\u00edvnych.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Krok 3: Systemd slu\u017eba<\/h2>\n\n\n\n<p>Aby BBS be\u017eala st\u00e1le (aj po re\u0161tarte Pi), vytvorte systemd unit:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\nsudo nano \/etc\/systemd\/system\/user-bbs.service\n<\/pre><\/div>\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\n&#x5B;Unit]&lt;br&gt;Description=USER BBS&lt;br&gt;After=network.target&lt;br&gt;&lt;br&gt;&#x5B;Service]&lt;br&gt;Type=simple&lt;br&gt;User=user&lt;br&gt;ExecStart=\/usr\/bin\/python3 \/home\/user\/bbs.py&lt;br&gt;Restart=always&lt;br&gt;RestartSec=5&lt;br&gt;&lt;br&gt;&#x5B;Install]&lt;br&gt;WantedBy=multi-user.target\n<\/pre><\/div>\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\nsudo systemctl daemon-reload&lt;br&gt;sudo systemctl enable user-bbs&lt;br&gt;sudo systemctl start user-bbs\n<\/pre><\/div>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Krok 4: Firewall a bezpe\u010dnos\u0165<\/h2>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\n# Z\u00e1kladn\u00fd firewall\nsudo ufw allow 22\/tcp      # SSH\nsudo ufw allow 6502\/tcp    # BBS\nsudo ufw allow 80\/tcp      # Web dashboard (volite\u013ene)\nsudo ufw enable\n\n# Fail2ban proti brute-force SSH \u00fatokom\nsudo systemctl enable fail2ban\nsudo systemctl start fail2ban\n<\/pre><\/div>\n\n\n<p>Fail2ban v default konfigur\u00e1cii zablokuje IP po 3 ne\u00faspe\u0161n\u00fdch SSH pokusoch na 24 hod\u00edn. Na malom Pi Zero 2 je to d\u00f4le\u017eit\u00e9 &#8212; nechcete, aby v\u00e1m boti zahltili procesor.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Krok 5: Port forwarding na routeri<\/h2>\n\n\n\n<p>Aby bola va\u0161a BBS dostupn\u00e1 z internetu, nastavte na routeri port forwarding:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>N\u00e1zov<\/th><th>Protokol<\/th><th>Extern\u00fd port<\/th><th>Lok\u00e1lna IP<\/th><th>Lok\u00e1lny port<\/th><\/tr><\/thead><tbody><tr><td>bbs<\/td><td>TCP<\/td><td>6502<\/td><td>192.168.x.x (IP v\u00e1\u0161ho Pi)<\/td><td>6502<\/td><\/tr><tr><td>ssh<\/td><td>TCP<\/td><td>22<\/td><td>192.168.x.x<\/td><td>22<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>Ak m\u00e1te dynamick\u00fa IP, pou\u017eite DDNS slu\u017ebu alebo si nap\u00ed\u0161te skript na detekciu zmeny WAN IP:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\n#!\/bin\/bash&lt;br&gt;# wan_ip_monitor.sh - detekcia zmeny WAN IP&lt;br&gt;CURRENT=$(curl -s --max-time 10 ifconfig.me)&lt;br&gt;SAVED=$(cat \/home\/user\/wan_ip_last 2&gt;\/dev\/null)&lt;br&gt;&lt;br&gt;if &#x5B; &quot;$CURRENT&quot; != &quot;$SAVED&quot; ] &amp;&amp; &#x5B; -n &quot;$CURRENT&quot; ]; then&lt;br&gt;    echo &quot;$CURRENT&quot; &gt; \/home\/user\/wan_ip_last&lt;br&gt;    echo -e &quot;Subject: WAN IP sa zmenila!\\n\\nNov\u00e1 IP: ${CURRENT}\\nStar\u00e1 IP: ${SAVED}&quot; | msmtp vas@email.com&lt;br&gt;fi\n<\/pre><\/div>\n\n\n<p>Pridajte do cronu (<code>crontab -e<\/code>):<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\n*\/30 * * * * \/home\/user\/wan_ip_monitor.sh\n<\/pre><\/div>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Krok 5: Pripojenie z Atari XE\/XL<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Varianta A: FujiNet (najjednoduch\u0161ia)<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Vypnite Atari, zapojte <strong>FujiNet<\/strong> do SIO portu<\/li>\n\n\n\n<li>Zapnite Atari &#8212; FujiNet sa pripoj\u00ed na va\u0161u WiFi<\/li>\n\n\n\n<li>Nahrajte termin\u00e1lov\u00fd program (napr. <strong>BOB-Term<\/strong> alebo <strong>ICE-T XE<\/strong>) &#8212; bu\u010f z TNFS servera alebo z SD karty cez FujiNet<\/li>\n\n\n\n<li>V termin\u00e1li nastavte:<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Host: <code>tnfs.vasweb.sk<\/code> (alebo va\u0161a dom\u00e9na\/IP)<\/li>\n\n\n\n<li>Port: <code>6502<\/code><\/li>\n\n\n\n<li>Protokol: Telnet<\/li>\n<\/ul>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Spojte sa &#8212; uv\u00edta v\u00e1s USER BBS header a v\u00fdzva na zadanie mena<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Varianta B: SIO2PC + APE<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Pripojte <strong>SIO2PC USB k\u00e1bel<\/strong> medzi Atari SIO port a PC<\/li>\n\n\n\n<li>Na PC spustite <strong>APE (Atari Peripheral Emulator)<\/strong><\/li>\n\n\n\n<li>V APE aktivujte <strong>R: handler<\/strong> (emul\u00e1cia 850 interface)<\/li>\n\n\n\n<li>Na Atari nahrajte termin\u00e1l (napr. BOB-Term)<\/li>\n\n\n\n<li>Pou\u017eite AT pr\u00edkazy:<\/li>\n<\/ol>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\n   ATDT tnfs.vasweb.sk:6502\n<\/pre><\/div>\n\n\n<h3 class=\"wp-block-heading\">Varianta C: AspeQt \/ RespeQt<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Pripojte SIO2PC k\u00e1bel<\/li>\n\n\n\n<li>Na PC spustite <strong>RespeQt<\/strong> (open source, multiplatformn\u00fd)<\/li>\n\n\n\n<li>Aktivujte R: handler device<\/li>\n\n\n\n<li>Na Atari pou\u017eite termin\u00e1l s AT pr\u00edkazmi rovnako ako vo Variante B<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Varianta D: R-Verter + Lantronix MSS100 (bez PC!)<\/h3>\n\n\n\n<p>Toto je &#8222;hardcore&#8220; varianta pre puristov &#8212; <strong>\u017eiadny PC v re\u0165azci<\/strong>:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>R-Verter<\/strong> sa zapoj\u00ed do SIO portu Atari &#8212; poskytuje RS-232 port a R: handler<\/li>\n\n\n\n<li>S\u00e9riov\u00fdm k\u00e1blom prepojte R-Verter s <strong>Lantronix MSS100<\/strong> (serial-to-Ethernet bridge)<\/li>\n\n\n\n<li>Lantronix pripojte ethernetom do siete<\/li>\n\n\n\n<li>Nakonfigurujte Lantronix (cez web interface) na transparentn\u00fd serial-TCP bridge<\/li>\n\n\n\n<li>Na Atari v termin\u00e1li vyto\u010dte:<\/li>\n<\/ol>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: bash; title: ; notranslate\" title=\"\">\n   ATDT tnfs.vasweb.sk:6502\n<\/pre><\/div>\n\n\n<ol start=\"6\" class=\"wp-block-list\">\n<li>Lantronix prelo\u017e\u00ed AT pr\u00edkaz na TCP spojenie a ste pripojen\u00ed!<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Z\u00e1ver<\/h2>\n\n\n\n<p>Cel\u00fd setup stoj\u00ed menej ne\u017e 20 EUR (Pi Zero 2 W) + cena FujiNetu alebo SIO2PC k\u00e1bla. V\u00fdsledkom je plne funk\u010dn\u00e1 BBS-ka, na ktor\u00fa sa d\u00e1 pripoji\u0165 z p\u00f4vodn\u00e9ho Atari 800XL z roku 1983.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Pre\u010do BBS na ATARI v roku 2026? V osemdesiatych rokoch boli BBS-ky centrom digit\u00e1lneho \u017eivota. \u013dudia vyt\u00e1\u010dali modemom \u010d\u00edslo, prip\u00e1jali sa na lok\u00e1lne n\u00e1stenky, \u010d\u00edtali spr\u00e1vy, stiahli si hru, podp\u00edsali sa do guestbooku. Potom pri\u0161iel internet a BBS-ky zmizli. Ale \u010do ak si jednu postav\u00edte znova &#8212; nie ako nostalgick\u00fa hra\u010dku, ale ako re\u00e1lny server, [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"ngg_post_thumbnail":0,"footnotes":""},"categories":[1],"tags":[],"class_list":["post-4700","post","type-post","status-publish","format-standard","hentry","category-nezaradene"],"blocksy_meta":[],"_links":{"self":[{"href":"https:\/\/www.turiecfoto.sk\/atari\/wp-json\/wp\/v2\/posts\/4700","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.turiecfoto.sk\/atari\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.turiecfoto.sk\/atari\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.turiecfoto.sk\/atari\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.turiecfoto.sk\/atari\/wp-json\/wp\/v2\/comments?post=4700"}],"version-history":[{"count":6,"href":"https:\/\/www.turiecfoto.sk\/atari\/wp-json\/wp\/v2\/posts\/4700\/revisions"}],"predecessor-version":[{"id":4711,"href":"https:\/\/www.turiecfoto.sk\/atari\/wp-json\/wp\/v2\/posts\/4700\/revisions\/4711"}],"wp:attachment":[{"href":"https:\/\/www.turiecfoto.sk\/atari\/wp-json\/wp\/v2\/media?parent=4700"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.turiecfoto.sk\/atari\/wp-json\/wp\/v2\/categories?post=4700"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.turiecfoto.sk\/atari\/wp-json\/wp\/v2\/tags?post=4700"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}