Пт, 23 ноя 2012 by Bolshevik in python | Comments Translations: en

Это первый пост, написанный с помощью блого-генератора Pelican и использованием разметки Markdown.

Pelican — это прилодение на питоне, позволяющее генерировать статический вебсайт по определенному шаблону. Основным назначением является генерация статического блога из контента в формате reStructuredText или Markdown.

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

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

Установка

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

$ virtualenv pelican
$ source pelican/bin/activate
(pelican)$ pip install -e git://github.com/getpelican/pelican#egg=pelican
(pelican)$ pip install Markdown

Использование

Для генерации базовых настроек и структуры проекта необходимо активировать виртуальное окружение и вызвать команду pelican-quickstart в необходмой дериктории. Затем необходимо проследовать диалогу программы. Важно ответить утвердительно на вопрос программы о создании Makefile, который упростит дальнейшее использование генератора.

$ source pelican/bin/activate
(pelican)$ pelican-quickstart

После настройки проекта создадим первый пост в папке content. Для этого необходимо создать новый файл с расширением md (Markdown) следующего содержания

Date: 2012-11-23
Title: Some title
Tags: thats, cool

This is the content of my super blog post.

Или rst (reStructuredText)

Some title
##############

:date: 2012-11-23 11:00
:tags: thats, cool
:category: yeah
:author: Test

This is the content of my super blog post.

Затем запустить в корне проекта.

(pelican)$ make html # сгенерирует вебсайт в папке output.
(pelican)$ make serve # запустит локальный вебсервер для проверки сайта.

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

(pelican)$ make devserver

Развертывание

По умолчанию Pelican предоставляет возможность развертывать сгенерированный вебсайт используя FTP, SSH или Dropbox. Но этого может быть недостаточно. Меня, например, заинтересовала возможность автоматически разворачивать вебсайт после обновления git репозитория, содержащего контент. Рассмотрим этот вариант, для этого нам необходим сервер, на котором находится как git репозиторий сайта, так и вебсервер, обслуживающий вебсайт. Конечно, веб сервер может находится и на другом сервере, это немного усложнит конфигурацию, поэтому этот вариант не рассматривается.

Итак, установим Pelican на сервер точно так же, как это было сделано для локального тестирования: необходимо создать виртуальное окружение и установить в него все необходимые компоненты. Предположим, что окружение будет находится в домашнем каталоге пользователя git, также отвечающего за обслуживание git репозиториев.

Git позволяет запускать сторонние шелл скрипты на сервере после различных событий, мы будем использовать событие post-update. Для этого создадим пустой шелл скрипт с именем post-update в каталоге hooks для голого git репозитория (не содержащего кода) или .git/hooks для простого репозитория. Этот скрипт нам понадобится для запуска процесса развертывания.

Далее идея состоит в том, что после того, как изменения загружены в репозиторий наш скрипт должен создать локальный клон основного репозитория, активировать для него виртуальное окружение и запустить make html, после чего синхронизировать каталог output с каталогом назначения используя rsync. Назовем первый скрипт deploy.sh и поместим в произвольный каталог.

#!/bin/sh
unset GIT_DIR

BASEDIR=$(dirname $0)
# Этот скрипт содержит одну строку, настраивающую CLONE_LOCATION
. ${BASEDIR}/vars.sh

VIRTUAL_ENV=/home/git/envs/pelican

if [ -d "$CLONE_LOCATION" ]; then
    cd ${CLONE_LOCATION}
    git checkout -f --
    git pull -u --force
else
    mkdir -p ${CLONE_LOCATION}
    cd  ${CLONE_LOCATION}
    git clone PATH_TO_REPO_TO_CLONE ${CLONE_LOCATION}
fi

git reset --hard origin/master # это нужно, если был force push
. ${VIRTUAL_ENV}/bin/activate
make html

find ${CLONE_LOCATION}output/ -type d | xargs chmod a+x
chmod -R a+r ${CLONE_LOCATION}output/
sudo -u www-data ${BASEDIR}/sync.sh

sync.sh:

#!/bin/sh

BASEDIR=$(dirname $0)
. ${BASEDIR}/vars.sh

DESTINATION=/var/www/PATH_TO_WEBSITE/

if [ -d "$CLONE_LOCATION" ]; then
   rsync -acvp --delete ${CLONE_LOCATION}output/ ${DESTINATION}
fi

Вот и все. Добавляем вызов скрипта deploy.sh в скрипт post-update. Теперь при каждом удачном git push, на сервере будет запускаться наш скрипт, который обновит весь вебсайт на сервере.

Comments

comments powered by Disqus

About

PHP web developer, python developer