Шахматный сервер ChesslaBlab

ChesslaBlab - это набор программных инструментов с открытым кодом для организации полноценного шахматного сервера с поддержкой Stockfish.

В материале рассмотрены тонкости настройки для сети IPv6 и Yggdrasil в частности.

Программный комплекс включает в себя множество компонентов, ниже будет рассмотрен необходимый для игры минимум.

chess-server

chess-server написан на языке PHP, поэтому работа с ним не составит трудностей для веб-разработчиков.

Понадобится:

apt install git php composer stockfish

для запуска вебсокет-сервера, также лучше создать отдельного пользователя в системе:

useradd -m chesslablab

устанавливаем последнюю версию из репозитория:

git clone https://github.com/chesslablab/chess-server.git
cd chess-server
composer install

скопируем файл настройки среды окружения

cp .env.example .env
nano .env

для работы с yggdrasil, приводим конфигурацию к следующему виду, где адрес IPv6 заменяем адресом сервера (yggdrasilctl getSelf)

JWT_ISS=[xxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx]
JWT_SECRET=super_password

UID=1000
GID=1000

WS_PORT=8085
WS_ADDRESS=[::]

Остальные параметры из файла example можно удалить или закомментировать.

Поскольку сервер будет работать только в сеть Yggdrasil, открываем порт 8085 для диапазона 0200::/7

ufw allow from 0200::/7 to any port 8085

* порт можно выбрать любой свободный

После этого, chess-server можно запустить:

php cli/ratchet/ws.php

* Запуск сервера поддерживает несколько веб-сокет библиотек, ratchet поддерживает протоколы wss и ws - в случае Yggdrasil, второй не требует наличия SSL сертификата.

Чтобы сервер запускался при старте системы, можно добавить его в systemd:

nano /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

Обновляем реестр systemd, добавляем службу в автозапуск и стартуем сервис:

systemctl daemon-reload
systemctl enable chesslablab
systemctl start chesslablab

В завершение, проверяем наличие работающей службы:

netstat -tulpn | grep LISTEN

если сервер есть в списке на интерфейсе IPv6, можем к нему подключаться любым совместимым клиентом и играть по сети или с компьютером.

react-chess

react-chess - это клиентский веб интерфейс, написанный с использованием фреймворка React.js

Репозиторий данного клиента был переименован:
https://github.com/chesslablab/spablab.git

Репозиторий данного клиента переведен в статус архива. Информация ниже приведена в качестве исторической справки.

Для использования актуального клиента, смотрите раздел mpablab

Для компиляции приложения потребуется:

apt install npm

Устанавливаем последнюю версию клиента из репозитория:

git clone https://github.com/chesslablab/react-chess.git
cd react-chess
npm install

Копируем пример конфигурации и делаем как указано ниже, заменив значения своими параметрами:

cp .env.example .env
nano .env
HOST=[yyy:yyyy:yyyy:yyyy:yyyy:yyyy:yyyy:yyyy]
HTTPS=false
PORT=9443

REACT_APP_WS_SCHEME=ws
REACT_APP_WS_HOST=[xxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx]
REACT_APP_WS_PORT=8085

* [yyy:yyyy:yyyy:yyyy:yyyy:yyyy:yyyy:yyyy] - адрес клиента react-chess, указывать его не обязательно при использовании нижеуказанных примеров nginx
* [xxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx] - адрес веб-сокета chess-server
*8085 - порт веб-сокет сервера

В оригинальной инструкции используются примеры виртуальных хостов /etc/hosts, следовать им не нужно, в случае подключения Yggdrasil-only.

Запускаем веб-клиент:

npm start

автоматически должно открыться окно браузера с веб интерфейсом для игры.

Для production, клиент компилируется командой:

npm run build

* При развертывании клиента на VPS, целесообразно компилировать приложение локально, и на сервер выгрузить лишь директорию build, без исходников node. Это позволит сэкономить порядка 300 Мб дискового пространства на сервере.

Nginx

Веб-клиент можно настроить различными способами (еще один вариант для локального развертывания указан в официальной документации)

В примерах ниже, директория build будет установлена по адресу:

/var/www/chesslablab/react-chess/build

Выполнение программы будет осуществляться пользователем www-data, поэтому не забываем дать соответствующие права:

chown -R www-data:www-data /var/www/chesslablab/react-chess/build

Домен

На примере используется домен chesslablab.ygg в системе Alfis DNS, при этом доступ ограничен только сети Yggdrasil:

nano /etc/nginx/sites-available/chesslablab.ygg.conf
server {
	listen [::]:80;

	allow 0200::/7;
	deny  all;

	root /var/www/chesslablab/react-chess/build;

	index index.html;

	server_name chesslablab.ygg chesslablab.ygg.at;

	location / {
		try_files $uri $uri/ =404;
	}
}

Включаем сайт, тестируем и перезагружаем конфигурацию Nginx:

ln -S /etc/nginx/sites-available/chesslablab.ygg.conf /etc/nginx/sites-enabled/chesslablab.ygg.conf
nginx -t
service nginx reload

Адрес подсети

Поскольку не все пользователи Yggdrasil используют DNS, важно предоставить возможность прямого доступа по IP.

Для Chesslablab удобнее всего создать выделенный адрес подсети и настроить по аналогии с доменом.

При использовании команды ifconfig lo inet6 add нужно учитывать, что адрес сбрасывается после перезагрузки системы, этот вопрос решается отдельно.

