3 неправильных и 1 правильный способ сделать блог
Моему личному сайту, kirill.sh, на котором можно найти всё, что я думаю о личной продуктивности, путешествиях и различных книгах, уже около 7 лет. Это был один из первых сайтов, которые я создал будучи пятнадцатилетним школьником. Конечно, на тот момент выглядел проект совсем иначе. Его дизайн и содержание я оставлю за кадром. Во-первых, потому что тогда мне придётся краснеть (и далеко не за дизайн). Во-вторых, потому что я в первую очередь хочу рассказать о технической стороне проекта, которая менялась по меньшей мере 4 раза.
Спойлер: если вы всё таки хотите, чтобы я краснел за свои предыдущие статьи, то вбейте fodoj.com в https://web.archive.org/. Или погуглите “fodoj.wordpress.com”.
V0: Только статика
Изначально сайт жил по адресу gornozavodsk.com. Это было впечатляющее месиво из javascript-свистоперделок, полуголых девиц из аниме и строк текста, которые мог написать только школьник, начавший изучать веб-разработку.
V1: blogger.com и wordpress.com
В какой-то момент я решил что хочу вести блог и завёл такой на blogger.com. Судя по всему, тот сервис мне показался неудобным и я перешёл на wordpress.com. Это было последнее правильное техническое решение, которое я принял касательно fodoj.com на последующие 7 лет. Блог на wordpress.com успешно просуществовал два с лишним года, после чего я захотел не просто какой-то блог, а полноценный личный сайт с крутыми штуками и невероятной гибкостью.
V2: Добро пожаловать в мир CMS
На тот момент я уже понимал, что писать свой движок для блога – тупое решение и нужно выбирать из существующих вариантов. При этом мне нужна была гибкость, позволяющая в любой момент выйти за пределы “просто блога” и добавить, например, плашку, выводящую какую книгу я в данный момент читаю (не спрашивайте).
Но если вам всё же интересно, какую книгу я в данный момент читаю, то добро пожаловать на goodreads.
Из всего зоопарка движков я в итоге остановился на ExpressionEngine. Это очень крутой движок, первая версия которого распространялась бесплатно. Сейчас первую версию вряд ли можно найти, а вторая раздаётся только за деньги.
ExpressionEngine мне очень понравился и служил мне верой и правдой целых два года подряд. Кстати, если вы ищете что-то похожее на ExpressionEngine, но бесплатное, то приглядитесь к ModX. Я использовал его для какого-то одного проекта много лет назад и мне понравилось. Возможно, оно всё ещё хорошее.
V3: Момент, когда всё пошло не так
В 2012-ом году мне надоело пользоваться ExpressionEngine. К тому моменту стало понятно, что никто не собирается выпускать к бесплатной версии новые фишки. Я устал от запутанного интерфейса, и мне хотелось чуть больше фич, чем система могла предложить. Более того, я решил полностью переделать дизайн. Короче говоря, я решил написать свой движок для своего блога. И написал. В итоге fodoj.com два года крутился на небольшом Rails-приложении.
На самом деле, у такого подхода есть определённые преимущества. Знаменитый в Ruby-сообществе Джеймс Эдвард Грэй Второй, например, для своего блога тоже написал свой движок. Вы можете выкатить свою хитрую систему комментариев и незаметно внедрить в блог, например, интернет-магазин и хостинг docker-контейнеров (новичкам от веб-дева и хипстерам: это была шутка).
В моём случае, мне нужны были такие “крутые” фишки как:
- админка для случайных фраз, которые выводятся в шапке сайта
- markdown редактор для текста
- ...
- плашка “этот сайт работает на моём собственном движке”
Со временем важность первого и последнего пунктов слегка снизилась (до нуля), а markdown можно получить и в других местах.
Недостатки же у поддержки своего движка чуть более весомы:
Временные затраты на разработку ненужных новых фич
Ладно: это всё таки Ruby on Rails и мне не составляет труда закодить любую нужную функциональность за расслабленный вечер, полный чая мате и оркестра Глена Миллера. Тем не менее, это целый вечер, который я мог бы потратить, например, на написание новых фич для mkdev или новых статей (или на что-то более приземлённое, типа похода в кино).
Но что более важно: сайт не нуждается в новой функциональности. За прошедший год я добавил следующие killer-фичи: robots.txt, sitemap и rss-фид. У нас на mkdev даже есть статья про то, как это всё сделать на Ruby on Rails: Правильный блог на Rails: sitemap, robots и rss.
В добавлении даже этих тривиальных вещей может оказаться множество небольших нюансов, о которых позаботились разработчики существующих систем.
Скорость
Существует определённый (и весьма очевидный) выигрыш в скорости при переходе с Rails приложения, крутящегося на бесплатном Heroku, на статический сайт, размещённый на AWS S3 и раздающийся через Cloudfront.
Поддержка
Новая уязвимость в Rails? Срочно обновлять FJEngine! Новая уязвимость в Ruby? Срочно обновлять FJEngine! Heroku поменял routing-правила? Ну вы поняли. Знаете, сколько разных уязвимостей в простом HTML файле? Вот именно что.
V4: Светлое будущее с Middleman
Встречайте Middleman: написанный на ruby генератор статичных сайтов. Принцип работы простой: вы создаёте сайт используя все удобные штуки, ускоряющие разработку. А затем генерируете одной командой итоговый набор HTML\CSS, который и заливаете на хостинг.
Из коробки Middleman поддерживает все радости современной веб-разработки вроде SCSS, erb-шаблонов, partials, локализации. Так же для него написана тонна расширений для любых нужд, включая деплой на S3 и подсветку кусков кода.
Существует несколько популярных альтернатив для Middleman. Самые значимые это Octopress и Jekyll. Последний даже используется для Github Pages. Я выбрал Middleman потому что, навскидку, для него гораздо больше готовых плагинов, его легче расширять и я работал с ним в прошлом. Официальный плагин для блога поддерживает всё, что мне нужно. Не исключаю, что всего, что мы будем делать в следующих статьях серии, можно добиться при помощи Octopress и Jekyll. У меня нет опыта ни с тем, ни с другим, поэтому буду рад услышать в комментариях истории успеха их применения.
Что дальше?
В следующих статьях серии я подробно опишу весь процесс миграции с FJEngine на Middleman и расскажу как автоматизировать деплой Middleman сайтов.