🔄
Хостинг

Обновление сайта через git pull: простой и надёжный деплой на хостинге

14.11.2026
← Все статьи

На небольших и средних сайтах деплой часто сводится к ручному копированию файлов по FTP. Это работает, но со временем забывается, какие файлы менялись, на сервере остаются устаревшие файлы, а если два разработчика работают одновременно, они перезаписывают изменения друг друга. Если проект хранится в Git, сервер можно рассматривать как ещё одну копию того же репозитория. Тогда обновление превращается в одну команду git pull, а код на сервере всегда соответствует конкретному коммиту.

Когда этот способ подходит

Деплой через git pull хорошо подходит для простых PHP-сайтов, тем и плагинов WordPress, проектов на Laravel и статических страниц. Условие одно: на хостинге должен быть SSH-доступ и установлен git. Есть ли SSH в вашем тарифе хостинга sayt.uz, можно узнать в кабинете или у технической поддержки, а на VPS Git устанавливается самостоятельно. Если проекту нужна сборка фронтенда или Node.js, после pull понадобятся дополнительные команды — о них ниже.

Стоит учитывать, что при каждом обновлении на несколько секунд возникает «промежуточное состояние»: часть файлов уже новая, часть ещё старая. На обычных сайтах это незаметно, но для нагруженных интернет-магазинов лучше использовать деплой без простоя через папки релизов и symlink.

Deploy-ключ на сервере

Если репозиторий закрытый, серверу нужен собственный ключ доступа. Записывать на сервер личный пароль от GitHub или GitLab — ошибка; вместо этого используется deploy key с правами только на чтение. Ключ создаётся в терминале сервера, а его открытая часть добавляется в раздел Deploy keys в настройках репозитория.

ssh-keygen -t ed25519 -C "deploy@example.uz" -f ~/.ssh/deploy_key -N ""
cat ~/.ssh/deploy_key.pub   # эту строку добавьте в Deploy keys репозитория

# запись в ~/.ssh/config:
Host github.com
    IdentityFile ~/.ssh/deploy_key
    IdentitiesOnly yes

Проверить подключение можно командой ssh -T git@github.com: при успехе GitHub ответит, что узнал вас. Важно оставить ключ в режиме «только чтение», чтобы даже при взломе сервера злоумышленник не смог записать код в ваш репозиторий.

Первое клонирование и структура папок

На многих хостингах корневая папка сайта задана заранее, например ~/www/example.uz. Если папка пуста, репозиторий можно клонировать прямо в неё. Если там уже есть файлы, безопаснее сначала сделать их резервную копию, затем освободить папку и только потом клонировать.

cd ~/www
git clone git@github.com:misol/example-sayt.git example.uz
cd example.uz
git log --oneline -1   # какой коммит сейчас на сервере

Чаще всего упускают из виду папку .git. Лежа в корне сайта, она содержит всю историю проекта, иногда вместе со старыми паролями, и если веб-сервер её отдаёт, любой может скачать код. В Apache такие запросы блокирует правило в .htaccess, в Nginx нужен аналогичный блок location. Ещё лучше, если фреймворк позволяет, направить корень сайта во вложенную папку вроде public.

# .htaccess (Apache)
RedirectMatch 404 /\.git

# Nginx
location ~ /\.git { deny all; return 404; }

.gitignore и секретные файлы сервера

Файлы, специфичные для сервера — .env, wp-config.php, загруженные пользователями изображения и папки кеша, — не должны попадать в репозиторий. Иначе каждый git pull будет затирать их локальной версией или, наоборот, пароли рабочего сервера окажутся на GitHub. Поэтому явно перечислите эти пути в .gitignore.

.env
wp-config.php
storage/logs/
wp-content/uploads/
vendor/
node_modules/

Скрипт обновления

Вместо того чтобы каждый раз набирать несколько команд вручную, удобно собрать их в небольшой скрипт. Пример ниже — для проекта на Laravel: сначала он проверяет, нет ли на сервере незакоммиченных изменений, затем обновляется только в режиме fast-forward, то есть если история на сервере разошлась с репозиторием, он остановится, а не будет пытаться что-то сливать.

#!/bin/bash
set -e
cd ~/www/example.uz

if [ -n "$(git status --porcelain --untracked-files=no)" ]; then
  echo "На сервере есть незакоммиченные изменения, остановлено"; exit 1
fi

git fetch origin
git pull --ff-only origin main
composer install --no-dev --optimize-autoloader
php artisan migrate --force
php artisan config:cache
echo "Деплой завершён: $(git log --oneline -1)"

Сохраните скрипт как deploy.sh и сделайте его исполняемым командой chmod +x deploy.sh. Для темы WordPress строки с Composer и миграциями не нужны — обычно достаточно git pull и очистки кеша плагином.

Пример: сайт учебного центра в Самарканде

Сайт самаркандского учебного центра написан на простом PHP: расписание курсов и форма записи. Раньше разработчик после каждой правки загружал десятки файлов по FTP и однажды залил старую версию файла формы — целый день заявки не приходили. После перехода на Git он вносит изменения на ноутбуке, отправляет их на GitHub через git push и запускает на сервере ./deploy.sh. Если что-то пошло не так, он находит предыдущий коммит в git log и за минуту возвращает его через git checkout.

Частые ошибки

Сообщение «Your local changes would be overwritten by merge» означает, что кто-то правил файлы прямо на сервере. Сначала посмотрите изменения через git diff: нужные перенесите в репозиторий, ненужные отмените командой git checkout -- файл. Ошибка «Permission denied (publickey)» говорит о том, что deploy-ключ не добавлен или config-файл заполнен неверно. Если владелец файлов неправильный, например клонирование выполнялось от root, сайт перестанет сохранять загружаемые изображения, поэтому всегда выполняйте команды Git от пользователя — владельца сайта.

Похожие статьи

💾 Снапшот VPS и резервная копия: в чём разница и что вас спасёт 🔀 Отдельная версия PHP для каждого сайта: настройка в ISPmanager 🖥️ Выбор хостинга в Узбекистане в 2026 году: местный или зарубежный сервер 🗂️ Закончились inode: место на диске есть, а файлы не создаются — причины и решение
🌐 Язык
🇺🇿 O'zbek 🇺🇿 Ўзбек 🇷🇺 Русский ✓ 🇬🇧 English