Создание PHP инструментов администрирования хостинга: вариации реализации

Раздел: Администрирование -> Настройка хостинга

Основные подходы и примеры реализации скриптов хостинга на PHP

Наиболее эффективным решением для автоматизации управления хостингом является использование официальных API панелей управления (cPanel, Plesk, ISPmanager). Это гарантирует безопасность, совместимость и поддержку всех функций.

Как реализовать создание хостинг-аккаунта через cPanel API?

cPanel предоставляет API2 и UAPI для взаимодействия. Пример ниже создаёт учётную запись через WHM API (для резеллеров и администраторов).


<?php
// whm_create_account.php
$whm_host = 'https://your-server:2087';
$whm_username = 'root';
$whm_token = 'ВАШ_ТОКЕН_ДОСТУПА';

$data = [
    'username' => 'testuser',
    'domain'   => 'example.com',
    'password' => 'SecurePass123!',
    'plan'     => 'default_plan',
];

$ch = curl_init($whm_host . '/json-api/createacct');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Authorization: whm ' . $whm_username . ':' . $whm_token,
]);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));

$response = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

if ($http_code == 200) {
    $result = json_decode($response, true);
    if ($result['metadata']['result'] == 1) {
        echo 'Аккаунт создан успешно.';
    } else {
        echo 'Ошибка: ' . $result['metadata']['reason'];
    }
} else {
    echo 'HTTP ошибка: ' . $http_code;
}
?>
  

скрипт хостинга php (php скрипт для хостинга)

Типичные проблемы:

  • Неверный токен доступа - проверьте, что токен сгенерирован в WHM с правами на создание аккаунтов.
  • HTTPS сертификат самоподписанный - добавляйте curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);.
  • Имя пользователя уже существует - перед созданием проверяйте через API listaccts.

Как добавить сайт через Apache виртуальный хост без панели управления?

На серверах без панели можно управлять конфигурацией Apache напрямую через PHP с помощью shell_exec или exec. Этот вариант подходит для собственных серверов с полным доступом.


<?php
function createApacheVhost($domain, $user, $group) {
    $vhost = <<<EOT
<VirtualHost *:80>
    ServerName $domain
    DocumentRoot /home/$user/public_html
    ErrorLog /var/log/apache2/{$domain}_error.log
    CustomLog /var/log/apache2/{$domain}_access.log combined
    <Directory /home/$user/public_html>
        Options -Indexes +FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>
EOT;
    file_put_contents('/etc/apache2/sites-available/' . $domain . '.conf', $vhost);
    exec('a2ensite ' . $domain . '.conf');
    exec('systemctl reload apache2');
}

// Вызов
createApacheVhost('mysite.local', 'webuser', 'www-data');
echo 'Виртуальный хост создан.';
?>
  

Возможные проблемы:

  • Необходимы права root или sudo - используйте sudoers с NOPASSWD для непривилегированного пользователя.
  • Повреждение конфигурации - всегда делайте бэкап перед записью.
  • Безопасность: экранируйте входные данные (escapeshellarg).

Как автоматизировать создание FTP-пользователя для хостинга?

С помощью системных команд useradd и passwd можно создавать UNIX-пользователей, которые также будут использоваться для FTP (например, vsftpd).


<?php
$username = 'ftp_user_' . uniqid();
$password = bin2hex(random_bytes(8));

// Создание пользователя
shell_exec("sudo useradd -m -s /bin/false $username");
// Установка пароля
shell_exec("echo '$username:$password' | sudo chpasswd");
// Ограничение домашней директории
shell_exec("sudo chown $username:$username /home/$username");

echo "FTP пользователь $username создан. Пароль: $password";
?>
  

Распространённые ошибки:

  • Не выполняется sudo - настройте файл sudoers для www-data (или пользователя веб-сервера).
  • Пароль хранится в логах - используйте proc_open для передачи пароля без вывода.
  • Системный пользователь может иметь shell - устанавливайте /sbin/nologin лучше, чем /bin/false.

Как управлять базами данных MySQL для клиентов хостинга?

Через PHP можно создавать базы и пользователей MySQL с помощью mysqli или PDO, используя учётные данные root.


<?php
$db = new mysqli('localhost', 'root', 'ROOT_PASSWORD');

$dbname = 'db_' . uniqid();
$dbuser = 'user_' . uniqid();
$dbpass = bin2hex(random_bytes(8));

// Создание БД
$db->query("CREATE DATABASE `$dbname`");
// Создание пользователя
$db->query("CREATE USER '$dbuser'@'localhost' IDENTIFIED BY '$dbpass'");
// Выдача прав
$db->query("GRANT ALL PRIVILEGES ON `$dbname`.* TO '$dbuser'@'localhost'");
$db->query('FLUSH PRIVILEGES');

echo "База $dbname создана. Пользователь: $dbuser, пароль: $dbpass";
?>
  

Опасности и их избегание:

  • Никогда не храните пароль root в коде - используйте отдельный конфигурационный файл с ограниченными правами.
  • SQL-инъекции через имена БД - экранируйте обратными кавычками.
  • Генерация уникальных имён - проверяйте существование через SHOW DATABASES LIKE '$dbname'.

Ниже приведены расширенные примеры кода с подробными пояснениями и демонстрацией результатов.

Пример 1. Полный скрипт создания аккаунта через WHM API с обработкой ошибок

Пример

<?php
class WHMAccountCreator {
    private $host;
    private $username;
    private $token;

    public function __construct($host, $username, $token) {
        $this->host = rtrim($host, '/') . ':2087';
        $this->username = $username;
        $this->token = $token;
    }

