Я уже рассказывал о “заморочках”, связанных с автоматизацией процессов публикации этого блога. Эволюция началась с заметки “Домашний Continuous Delivery”, тогда я использовал Jenkins на домашнем сервере. Продержалось пару недель. Далее - “Перенос блога на Amazon S3”, перешёл на Travis, пользовался около года. Затем с AWS вернулся на Digital Ocean.

Конечно же, гораздо проще использовать Wordpress, Ghost или Эгею. Но мне нравится идея статически сгенерированных блогов и поэтому проходится выкручиваться.

Схема с Travis была такая:

  • исходный код и статьи блога (на базе фактически умершего Octopress) находились в публичном репозитории Github. Потому что для приватных репозиториев нужен коммерческий Travis ($129 в месяц). Не катит, это понятно.
  • при коммите Github дёргает Travis, он стягивает репозиторий, устанавливает необходимые для генерации сайта пакеты, делает public, публикует его в бакет Amazon S3
  • отдельно в Dropbox хранится каталог cdn с картинками (2 GB, половину можно убрать), их я заливал с помощью s3_website

Что меня не устраивало:

  1. S3 не позволяет строить редиректы на базе User Agent, и чтобы не было “vendor lock” на конкретный трекер RSS-подписчиков, пришлось отказаться от этого трекинга.
  2. Схема с хранением “исходных” картинок в Dropbox мне не нравилась. Ещё один сервис, который нормально не прикрутишь к серверу. Ну не хочется мне подымать там Dropbox, даже на отдельном account’е и шарить основной. Я бы вообще отказался бы от Dropbox, я его толком использую по инерции, а не по необходимости.

Когда перешёл на Digital Ocean, то:

  • отказался от Travis и стал снова генерировать сайт через rake. Вспомнились “старые добрые времена”. Под OS X были проблемы, ничего толком не генерировалось из-за странных ошибок. Проверял на RVM с двумя версиями Ruby. Плюнул, запустил под Ubuntu с родным ruby — ни одной проблемы. Стал всё делать там.
  • раз Travis мне не нужен, а Github ввёл неограниченные приватные репозитории за 7$ в месяц, то переключился на платный акк и приватный репозиторий (скрывать мне нечего, но как-то уютнее). Понятно, что Github я использую далеко не только для блога и был очень рад изменению ценовой политики. От бесплатного Gitlab.com я с огромной радостью отказался — они не справляются с нагрузкой и запушить или запулить изменения превралось то в муку, то в лотерею. А Bitbucket не особо нравится, хоть там и держу несколько “legacy” проектов.
  • в процессе покупки платного акка Guthub увидел ссылку на LFS. Бесплатно даётся 1 GB диска/трафика, мне этого мало, купил 1 storage pack за $5 в месяц, это даёт 50 GB диска/трафика. Итого — $12 в месяц.
  • сделал отдельный приватный репозиторий для cdn, залив jpg/png/etc в LFS. Небольшое неудобство — из 2 GB каталог с репозиторием стал занимать 4 GB, но это само собой понятно и меня устраивает.

И вот на выходных во время ливней я занялся переделкой схемы. Получилось такое:

  • сделал приватный образ docker для генерации сайта. Запускается на сервере в DO. При запуске он стаскивает сайт из приватного репозитория (ssh-ключ в image + deploy key на Github = не очень хорошо, но работает), генерирует сайт и делает rsync на volume, замапленый на DocumentRoot сайта
  • на сервере cdn пулится из LFS, стаскиваются бинарные файлы
  • и что очень нравится — для автоматизации подвесил два сервиса, принимающих запросы по webhook от Github. Один для сайта, другой для cdn. Важно, что это делается независимо — заливка новой картинки не вызывает перегенерацию сайта. Использую schickling/docker-hook. На сервере только пара статических сайтов, так что дополнительной защитой не заморачивался. Можете дёрнуть его, без знания токенов получите 401. Webhook запускает скрипты, в одном docker’ом генерируется сайт, в другом стаскивается LFS.

Процесс публикации такой:

  1. пишу статью, картинки записываю в репозиторий cdn
  2. когда закончил, то делаю коммиты в репозитории сайта и cdn
  3. push cdn и сайта на Github

Всё, остальное делается автоматом.

Достигнутый эффект:

  • никаких ручных действий на сервере
  • отказался от Dropbox для хранения картинок
  • все данные с историей лежат в приватных репозиториях на Github

Что хотелось бы усовершенствовать:

  • @done - отказаться от хранения ssh-ключа в docker image. Он-то приватный на Docker Hub (в бесплатном акке - один приватный, было бы здорово, если бы сделали, как Github), но это не очень хорошо.
  • @wontdo - отказаться от необходимости сделать один раз docker login на сервере (из-за приватного образа)
  • @done - сейчас gems ставятся каждый раз при генерации сайта, хотя Octopress уже развиваться не будет. Нужно сделать image, в котором достаточно стянуть сайт с Github и запустит генерацию без доустановки чего-либо
  • сделать на Ansible автоматическое разворачивание сервера на Digital Ocean, хочется получить одним запуском полностью рабочий сайт со всем содержимым с нуля
  • или сделать схему с Docker Cloud Platform - кстати, посмотрите статью Севы Полякова “Перенос блога и Docker Cloud”, он был очень недоволен.

P.S. Если кому-то будет интересно, то опишу техническую реализацию с кодом.