Костыль панели Pterodactyl для перезагрузки/обновления сервера если на нем нет онлайна

После релиза cs2 я заметил что панелька не может сама обновлять сервер, да и вообще это полезно, если на сервере случится какой-то баг и игроки тупо не смогут заходить на сервер.
Данный костыль будет каждый час (Или как вам угодно) проверять есть ли на сервере онлайн или нет. Если онлайна нет, то через API птеродактеля перезапустит его.

Костыль будет работать через cron используя код на php.

Нам потребуется:
PHP версии 7.4 и выше.
composer
Ну и сама панель птеродактеля.

Для начала заходим в вашу панель
адрес панели/account/api (т.е. в настройки аккаунта → API Credentials)

После этого создаем API ключ и указываем разрешенный IP для запросов (либо можете оставить пустым, и тогда запросы могут приходить с любого IP без ограничений).
1696213206478.png

Копируем и записываем в блокнот ваш ключ, ибо посмотреть еще раз вам не дадут!

Потом заходим в панель где консоль вашего сервера и в адресе копируем в блокнот ID сервера (Он понадобится для скрипта)
1696213151807.png


Теперь приступим к самому коду.

создаем папку с любым названием в домашней директории вашего пользователя откуда будет запускаться скрипт
C-подобный:
mkdir ~/srvupdate

заходим в папку
C-подобный:
cd ~/srvupdate

и вводим команду (У вас должен быть установлен композер!!!)
C-подобный:
composer require xpaw/php-source-query-class:2.1

Далее создаем в этой папке файл index.php и вставляем код

PHP:
<?php

require_once('vendor/autoload.php');

$srv = array(
  1 => array(
          'ip' => '91.122.192.252',
          'port' => '27015',
          'id' => 'ID сервера'
  ),
  // 2 => array(
  //         'ip' => '91.122.192.252',
  //         'port' => '27015',
  //         'id' => 'ID сервера'
  // ),
);

$panelurl = "https://Адрес вашей панельки";
$apikey = "API ключ";

use xPaw\SourceQuery\SourceQuery;


 
// For the sake of this example
Header( 'Content-Type: text/plain' );
Header( 'X-Content-Type-Options: nosniff' );

define( 'SQ_TIMEOUT',     1 );
define( 'SQ_ENGINE',      SourceQuery::SOURCE );

foreach ($srv as $server) {
  $info = 0;

  $serverid = $server['id'];

  $Query = new SourceQuery( );

  try
  {
    $Query->Connect( $server['ip'], $server['port'], SQ_TIMEOUT, SQ_ENGINE );
    $info = $Query->GetInfo( );
    print_r( $info );
  }
  catch( Exception $e )
  {
    echo $e->getMessage( );
  }
  finally
  {
    $Query->Disconnect( );
  }

  if (is_array($info) == true) {

    if ($info['Players'] == 0) {
 
      $curl = curl_init();
 
      curl_setopt_array($curl, array(
        CURLOPT_URL => "$panelurl/api/client/servers/$serverid/power",
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_ENCODING => "",
        CURLOPT_MAXREDIRS => 10,
        CURLOPT_TIMEOUT => 30,
        CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
        CURLOPT_CUSTOMREQUEST => "POST",
        CURLOPT_POSTFIELDS => "{\n\t\"signal\": \"kill\"\n}",
        CURLOPT_HTTPHEADER => array(
          "Accept: application/json",
          "Content-Type: application/json",
          "Authorization: Bearer $apikey"
        )
      ));
 
      $response = curl_exec($curl);
      $err = curl_error($curl);
 
      curl_close($curl);
 
      if ($err) {
        echo "cURL Error #:" . $err;
      } else {
        echo $response;
      }
 
      echo "Убил процесс";

      sleep(5);
 
      $curl = curl_init();
 
      curl_setopt_array($curl, array(
        CURLOPT_URL => "$panelurl/api/client/servers/$serverid/power",
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_ENCODING => "",
        CURLOPT_MAXREDIRS => 10,
        CURLOPT_TIMEOUT => 30,
        CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
        CURLOPT_CUSTOMREQUEST => "POST",
        CURLOPT_POSTFIELDS => "{\n\t\"signal\": \"start\"\n}",
        CURLOPT_HTTPHEADER => array(
          "Accept: application/json",
          "Content-Type: application/json",
          "Authorization: Bearer $apikey"
        )
      ));
 
      $response = curl_exec($curl);
      $err = curl_error($curl);
 
      curl_close($curl);
 
      if ($err) {
        echo "cURL Error #:" . $err;
      } else {
        echo $response;
      }
 
      echo "Запустил сервер";

    } else {
      echo "На сервере есть онлайн и он не нуждается в перезапуске!";
    }

  }
 
}

?>

Теперь нужно проверить работает ли скрипт.
Вводим команду
C-подобный:
php index.php

И если все сделали правильно, то вы должны увидеть это (Также проверьте перезапустился ли ваш сервер):
1696213384511.png


Если картинка у вас похожая, но сервер не перезапустился, то скорее всего вы указали не тот ID сервера, либо адрес панельки, либо API ключ.

Теперь вводим команду:
C-подобный:
crontab -e

И в самом низу вставляем
C-подобный:
0 */1 * * * php ~/srvupdate/index.php >/dev/null 2>&1

где */1 это значит, что скрипт будет выполняться каждый час.
Подробнее про крон можете почитать тут

Сохраняем и все готово.

Если не хотите ставить композер и вообще вставлять код, то готовое решение прикрепил специально для ленивых.
Об авторе
norice
Если статья была полезной, то не забудь поставить лайк 😉

Комментарии

Нет комментариев для отображения.

Информация о статье

Автор
norice
Article read time
3 min read
Просмотры
2,460
Последнее обновление

Загрузки

  • srvupdate.zip
    64.4 КБ · Просмотры: 40

Ещё в Прочее

Поделиться этой статьёй

Сверху Снизу