Belot

Belot

Docker app from ivayloivanov82's Repository

Overview

Самостоятелен, self-hosted белот за 4 играчи - играе се направо в браузъра. Пълни официални правила, двуезичен интерфейс (BG/EN), drag-and-drop карти, именуване на отборите, recap на всяка ръка.

Белот

Икона Self-hosted браузър белот за 4 приятели, играещи заедно през Teams (или каквото и да е гласово приложение). Сървърът е единственият източник на истината — клиентите само показват състоянието и изпращат ходове; всички правила се проверяват на сървъра, така че никой не може да излъже играта дори случайно.

Бързо пускане на Unraid (или всеки Docker хост)

  1. Копирай цялата папка belot/ на сървъра (напр. през SMB на Unraid share).

  2. От вътре в папката:

    docker compose up -d --build

  3. Отвори http://<IP-на-сървъра>:8080 в браузъра — на всеки компютър/телефон в мрежата.

Портът по подразбиране е 8080, зададен в docker-compose.yml. Смени "8080:8080" на "ДРУГ_ПОРТ:8080", ако вече ползваш 8080 за нещо друго.

За постоянен достъп през http://belot.local вместо IP адрес, добави A запис в locally DNS-а си (или в /etc/hosts на всеки клиент) сочещ към Unraid IP-то, или сложи Nginx Proxy Manager отпред.

Reconnect и "нова игра"

Ако някой презареди страницата (или затвори таба и се върне по-късно), браузърът помни последната стая (код + име) в localStorage и автоматично се опитва да се присъедини отново — при успех кацаш точно там, докъдето е стигнала играта, без да пипаш нищо. Работи, докато самият сървърен процес не е рестартиран — тъй като играта живее само в паметта на контейнера. Ако Unraid-ът рестартира контейнера (reboot, redeploy, ръчен restart), цялото състояние на текущите игри се губи и всички трябва да започнат наново.

Бутонът "Нова игра" горе вдясно на масата напуска текущата стая (изтрива запомнената сесия) и те връща на началния екран, за да създадеш чисто нова стая — старата продължава да си работи за останалите играчи, ако все още са в нея.

Ако мрежата помежду ви примигне за момент (WiFi засичане, идле timeout от рутер/NAT), клиентът сега тихо се опитва да се свърже отново на мястото, където сте спрели — вместо досадния "Връзката прекъсна" alert. Сървърът пуска ping на всеки ~24 сек, за да не изглежда връзката "неактивна" на евентуален посредник по мрежата.

Как се играе

  1. Първият играч натиска "Създай игра", вкарва си името → получава 6-символен код на стая.
  2. Останалите трима отварят същия адрес, вкарват името си + кода → "Присъедини се".
  3. Когато всичките 4 места са заети, всеки избира Отбор А или Отбор Б (макс. 2 на отбор — заключено надеждно на сървъра, дори при едновременен клик). Щом отбор се напълни до двама, сървърът произволно избира ЕДИН от тях и му праща прозорче да кръсти отбора — това име остава до края на мача. "Старт" се появява едва след като и двата отбора са именувани.
  4. Играе се както обичайния белот — наддаване на 5 карти, после останалите 3 се дораздават и започва самата игра. Клик върху карта = изигравате я, или я довлачете до центъра — и двете работят. Невалидните карти са леко затъмнени и не могат да се играят. Всяка изиграна карта лети от играча към центъра с пълно завъртане; след всяка взятка картите отлитат анимирано към играча, който я е спечелил.
  5. Когато ръката приключи, всички карти от нея се показват накуп на един ред, подредени по реда, по който са паднали на масата, всяка леко отместена нагоре или надолу според това кой отбор е взел съответната взятка. Играта чака всеки от четиримата да натисне "Готово", преди да раздаде следващата ръка — никой не остава изненадан от внезапна нова ръка.

Имената на играчите са оцветени спрямо теб — пастелно синьо за твоя отбор, пастелно червено за противниковия — навсякъде по масата, независимо как се казват отборите.

Локална разработка (без Docker)

Изисква се Go 1.22+.

go run ./cmd/server -addr :8080 -web ./web

Тестове:

go test ./...                                  # всички unit + интеграционни тестове
go test ./engine/... -run TestFullMatchSimulation -v   # симулация на цял мач

Артуърк на картите

Лицата (SVG) на картите са от Xadeck/xCards (LGPL-3.0 лиценз — различен от лиценза на самия проект, пази се отделно; виж пълния текст на лиценза в оригиналното repo). Копирани са само 32-те карти, нужни за белот (7 до Аса). Гърбът на картите (web/cards/back.png) е отделен файл. Всички се намират в web/cards/.

Структура на проекта

engine/    - цялата логика на играта (карти, наддаване, ходове, точки) - независима от сървъра
server/    - WebSocket сървър, стаи/лоби, JSON протокол
cmd/server/main.go - входна точка, сервира web/ + /ws
web/       - браузър клиент (чист HTML/CSS/JS, без build stage)
Dockerfile, docker-compose.yml - за деплой

Следващи стъпки

  • Replay на изиграна ръка (историята вече се пази в Match.History).
  • Overcalling логика в наддаването.
  • Referee Mode — обяснение защо даден ход е невалиден.
  • AI играч за запълване на празно място.

Install Belot on Unraid in a few clicks.

Find Belot in Community Apps on your Unraid server, review the template, and click Install. Unraid handles the Docker app or plugin setup from the published template.

Open the Apps tab on your Unraid server Search Community Apps for Belot Review the template variables and paths Click Install

Categories

Download Statistics

24
Total Downloads

Related apps

Explore more like this

Explore all

Details

Repository
leppermesiah/belot:latest
Last Updated2026-07-29
First Seen2026-07-29

Runtime arguments

Web UI
http://[IP]:[PORT:8080]/
Network
bridge
Shell
sh
Privileged
false

Template configuration

WebUI PortPorttcp

WebUI Port

Target
8080
Default
8080
Value
8080