    public function createAccount($domain, $username, $password, $plan = 'default') {
        $query = http_build_query([
            'username' => $username,
            'domain'   => $domain,
            'password' => $password,
            'plan'     => $plan,
            'contactemail' => 'admin@' . $domain,
        ]);

        $url = $this->host . '/json-api/createacct?' . $query;
        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_HTTPHEADER, [
            'Authorization: whm ' . $this->username . ':' . $this->token,
        ]);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);

        $response = curl_exec($ch);
        $info = curl_getinfo($ch);
        curl_close($ch);

        if ($info['http_code'] !== 200) {
            return ['success' => false, 'error' => 'HTTP: ' . $info['http_code']];
        }

        $data = json_decode($response, true);
        if (isset($data['metadata']['result']) && $data['metadata']['result'] == 1) {
            return ['success' => true, 'ip' => $data['data']['ip']];
        } else {
            $error = $data['metadata']['reason'] ?? 'Неизвестная ошибка';
            return ['success' => false, 'error' => $error];
        }
    }
}

// Использование
$creator = new WHMAccountCreator('https://server.domain.com', 'root', 'mytoken123');
$result = $creator->createAccount('example.org', 'exampleusr', 'SuperP@ss!');

if ($result['success']) {
    echo "Аккаунт создан. IP: {$result['ip']}";
} else {
    echo "Ошибка: {$result['error']}";
}
?>
Аккаунт создан. IP: 192.168.1.100

Класс инкапсулирует логику, упрощает повторное использование. Параметр plan должен быть определён в WHM. При ошибке возвращается массив с подробным описанием.

Пример 2. Создание виртуального хоста Nginx через PHP с поддержкой SSL (Let's Encrypt)

Пример

<?php
function createNginxVhost($domain, $rootDir, $ssl = false) {
    $config = <<<NGINX
server {
    listen 80;
    server_name $domain;
    return 301 https://$domain\$request_uri;
}

server {
    listen 443 ssl http2;
    server_name $domain;
    root $rootDir;

    index index.php index.html;

    ssl_certificate     /etc/letsencrypt/live/$domain/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/$domain/privkey.pem;

    location ~ \.php$ {
        fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME \$document_root\$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~ /\.ht {
        deny all;
    }
}
NGINX;

    $configPath = "/etc/nginx/sites-available/$domain.conf";
    file_put_contents($configPath, $config);
    exec("ln -s $configPath /etc/nginx/sites-enabled/");
    exec("nginx -t 2>&1", $output, $return_var);

    if ($return_var === 0) {
        exec('systemctl reload nginx');
        echo "Конфигурация Nginx для $domain применена.";
    } else {
        echo "Ошибка в конфигурации: " . implode("\n", $output);
    }
}

// Вызов
createNginxVhost('example.com', '/var/www/example', true);
?>
Конфигурация Nginx для example.com применена.

Скрипт генерирует конфигурацию с редиректом на HTTPS и поддержкой PHP-FPM. Важно предварительно получить сертификат Let's Encrypt через certbot.

Пример 3. Создание и предоставление доступа к базе данных MySQL с использованием PDO

Пример

<?php
$pdo = new PDO('mysql:host=localhost', 'root', 'example_root_password');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$dbName = 'client_' . uniqid('db_');
$userName = 'client_' . uniqid('user_');
$userPass = substr(str_shuffle('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%'), 0, 16);

try {
    $pdo->exec("CREATE DATABASE `$dbName` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci");
    $pdo->exec("CREATE USER '$userName'@'localhost' IDENTIFIED BY '$userPass'");
    $pdo->exec("GRANT ALL PRIVILEGES ON `$dbName`.* TO '$userName'@'localhost'");
    $pdo->exec('FLUSH PRIVILEGES');

    echo "База данных: $dbName
"; echo "Пользователь: $userName
"; echo "Пароль: $userPass
"; } catch (PDOException $e) { echo "Ошибка: " . $e->getMessage(); } ?>
База данных: client_db_62a1f3
Пользователь: client_user_9bcdef
Пароль: aB3$kL9m@xY7!zQ1

PDO выбрасывает исключения при ошибках, что упрощает отладку. Используется случайная генерация пароля из набора символов для повышения безопасности.

Пример 4. Управление почтовыми ящиками через exec (Postfix + Dovecot)

Пример

<?php
function createMailbox($email, $password) {
    $username = explode('@', $email)[0];
    $domain = explode('@', $email)[1];

    // Создание системного пользователя (виртуальный пользователь для Dovecot)
    $cmd = "sudo useradd -m -s /bin/false -d /home/vmail/$domain/$username $username";
    exec($cmd, $output, $ret);
    if ($ret !== 0) {
        return "Ошибка создания пользователя: " . implode(' ', $output);
    }

    // Установка пароля
    $cmd = "echo '$username:$password' | sudo chpasswd";
    exec($cmd, $output, $ret);
    if ($ret !== 0) {
        return "Ошибка установки пароля.";
    }

    // Создание каталога Maildir
    $home = "/home/vmail/$domain/$username";
    exec("sudo mkdir -p $home/Maildir/new $home/Maildir/cur $home/Maildir/tmp");
    exec("sudo chown -R $username:$username $home");
    exec("sudo chmod -R 700 $home/Maildir");

    return "Почтовый ящик $email создан.";
}

echo createMailbox('user@example.com', 'mailpass123');
?>
Почтовый ящик user@example.com создан.

В данном примере используется виртуальный каталог /home/vmail, который часто настраивается в Postfix. Перед использованием необходимо убедиться, что Dovecot настроен на работу с Maildir и системную аутентификацию.

PHP скрипт для хостинга - comments

En
скрипт хостинга php (php)