Новый блог на HUGO

Feb 2, 2016 21:01 · 420 words · 2 minute read

Go и путь Gopher-а

Совсем не так давно я изучая просторы Go, я наткнулся на проект Hugo. Проект представляет собой генерацию статичных страниц на основе файлов формата markdown.

Так как у меня в голове давно засела мысль о “скоростном вебе”, я незамедлительно решил что перенесу блог весны на платформу Hugo.

Основных причин было две:

  • Сделать блог быстрым, ghost не радовал скоростью
  • Изучить подробнее Go и его работу с вебом.

Сказано-сделано

Первым делом надо перенести старые записи в новый формат. Есть чудесный скрипт GhostToHugo. Обрабатываем им выгруженные даннее из Ghost и всё можно запускать Hugo.

hugo server -w 

По умолчанию он запускает сервер по адресу localhost:1313, при желании его можно сменить.

Выгрузка на сервер. Docker.

Небольшой поиск готовых решений на Docker Hub и я остановился на образе jojomi/hugo.

Файл run.sh который является точкой входа docker-контейнера. Основными параметрами при запуске сервера на которые стоит обратить внимание являются —source=“/src” и –destination=“/output” т.е. путь к проекту на Hugo и место куда сложить статику.

Файл run.sh

#!/usr/bin/env sh

WATCH="${HUGO_WATCH:=false}"
SLEEP="${HUGO_REFRESH_TIME:=-1}"
echo "HUGO_WATCH:" $WATCH
echo "HUGO_REFRESH_TIME:" $HUGO_REFRESH_TIME
echo "HUGO_THEME:" $HUGO_THEME
echo "HUGO_BASEURL" $HUGO_BASEURL

HUGO=/usr/bin/hugo

while [ true ]
do
    if [[ $HUGO_WATCH != 'false' ]]; then
	    echo "Watching..."
        $HUGO server --watch=true --source="/src" --theme="$HUGO_THEME" --destination="/output" --baseUrl="$HUGO_BASEURL" || exit 1
    else
	    echo "Building one time..."
        $HUGO --source="/src" --theme="$HUGO_THEME" --destination="/output" --baseUrl="$HUGO_BASEURL" || exit 1
    fi

    if [[ $HUGO_REFRESH_TIME == -1 ]]; then
        exit 0
    fi
    echo "Sleeping for $HUGO_REFRESH_TIME seconds..."
    sleep $SLEEP
done

Немного о том как работает Hugo. На основе .md файлов и шаблона темы он генерирует готовые html которые являются полностью статичными.

Т.е. на выходе мы получим лишь статичные файлы которые мы покажем пользователям. А кто справится с этой задачей лучше чем nginx?

Связываем 2 контейнера между собой при помощи docker-compose.

Файл docker-compose.yml

hugo:
  image: jojomi/hugo:latest
  volumes:
    - ./blog.vesna.kz/:/src
    - ./output/:/output
  environment:
    - HUGO_REFRESH_TIME=3600
    - HUGO_THEME=robust
    - HUGO_WATCH=false
    - HUGO_BASEURL=http://blog.vesna.kz
  restart: always

web:
  image: jojomi/nginx-static
  volumes:
    - ./output:/var/www
  environment:
    - VIRTUAL_HOST=blog.vesna.kz
  ports:
    - "80:80"
  restart: always

Запускаем

docker-composer -f docker-compose.yml up

Итог

На хостовой машине мы получаем nginx на 80-м порту, который показывает содержимое статичной папки блога. Которая в свою очередь генерится каждый час на основе файлов из проекта Hugo.

root@blog:~# docker ps
CONTAINER ID        IMAGE                 COMMAND             CREATED             STATUS              PORTS                         NAMES
1a0419db8e6b        jojomi/hugo:latest    "/run.sh"           17 hours ago        Up 17 hours         1313/tcp                      root_hugo_1
6dab6f20a315        jojomi/nginx-static   "nginx"             17 hours ago        Up 17 hours         0.0.0.0:80->80/tcp, 443/tcp   root_web_1

Нам остаётся лишь писать новые записи в блог и пушить их на сервер

hugo new vesna/blog.md
git add vesna/blog.md
git commit -m "Новая запись в блоге"
git push production master

That`s all folks!