Сергей Супрунов
Обзор CMS Skeletonz
Системы управления содержимым (content management system, CMS) с каждым днём приобретают всё большую популярность. Оно и понятно – интернет-сайты из категории «творчества» постепенно переходят в «бизнес», и поэтому значительное место начинают занимать не только вопросы эффективности их разработки, но и последующего сопровождения.
На рынке уже присутствует довольно большое число CMS с богатым набором возможностей. Среди открытых решений сразу же вспоминаются Joomla! (http://www.joomla.org) и Drupal (http://drupal.org), из коммерческих в нашей стране, пожалуй, наиболее известны продукты «1С-Битрикс» (http://www.1c-bitrix.ru).
Однако всё это могучие системы, позволяющие создавать сайты почти любой сложности и, как следствие, требующие определённой квалификации веб-разработчика или времени на изучение всех их возможностей. Да и вопросы сопровождения могут требовать не меньшего внимания.
Однако иногда такие возможности оказываются избыточными, и для задачи создания простейшего сайта (пара новостей в неделю, контактная информация, несколько статей-инструкций) хочется найти что-нибудь «поскромнее». Одну из таких CMS – Skeletonz – мы и рассмотрим.
Первое знакомство
Skeletonz – это одна из несложных и не особо известных систем управления содержимым сайтов (CMS), написанная на языке Python и использующая для хранения информации СУБД MySQL. Первоначально основанная на веб-фреймворке CherryPy (http://www.cherrypy.org) и ORM-библиотеке SQLObject (http://www.sqlobject.org), в настоящее время Skeletonz развивается с акцентом на простоту и быстродействие.
В основе последней версии Skeletonz (которая всё никак не выйдет в релиз, оставаясь в beta-статусе) лежит набор модулей, разработанных Амиром Салихефендиком (Amir Salihefendic, http://amix.dk). Так, веб-фреймворк был заменён модулями AmiWeb, функцию взаимодействия с базой данных взял на себя AmiDB (основанный на SQLAlchemy, http://www.sqlalchemy.org). Неизменной осталась, пожалуй, лишь система разработки шаблонов Cheetah (http://www.cheetahtemplate.org).
Поставляется Skeletonz с собственным веб-сервером, что весьма удобно для разработки, но привносит ряд особенностей в процесс развёртывания для «промышленной эксплуатации» (о них мы поговорим ниже).
Официальный сайт проекта – http://orangoo.com/skeletonz.
Инсталляция
Устанавливать будем на FreeBSD (хотя подойдёт любая система, где работает Python). В коллекции портов Skeletonz не представлена, так что исходные коды – единственный путь обзавестись этой CMS. Впрочем, ничего сложного здесь нет.
Для начала нужно установить язык программирования Python и СУБД MySQL (или убедиться, что эти пакеты уже присутствуют в системе). Жёстких требований к версиям с точки зрения совместимости нет – интерпретатор Python должен быть не ниже версии 2.4, MySQL – 4.1 и выше (версии 5.х тоже будут работать нормально). Установка из портов отлично решит задачу. Также понадобится python-модуль MySQLdb (http://sourceforge.net/projects/mysql-python), установить его можно также из коллекции портов: /usr/ports/databases/py-MySQLdb.
Дополнительно можно установить графическую библиотеку PIL (Python Image Library, http://www.pythonware.com/products/pil) – без неё Skeletonz работать будет, но не подключится плагин «ImgTitle», позволяющий «на лету» генерировать графические изображения из заданного текста:
$ fetch http://effbot.org/downloads/Imaging-1.1.6.tar.gz
Imaging-1.1.6.tar.gz 100% of 425 kB 102 kBps |
$ tar xf Imaging-1.1.6.tar.gz
$ cd Imaging-1.1.6
$ sudo python setup.py install
Для полного счастья понадобятся также TTF-шрифты (можно поискать что-нибудь в коллекции портов, например, поставив x11-fonts/freefont-ttf, или просто «натаскать» шрифты в систему вручную из «открытых источников»). Путь к каталогу со шрифтами, а также шрифт по умолчанию нужно будет затем указать в настройках плагина.
Теперь дело, собственно, за Skeletonz. Поскольку данная CMS написана на языке Python, установка заметно упрощается (а заодно снижается и число возможных проблем), поскольку этапы компиляции и инсталляции будут отсутствовать: скачиваем архив с исходным кодом, распаковываем в рабочий каталог, выполняем правку конфигурационного файла general_config.py, и можно запускать:
$ fetch http://orangoo.com/skeletonz/uploads/skeletonz_beta.zip
skeletonz_beta.zip 100% of 753 kB 96 kBps |
$ tar xzf skeletonz_beta.zip
$ cd skeletonz_beta
$ vi general_config.py
Конфигурационный файл хорошо прокомментирован и содержит лишь необходимый минимум опций. Многие из параметров вам нужно будет изменить (или проверить, что значения, выставленные по умолчанию, соответствуют вашим желаниям):
- PORT – задаёт номер порта, на котором будет работать собственный веб-сервер Skeletonz (по умолчанию используется значение 14002; номер порта меньше 1024 потребует прав суперпользователя, поэтому не рекомендуется; как обеспечить доступ через стандартный 80-й порт, мы поговорим отдельно).
- TITLE_PREFIX – префикс заголовка, который будет присутствовать на каждой странице сайта (т.е. тег <title> каждой страницы будет формироваться как TITLE_PREFIX + имя страницы). Здесь есть одна особенность, связанная с поддержкой национальных кодировок, о которой будет сказано чуть позже.
- BASE_URL – базовый адрес сайта (на каждую страницу сайта будет добавлен тег <base ...> с данным значением, что наверняка создаст проблемы, если сайт должен быть доступен на разных интерфейсах, имеющих разные DNS-имена).
- CHECK_LOGIN, ADMIN_USERNAME, ADMIN_PASSWORD – параметры доступа к административным функциям CMS. Понятно, что права доступа к конфигурационному файлу, поскольку он содержит пароль в открытом виде, должны быть максимально жёсткими (но достаточными для того, чтобы его могла «прочитать» сама Skeletonz).
- START_PAGE – имя страницы, которая будет открываться при первоначальном входе на сайт.
- TABLE_PREFIX, DB_USER, DB_PASSWORD, DB_HOST, DB_DATABASE – параметры доступа к СУБД. Возможность указывать префикс имён таблиц позволяет задействовать для Skeletonz одну из существующих баз данных MySQL. Однако, если такая возможность имеется, лучше всё-таки создать отдельную БД специально для нужд CMS. Возможности работать с другой СУБД нет (не считая правки исходников), хотя ходят слухи о грядущей поддержке SQLite.
Нужно обратить внимание на следующую особенность – файл general_config.py является обычным сценарием
Python, поэтому он должен соответствовать синтаксису этого языка. Не забывайте заключать в кавычки текстовые строки, ставить знаки равенства между именем параметра и значением, соблюдайте правильный регистр имён параметров и внимательно следите за отступами (точнее, за их отсутствием – все строки должны начинаться строго с первой позиции). Кроме того, интерпретатор Python по умолчанию ожидает увидеть в своём коде исключительно ASCII-символы, так что если хочется задать какую-то строку на русском языке (пожалуй, кроме параметра TITLE_PREFIX такая необходимость нигде возникнуть не должна), нужно первой строкой конфигурационного файла добавить следующую:
# -*-coding: utf8 -*-
Причём именно UFT-8, независимо от вашей системной локали, – эта кодировка используется по умолчанию во всех подсистемах CMS, и способа её изменить без глубокого погружения в исходный код я не нашёл. Очевидно, что и значение параметра в конфигурационном файле придётся задавать в этой кодировке. Если ваш редактор не поддерживает UTF-8, можно воспользоваться утилитой iconv для последующего преобразования в Юникод:
$ iconv -f koi8-r -t utf-8 general_config.koi.py > general_config.py
Ну вот, собственно, и все приготовления. Можно запускать сервер.
Первый запуск
Как я уже упоминал, Skeletonz поставляется со встроенным веб-сервером. Запуск этого сервера осуществляется следующей командой из каталога, куда распакована Skeletonz:
$ python launch_server.py
При таком запуске сервер останется активным, и вы сможете в терминале отслеживать все его сообщения. Запускать сервер в фоновом режиме придётся, например, следующим образом:
$ nohup python launch_server.py &>skeletonz.log &
Ожидать запросы веб-сервер будет на указанном в конфигурации порту на всех сетевых интерфейсах. Способа запустить его на конкретном интерфейсе я не нашёл, так что если на всех интерфейсах он вам не нужен, придётся использовать пакетный фильтр для запрета доступа на соответствующие порты. Впрочем, в любом случае для «промышленной» эксплуатации лучше использовать доступ через проски-сервер, о чём мы поговорим в разделе, посвящённом вопросам развёртывания сайта на Skeletonz.
Пример страницы, тема «Dragon»
Если сообщение о том, что модуль sre устарел, которое будет появляться при каждом старте сервера, будет вас сильно раздражать, можно подправить файл amilib/simplejson/scanner.py, изменив в шестой строке имя модуля sre на re.
Ну всё, теперь можете подключаться на соответствующий порт и приступать к знакомству с этой CMS.
Обзор административных функций
На стартовой странице вас встретит приятный глазу логотип, уведомление, что this page has no content, и две ссылки – на официальный сайт Skeletonz и административный вход. Последней и воспользуемся, введя логин и пароль, заданные в конфигурационном файле.
Здесь, щёлкнув по кнопке Admin, вы сможете выполнять следующие действия:
- Создавать/удалять пользователей и группы (User manager и Group manager соответственно). Пользователь может принадлежать к одному из двух типов: user (по умолчанию бесправный) и admin (по умолчанию обладающий всей полнотой власти).
- Раздавать созданным пользователям и группам права на редактирование отдельных страниц сайта (Site manager).
- Смотреть, кто какие файлы загружал (Upload manager), и при желании удалять загруженное. Однако выполнить новую загрузку отсюда нельзя.
- Создавать резервные копии сайта (Backup manager). Для этого от вас потребуется лишь указать имя «снапшота», и после создания вы
- сможете скачать себе архивную копию и сохранить в надёжном месте.
- Просмотреть информацию о системных настройках (Site manager). Здесь же размещена полезная кнопка – Terminate server, которая позволяет «культурно» остановить сервер, а не «грохать» его командой kill (правда, при запуске через nohup она не работает, так что в этом случае придётся-таки использовать kill).
- Просмотреть синтаксис использования различных плагинов, а некоторые из них и понастраивать (Plugin manager).
- Наконец, выбрать одну из тем для сайта (Template manager). К всеобщему сожалению, только выбрать – создавать и устанавливать придётся вручную.
Профессионалу «развернуться», конечно, негде, зато новичок точно не заблудится.
Наполнение сайта
Здесь в принципе всё просто – в режиме администратора (или под именем пользователя, которому делегированы права на редактирование данной страницы) заходим на сайт и пользуемся доступными здесь «органами управления».
«Типовая» иерархия Skeletonz предусматривает наличие двух уровней навигации: главное меню и (опционально) локальное меню страницы (Page tabs). Каждая ссылка меню ведёт на определённую страницу. Содержимое страницы создаётся вручную, используя несложный синтаксис: скажем, «%(b)text%» означает выделение текста text полужирным шрифтом, «h1.» с последующим текстом – заголовок первого уровня, и т. п. Чтобы посмотреть все возможности, щёлкните кнопку Syntax help. При необходимости никто не запрещает прибегать к HTML-синтаксису (например, именно так придётся делать таблицы). Некоторые сложные элементы (скажем, те же меню) вставляются как «плагины» (выглядят такие вставки следующим образом – [pagetabs=news]). Если что-то забыли, можно щёлкнуть на значке Add plugin syntax и выбрать нужный плагин из списка (там же будет подсказка по параметрам).
Немного странно работает вставка изображений. Вам нужно будет в режиме редактирования контента добавить вызов плагина: [image=img2], где img2 – некоторое условное наименование рисунка. Теперь, сохранив страницу, вы получите на месте изображения иконку-ссылку, позволяющую загрузить файл. После загрузки изображение займёт своё законное место, а управлять файлом можно будет через панель управления, раздел Upload manager.
Эта же страница в режиме редактирования (тема «Default»)
Среди остальных плагинов: блоги, лента новостей (правда, RSS-возможности оказываются практически неработоспособны из-за жёсткой привязки к iso-8859-1; править это придётся в исходниках – amilib/PyRSS2Gen.py, dynamic_dirs/rss/news_section_news.xml и ряде других файлов), некая пародия на wiki, подсветка текста и прочая «мелочёвка». Нельзя сказать, что все они близки к совершенству, но обеспечить основную функциональность могут. Подгонка дизайна обычно сводится к правке соответствующих классов в CSS-файле шаблона. Для добавления нового плагина (если такой посчастливится найти) каталог с его кодом нужно будет просто скопировать в site_plugins (вручную; интерфейс для добавления плагинов не предусмотрен).
Есть и один довольно неприятный момент – Skeletonz выставляет адресом страницы её наименование, то есть если создать страницу «Вопросы и ответы», то URL будет выглядеть как «http://mysite.ru/Вопросы и ответы». Вроде бы даже хорошо, но в некоторых браузерах в строке адреса будет красоваться «http://mysite.ru/%D0%92%D0%BE%D0% BF%D1%80%D0%BE%D1%81%D1%8B_%D0%B8_%D0% BE%D1%82%D0%B2% D0%B5%D1%82%D1%8B/».Так что хоть победа Юникода и неизбежна, но борьба будет долгой и кровопролитной. Пока же в качестве обходного маневра «прокатывает» следующий приём (правда, нет никаких гарантий, что данная «фича» сохранится в будущих версиях): всем вновь создаваемым страницам задавайте имена в латинице и без пробелов (так, как вам хотелось бы видеть их URL). А позже можно будет изменить наименование страницы – в заголовках и меню оно изменится, а URL останется прежним. Дело в том, что он сохраняется в другой SQL-таблице, которая не перезаписывается при изменениях страницы – что бы вы ни делали со страницей, её адрес останется таким, какой она получила при создании. Сама по себе «фича» очень неприятная, поскольку, если возникнет необходимость изменить URL страницы, придётся создавать новую, а старую удалять. Ну или лезть руками в базу MySQL. Так что будьте внимательны и продумывайте структуру сайта заранее.
Контроль версий
Несмотря на свою простоту, Skeletonz предоставляет и некоторые функции контроля версий – изменения каждой страницы отслеживаются, и вы имеете возможность просмотреть внесённые изменения и при необходимости «откатиться» на любую версию.
Для использования этих возможностей щёлкните, находясь в режиме администрирования страницы, кнопку «Page log». А дальше вопросов возникать не должно.
Темы
В дистрибутиве Skeletonz присутствуют три темы – Default (на её базе создан официальный сайт CMS – http://orangoo.com/skeletonz), сверхупрощённая Dummy и оригинальная, но слишком неэкономно использующая рабочее пространство Dragon. Если вас в них что-то не устраивает или же хочется чего-то совсем иного, выход один – создание своей темы (возможно, на основе одной из существующих).
Рассматривать здесь данный процесс не будем. Скажу лишь, что «верстать» тему придётся вручную. Помимо знаний HTML и CSS, вам понадобится умение использовать шаблоны Cheetah, а также нужно будет иметь представление о «стандартных объектах», предоставляемых системой Skeletonz. Если интересно, на официальном сайте есть пример разработки собственной темы. Добавление темы сводится к копированию соответствующего каталога в templates.
Развёртывание сайта
Встроенный веб-сервер Skeletonz удобен для разработки сайта, но не слишком хорош для «промышленной эксплуатации». Одна из причин – необходимость в правах root для запуска на 80-м порту.
Разработчики Skeletonz предлагают два варианта решения этой задачи – связка с Apache (потребуются модули mod_rewrite и mod_proxy) и при помощи прокси-сервера Delegate. Смысл обоих сводится к тому, чтобы 80-й порт прослушивался «сторонним» сервером, работающим в режиме прокси и пересылающим запросы серверу Skeletonz. Подробности можно найти на сайте проекта, здесь для примера остановимся на связке с Delegate.
Для начала в general_config.py рекомендуется включить кэширование (USE_CACHING и BUILD_CACHE_ON_START), а также установить переменную MODE в значение deployment. Также придётся изменить параметр BASE_URL, чтобы он указывал на адрес сайта с точки зрения клиента.
Теперь следует решить проблему автоматического запуска самой Skeletonz. В составе дистрибутива нет и намёка на стартовый сценарий (учитывая, что сервер даже не предусматривает работу в режиме демона, это неудивительно), его придётся писать самому, используя для запуска всё тот же «некрасивый» приём с nohup, а для останова – утилиту kill.
Ну и теперь запускаем Delegate (подробно этот сервер рассматривался в журнале за октябрь 2008 года):
# delegated -P80 MOUNT="/* http://localhost:14002/* PERMIT="http:localhost:*"
Очевидно, что все эти сложности практически ставят «крест» на использовании данной CMS в условиях виртуального хостинга, поэтому область её применения сужается до подконтрольных вам серверов (веб-сайт компании, внутрисетевой сайт, страничка «кампусной» сети и т. п.).
Резюме
Итак, из плюсов: простота и понятность, неплохое быстродействие, низкое ресурсопотребление. Для себя я отмечаю ещё язык Python, хотя это уже довольно субъективно. Недостатки: «сырость» проекта, невысокие темпы разработки, отсутствие нормального механизма развёртывания, проблемы с «не-Юникодом», не слишком богатый выбор плагинов.
Как видите, Skeletonz ещё очень далека от совершенства. Если вы планируете (не обязательно прямо сейчас) развивать свой сайт в направлении интерактивности, если вам в будущем может понадобиться большая гибкость дизайна, если хочется вместо ручной вёрстки шаблонов просто подключать готовые компоненты – изучайте Joomla! или что-то не менее мощное. Если же ваши амбиции в ближайшие годы не выходят за рамки небольшого информационного сайта на сервере компании и не пугает вывод «обратной трассировки» интерпретатора Python при ошибках плагинов, то Skeletonz вполне способна взять на себя большую часть рутины, оставив вам лишь задачу наполнения сайта. А там – кто знает? – может, и появится пара-тройка по-настоящему шикарных тем и мощных дополнений.