Обновление сайта без Github

2023-06-16

Итак, есть сайт на локальной машине и его точная копия есть на виртуальном хостинге. В локальной версии будут делаться какие-то доработки. Задача самая простая - обновить сайт на виртуальном хостинге.
Так как работа на сайте ведется одним человеком, то для контроля всех изменений достаточно установить Git локально.

Установить Git

Все действия проводятся только на локальной машине через терминал. Для начала установим гит.

sudo apt install git

Когда git установлен, то перед тем как вносить какие-то изменения нужно его настроить.
Для начала делаем такие настройки, где указываем свои имя и почту:

git config --global user.name "Мое имя"
git config --global user.email "Моя почта"

Переходим в директорию сайта (/var/www/my-site.ru/)и запускаем команду

git init - так создается репозиторий гита.

После этого в корне сайта появится папка .git, в которой будет хранится вся информация о проекте и его изменениях.

Добавляем директорию где находится сайт:

git config --global --add safe.directory /var/www/директория сайта

Теперь добавляем все файлы проекта в репозиторий:

git add --all

Делаем снимок репозитория:

git commit -m "Первая версия сайта"

Теперь можно начинать работать над сайтом и вносить изменения - все изменения файлов и директорий будут фиксироваться системой git. Чтобы посмотреть список измененных файлов можно написать команду: git status. Когда работа над изменениями окончена нужно выполнить следующие команды:

git add . - обновляет файлы репозитория.
git commit -m "Вторая версия сайта" - новый снимок сайта.

В итоге у нас есть два снимка(коммита) сайта - до изменений и после изменений. Далее во всех инструкциях написано, что нужно выгрузить изменения в какой-то некий Хаб, сгененрировать ключи, и всякие другие заморочки, а нам нужно всего-то получить измененные файлы и закинуть их к хостеру на сервер.

Обновление сайта архивом

Для решения такой задачи можно сформировать архив сайта и просто закинуть его на хостинг

git archive -o update.zip HEAD

Постоянно таскать архив всего сайта незачем, можно выгрузить архив только с измененными файлами:

git archive -o update.zip HEAD $(git diff --name-only HEAD HEAD^) - HEAD это последний коммит, а HEAD^ это предпоследний.

В результате этой команды - в директории сайта появится архив update.zip - его нужно скопировать на хостинг и разархивировать. Кстати, при создании следующих коммитов, гит будет говорить что появился файл update.zip, чтобы он его не отслеживал, нужно в папке проекта создать файл .gitignore и прописать в него строку update.zip. И добавить файл .gitignore в гит командой:

git add .gitignore

Для загрузки и распаковки архива удобно пользоваться программой WinSCP. Подключаемся к хостингу по SSH, закидываем архив в корень сайта.
Для того чтобы распаковать архив, нужно в Options/Preferences/Commands добавить команду unzip -o "!".

Unzip в winSCP

Теперь можно, нажав правой кнопкой на архив, выбрать File Custom Commands и сделать unzip прямо в папку с архивом. Старые файлы заменятся на новые.

Обновление сайта через git push

Этот метод немного сложнее, зато полностью автоматизирует процесс обновления.
Сначала нужно убедиться, что на хостинге установлен git, если это не так, попросите техподдержку установить его. Если гит на сервере установлен - продолжаем.
Первым делом нужно сделать клон текущего проекта, сначала выйти в родительскую папку проекта и выполнить:

git clone --bare papka-s-saytom papka-s-saytom.git

В результате получим копию репозитория в папке с окончанием .git. Дальше закидываем эту папку на сервер любым способом, куда удобно.
Переходим в папку, которую вы только что загрузили, затем в папку hooks и создайте файл post-receive.

#!/usr/bin/bash
git --work-tree=/home/pathto/docs --git-dir=/home/path/to/papka-s-saytom.git checkout -f

Нужно указывать полный путь, до рабочей папки сайта и репозитория. Этот файл нужно сохранить в формате utf-8, и затем выполнить команду:

sed -i -e 's/\r$//' post-receive

Этот файл будет выполняться сразу после получения обновления, здесь checkout, копирует файлы из git-dir в work-dir.
Теперь можно вносить изменения в проект, коммитить его и отправлять на сервер командой:

git push --set-upstream user@ssh-host:/path/papka-s-saytom.git master

Эта команда создаст ssh подключение и загрузит последний коммит на сервер в репозиторий papka-s-saytom.git. После ввода пароля от учетной записи пользователя, произойдет загрузка и выполнение файла post-receive, который обновит файлы в рабочем каталоге сайта.

Успешное обновление сайта через git push

Таким образом можно обновлять проект на хостинге без всяких Githubов и прочих сторонних сервисов.

Отключение пароля ssh

Чтобы, выполняя команду git push, не вводить каждый раз пароль пользователя, можно организовать подключение не по паролю, по ssh-ключу. Делается это очень просто:
На локальном компьютере нужно сгенерировать ключи, выполнив команду:

ssh-keygen
Генерация ключа для SSH

Система сгенерирует ключ. Теперь нужно скопировать содержимое этого ключа на сервер. Выполните команду cat ~/.ssh/id_rsa.pub, подключитесь к серверу, создайте каталог и файл ~/.ssh/authorized_keys, и скопируйте содержимое файла id_rsa.pub в файл authorized_keys на сервере.

Открытая часть сгенерированного ключа

Теперь при подключении по ssh авторизация будет происходить по ключу, если ключ не будет обнаружен - запросит пароль.