ChesslaBlab - шахи онлайн з відкритим кодом на PHP

3 хв. читання

ChesslaBlab - це проект з відкритим кодом на PHP, для розгортання шахового серверу з нуля та клієнтська частина на Symfony - для вивчення стратегій, гри онлайн з комп'ютером або друзями.

Являє собою невибагливу до серверних потужностей та більш спрощену альтернативу Lichess. У якості рушія штучного інтелекту використовується сервер Stockfish.

ChesslaBlab може бути цікавим для розробників, керівників освітніх програм, тренерів шахових клубів та просто бажаючих проводити власні турніри, розгорнувши багатокористувацький сервер для гри в браузері на мінімальному тарифі VPS.

Варто зауважити, що обчислення сценаріїв виконується в режимі server-side, тому такий проект оптимально підійде для ігор з невеликою кількістю одночасних сесій, наприклад в локальній мережі.

Сервер

Для розгортання серверної частини, використовується chess-server, що реалізує бібліотеку 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

Для кожного типу з'єднань, є свій метод (скрипт) запуску, описаний в документації. Наприклад, для WS я користуюсь реалізацією сокет-сервера на PHP - 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, яка нещодавно була переведена у стан архівної.

Наразі, актуальним клієнтом є багатосторінкова реалізація на базі фреймворку Symfony, розробка ведеться в репозиторії 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 / Alfis DNS, я користуюсь наступною конструкцією 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 - проект має хороший фідбек від розробника!

Посилання

Помітили помилку? Повідомте автору, для цього достатньо виділити текст з помилкою та натиснути Ctrl+Enter
p.s. 372
Приєднався: 1 місяць тому
Коментарі (0)

    Ще немає коментарів

Щоб залишити коментар необхідно авторизуватися.

Вхід / Реєстрація