cPanel Git Version Control позволяет клонировать GitHub/GitLab репозиторий прямо на хостинг и автоматически деплоить изменения при push.
Настройка Git Version Control
cPanel → Files → Git Version Control → Create.
Clone URL: https://github.com/username/mysite.git
Repository Path: /home/user/public_html
Repository Name: mysite
Автодеплой через .cpanel.yml
Создайте файл .cpanel.yml в корне репозитория:
---
deployment:
tasks:
- export DEPLOYPATH=/home/user/public_html
- /bin/cp -r $SRCDIR/* $DEPLOYPATH
- cd $DEPLOYPATH && composer install --no-dev
- cd $DEPLOYPATH && php artisan migrate --force
Ручной деплой через SSH
# Перейти в папку репозитория
cd ~/repositories/mysite
# Получить изменения
git pull origin main
# Обновить production файлы
rsync -av --delete ./ ~/public_html/ --exclude='.git'
Webhook для автодеплоя из GitHub
<?php
// deploy.php
$secret = 'your_webhook_secret';
$payload = file_get_contents('php://input');
$sig = 'sha256=' . hash_hmac('sha256', $payload, $secret);
if (!hash_equals($_SERVER['HTTP_X_HUB_SIGNATURE_256'], $sig)) {
http_response_code(403);
exit;
}
exec('cd /home/user/public_html && git pull origin main 2>&1', $output);
echo implode("
", $output);
RedirectMatch 404 /\.gitАльтернатива webhook: деплой через GitHub Actions
Если хостинг блокирует входящие вебхуки фаерволом или тариф не выдаёт публичный IP для приёма запросов, деплой можно запускать по SSH прямо из GitHub Actions — раннер сам подключается к серверу и подтягивает изменения при push в ветку main, без файла deploy.php на сайте.
# .github/workflows/deploy.yml
name: Deploy
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: SSH deploy
uses: appleboy/ssh-action@v1
with:
host: ${{ secrets.SSH_HOST }}
username: ${{ secrets.SSH_USER }}
key: ${{ secrets.SSH_PRIVATE_KEY }}
port: ${{ secrets.SSH_PORT }}
script: cd ~/public_html && git pull origin main
Типичные ошибки при Git-деплое
| Сообщение | Причина |
|---|---|
| fatal: Could not read from remote repository | SSH-ключ хостинга не добавлен в GitHub/GitLab, либо для приватного репозитория используется HTTPS-клон без токена доступа |
| error: Your local changes... would be overwritten by merge | Файлы в репозитории на сервере правили вручную через Файловый менеджер; git pull отказывается затирать несохранённые изменения |
| Задачи .cpanel.yml не выполняются при push | Деплой в cPanel Git Version Control запускается кнопкой «Deploy HEAD Commit» в интерфейсе, а не автоматически по push с локальной машины — для автозапуска нужен webhook |
| fatal: destination path already exists and is not empty | Попытка клонировать репозиторий прямо в public_html, где уже лежат файлы по умолчанию (index.html от хостинга) |
| composer: command not found (в логе .cpanel.yml) | Задачи деплоя выполняются с минимальным PATH — нужен полный путь к бинарнику, например /opt/cpanel/composer/bin/composer |
Когда Git-деплой через cPanel не подходит
- Нужен CI с тестами и линтерами перед выкладкой — cPanel Git Version Control не изолирует сборку от продакшена, задачи .cpanel.yml выполняются сразу на живом сайте
- Несколько разработчиков одновременно работают через pull request с ревью — здесь нужен полноценный GitFlow, а не прямой git pull на прод-ветку
- Требуется откат к произвольному коммиту одной кнопкой — штатного UI для отката нет, придётся делать git reset вручную через SSH
- Сборка идёт в Docker-контейнере — на shared-хостинге нет демона Docker, доступны только команды из jailshell
- Нужны отдельные окружения staging и production с разными переменными — cPanel Git Version Control привязан к одному Repository Path на аккаунт, без встроенного разделения сред
Проверка результата деплоя
После push или ручного pull убедитесь, что сервер получил именно тот коммит, который ожидался — детали работы с SSH-ключами и jailshell разобраны в статье про SSH-доступ на хостинге cPanel, а автоматизацию последующих шагов удобно вынести в cron-задачу.
# Сравнить локальный HEAD и HEAD на сервере
cd ~/repositories/mysite && git log -1 --oneline
git ls-remote origin HEAD
# Проверить время изменения ключевого файла в public_html
ls -la --time-style=full-iso ~/public_html/index.php