Развертывание сайта Jekyll с помощью хуков Git в Ubuntu 16.04

Jekyll – это генератор статических сайтов, который предоставляет некоторые функции системы управления контентом (CMS), позволяя при этом избежать проблем с производительностью и безопасностью баз данных. Кроме того, Jekyll включает специальные функции для обработки организованного по датам контента, хотя его преимущества не ограничиваются поддержкой блогов. Jekyll хорошо подходит разработчикам, которые предпочитают использовать для обслуживания контента легкие редакторы и нуждаются в контроле версий для отслеживания изменений на своем веб-сайте.

Данный мануал поможет настроить локальную машину и среду производства Nginx для обслуживания сайта Jekyll, а также подготовить Git для отслеживания изменений и обновления сайта при загрузке нового контента. Также вы узнаете, как установить и настроить git-shell для дополнительной защиты сервера от неавторизованных пользователей.

Требования

1: Настройка пользователя Git

В целях безопасности начнем с создания учетной записи пользователя, на которой будет размещен репозиторий Git для сайта Jekyll. Этот пользователь выполнит сценарий хуков Git, который вы создадите далее для обновления сайта (после добавления нового контента). Следующая команда создаст пользователя по имени git:

sudo adduser git

Вам будет предложено ввести и подтвердить пароль, а затем опционально ввести базовую информацию о пользователе. В конце вам будет предложено подтвердить информацию, введя Y:

Adding user `git' ...
Adding new group `git' (1001) ...
Adding new user `git' (1001) with group `git' ...
Creating home directory `/home/git' ...
Copying files from `/etc/skel' ...
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
Changing the user information for git
Enter the new value, or press ENTER for the default
Full Name []:
Room Number []:
Work Phone []:
Home Phone []:
Other []:
Is the information correct? [Y/n]

Также нужно подготовить корневой каталог для хранения созданного сайта. Сначала удалите веб-страницу по умолчанию из каталога /var/www/html:

sudo rm /var/www/html/index.nginx-debian.html

Теперь передайте группе www-data и пользователю git права собственности на каталог, чтобы этот пользователь мог обновлять контент сайта при поступлении изменений. Группа www-data позволяет веб-серверам получить доступ и управлять файлами, расположенными в /var/www/html:

sudo chown git:www-data /var/www/html

Прежде чем продолжить, скопируйте свой SSH-ключ для пользователя git, чтобы вы могли безопасно получить доступ к вашему серверу с помощью Git. Вы можете сделать это, выполнив раздел 4 мануала по начальной настройке сервера Ubuntu 16.04. Самый простой способ – использовать команду ssh-copy-id, но вы также можете скопировать ключ вручную.

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

2: Настройка репозитория Git

Репозиторий Git будет содержать данные сайта, включая историю изменений и коммитов. На этом этапе нужно создать репозиторий Git на сервере производства с помощью хука post-receive, который будет восстанавливать и обновлять ваш сайт.

Репозиторий будет находиться в домашнем каталоге пользователя git; поэтому если вы вышли из этой учетной записи после предыдущего раздела, используйте команду su для переключения ролей.

su - git

В домашнем каталоге создайте папку, в которой будет храниться репозиторий Git. Этот каталог обязательно должен находиться в домашнем каталоге и называться в формате repo-name.git, иначе команды git не смогут его обнаружить. Обычно repo-name – это имя сайта: так git легче распознавать и различать сайты и репозитории. Для примера назовем сайт 8host-blog:

mkdir ~/8host-blog.git

Перейдите в каталог и инициализируйте репозиторий Git с помощью команды git init. Флаг —bare готовит репозиторий для работы на сервере и обеспечивает взаимодействие между несколькими пользователями:

cd ~/8host-blog.git
git init --bare

Вывод сообщит, что операция прошла успешно:

Initialized empty Git repository in /home/git/8host-blog.git

Если вы не видите такой вывод, проверьте логи, чтобы устранить проблему, прежде чем продолжить работу.

Созданная вами папка содержит каталоги и файлы, необходимые для размещения вашего репозитория. Вы можете проверить его содержимое:

ls
branches  config  description  HEAD  hooks  info  objects  refs

Если вы не видите такой вывод, убедитесь, что вы перешли в соответствующий каталог и успешно выполнили git init.

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

Создайте файл post-receive в каталоге hooks и откройте его в текстовом редакторе:

