Про этот сайт

Свою первую домашнюю страничку я сделал в 1996 году. Это была именно что страничка (или, как модно сейчас говорить, «одностраничный сайт») и весь текст на ней помещался в одном большом блоке <pre>.

Веб-разработкой я стал заниматься в 1999, и с тех пор у меня было много всяких там «домашних страничек» и «личных сайтов». Этот домен (kastaneda.kiev.ua) у меня появился в 2001-м году с лёгкой руки камрада Змеюки. Так оно и живёт. Я перепробовал много технологий и вариантов дизайна. «Движков» было несколько, все на PHP и все самодельные.

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

Как устроен этот сайт

Этот сайт полностью статический. Его можно раздавать через CDN, для него достаточно «лёгких» httpd вроде nginx, а с учётом небольшого веса этот сайт можно хостить даже на домашнем роутере.

При этом лично мне очень удобно возиться с содержимым сайта. Я пишу этот текст в формате Markdown при помощи текстового редактора. Это на 38% удобнее, чем писать текст в веб-интерфейсе админки любой из известных мне CMS. Никакая <textarea> не сможет дать мне всего того, что у меня есть в полноценном текстовом редакторе.

Всё это вместе взятое (тексты сайта, оформление и система сборки) хранится в Git-репозитории.

Теоретически у меня есть возможность публиковать материалы при помощи одного лишь браузера (почти как в обычных database-driven CMS). В любом интернет-кафе я могу залогиниться на GitHub'е и прямо там, в веб-интерфейсе, сделать новый коммит. Как запасной вариант сойдёт.

Система сборки

HTML-страницы собираются из Markdown'а при помощи программы Pandoc (а также GNU make и набора моих скриптов). Как при компиляции, make обходит все исходные файлы (в моём случае это файлы с расширением «.md») и, если требуется, обновляет результирующие страницы.

Работает это, упрощая, приблизительно вот так:

# apt-get install pandoc
PANDOC = pandoc --from markdown --to html5 --css style.css --standalone

SOURCE_PAGES = $(shell find . -type f -name '*.md')
TARGET_PAGES = $(patsubst %.md,%.html,$(SOURCE_PAGES))

all: $(TARGET_PAGES)

%.html: %.md
    $(PANDOC) $< --output $@

Чистый CSS писать вручную я не люблю, это бывает утомительно. Я предпочитаю препроцессоры, добавляющие к CSS удобные расширения синтаксиса — в частности, LESS. Само собой, CSS из LESS также делается при помощи make:

# apt-get install node-less
LESSC = lessc --compress

style.css: style.less
    $(LESSC) $< > $@

Кроме CSS, у меня собирается sitemap.xml.

В реально использующемся Makefile всё устроено чуть сложнее, чем в этих примерах, но в целом принцип такой же.

Как бы «Continuous Integration»

У меня есть автоматическая сборка сайта. Работает это так:

  1. Я делаю git push на GitHub (или делаю коммит через веб-интерфейс GitHub).
  2. GitHub вызывает Post-Receive WebHook.
  3. У меня на билд-сервере этот WebHook вызывает скрипт какого-то такого вида:
<?php echo touch('/home/gray/git/homepage/_build') ? 'OK' : 'Error';
  1. У меня на билд-сервере периодически по crontab'у вызывается скрипт сборки. Обнаружив флаг, говорящий о необходимости пересобрать сайт, скрипт он начинает сборку. В противном случае он молча выходит.
  2. Сайт обновлён.
  3. Отчёт о сборке cron присылает мне на почту.