Поддиректория

Расположение клиента в подкатегории вида http://[0200::/7]/chesslablab/ удобно тем, что к сайту удобно обращаться из адресной строки браузера без DNS, поскольку в истории посещений к поддиректории подставляется IP ресурса.

Чтобы заставить клиент работать в такой конфигурации без модификации кода react-chess, можно использовать следующий вариант:

создаем ссылку в корневом каталоге сервера:

ln -S /var/www/chesslablab/react-chess/build /var/www/html/chesslablab

*при условии, что корневая веб директория Nginx расположена по адресу /var/www/html

открываем стандартный файл конфигурации для корня (обычно default):

nano /etc/nginx/sites-available/default

и добавляем новую секцию:

	location /chesslablab {

		index index.html;
		
		# чтобы не патчить код клиента, делаем замену веб-корня в ответе сервера с помощью sub_filter

		sub_filter_once off;
		sub_filter_types *;
		
  		sub_filter 'action="/' 'action="/chesslablab/';
  		sub_filter 'href="/' 'href="/chesslablab/';
  		sub_filter 'src="/' 'src="/chesslablab/';
  		
		sub_filter 'static/media/' 'chesslablab/static/media/';	

		try_files $uri $uri/ =404;
	}

Тестируем и перезагружаем конфигурацию Nginx:

nginx -t
service nginx reload

mpablab

mpablab - многостраничная и наиболее актуальная версия клиента на базе фреймворка Symfony.

На данный момент, репозиторий клиента переехал по адресу website.

Информация ниже актуализирована.

Установка

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

Настройка

Далее, нужно настроить приложение для Yggdrasil, используем пример сервера YGGverse:

assets/env.js
const API_SCHEME = 'http';
const API_HOST = '[201:23b4:991a:634d:8359:4521:5576:15b7]';
const API_PORT = '80';
const API_VERSION = 'v1';
const API_KEY = 'ваш ключ';

const WEBSOCKET_SCHEME = 'ws';
const WEBSOCKET_HOST = '[201:23b4:991a:634d:8359:4521:5576:15b7]';
const WEBSOCKET_PORT = '8085';

export {
  API_SCHEME,
  API_HOST,
  API_PORT,
  API_VERSION,
  API_KEY,
  WEBSOCKET_SCHEME,
  WEBSOCKET_HOST,
  WEBSOCKET_PORT
};

После изменений, необходимо обновить кеш настроек, пересобрав наборы:

php bin/console asset-map:compile

Возможно, данные опции следует указывать в корневом файле .env, не проверял, если так, важно также стандартно для Symfony сбросить кеш продакшн:

APP_ENV=prod APP_DEBUG=0 php bin/console cache:clear

Nginx / DNS

/etc/nginx/sites-available/chesslablab.ygg
server {
	listen [::]:80;

	allow 0200::/7;
	deny  all;

	server_name chesslablab.ygg chesslablab.ygg.at;

	root /home/chesslablab/website/public;
	rewrite ^/chesslablab/(.*)$ /$1 break;
	try_files $uri @chesslablab;

	location @chesslablab {

		# Provide actual php -v
		fastcgi_pass unix:/run/php/php8.2-fpm.sock;

		include fastcgi_params;
		fastcgi_param SCRIPT_FILENAME /home/chesslablab/website/public/index.php;
		fastcgi_param SCRIPT_NAME /chesslablab/index.php;
		fastcgi_param REQUEST_URI /chesslablab$uri?$args;

		# Environment variables
		fastcgi_param APP_ENV prod;
	}
}

Nginx / поддиректория

/etc/nginx/sites-available/default
	location /chesslablab {
		root /home/chesslablab/website/public;
		rewrite ^/chesslablab/(.*)$ /$1 break;
		try_files $uri @chesslablab;
	}
	
	location @chesslablab {

		# Provide actual php -v
		fastcgi_pass unix:/run/php/php8.2-fpm.sock;

		include fastcgi_params;
		fastcgi_param SCRIPT_FILENAME /home/chesslablab/website/public/index.php;
		fastcgi_param SCRIPT_NAME /chesslablab/index.php;
		fastcgi_param REQUEST_URI /chesslablab$uri?$args;

		# Environment variables
		fastcgi_param APP_ENV prod;
	}
service nginx reload

Узлы

Клиенты

Сервера

  • [201:23b4:991a:634d:8359:4521:5576:15b7]:8085

Ссылки

Проект на GitHub: https://github.com/chesslablab

Обсуждение

d4708, 2023/12/11 12:18, 2023/12/11 12:19
К стати, зашел на википедию Lichess, там указано что движок сервера открытый https://github.com/orgs/lichess-org/repositories

Нужно разобраться, и подправить описание (пока сомневаюсь, возможно открыт также как tutanota)

d4708, 2024/03/25 01:41
В общем, Lichess тоже открыт но запуск его зависимостей на движке Java сожрал все ресурсы сервера (в прочем, функционально он круче). Поскольку Chessblablab испульзует Stockfish и активно развивается, продолжаю играть и участвовать в данном проекте как более легковесном при низком онлайне (т.к. Lichess вроде как делегирует нагрузки клиенту посредством JavaScript). Материал поправил.

Только авторизованные участники могут оставлять комментарии.
yggdrasil/games/chesslablab_game_server.txt · Последнее изменение: 2024/03/25 01:52 — d4708
 
Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki