devzone.org.ua/post/chesslablab-shakhy-onlayn-z-vidkrytym-kodom-na-php.md
2025-11-01 14:28:20 +02:00

153 lines
No EOL
7.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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)