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