суббота, 27 апреля 2013 г.

Настройка Git для разработки на сервере и клиенте


Сегодня я расскажу как установить Git на сервере и клиенте. На клиентской машине установлена Ubuntu 10.04 LTS, на сервере - Debian 6 x86-64.

Клиентская часть

Итак делаем следующее:

# add-apt-repository ppa:git-core/ppa
# apt-get update
# apt-get install git

Теперь сгенерим SSH-ключ для доступа по нему к Git репозиторию:

$ cd ~ $ ssh-keygen -t rsa

На все вопросы утилиты нажимаем "Enter", ничего вводить более не нужно. Все, связка публичного и приватного ключа сгенерирована. Она сохранена в ~/.ssh. Публичный ключ лежит в ~/.ssh/id_rsa.pub. Его содержимое будет в формате:

ssh-rsa AAAAB3NzaC1yc2EAAAADA.....v8JggJICUvax2T9va5 user@machine

Теперь осталось отредактировать e-mail и имя пользователя, которое будет использовать Git во время коммитов:

$ git config --global user.name "User Name"
$ git config --global user.email email@somemail.com

Настройка Git на клиентской машине закончена. Приступим к настройке сервера.

Серверная часть

# apt-get install git

Создаем юзера git с помощью которого можно будет пользоваться репой:

# adduser git
# su git
$ cd
$ mkdir .ssh

Затем, нужно добавить открытый SSH-ключ некоторого разработчика в файл authorized_keys этого пользователя. Предположим, вы уже получили несколько ключей по электронной почте и сохранили их во временные файлы id_rsa.oleg.pub и id_rsa.max.pub. Их необходимо добавить в файл authorized_keys:

$ cat /tmp/id_rsa.oleg.pub >> ~/.ssh/authorized_keys
$ cat /tmp/id_rsa.max.pub >> ~/.ssh/authorized_keys

или так:

$ echo 'ssh-rsa ....ababbASFf1...... oleg@machine' >> ~/.ssh/authorized_keys
$ echo 'ssh-rsa ....fA78Hdff...... max@machine' >> ~/.ssh/authorized_keys

Теперь создаем Git репозиторий на сервере:

$ cd ~
$ mkdir myproject.git
$ cd myproject.git
$ git --bare init

Почему именно с опцией "--bare"? Согласно документации по Git:
Для того чтобы приступить к установке любого сервера Git, вы должны экспортировать существующий репозиторий в новый “голый” репозиторий, т.е. репозиторий без рабочего каталога. Обычно это несложно сделать. Чтобы склонировать ваш репозиторий и создать новый “голый” репозиторий, выполните команду clone с параметром --bare. По существующему соглашению, каталоги с голыми репозиториями заканчиваются на .git.
Теперь перейдем к тонкой настройке сервера. Подстраиваем ssh демон:

# nano /etc/ssh/sshd_config

Раскомментируем строки:

PubkeyAuthentication yes AuthorizedKeysFile .ssh/authorized_keys

Последним шагом будет более секьюрная настройка на сервере. В качестве дополнительной меры предосторожности можно ограничить возможности пользователя "git" только действиями связанными с Git с помощью ограниченной оболочки git-shell поставляемой вместе с Git. Если вы выставите ее в качестве командного интерпретатора пользователя "git", то этот пользователь не сможет получить доступ к обычной командной оболочке на вашем сервере. Чтобы её использовать, укажите git-shell, вместо bash или csh в качестве командной оболочки пользователя. Для этого вы должны отредактировать файл /etc/passwd:

# nano /etc/passwd

В конце вы должны найти строку, похожую на эту:

git:x:1000:1000::/home/git:/bin/sh

Замените /bin/sh на /usr/bin/git-shell (или запустите:

$ which git-shell

чтобы проверить, куда он установлен). Отредактированная строка должна выглядеть следующим образом:

git:x:1000:1000::/home/git:/usr/bin/git-shell

Теперь, пользователь "git" может использовать SSH соединение только для работы с репозиториями Git, и не может зайти на машину. Вы можете попробовать и увидите, что вход в систему отклонен:

$ ssh git@server_url.com
fatal: What do you think I am? A shell? Connection to server_url.com closed.

В следующей статье я расскажу как настроить оповещатель на e-mail о push'ах.