Настраиваем Rsync для публикации сайта на Octopress
Octopress предоставляет несколько способов публикации собранного сайта на удаленный сервер. Лично мне больше всего подходит использование Rsync, поскольку мой сайт размещен на собственном хостинге, а не на Github’e или, не приведи Господи, Heroku. Ниже я кратко опишу процесс настройки публикации сайта на удаленный сервер с использованием rsync и команды rake deploy
, включая некоторые подводные камни этого процесса.
Настраиваем работу Rsync через SSH
Настройки публикации сайта находятся в Rakefile
в разделе Rsync Deploy config
. Поэтому первым делом идем туда и вводим свои настройки:
ssh_user = "username@domain.ru"
ssh_port = "22"
document_root = "/path/to/site/root/"
rsync_delete = true
deploy_default = "rsync"
После установки настроек в Rakefile
необходимо озаботиться тем, чтобы в процессе публикации удаленный сервер не спрашивал у нас пароля пользователя username
, от имени которого мы и будем осуществлять логин на удаленный сервер во время публикации. Если вас не смущает ввод пароля каждый раз при публикации новой заметки или если у вас уже настроена авторизация через, скажем, rsa-ключи, можете смело пропустить следущий раздел.
Генерация пары ключей
Процесс описывается для связки Mac (локальная машина) + Ubuntu 10.10 (удаленный сервер), однако, всё будет работать и на более поздних версиях Ubuntu. Сперва генерируем пару ключей. В зависимости от того, какая версия протокола используется на вашем удаленном сервере, необходимо генировать подходящие ключи.
Генерация ключей RSA
Для наших целей подойдет самая простая пара ключей с настройками по-умолчанию. Для этого набираем в терминале локальной машины:
ssh-keygen
В результате работы получаем:
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/developer/.ssh/id_rsa): username_rsa
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in username_rsa.
Your public key has been saved in username_rsa.pub.
Нам предлагается ввести имя файла (я ввел 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:
ssh-keygen -t dsa
В результате работы получаем:
Generating public/private dsa key pair.
Enter file in which to save the key (/Users/developer/.ssh/id_dsa): username_dsa
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in username_dsa.
Your public key has been saved in username_dsa.pub.
Опять же, в случае нажатия enter
при запросе имени файла без ввода своего имени файла, будет создана пара ключей по-умолчанию с именем id_dsa
, что нежелательно для генерации нескольких пар ключей для использования в случае нескольких разных сайтов.
В этом случае создалась пара ключей username_dsa
и username_dsa.pub
, первый является секретным ключом, второй - публичным.
Помещаем публичные ключи на удаленный сервер
Для того, чтобы общаться с удаленным сервером без запроса авторизации пользователя, в директории ~./ssh
удаленного сервера создается файл authorized_keys
для ключей RSA и файл authorized_keys2
для ключей DSA. Далее содержимое файлов публичных ключей добавляется в конец указанных файлов.
Предположим, что у нас есть файлы username_rsa.pub
и username_dsa.pub
, содержащие публичные ключи. Скопируем их на удаленный сервер (находясь при этом в директории ~./ssh
) в директорию ~/.ssh
удаленного сервера:
scp username_rsa.pub username@hostname.ru:/username/.ssh
username_rsa.pub 100% 624 0.6KB/s 00:00
scp username_dsa.pub username@hostname.ru:/username/.ssh
username_dsa.pub 100% 624 0.6KB/s 00:00
Далее заходим на удаленный сервер по ssh с вводом пароля, идем в директорию ~/.ssh
и создаем файлы authorized_keys
и authorized_keys2
, если их там еще нет:
touch authorized_keys
touch authorized_keys2
Далее меняем права доступа к этим файлам, чтобы к ним не мог доступиться кто попало:
chmod 600 authorized_keys
chmod 600 authorized_keys2
Далее копируем содержимое файлов публичных ключей в созданные нами файлы authorized_keys
и authorized_keys2
:
cat username_rsa.pub >> authorized_keys
cat username_dsa.pub >> authorized_keys2
Обратите внимание, содержимое файла username_dsa.pub
дописывается в конец файла authorized_keys2
поскольку это ключ DSA! Более файлы публичных ключей нам не нужны, поэтому можем их удалить:
rm username_rsa.pub
rm username_dsa.pub
Почти все готово! Теперь для логина по SSH к удаленному серверу достаточно набрать:
ssh -1 -v username@hostname.ru
или
ssh -2 -v username@hostname.ru
Обратите внимание! Вам достаточно создать только одну пару ключей - RSA или DSA - в зависимости от того, какая версия поддерживается вашим удаленным сервером. Я привел описания процесса для двух пар ключей исключительно для того, чтобы можно было выбрать нужный вариант.
Update: В настоящее время authorized_keys2
считается depricated и не используется. Вместо него используется authorized_keys
.
Использование собственного имени пары ssh-ключей
Однако, если вы проделали все в точности согласно описанной процедуре, залогиниться вам не удастся. Дело в том, что при создании файлов ключей с именем, отличным от имени по умолчанию (id_rsa
, id_dsa
), при попытке логина ssh ищет именно файлы с именами по-умолчанию. Для использования выбранных вами кастомных имен (в нашем примере это username_rsa
и username_dsa
) совместно с rsync, вам необходимо создать на локальной машине в директории ~/.ssh
файл config
(touch config
), в котором задать для вашего удаленного хоста свой IdentityFile
, например:
Host 66.77.44.99
IdentityFile ~/.ssh/username_dsa
При использовании нестандартного порта для SSH (отличного от порта 22), в config
можно задать этот порт.
После этого вам удастся зайти на удаленный хост по SSH с использованием команды:
ssh -2 -v username@66.77.44.99
Настроив доступ к удаленному серверу через SSH с использованием пары шифрованных ключей, мы можем использовать rsync
, на которой базируется команда публикации сайта на удаленный сервер rake deploy
.
Публикуем сайт через Rsync
Все готово для публикации сайта через rsync. Для публикации сайта наберите в терминале (находясь в директории octopress
):
rake generate # Генерируем блог, если еще этого не сделали
rake deploy # Синхронизируем блог через SSH
При выполнении этой команды Ваша директория public
будет синхронизирована с удаленным сервером.
Настройка rsync delete
Если в вашем Rakefile
значение rsync_delete
равно true
, rsync будет создавать полную копию вашей public
директории на удаленном сервере, включая создание, обновление и удаление страниц и заметок. Иными словами, если на локальной машине вы удалили заметку, она исчезнет и на удаленном сервере при следующем rake deploy
.
Если вы не хотите, чтобы какие-либо локальные файлы передавались при деплое на сервер, вам необходимо создать файл rsync-exclude
в корневую директорию вашего проекта, содержимое этого файла может быть таким:
some-file.txt
some-directory/
*.mp4
Использование rsync-exclude
предотвратит передачу на сервер указанных в нем файлов, а также при включенном rsync_delete
удаление на удаленном сервере файлов, перечисленных в rsync-exclude
.
Источники
При написании данной заметки были использованы следующие источники, которые рекомендуются к прочтению для углубленного изучения вопроса, либо при возникновении проблем в процессе использования представленного описания настроек rsync
: