gitosis — программное обеспечение для хостинга Git репозиториев
Установка:
Появился скрипт авто установки пока тестируется
sudo apt-get install python-setuptools git-core -y
mkdir ~/src
cd ~/src
git clone git://github.com/sc0rp1us/gitosis-tools.git
cd gitosis-tools/gitautoinstall
sudo bash main
Дальше следуем инструкциям скрипта
Но вернёмся к статье
Для начала установим необходимые компоненты для запуска gitosis:
- Для debian & ubuntu выполните следующие команды от пользователя root
apt-get update
apt-get upgrade
apt-get install python-setuptools git-core -y
cd ~/src
git clone git://eagain.net/gitosis.git
cd gitosis
python setup.py install
Далее зайдём в учётную запись через которую будем управлять gitosis'om (назовём её gitadmin), выгрузим дистрибутив и установим его
Настройка:
Теперь нам нужно будет создать пользователя который будет владеть хранилищем(имя может быть любым, но я предпочитаю использовать просто git), к тому же на одном сервере может быть несколько аккаунтов владеющих хранилищами, такому аккаунту не нужен пароль, но необходим действующий shell иначе SSH откажется с ним работать:
P.S. вы конечно можете использовать уже существующую учётную запись, но по соображениям безопасности, крайне не рекомендуется этого делать
- Для debian & ubuntu выполните следующую команду
sudo adduser --system --shell /bin/sh --gecos 'git version control' --group \
--disabled-password --home /home/git git
Теперь создаём RSA ключ для беспарольного доступа
ssh-keygen -t rsa
Далее, нам необходимо выполнить команду инициализации, она создаст /home/git/repositories, который будет содержать git репозитории, и /home/git/. gitosis.conf, который является символической ссылкой на сам файл конфигурации /home/git/repositories/gitosis-admin.git/gitosis.conf, и добавит открытый ключ SSH в .ssh/authorized_keys также добавив в него опцию Command= которая ограничит ssh доступ запуском gitosis-serve.
sudo -H -u git gitosis-init < /home/gitadmin/.ssh/id_rsa.pub
ОН КОНЕЧНО ДОЛЖЕН ВСЁ ЭТО ДЕЛАТЬ, НО ДЕЛАЕТ ДАЛЕКО НЕ ВСЕГДА, ПОЭТОМУ БУДУТ ТАНЦИ С БУБНОМ, ГОТОВЬТЕСЬ, ВОЗЬМИТЕ БУБЕН, В ЛЕВУЮ РУКУ, И ЛЁГКИМ ДВИЖЕНИЕМ РУКИ УДАРЬТЕ ПО РАБОЧЕЙ ПОВЕРХНОСТИ БУБНА ПРАВОЙ РУКОЙ… Ж: — )
После чего выполняем следующее действие ( Этот костыль нужен не везде, допустим в Debian всё работает и без него, а пользователям RedHat подобных систем скорее всего пригодится ( Это и есть тот загадочный учёт проблем возникающих при установке, точнее один из них ) )
su - git
cat .ssh/authorized_keys | sed 's#gitosis-serve#/usr/local/bin/gitosis-serve#g' > 0
cat 0 > .ssh/authorized_keys && rm 0
Кстати в некоторых системах могу возникнуть проблемы с PATH путями, поэтому в нижеуказанный файлик нужно будет добавить строчку ". /etc/profile" после опции «set -e»
/home/git/repositories/gitosis-admin.git/hooks/post-update
Затем клонируйте репозитарий
git clone git@SERVER:gitosis-admin.git
и вы получите хранилище SSH ключей /home/gitadmin/gitosis-admin/keydir/ (в который нужно будет сложить публичные ключи клиентов), и /home/gitadmin/gitosis-admin/gitosis.conf (в котором нужно будет прописывать параметры репозитариев)
git clone ssh://git@localhost/gitosis-admin.git
Initialized empty Git repository in /usr/gitosis-admin/.git/
remote: Counting objects: 5, done.
remote: Compressing objects: 100% (4/4), done
remote: Total 5 (delta 0), reused 5 (delta 0)
Receiving objects: 100% (5/5), done
sudo chmod 755 /home/git/repositories/gitosis-admin.git/hooks/post-update
Предупреждение
Сейчас, gitosis использует HOME переменную окружения для записи файов. Если вы используете sudo без опции -H, то git оставит старое значение HOME на месте, и это вызовет проблемы. В дальнейшем это можно будет обойти, но сейчас не забывайте использование -H.
Вы всегда должны редактировать конфигурационный файл через GIT. Файл символическими ссылками на ~/. gitosis.conf на сервере будет перезаписан при отправке изменений в gitosis-admin.git репозитарий.
Измените настройки по своему желанию, и сделайте commit и push.
После отправки на сервер, gitosis сразу же внесёт изменения, и применит их на сервере.
Управление
Добавление новых пользователей:
— Добавить файл keys/USER.pub
— Разрешить группе чтение/запись в репозитарий (или просто разрешите группе All)
Для создания нового хранилища, просто дайте право записи для группы и сделайте push.
Например: предположим, Ваше имя пользователя jdoe, и вы хотите создать хранилище MyProject.
В вашем клоне gitosis-admin правьте gitosis.conf и добавить:
[group myteam]
members = jdoe
writable = myproject
Сейчас нам нужно отправить изменения в gitosis
git add .
git commit -am 'add new project Michael Queally-1 and users'
git push
Теперь нам нужно переинициализировать gitosis
sudo -H -u git gitosis-init < /home/gitadmin/.ssh/id_rsa.pub
su - git
cat .ssh/authorized_keys | sed 's#gitosis-serve#/usr/local/bin/gitosis-serve#g' > 0 && \
cat 0 > .ssh/authorized_keys && rm 0
Создаём репозиторий на локальной машине в учётной записи откуда был взят PUBLIC key
mkdir myproject
cd mypyroject
git init
git remote add MYSERVER git@MYSERVER:myproject.git
touch testfile
git add .
git commit -am 'add test file'
git push MYSERVER master:refs/heads/master
Вот и все. Теперь, если вы добавите других членов в members, они тоже смогут использовать этот репозитарий
Интеграция в redmine:
Создаём директорию для bare репозитариев, и задаём владельца
mkdir -p /srv/redmine/git_repositories/
chown wwwrun:wwwrun /srv/redmine/git_repositories/
Генерируем ssh ключ для пользователя под которым работает web-сервер (в моём случае это apache)
sudo -H -u wwwrun ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/var/lib/wwwrun/.ssh/id_rsa):
Created directory '/var/lib/wwwrun/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /var/lib/wwwrun/.ssh/id_rsa.
Your public key has been saved in /var/lib/wwwrun/.ssh/id_rsa.pub.
The key fingerprint is:
86:58:61:7b:56:5e:55:85:74:4f:12:33:ad:dc:1f:90 wwwrun@vzserv
The key's randomart image is:
+--[ RSA 2048]----+
| o . o**+* |
| o o ..Eo+. |
| .. o. . |
| o .. |
| .. |
| . |
| |
| |
| |
+----------------------+
Добавляем ключ в keydir и задаём на него права
cp /var/lib/wwwrun/.ssh/id_rsa.pub /home/gitadmin/gitosis-admin/keydir/wwwrun@vzserv.pub
chown gitadmin:gitadmin /home/gitadmin/gitosis-admin/keydir/wwwrun@vzserv.pub
Добавляем пользователя в репозиторий
su - gitadmin
cd gitosis-admin/
vim gitosis.conf # Добавляем пользователя в нужный нам репозиторий
git add .
git commit -am 'add redmine'
Created commit 7f94aac: add redmine
2 files changed, 2 insertions(+), 1 deletions(-)
create mode 100644 keydir/wwwrun@vzserv.pub
git push
Counting objects: 8, done.
Compressing objects: 100% (5/5), done.
Writing objects: 100% (5/5), 745 bytes, done.
Total 5 (delta 2), reused 0 (delta 0)
To git@127.0.0.1:gitosis-admin.git
608aa58..7f94aac master -> master
Переинициируем gitosis (после чего он пересоздаст .ssh/authorized_keys но иногда он это делает криво)
sudo -H -u git gitosis-init < /home/gitadmin/.ssh/id_rsa.pub
gitadmin's password:
Reinitialized existing Git repository in /home/git/repositories/gitosis-admin.git/
Reinitialized existing Git repository in /home/git/repositories/gitosis-admin.git/
Делаем пару шаманских действий заменяем в .ssh/authorized_keys gitosis-serve на /usr/local/bin/gitosis-serve
su - git
cat .ssh/authorized_keys | sed 's#gitosis-serve#/usr/local/bin/gitosis-serve#g' > 0 && cat 0 > .ssh/authorized_keys && rm 0
Создаём директорию для bare репозитария и делаем правильный git clone
cd /srv/redmine/git_repositories
sudo -H -u wwwrun git clone --bare git@127.0.0.1:PROJECTNAME.git
cd PROJECTNAME
sudo -H -u wwwrun git --bare remote add origin git@127.0.0.1:PROJECTNAME.git
ls
HEAD branches config description hooks info objects packed-refs refs
Теперь пишем скрипт для самостоятельного обновления локального redmine репозитария, я назвал его gir(gitosis-in-redmine) и сохраняем его скажем в /root/scripts
#!/bin/sh
#The script for pull in bare gitosis repository
#set var
uname=wwwrun #Указываем в переменной имя пользователя от которого запускается наш httpd(в моём случае apache2)
rdir=/srv/redmine/git_repositories #Адрес директории где лежат подготовленные bare репозитории
tmpls=/tmp/tmpls #Указываем адрес temp файла !!! У нас должны быть права на запись !!!
#end var
#start check
if [ `whoami` == $uname ]
then
#start exec
touch $tmpls
ls -1 $rdir > $tmpls
while read LINE; do
cd $rdir/$LINE
git --bare fetch origin :master
echo "update git repository $LINE"
done < $tmpls
rm $tmpls
#end exec
else
echo "Start me from the user $uname"
fi
#end check
И добавляем его в крон
echo "10 * * * * wwwrun /root/scripts/gir" >> /etc/crontab
/etc/init.d/cron restart
Shutting down CRON daemon done
Starting CRON daemon
Теперь актуальность этого репозитария для resmine будет составлять 10 минут
Далее открываем браузер и идём в Redmine (Не забывайте что этот bare репозитарий должен находиться на одном сервере вместе с Redmine'om)
Кликаем следующую последовательность
Projects>projectname>Settings>Repository>
Далее в поле SCM выбираем GIT, а в поле Path to .git directory
прописываем получившийся у нас путь /srv/redmine/git_repositories/PROJECTNAME.git
И собственно всё!