# Упрощение публикации статического сайта

О [недостатках Jekyll](/2013/11/10/lack-of-jekyll/ "Недостатки Jekyll") мы уже говорили, теперь давайте рассмотрим, как можно  перенести процесс генерации сайта на рабочий сервер.

Во-первых, сделать это можно и совершенно бесплатно. Достаточно размещать код своего сайта на Github, а генерацию производить с использованием [Travis CI](http://about.travis-ci.org "Travis CI"), с последующей публикацией результата на Github Pages.

Во-вторых, если используется свой сервер, можно генерировать сайт непосредственно с его помощью. Это вариант сейчас и рассмотрим.

## Post-Receive Hooks

Для оповещения сервера о проведенных изменениях в репозитории кода используется [Post-Receive Hooks](https://help.github.com/articles/post-receive-hooks "Post-Receive Hooks"). Довольно долго и безрезультатно пытался найти что-нибудь работоспособное для использования триггеров, пока наконец, не наткнулся на разработку [Александра Соловьева](http://solovyov.net/ "Piranha") под названием [Webhooker](https://github.com/piranha/webhooker "piranha/webhooker"). Устанавливаем Golang:

```shell
$ sudo apt-get install python-software-properties  # 12.04
$ sudo add-apt-repository ppa:duh/golang
$ sudo apt-get update
$ sudo apt-get install golang
$ echo 'export GOPATH=$HOME' >> ~/.profile
$ echo 'export PATH=$PATH:$GOPATH/bin' >> ~/.profile
```

Теперь устанавливаем сам Webhooker:

```shell
$ go get github.com/piranha/webhooker
```

По привязке webhooker к nginx есть описание на официальной странице приложения, поэтому в данной статье я останавливаться на этом моменте не буду. Расскажу лишь об автоматизации запуска Webhooker при старте системы. Александр предлагает использовать для запуска и мониторинга его состояния работы [Supervisor](http://supervisord.org "Supervisor: A Process Control System"). Но я нашел использование Upstart в Ubuntu наиболее приемлемым вариантом, тем более, что он сейчас используется в системе по умолчанию.

Необходимо создать файл конфигурации `/etc/init/webhook.conf` в котором прописываем всего несколько строк:

```conf
description "Webhook for Gihub"

start on startup
stop on shutdown

console none
respawn

exec su usename -c "~/bin/webhooker -p 5010 -i 127.0.0.1 -c ~/hooks/webhook.conf"
```

Теперь для запуска достаточно дать команду:

```shell
$ sudo start webhook
```

Для остановки:

```shell
$ sudo stop webhook
```

Файл `~/hooks/webhook.conf` я использую для описания правил работы триггеров, и если правило всего одно, его можно прописывать непосредственно в строке запуска. На данный момент в файле `~/hooks/webhook.conf` у меня одна строка:

```conf
Juev/juev.ru:master='/home/username/hooks/juevru.sh'
```

Александр задумывал использовать триггеры для запуска нескольких команд максимум, и при этом использует для запуска командный интерпретатор `sh`. А так как у меня на сервере используется `Ruby`, установленный с использованием `rbenv`, то приходиться запускать целый скрипт, в котором помимо запуска команд, необходимо еще установить рабочее окружение:

```bash
#!/bin/bash
export LANG="en_US.UTF-8"
export LC_ALL="en_US.UTF-8"
export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init -)"

cd ~/Projects/juev.ru
git pull
rake
rsync -az --delete public/ ~/web/juevru/
```

Хочу обратить внимание на тот факт, что генерация сайта производиться во временной директории. И только по окончанию работы осуществляется синхронизация этой временной директории с рабочим каталогом веб-сайта с использованием команды `rsync`. Это позволяет избежать моментов отсутствия страниц на сайте во время генерации.

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

Единственная проблема, которая остается при использовании Jekyll -- это работа с изображениями. Влад Гороховский предложил вариант решения в статье [Автоматизация обработки картинок](http://macosworld.ru/screenshot-edit-and-upload-automatisation/ "Автоматизация обработки картинок (Hazel, Transmit, TextExpander)"), но он использует для этого одновременно несколько довольно дорогих программ, что делает публикацию возможной только при использовании своего компьютера, что не всегда возможно.

Но уже сейчас работать с Jekyll стало гораздо проще.

