Резервное копирование
веб-сайта с хостинга

27 августа 2020

  • Размещение сайта на 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 и веб-фреймворков) — про её копирование поговорим во второй части статьи.


← Назад в Блог

Подпишитесь на новые статьи: