caine's place

Мой угол в интернете

Обновление сайта и миграция на Octopress.

После продолжительного тестирования и многочисленных экспериментов я, наконец, решился перевести сайт с порядком надоевшего Wordpress’а на Octopress.

Уже давно наблюдаю за развитием этого фреймворка, и вот, наконец, созрел до миграции блога на него. Расписывать подробно все его прелести не буду, в сети есть большое количество разных статей на эту тему, но основная идея - Octopress преобразует статьи, размеченные в markdown, в статический HTML-сайт, безо всякого php, баз данных и прочих задумчивых вещей. Причем, все это действо происходит прямо на моем компе, не загружая сервер лишней работой. Все, что остается - синхронизировать полученный HTML-контент с сервером с помощью rsync, например. Разумеется, тут теряется возможность написать пост, сидя в байдаре посреди речки или из открытого космоса - под рукой должен быть, как минимум, компьютер, но для меня это небольшая проблема, тем более, что для сиюминутного графоманства отлично подойдет и твиттер.

Причин для переезда множество и основная - просто захотелось что-то поменять. Wordpress наскучил и начал доставать своими тормозами (генерация страницы за 5 секунд - форменное безобразие на мой взгляд), предыдущий хостер тоже начал демонстрировать со временем признаки упадка в виде 500 Server Error. И даже попытка размещения сайта на VPS и эксперименты с кеш-плагинами для WP проблемы толком не решили.

Заодно, решил поменять и хостинг, ибо со статическим сайтом выбор значительно упрощается: хоть на narod.ru выкладывай. Ну, про narod.ru я пошутил: тамошняя принудительная реклама с легкостью перечеркивает все плюсы, поэтому я выложил сайт на Amazon S3. В течение прошлого года, благодаря кампании free tier (год бесплатного использования Amazon Web Services для всех желающих) я не только познакомился с этими замечательными сервисами, но и перевел туда несколько проектов, так что общение с S3 мне было не в новинку. Для тех же, кто слышит об этом впервые, есть несколько замечательных статей на Хабре.

Ну а теперь напишу небольшую шпаргалку для быстрого развертывания Octopress на домашнем компе с OS X 10.7 и синхронизации его с Amazon S3. В первую очередью для для установки и работы фреймворка мне понадобится git (ставится вместе с Xcode) и Ruby, причем именно версии 1.9.2. В OS X Lion Ruby установлен изначально, но версии 1.8.7, Octopress с таким работать не будет, так что придется обновиться. Итак, приступим:

Сделаем папку и загрузим туда Octopress.
1
2
mkdir work && cd work
git clone git://github.com/imathis/octopress.git octopress

Затем установим RVM (Ruby Version Manager) и вместе с ним Ruby 1.9.2:

1
2
3
4
bash -s stable < <(curl -s https://raw.github.com/wayneeseguin/rvm/master/binscripts/rvm-installer)
echo '[[ -s "/Users/caine/.rvm/scripts/rvm" ]] && source "/Users/caine/.rvm/scripts/rvm" # Load RVM into a shell session *as a function*' >> ~/.profile
cd octopress
rvm install 1.9.2 && rvm use 1.9.2

Ну и собственно, установим Octopress:

1
2
3
gem install bundler
bundle install
rake install

Дальнейший процесс настройки и использования фреймворка хорошо и подробно документирован на сайте Octopress, поэтому не буду описывать его подробно. А вот о синхронизации с Amazon S3 стандартным для Octopress путем (через ‘rake deploy’) не слишком много написано в сети, так что остановимся на ней подробнее. Для начала нам понадобится утилитка s3cmd. Сама она написана для Linux, но, как показала практика, отлично работает и на Mac. Перейдем в папку с распакованным архивом и запустим в терминале:

1
2
sudo python setup.py install
s3cmd --configure

Программа задаст несколько вопросов о способе подключения и ключах доступа к AWS, узнать которые можно тут.

Затем нам надо сконфигурировать rakefile для работы с s3cmd, для чего добавим в него следующие строки:

1
2
3
4
5
desc "Uploading site to Amazon S3"
task :s3 do
  puts "## Uploading site to Amazon S3"
  ok_failed system("s3cmd sync --acl-public public/* s3://#{s3_bucket}/")
end

и установим там же переменные:

blog.caine.in - это, разумеется, настройка для меня
1
2
s3_bucket = "blog.caine.in"
deploy_default = "s3"

Привязать доменное имя к сайту на S3 можно через DNS-псевдоним CNAME:

1
blog.caine.in CNAME blog.caine.in.s3-website-eu-west-1.amazonaws.com.

Записи типа A не поддерживаются, но при сильном желании можно смухлевать:

1
2
3
4
5
6
main:octopress caine$ nslookup blog.caine.in.s3-website-eu-west-1.amazonaws.com

Non-authoritative answer:
blog.caine.in.s3-website-eu-west-1.amazonaws.com  canonical name = s3-website-eu-west-1.amazonaws.com.
Name: s3-website-eu-west-1.amazonaws.com
Address: 178.236.5.70

Где 178.236.5.70 - IP адрес нашего сайта на S3 в данный момент. Можно привязать имя к этому адресу:

1
blog.caine.in A 178.236.5.70

Вот тут и заключается главная проблема такого подхода: S3 использует балансировку нагрузки и IP-адреса постоянно меняются, подставляя наименее загруженный сервер в датацентре, а используя запись типа A мы лишаемся этой возможности. Вдобавок, нет никакой уверенности, что датацентр не сменит свои IP-адреса в будущем. В общем, рекомендовать привязку имени через запись A можно лишь в самом отчаянном положении при невозможности пользоваться записями CNAME.

Ну а дальнейшие действия просты: пишем посты на markdown, кидаем их в папку octopress/source/_posts и генерируем сайт:

1
2
3
cd ~/work/octopress
rake generate
rake deploy

P.S. Для любителей нестандартных хостингов можно порекомендовать статьи о размещении сайта c Octopress на Heroku (и еще тут), Github и даже Google App Engine. Во всех этих случаях можно, кстати, размещать сайт совершенно забесплатно, но в ущерб посещаемости (GAE), скорости работы (Heroku) и закрытости исходников (Github).

P.P.S. Кстати, за время тестирования (примерно 2 месяца, правда, с небольшим трафиком) этого и 3-х других сайтов Amazon предъявил мне счет всего на 1.18$!

Коментарии