# ChesslaBlab - шахи онлайн з відкритим кодом на PHP [ChesslaBlab](https://chesslablab.org) - це проект з [відкритим кодом](https://github.com/chesslablab) на PHP, для розгортання шахового серверу з нуля та клієнтська частина на [Symfony](https://symfony.com) - для вивчення стратегій, гри онлайн з комп'ютером або друзями. Являє собою невибагливу до серверних потужностей та більш спрощену альтернативу [Lichess](https://github.com/lichess-org). У якості рушія штучного інтелекту використовується сервер [Stockfish](https://github.com/official-stockfish/Stockfish). ChesslaBlab може бути цікавим для розробників, керівників освітніх програм, тренерів шахових клубів та просто бажаючих проводити власні турніри, розгорнувши багатокористувацький сервер для гри в браузері на мінімальному тарифі VPS. Варто зауважити, що обчислення сценаріїв виконується в режимі *server-side*, тому такий проект оптимально підійде для ігор з невеликою кількістю одночасних сесій, наприклад в локальній мережі. ## Сервер Для розгортання серверної частини, використовується [chess-server](https://github.com/chesslablab/chess-server), що реалізує бібліотеку [php-chess](https://github.com/chesslablab/php-chess). В системах Debian, спочатку потрібно встановити наступні залежності: ``` apt install git php composer stockfish ``` Для безпечного запуску, краще створити окремого користувача: ``` useradd -m chesslablab su chesslablab ``` Клонуємо репозиторій та оновлюємо залежності Composer: ``` git clone https://github.com/chesslablab/chess-server.git cd chess-server composer update ``` Копіюємо приклад конфігурації в продакшн: ``` cp .env.example .env ``` Файл містить налаштування для двох типів з'єднань: 1. `WSS` - захищене з'єднання через веб-сокет (потребує додатково створення сертифікатів) 2. `WS` - незахищене, в принципі цей варіант буде простішим для початку Вказуємо актуальні адреси для обраного способу, після чого відкриваємо відповідні порти в `iptables` наприклад за допомогою утиліти `ufw`: ``` ufw allow 8443 ufw allow 8085 ``` Для кожного типу з'єднань, є свій метод (скрипт) запуску, описаний в [документації](https://chess-server.docs.chesslablab.org). Наприклад, для `WS` я користуюсь реалізацією сокет-сервера на PHP - [Ratchet](https://github.com/ratchetphp/Ratchet) і наступною командою: ``` php cli/ratchet/ws.php ``` Також, зручно створити сервіс `systemd`: ``` # /etc/systemd/system/chesslablab.service [Unit] Description=chesslablab After=network.target [Service] Type=simple User=chesslablab ExecStart=/usr/bin/php /home/chesslablab/chess-server/cli/ratchet/ws.php StandardOutput=file:/home/chesslablab/chess-server-debug.log StandardError=file:/home/chesslablab/chess-server-error.log Restart=on-failure [Install] WantedBy=multi-user.target ``` Після чого додати його в авто-запуск: ``` systemctl daemon-reload systemctl enable chesslablab systemctl start chesslablab ``` Перевірити роботу служби на порті можна командою: ``` netstat -tulpn | grep LISTEN ``` ## Клієнт За весь час розробки, проект мав декілька клієнтів, зокрема [реалізацію на React.js](https://github.com/chesslablab/react-chess), яка нещодавно була переведена у стан архівної. Наразі, актуальним клієнтом є багатосторінкова реалізація на базі фреймворку Symfony, розробка ведеться в репозиторії [website](https://github.com/chesslablab/website). Встановлення досить просте, якщо додані залежності серверу, достатньо виконати наступні команди: ``` cd /home/chesslablab git clone https://github.com/chesslablab/website.git cd website composer update cp assets/env.example.js assets/env.js php bin/console importmap:install ``` Змінюємо у скопійованому файлі `assets/env.js` потрібні нам адреси відповідно до налаштувань сервера і генеруємо оптимізований кеш для веб-застосунку: ``` php bin/console asset-map:compile ``` При змінах в стандартному файлі Symfony `.env` в середовищі `production`, скидаємо кеш командою: ``` APP_ENV=prod APP_DEBUG=0 php bin/console cache:clear ``` Налаштування Nginx - таке само як і для типового проекту на Symfony. Для свого проекту в локальній мережі IPv6 [Yggdrasil](https://devzone.org.ua/post/yggdrasil-mereznii-protokol-z-decentralizovanim-routingom) / [Alfis DNS](https://devzone.org.ua/post/alfis-dns-rejestraciia-domenu-v-blokcein), я користуюсь наступною конструкцією `WS` (достатньо змінити домен на той, що вказано в налаштуваннях клієнта): ``` server { listen [::]:80; allow 0200::/7; deny all; server_name chesslablab.ygg chesslablab.ygg.at; root /home/chesslablab/website/public; location / { try_files $uri /index.php$is_args$args; } location ~ ^/.+\.php(/|$) { # php -v fastcgi_pass unix:/run/php/php8.2-fpm.sock; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param APP_ENV prod; } } ``` Якщо все зроблено правильно, то можна відкрити сайт і почати гру з комп'ютером. У разі проблем, першим ділом відкриваємо консоль браузеру `Ctrl+Shift+i` та дивимось стан підключення. Якщо підключення до сокету успішне, тоді потрібно дивитись безпосередньо серверні журнали за шляхами, які вказані в секціях `StandardOutput` та `StandardError` сервісу `systemd`. Пишіть ваші враження та питання в коментарях а також долучайтесь до розробки на GitHub - проект має хороший фідбек від розробника! ## Посилання * [Офіційний сайт ChesslaBlab](https://chesslablab.org) * [Сторінка на GitHub](https://github.com/chesslablab)