Настраиваем Rsync для публикации сайта на Octopress
Octopress предоставляет несколько способов публикации собранного сайта на удаленный сервер. Лично мне больше всего подходит использование Rsync, поскольку мой сайт размещен на собственном хостинге, а не на Github’e или, не приведи Господи, Heroku. Ниже я кратко опишу процесс настройки публикации сайта на удаленный сервер с использованием rsync и команды rake deploy
, включая некоторые подводные камни этого процесса.
Настраиваем работу Rsync через SSH
Настройки публикации сайта находятся в Rakefile
в разделе Rsync Deploy config
. Поэтому первым делом идем туда и вводим свои настройки:
После установки настроек в Rakefile
необходимо озаботиться тем, чтобы в процессе публикации удаленный сервер не спрашивал у нас пароля пользователя username
, от имени которого мы и будем осуществлять логин на удаленный сервер во время публикации. Если вас не смущает ввод пароля каждый раз при публикации новой заметки или если у вас уже настроена авторизация через, скажем, rsa-ключи, можете смело пропустить следущий раздел.
Генерация пары ключей
Процесс описывается для связки Mac (локальная машина) + Ubuntu 10.10 (удаленный сервер), однако, всё будет работать и на более поздних версиях Ubuntu. Сперва генерируем пару ключей. В зависимости от того, какая версия протокола используется на вашем удаленном сервере, необходимо генировать подходящие ключи.
Генерация ключей RSA
Для наших целей подойдет самая простая пара ключей с настройками по-умолчанию. Для этого набираем в терминале локальной машины:
В результате работы получаем:
Нам предлагается ввести имя файла (я ввел username_rsa
), а также ввести passphrase
(я не вводил, это не обязательно, кроме того, passphrase можно добавить к ключу позже при помощи команды ssh-keygen -p
), которая повышает уровень защиты ключей. Если при запросе имени файла просто нажать enter
, создастся пара ключей с именами по-умолчанию id_rsa
. Однако я не рекомендую оставлять имя файла по-умолчанию, потому что при генерации следующей пары ключей с именем по-умолчанию старые ключи перезапишутся и станут непригодны к использованию.
В результате будут созданы пара ключей в директории ~/.ssh
с именами (в моем случае) username_rsa
и username_rsa.pub
. Файл username_rsa
содержит в себе секретный ключ и не должен передаваться кому-либо. Файл username_rsa.pub
содержит в себе публичный ключ и может быть передан на удаленный сервер.
Генерация ключей DSA
Update: Внимание! ключи DSA в настоящее время считаются уязвимыми, не используйте их!
Процесс генерации ключей DSA весьма похож на генерацию ключей RSA:
В результате работы получаем:
Опять же, в случае нажатия enter
при запросе имени файла без ввода своего имени файла, будет создана пара ключей по-умолчанию с именем id_dsa
, что нежелательно для генерации нескольких пар ключей для использования в случае нескольких разных сайтов.
В этом случае создалась пара ключей username_dsa
и username_dsa.pub
, первый является секретным ключом, второй - публичным.
Помещаем публичные ключи на удаленный сервер
Для того, чтобы общаться с удаленным сервером без запроса авторизации пользователя, в директории ~./ssh
удаленного сервера создается файл authorized_keys
для ключей RSA и файл authorized_keys2
для ключей DSA. Далее содержимое файлов публичных ключей добавляется в конец указанных файлов.
Предположим, что у нас есть файлы username_rsa.pub
и username_dsa.pub
, содержащие публичные ключи. Скопируем их на удаленный сервер (находясь при этом в директории ~./ssh
) в директорию ~/.ssh
удаленного сервера:
Далее заходим на удаленный сервер по ssh с вводом пароля, идем в директорию ~/.ssh
и создаем файлы authorized_keys
и authorized_keys2
, если их там еще нет:
Далее меняем права доступа к этим файлам, чтобы к ним не мог доступиться кто попало:
Далее копируем содержимое файлов публичных ключей в созданные нами файлы authorized_keys
и authorized_keys2
:
Обратите внимание, содержимое файла username_dsa.pub
дописывается в конец файла authorized_keys2
поскольку это ключ DSA! Более файлы публичных ключей нам не нужны, поэтому можем их удалить:
Почти все готово! Теперь для логина по SSH к удаленному серверу достаточно набрать:
или
Обратите внимание! Вам достаточно создать только одну пару ключей - RSA или DSA - в зависимости от того, какая версия поддерживается вашим удаленным сервером. Я привел описания процесса для двух пар ключей исключительно для того, чтобы можно было выбрать нужный вариант.
Update: В настоящее время authorized_keys2
считается depricated и не используется. Вместо него используется authorized_keys
.
Использование собственного имени пары ssh-ключей
Однако, если вы проделали все в точности согласно описанной процедуре, залогиниться вам не удастся. Дело в том, что при создании файлов ключей с именем, отличным от имени по умолчанию (id_rsa
, id_dsa
), при попытке логина ssh ищет именно файлы с именами по-умолчанию. Для использования выбранных вами кастомных имен (в нашем примере это username_rsa
и username_dsa
) совместно с rsync, вам необходимо создать на локальной машине в директории ~/.ssh
файл config
(touch config
), в котором задать для вашего удаленного хоста свой IdentityFile
, например:
При использовании нестандартного порта для SSH (отличного от порта 22), в config
можно задать этот порт.
После этого вам удастся зайти на удаленный хост по SSH с использованием команды:
Настроив доступ к удаленному серверу через SSH с использованием пары шифрованных ключей, мы можем использовать rsync
, на которой базируется команда публикации сайта на удаленный сервер rake deploy
.
Публикуем сайт через Rsync
Все готово для публикации сайта через rsync. Для публикации сайта наберите в терминале (находясь в директории octopress
):
При выполнении этой команды Ваша директория public
будет синхронизирована с удаленным сервером.
Настройка rsync delete
Если в вашем Rakefile
значение rsync_delete
равно true
, rsync будет создавать полную копию вашей public
директории на удаленном сервере, включая создание, обновление и удаление страниц и заметок. Иными словами, если на локальной машине вы удалили заметку, она исчезнет и на удаленном сервере при следующем rake deploy
.
Если вы не хотите, чтобы какие-либо локальные файлы передавались при деплое на сервер, вам необходимо создать файл rsync-exclude
в корневую директорию вашего проекта, содержимое этого файла может быть таким:
Использование rsync-exclude
предотвратит передачу на сервер указанных в нем файлов, а также при включенном rsync_delete
удаление на удаленном сервере файлов, перечисленных в rsync-exclude
.
Источники
При написании данной заметки были использованы следующие источники, которые рекомендуются к прочтению для углубленного изучения вопроса, либо при возникновении проблем в процессе использования представленного описания настроек rsync
: