- Размещение сайта на shared-хостинге (в просторечии «на шареде») имеет определённые достоинства.
- Например, при небольших нагрузках shared hosting обычно дешевле альтернатив (виртуального, облачного или выделенного сервера).
- Кроме того, значительную часть работы по настройке и обслуживанию сайта выполняют администраторы хостинга (вопрос их квалификации сейчас оставим в стороне).
Но у такого подхода есть и минусы:
- Например, резервное копирование сайта, как правило, будет выполняться автоматически.
- Но если вы решите перестраховаться и настроить собственные бэкапы, вас наверняка ждут проблемы, т.к. на хостингах зачастую отсутствует возможность подключаться по SSH, запускать собственные команды, напрямую обращаться к файлам и т.д. Тех, кому нужна подобная гибкость, техподдержка обычно отправляет заказывать VPS.
- Из-за этого становится невозможным вариант, предложенный нами в статье Git для сайтов.
Поэтому доработаем его следующим образом:
- Сначала полностью скопируем файлы сайта по протоколу FTP или SFTP на свой сервер (сделаем локальное зеркало)
- и запустим Git на локальной копии.
Вот работающий пример:
Скорее всего, от вас потребуется исправить только переменные в заголовке:
#!/bin/sh
PROTO="ftp"
SITE="example.org"
USER="admin@$SITE"
PASS="My_Very_Secret_FTP_Password_On_Shared_Hosting"
DEST="/opt/backups/${SITE}"
SITEDIR="/$SITE/public_html"
MAILTO="admins"
umask 077
mkdir -p "$DEST"
test -s "$DEST.git/config" || git init --separate-git-dir="$DEST.git" "$DEST"
cd "$DEST"
lftp -e "
set ssl:check-hostname 0;
open $PROTO://$USER:$PASS@$SITE;
cd $SITEDIR;
mirror -c -e -P4 -X php_errorlog -X .git -X Cookie_UserSettings_Log_??????.csv ;
quit
"
LANG=C git status | grep -q '^nothing to commit' && exit 0
LANG=C git status | mail -s "${PWD##*/} changed on $(hostname -f)" $MAILTO
Пояснения:
- Скачивание производится утилитой LFTP, которая неоднократно выручала нас ранее, и вне всякого сомнения продолжит выручать и в дальнейшем.
- Git-репозитарий инициализируется автоматически, но в отдельном каталоге, чтобы случайно не удалить его при синхронизации (или не отправить на публичный сервер, что ещё хуже).
- В LFTP используется встроенная команда "mirror", которая скачивает только отличия.
- Ключ "-c" означает «при возможности возобновлять прерванное скачивание с момента обрыва вместо запуска сначала».
- "-e" означает удаление файлов на приёмной стороне, если они отсутствуют на отправляющей (мы этого не боимся, потому что о сохранении удаляемых файлов позаботится Git).
- "-P4" означает скачивание в 4 одновременных потока (значение подбирается методом проб и ошибок, правила хорошего тона рекомендуют не делать его слишком большим).
- "-X" исключает служебные файлы, которые (а) не являются частью сайта и (б) постоянно изменяются или (в) имеют большой размер.
- Полученные изменения не сохраняются в Git автоматически!
- Вместо этого при появлении отличий администраторам отправляется уведомление в Телеграм.
- Администратор просматривает изменения, и только убедившись, что они не содержат следов взлома, выполняет
"git add -A && git commit -am ..."
Примечания:
- Надо быть готовыми к тому, что Git откажется обрабатывать файлы большого размера (архивы, видео и т.д.) и для них потребуется явно настроить Git LFS.
- Кроме файлов, сайт может иметь SQL-базу (это относится к большинству распространённых CMS и веб-фреймворков) — про её копирование поговорим во второй части статьи.