howto-db/data/pages/yggdrasil/games/chesslablab_game_server.txt
2024-04-26 01:00:04 +00:00

390 lines
13 KiB
Plaintext
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 ======
[[https://github.com/chesslablab |ChesslaBlab]] - это набор программных инструментов с открытым кодом для организации полноценного шахматного сервера с поддержкой [[wpru>Stockfish|Stockfish]].
В материале рассмотрены тонкости настройки для сети IPv6 и Yggdrasil в частности.
Программный комплекс включает в себя множество компонентов, ниже будет рассмотрен необходимый для игры минимум.
===== chess-server =====
[[https://github.com/chesslablab/chess-server|chess-server]] написан на языке PHP, поэтому работа с ним не составит трудностей для веб-разработчиков.
Понадобится:
<code>
apt install git php composer stockfish
</code>
для запуска вебсокет-сервера, также лучше создать отдельного пользователя в системе:
<code>
useradd -m chesslablab
</code>
устанавливаем последнюю версию из репозитория:
<code>
git clone https://github.com/chesslablab/chess-server.git
cd chess-server
composer install
</code>
скопируем файл настройки среды окружения
<code>
cp .env.example .env
nano .env
</code>
для работы с yggdrasil, приводим конфигурацию к следующему виду, где адрес IPv6 заменяем адресом сервера (yggdrasilctl getSelf)
<code>
JWT_ISS=[xxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx]
JWT_SECRET=super_password
UID=1000
GID=1000
WS_PORT=8085
WS_ADDRESS=[::]
</code>
Остальные параметры из файла example можно удалить или закомментировать.
Поскольку сервер будет работать только в сеть Yggdrasil, открываем порт 8085 для диапазона 0200::/7
<code>
ufw allow from 0200::/7 to any port 8085
</code>
//* порт можно выбрать любой свободный//
После этого, chess-server можно запустить:
<code>
php cli/ratchet/ws.php
</code>
* Запуск сервера поддерживает несколько веб-сокет библиотек, ratchet поддерживает протоколы wss и ws - в случае Yggdrasil, второй не требует наличия SSL сертификата.
Чтобы сервер запускался при старте системы, можно добавить его в systemd:
<code>
nano /etc/systemd/system/chesslablab.service
</code>
<code>
[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
</code>
Обновляем реестр systemd, добавляем службу в автозапуск и стартуем сервис:
<code>
systemctl daemon-reload
systemctl enable chesslablab
systemctl start chesslablab
</code>
В завершение, проверяем наличие работающей службы:
<code>
netstat -tulpn | grep LISTEN
</code>
если сервер есть в списке на интерфейсе IPv6, можем к нему подключаться любым совместимым клиентом и играть по сети или с компьютером.
===== react-chess =====
[[https://github.com/chesslablab/react-chess|react-chess]] - это клиентский веб интерфейс, написанный с использованием фреймворка [[wpru>React|React.js]]
<WRAP round info 60%>
Репозиторий данного клиента был переименован:\\
https://github.com/chesslablab/spablab.git
</WRAP>
<WRAP round important 60%>
Репозиторий данного клиента переведен в статус архива. Информация ниже приведена в качестве исторической справки.
Для использования актуального клиента, смотрите раздел [[yggdrasil:games:chesslablab_game_server#mpablab]]
</WRAP>
Для компиляции приложения потребуется:
<code>
apt install npm
</code>
Устанавливаем последнюю версию клиента из репозитория:
<code>
git clone https://github.com/chesslablab/react-chess.git
cd react-chess
npm install
</code>
Копируем пример конфигурации и делаем как указано ниже, заменив значения своими параметрами:
<code>
cp .env.example .env
nano .env
</code>
<code>
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
</code>
//* [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.
Запускаем веб-клиент:
<code>
npm start
</code>
автоматически должно открыться окно браузера с веб интерфейсом для игры.
Для production, клиент компилируется командой:
<code>
npm run build
</code>
* При развертывании клиента на VPS, целесообразно компилировать приложение локально, и на сервер выгрузить лишь директорию build, без исходников node.
Это позволит сэкономить порядка 300 Мб дискового пространства на сервере.
==== Nginx ====
Веб-клиент можно настроить различными способами (еще один вариант для локального развертывания указан в официальной документации)
В примерах ниже, директория build будет установлена по адресу:
<code>
/var/www/chesslablab/react-chess/build
</code>
Выполнение программы будет осуществляться пользователем www-data, поэтому не забываем дать соответствующие права:
<code>
chown -R www-data:www-data /var/www/chesslablab/react-chess/build
</code>
=== Домен ===
На примере используется домен chesslablab.ygg в системе [[yggdrasil:dns:alfis|Alfis DNS]], при этом доступ ограничен только сети Yggdrasil:
<code>
nano /etc/nginx/sites-available/chesslablab.ygg.conf
</code>
<code>
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;
}
}
</code>
Включаем сайт, тестируем и перезагружаем конфигурацию Nginx:
<code>
ln -S /etc/nginx/sites-available/chesslablab.ygg.conf /etc/nginx/sites-enabled/chesslablab.ygg.conf
nginx -t
service nginx reload
</code>
=== Адрес подсети ===
Поскольку не все пользователи Yggdrasil используют DNS, важно предоставить возможность прямого доступа по IP.
Для Chesslablab удобнее всего создать выделенный [[yggdrasil:subnet_setting|адрес подсети]] и настроить по аналогии с доменом.
<WRAP round info 60%>
При использовании команды ifconfig lo inet6 add нужно учитывать, что адрес сбрасывается после перезагрузки системы, этот вопрос решается отдельно.
</WRAP>
=== Поддиректория ===
Расположение клиента в подкатегории вида http://[0200::/7]/chesslablab/ удобно тем, что к сайту удобно обращаться из адресной строки браузера без DNS, поскольку в истории посещений к поддиректории подставляется IP ресурса.
Чтобы заставить клиент работать в такой конфигурации без модификации кода react-chess, можно использовать следующий вариант:
создаем ссылку в корневом каталоге сервера:
<code>
ln -S /var/www/chesslablab/react-chess/build /var/www/html/chesslablab
</code>
//*при условии, что корневая веб директория Nginx расположена по адресу /var/www/html//
открываем стандартный файл конфигурации для корня (обычно default):
<code>
nano /etc/nginx/sites-available/default
</code>
и добавляем новую секцию:
<code>
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;
}
</code>
Тестируем и перезагружаем конфигурацию Nginx:
<code>
nginx -t
service nginx reload
</code>
===== mpablab =====
[[https://github.com/chesslablab/mpablab|mpablab]] - многостраничная и наиболее актуальная версия клиента на базе фреймворка [[wpru>Symfony|Symfony]].
<WRAP round info 60%>
На данный момент, репозиторий клиента переехал по адресу [[https://github.com/chesslablab/website|website]].
Информация ниже актуализирована.
</WRAP>
**Установка**
<code>
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
</code>
**Настройка**
Далее, нужно настроить приложение для Yggdrasil, используем пример клиент-сервера YGGverse:
<file - assets/env.js>
const API_SCHEME = 'http';
const API_HOST = '[301:23b4:991a:634d::cbb]';
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
};
</file>
После изменений, необходимо обновить кеш настроек, пересобрав наборы:
<code>
php bin/console asset-map:compile
</code>
Возможно, данные опции следует указывать в корневом файле .env, не проверял, если так, важно также стандартно для Symfony сбросить кеш продакшн:
<code>
APP_ENV=prod APP_DEBUG=0 php bin/console cache:clear
</code>
**Nginx**
<file - /etc/nginx/sites-available/chesslablab>
server {
listen [301:23b4:991a:634d::cbb]:80;
server_name _;
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;
}
}
</file>
<code>
service nginx reload
</code>
===== Узлы =====
==== Клиент ====
* [[http://[301:23b4:991a:634d::cbb]/en/]] - Веб-клиент, администрируется YGGverse
==== Сервер ====
* [201:23b4:991a:634d:8359:4521:5576:15b7]:8085 - Сервер YGGverse, только 0200::/7
===== Ссылки =====
Проект на GitHub: https://github.com/chesslablab \\
~~DISCUSSION~~