====== Шахматный сервер ChesslaBlab ====== [[https://github.com/chesslablab |ChesslaBlab]] - это набор программных инструментов с открытым кодом для организации полноценного шахматного сервера с поддержкой [[wpru>Stockfish|Stockfish]]. Данный комплекс может быть свободной альтернативой проприетарной площадке [[wpru>Lichess|Lichess]]: для игры в шахматы с друзьями или тренировок с ИИ. В материале рассмотрены тонкости настройки для сети IPv6 и Yggdrasil в частности. Программный комплекс включает в себя множество компонентов, ниже будет рассмотрен необходимый для игры минимум. ===== chess-server ===== [[https://github.com/chesslablab/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 TCP_PORT=8085 WS_PORT=8085 WS_ADDRESS=[::] Остальные параметры из файла example можно удалить или закомментировать. Поскольку сервер будет работать только в сеть Yggdrasil, открываем порт 8085 для диапазона 0200::/7 ufw allow from 0200::/7 to any port 8085 //* порт можно выбрать любой свободный// После этого, chess-server можно запустить: php cli/dev.php * Запуск сервера подразумевает несколько режимов, описанных [[https://github.com/chesslablab/chess-server#run-the-chess-server|README]]. В нашем случае подойдёт именно dev, так как он не требует наличия 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/dev.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 ===== [[https://github.com/chesslablab/react-chess|react-chess]] - это клиентский веб интерфейс, написанный с использованием фреймворка [[wpru>React|React.js]] Для компиляции приложения потребуется: 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 в системе [[yggdrasil:dns:alfis|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 удобнее всего создать выделенный [[yggdrasil:subnet_setting|адрес подсети]] и настроить по аналогии с доменом. При использовании команды 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 ===== Узлы ===== ==== Клиенты ==== * [[http://[201:23b4:991a:634d:8359:4521:5576:15b7]/chesslablab/]] - работает в тестовом режиме, могут быть ошибки, просьба сообщать в [[http://[201:23b4:991a:634d:8359:4521:5576:15b7]/kevachat/room/Nj3UDaQ89rF5W5dGUbMSgb1C84cHW2562j#latest|канал KevaChat]] * [[http://chesslablab.ygg]] - алиас * [[https://github.com/d47081/react-chess/tree/ygg|используемый инстансом форк react-chess]] - настройки чата в dot/env, список ожидающих онлайн партий в меню и т.д. ==== Сервера ==== * [201:23b4:991a:634d:8359:4521:5576:15b7]:8085 ===== Ссылки ===== Проект на GitHub: https://github.com/chesslablab \\ ~~DISCUSSION~~