nano ~/8host-blog.git/hooks/post-receive

Настройте хук для клонирования последних изменений во временный каталог, повторной сборки сайта и сохранения сгенерированного сайта в /var/www/html.

Скопируйте и вставьте в файл:

#!/usr/bin/env bash
GIT_REPO=$HOME/8host-blog.git
TMP_GIT_CLONE=/tmp/8host-blog
PUBLIC_WWW=/var/www/html
git clone $GIT_REPO $TMP_GIT_CLONE
pushd $TMP_GIT_CLONE
bundle exec jekyll build -d $PUBLIC_WWW
popd
rm -rf $TMP_GIT_CLONE
exit

Сохраните и закройте файл.

Сделайте сценарий исполняемым, чтобы пользователь git мог запустить его при изменении контента:

chmod +x ~/8host-blog.git/hooks/post-receive

На данный момент у вас есть полностью настроенный репозиторий Git и хук post-receive для обновления вашего сайта при получении изменений. Прежде чем загрузить сайт в репозиторий, нужно дополнительно защитить сервер производства, настроив интерактивную оболочку git-shell (она может предоставлять пользователям различные команды Git, когда они подключаются через SSH).

3: Настойка git-shell и отключение интерактивных логинов

Если вы совместно используете SSH-ключ пользователя git с другими людьми, у них будет доступ к интерактивной сессии Bash через SSH. Это опасно, так как эти пользователи могут получить доступ к другим данным, не связанным с сайтом. Настройте git-shell как неинтерактивную оболочку, чтобы у пользователя git не было возможности запустить интерактивную сессию Bash.

Убедитесь, что вы работаете в сессии пользователя git.

Создайте каталог git-shell-commands, необходимый для работы оболочки git-shell.

mkdir ~/git-shell-commands

Файл no-interactive-shell используется для определения неинтерактивного поведения оболочки, поэтому откройте его в текстовом редакторе:

nano ~/git-shell-commands/no-interactive-login

Скопируйте в файл следующий контент. Он будет открывать приветственное сообщение, если вы попытаетесь войти в систему через SSH:

#!/usr/bin/env bash
printf '%s\n' "You've successfully authenticated to the server as $USER user, but interactive sessions are disabled."
exit 128

Сохраните и закройте файл.

Сделайте файл исполняемым:

chmod +x ~/git-shell-commands/no-interactive-login

Вернитесь в сессию пользователя sudo, чтобы изменить свойства пользователя git.

exit

Теперь нужно изменить оболочку пользователя git на git-shell:

sudo usermod -s $(which git-shell) git

Убедитесь, что вы не можете получить доступ к интерактивной оболочке, запустив SSH с машины разработки:

ssh git@production_server_ip

Вы должны увидеть следующее сообщение. Если вы не видите его на экране, убедитесь, что у вас есть соответствующие ключи SSH и повторите предыдущие разделы, чтобы устранить проблему, прежде чем продолжить работу.

Welcome to Ubuntu 16.04.3 LTS (GNU/Linux 4.4.0-109-generic x86_64)
...
You've successfully authenticated to the server as git user, but interactive sessions are disabled.
Connection to production_server_ip closed.

Теперь пора настроить локальную машину разработки для использования этого репозитория Git, а затем переместить ваш сайт в репозиторий.

4: Загрузка изменений в репозиторий

Вы инициализировали и настроили репозиторий Git на сервере производства. На машине разработки необходимо инициализировать локальный репозиторий, содержащий данные об удаленном репозитории и изменения, внесенные в локальный репозиторий.

На машине разработки перейдите в каталог сайта:

cd ~/www

Теперь нужно инициализировать репозиторий Git в корневом каталоге сайта, чтобы вы могли размещать контент в удаленном репозитории:

git init

В выводе будет сообщение об успешной инициализации репозитория:

Initialized empty Git repository in /home/8host/www

Если вы не видите такое сообщение, следуйте инструкциям на экране, чтобы устранить проблему, прежде чем продолжить.

Теперь создайте удаленный объект, представляющий объект Git для отслеживания удаленных репозиториев и веток, в которых вы работаете. Обычно удаленный репозиторий по умолчанию называется origin.

Следующая команда создаст удаленный репозиторий origin, который будет отслеживать репозиторий 8host-blog на сервере производства с помощью пользователя git:

git remote add origin git@production_server_ip:8host-blog.git

Если команда не вернула вывода, значит, все прошло успешно. Если вы видите сообщение об ошибке, устраните ее, прежде чем перейти к следующему шагу.

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

Коммиты используются для отслеживания сделанных изменений. Они содержат сообщение, которое описывает внесенные изменения. Рекомендуется создавать короткие, но содержательные сообщения, включая подробные сведения о наиболее важных изменениях в коммите.

Для начала выберите выбрать файлы, для которых вы хотите создать коммит. Следующая команда создаст коммит для всех файлов:

git add .

Команда не выводит результат. Если вы получили сообщение об ошибке, исправьте ее, прежде чем продолжить.

Затем создайте коммит с флагом –m, который позволяет добавить сообщение. Например, в первом коммите будет сообщение «Initial commit»:

git commit -m "Initial commit."

В выводе будет список измененных каталогов и файлов:

10 files changed, 212 insertions(+)
create mode 100644 .gitignore
create mode 100644 404.html
create mode 100644 Gemfile
create mode 100644 Gemfile.lock
create mode 100644 _config.yml
create mode 100644 _posts/2017-09-04-link-test.md
create mode 100644 about.md
create mode 100644 assets/postcard.jpg
create mode 100644 contact.md
create mode 100644 index.md

Если вы видите какие-либо ошибки, обязательно устраните их, прежде чем продолжить.

Затем используйте следующую команду, чтобы загрузить изменения в удаленный репозиторий.

git push origin master

Вывод будет содержать информацию о процессе загрузки. Когда он закончится, вы увидите следующую информацию:

Counting objects: 14, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (12/12), done.
Writing objects: 100% (14/14), 110.80 KiB | 0 bytes/s, done.
Total 14 (delta 0), reused 0 (delta 0)
remote: Cloning into '/tmp/8host-blog'...
remote: done.
remote: /tmp/8host-blog ~/8host-blog.git
remote: Configuration file: /tmp/8host-blog/_config.yml
remote:             Source: /tmp/8host-blog
remote:        Destination: /var/www/html
remote:  Incremental build: disabled. Enable with --incremental
remote:       Generating...
remote:                     done in 0.403 seconds.
remote:  Auto-regeneration: disabled. Use --watch to enable.
remote: ~/8host-blog.git
To git@188.166.57.145:8host-blog.git
* [new branch]      master -> master

Если вы не видите такой вывод, следуйте инструкциям на экране, чтобы устранить проблему.

На этом этапе ваш сайт загружен на сервер, и через короткий период он будет пересобран. Откройте в веб-браузере:

http://production_server_ip

Вы должны увидеть свой сайт. Если сайт не открывается или не работает, повторите предыдущие шаги, чтобы убедиться, что вы сделали все правильно.

Чтобы регенерировать сайт после изменнеий, вам нужно добавить файлы в коммит, а затем загрузить изменения, как это было в случае с первым коммитом.

После внесения изменений в файлы используйте следующие команды, чтобы добавить все измененные файлы в коммит. Если вы создали новые файлы, вам также необходимо добавить их с помощью git add, как это было сделано в первом коммите. Когда вы будете готовы создать коммит, добавьте сообщение, описывающее текущие изменения, например «updated files»:

git commit -am "updated files"

Загрузите изменения в репозиторий:

git push origin master

Вы получите такой вывод, очень похожий на предыдущий:

Counting objects: 14, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (12/12), done.
Writing objects: 100% (14/14), 110.80 KiB | 0 bytes/s, done.
Total 14 (delta 0), reused 0 (delta 0)
remote: Cloning into '/tmp/8host-blog'...
remote: done.
remote: /tmp/8host-blog ~/8host-blog.git
remote: Configuration file: /tmp/8host-blog/_config.yml
remote:             Source: /tmp/8host-blog
remote:        Destination: /var/www/html
remote:  Incremental build: disabled. Enable with --incremental
remote:       Generating...
remote:                     done in 0.403 seconds.
remote:  Auto-regeneration: disabled. Use --watch to enable.
remote: ~/8host-blog.git
To git@188.166.57.145:8host-blog.git
* [new branch]      master -> master

На этом этапе сайт будет повотрно собран с учетом последних изменений.

Читайте также: Автоматизация разработки и развертывания с помощью хуков Git

Tags: , ,