====== Сервер git ====== //или рассказ о том, как сделать из Keenetic Giga git-сервер (dropbear+gitosis+gitlist+(lighttpd+php)), как настроить клиент под Windows, и прочее, прочее...// ---- **__Введение__** 1) Эксперименты проводились на сервере с уже установленным lighttpd + php (fastcgi) + apc. 2) Клиентская машина - под Windows XP, поэтому примеры соответствующие. Для linux все значительно проще. 3) Использовался HDD под NTFS, серьезных проблем с правами не возникало. Если HDD размечен под ext - в каких-то случаях я мог забыть про необходимость установки прав доступа. 4) При выполнении инструкций обозначения "myserver.ru "и "port" заменяем на свои. 5) На кинетике один пользователь - "root" (не считая "nobody"). Это усложняет задачу. 6) Поскольку нет полноценного ssh, а только dropbear, для создания нескольких пользователей git придется применять разнообразные трюки. ---- **__Работаем по SSH с сервером__** 1) Если не поставили web-сервер на lighttpd и php - ставим (ищем инструкции на этом интернет-ресурсе). Затем ставим git, python, для php нужен php5-mod-ctype и php5-mod-simplexml opkg install git opkg install python opkg install php5-mod-ctype opkg install php5-mod-simplexml Зачем нам еще и web-сервер с php ? Для того, чтобы добавить web-интерфейс к git, облегчив доступ к репозиторию на чтение. 2) Создаем папку для хранения скриптов gitosis и переходим в нее, выполняем cd /media/DISK_A1/system mkdir src cd src 3) Возьмем setuptools для python по ссылке https://pypi.python.org/pypi/setuptools#downloads Нужен файл setuptools-0.6c11-py2.7.egg, положим его в каталог src, запустим на выполнение. 4) Получим исходные коды последней версии gitosis из официального хранилища проекта (оставаясь в каталоге src), перейдём в папку с ними и установим. git clone git://github.com/tv42/gitosis.git cd gitosis python setup.py install Зачем нужен gitosis ? Он: - позволяет делать полноценный многопользовательский доступ, - не требует висящего демона и просто настраивается, - на сервере только один пользователь, - упрощается администрирование git-сервера с клиентской машины (достаточно внести изменения в административном репозитории, выполнить commit + push, после чего все изменения оказываются на сервере). 5) Удалим ненужные файлы и вернемся в домашний каталог rm -rf /media/DISK_A1/system/src cd ~ ---- **__Переходим на клиентскую машину__** 1) Нам понадобится PuTTY, поскольку нужны PAgeant и PLink. Качаем http://the.earth.li/~sgtatham/putty/latest/x86/putty-0.62-installer.exe Запускаем инсталляцию, путь - "C:\PuTTY" (иначе могут быть проблемы), ставим "птичку" на пункте "Associate .PPK files..." 2) Установим git и создадим ключи авторизации (или возьмем имеющиеся; для генерации ключей под Windows PuttyGen не годится). Качаем с http://code.google.com/p/msysgit/downloads/list инсталляционный файл MSysGit: Git-1.8.1.2-preview20130201.exe, устанавливаем в "C:\Git" (иначе будут проблемы). При инсталляции выбираем "Windows Explorer Integration->Simple Comtext Menu". Затем "Run from the Windows command prompt". 3) Глупые инсталляторы не добавляют пути. Проверяем наличие и добавляем: C:\Git\cmd (этот наверняка будет) C:\Git\bin C:\PuTTY Проверяем и добавляем переменную окружения GIT_SSH=C:\PuTTY\plink.exe Если работали, например, из Far, не забываем его перезапустить. 4) Выполняем генерацию ключей. Переходим в каталог C:\Git\bin, запускаем ssh-keygen -t dsa -C root В команде используем тип dsa, поскольку нужна только идентификация пользователей, шифрование не нужно. Отвечаем на вопрос об имени файла, на остальное давим Enter. Создаются два файла (root.pub и root - публичный и приватный ключи соответственно). Эта пара будет использоваться только для root и автоматического доступа по ssh к серверу. Создаем (аналогичным способом) еще пары ключей: - gitadmin (для администратора git) - gituser1 (первый пользователь) - gituser2 (второй пользователь) и т.д. Разумеется, для gitadmin и gituser* можно дать иные имена, но так нам будет в дальнейшем проще. Теперь надо преобразовать приватные ключи в формат, который понимает PAgeant: - запускаем PuTTYGen, - нажимаем "Load", - выбираем "All Files", - разыскиваем и загружаем файл приватного ключа (root, gitadmin, gituser1, gituser2 ...), - в комментарии пишем то же, что указывали для ssh-keygen в ключе "-C", - ставим "птичку" на "SSH-2 DSA" - passphrase игнорируем - нажимаем "Save Private Key" - задаем то же самое имя файла, что загружали, с расширением ".ppk" Все файлы сохраняем на локальном компьютере в надежном месте. Публичные ключи root.pub, gitafmin.pub, gituser1.pub, gituser2.pub копируем на сервер в /media/DISK_A1/system/root (они нам сейчас понадобятся). 5) В каталоге (на клиенте), где лежат ключи, выполняем команду pageant root.ppk Теперь у нас работает агент идентификации, в трее виден значок, можем добавлять ключи и прочее. PAgeant можно запускать при старте Windows с указанием ключа в качестве параметра. 6) С сервером надо соединиться первый раз - чтобы PLink его "запомнил" (такая вот "фича"). plink -P port root@myserver.ru Соглашаемся сохранить ключ в кэше (если спросит), вводим пароль root и после того, как видим приглашение ash, выполняем "exit". То же самое надо проделывать на других компьютерах, которые ещё ничего не знают о Вашем сервере, например, для gituser1: plink -P port gituser1@myserver.ru Также соглашаемся сохранить ключ в кэше (если спросит), на запрос пароля прерываем выполнение по Ctrl/C. Эта операция наверняка понадобится, если Вы передали кому-то ключ (например, gituser1.ppk). ---- **__Идем на сервер__** 1) Инициализируем административный репозиторий, а также ставим публичный ключ gitadmin.pub (обратите внимание - вовсе не root.pub), для чего выполняем cd ~ gitosis-init < gitadmin.pub В результате в /media/DISK_A1/system/root должны образоваться подкаталоги gitosis, repositories, repositories/gitosis-admin.git и др. 2) Вносим исправления в /media/DISK_A1/system/root/repositories/gitosis-admin.git/hooks/post-update Из-за ограничений на environment в dropbear добавляем пути в PATH после команды "set -e": PATH=$PATH:/media/DISK_A1/system/bin:/media/DISK_A1/system/usr/bin:/media/DISK_A1/system/usr/lib/git-core Также надо задать правильные права (из-за особенностей python; для NTFS не обязательно) chmod 755 /media/DISK_A1/system/root/repositories/gitosis-admin.git/hooks/post-update 3) Поставим gitlist, чтобы можно было работать с репозиторием через web-интерфейс (а конкретно - получать файлы проектов). Скачаем с gitlist.org (я качал версию 0.3 по ссылке https://s3.amazonaws.com/gitlist/gitlist-0.3.tar.gz). Установим в www/gitlist (абсолютный путь у меня /media/DISK_A1/system/www/gitlist) и изменим config.ini под свои пути: client = '/media/DISK_A1/system/usr/bin/git' ; Your git executable path repositories = '/media/DISK_A1/system/root/repositories/' ; Path to your repositories 4) Добавим в конфигурацию /lighttpd.conf строки url.rewrite-once = ( "^/gitlist/web/.+" => "$0", "^/gitlist/favicon\.ico$" => "$0", "^/gitlist(/[^\?]*)(\?.*)?" => "/gitlist/index.php$1$2" ) Также укажем в php.ini свою таймзону [Date] date.timezone = Europe/Kiev Узнать как пишется Ваша таймзона можно здесь http://php.net/manual/en/timezones.php 5) Создадим хранилища c именами "project1", "project2". Перейдем в /root/repositories. Создадим каталог project1.git, перейдем в него и выполним команду создания пустого репозитория cd ~/repositories mkdir project1.git cd project1.git git --bare init Затем выполним то же самое для project2.git. Лично я рекомендую создавать новые репозитории на сервере именно так. 6) Добавим пользователей для dropbear. gitosis-admin считает, что ключи хранятся в ~/.ssh/authorized_keys, но dropbear хранит ключи в /etc/dropbear/authorized_keys (здесь и далее перед /etc, /root и т.п. в тексте не буду приводить полные абсолютные пути). Поэтому те ключи, которые будет добавлять gitosis-admin, придется вручную добавлять в /etc/dropbear/authorized_keys (автоматизировать эту процедуру будем позже). Начнем с ключа root.pub. Если нет файла /etc/dropbear/authorized_keys - создаем. Добавляем в одну строку содержимое ключа root.pub (перевод строки после ключа обязателен), содержимое файла будет примерно такое ssh-dss <значение ключа> root Потом добавляем gitadmin.pub, gituser1.pub, gituser2.pub и вносим необходимые исправления для gitosis: command="/media/DISK_A1/system/etc/dropbear/dropbear-gitosis gitadmin" ssh-dss <значение ключа> gitadmin command="/media/DISK_A1/system/etc/dropbear/dropbear-gitosis gituser1" ssh-dss <значение ключа> gituser1 command="/media/DISK_A1/system/etc/dropbear/dropbear-gitosis gituser2" ssh-dss <значение ключа> gituser2 Теперь создадим файл "dropbear-gitosis" со следующим содержимым #!/bin/sh MOUNT="/media/DISK_A1/system" PATH=$PATH:$MOUNT/bin:$MOUNT/sbin:$MOUNT/usr/bin:$MOUNT/usr/sbin:$MOUNT/usr/lib/git-core gitosis-serve $1 $2 $3 $4 $5 и дадим ему права на выполнение (для NTFS не требуется) Если диск размечен в ext - убеждаемся, что права на /etc/dropbear и файл authorized_keys - 600. Если нет - ставим chmod 600 /media/DISK_A1/system/etc/dropbear chmod 600 /media/DISK_A1/system/etc/dropbear/authorized_keys 7) Поиграем с правами нужных dropbear каталогов и файлов. Это необходимо для NTFS, а также для дальнейшей автоматизации работы связки dropbear и gitosis, поэтому делаем в любом случае. Завершим работу dropbear /media/DISK_A1/system/etc/init.d/S10dropbear stop иначе есть риск потерять изменения в файле ! Дальнейшие изменения делаем по ftp с клиента. ---- **__Перейдем на клиентскую машину__** 1) Продолжение игр с правами и подготовка к автоматизации работы связки dropbear-gitosis. dropbear требует права 600 для /etc/dropbear и authorized_keys в нем... Поскольку для NTFS права на отдельные каталоги и файлы выставить невозможно, применим трюк. Сначала переименуем /etc/dropbear в /etc/dropbear.init Затем внесем изменения в /etc/init.d/S10dropbear, добавив после start() { следующие команды cp -r -f $MOUNT/etc/dropbear.init /tmp/dropbear chmod 600 /tmp/dropbear chmod 600 /tmp/dropbear/authorized_keys ln -s /tmp/dropbear $MOUNT/etc/dropbear и после stop() { добавим rm $MOUNT/etc/dropbear rm -r /tmp/dropbear а также увеличим размер буфера Dropbear добавим ключ -W 819200 $DROPBEAR -d $DSS -r $RSA -W 819200 после чего сохраним файл и **перезапустим роутер**. Ждем, пока произойдет загрузка. 2) Проверим работу с сервером по ssh. Проверим, запущен ли PAgeant и с каким ключом (должен быть только root.ppk). Выполним ssh -p port root@myserver.ru "echo $PATH" Это желательно выполнить при первом совединении с сервером, ответив ответить на вопросы. Такая "фича" ssh - он должен "запомнить" сервер. 3) Убедимся, что можем попасть на сервер через ssh, используя PuTTY. Запускаем PuTTY, настраиваем: - Host Name (or IP address) - myserver.ru или IP - Port - порт - Window->Translation->Remote character set - UTF-8 - в окошке "Saved Sessions" задаем имя нашей сессии сохраняем ее - нажимаем "Open" Если все правильно сделали - должны войти только по логину root, без необходимости ввода пароля. Если это не так - возможно, в S10dropbear потребуется добавить ключик запуска dropbear "-g" (информацию ищите на этом ресурсе). Если все нормально - закрываем сессию. Теперь в PAgeant удаляем ключ root.ppk, добавляем gitadmin.ppk. Снова запускаем PuTTY и открываем сессию (уже от gitadmin). Если все правильно сделали - войти не сможем. Увидим сообщение об ошибке и окно сессии закроется. 4) Выполним команды глобальных настроек git (вместо "My Name" и "myemail@mailserver.ru" подставьте свое): git config --global user.name "My Name" git config --global user.email "myemail@mailserver.ru" В том числе определим режим операций, выполнив команду git config --global push.default simple 5) Клонируем на клиента gitosis-admin.git Создадим каталог, где будут располагаться репозитории (в том числе административный gitosis-admin), перейдем в него и выполним команду git clone ssh://root@myserver.ru:port/gitosis-admin.git Обратите внимание: пользователь указан root, а ключ (загружен в PAgeant) используется от gitadmin. Если при выполнении команды у Вас спросят запросит пароль root, значит, что-то не так сделано с ключами, PLink, PAgeant, ssh, dropbear или неизвестно с чем)) Все перепроверяем. После клонирования, перейдя в каталог административного репозитория gitosis-admin, обнаружим там файл gitosis.conf, подкаталог keydir с файлом ключей, и скрытый подкаталог .git 6) Вносим изменения в конфигурацию, см. файл gitosis.conf [gitosis] loglevel = DEBUG [group gitosis-admin] ... Добавляем пользователей (дописываем в конце файла), например таких: [group users1] members = gitadmin gituser1 writable = project1 [group users2] members = gitadmin gituser1 gituser2 writable = project2 То есть создаем две группы пользователей. Над проектом project1 работают gitadmin и gituser1, а над project2 - gitadmin, gituser1 и gituser2. В строке members указывается какие пользователи будут иметь доступ к хранилищу (project1, project2) на чтение (readonly) и запись (writable). Название группы (users) нигде не используется, так что может быть абсолютно любым (но уникальным в этом файле). Теперь ключи gituser1.pub, gituser2.pub переписываем в подкаталог keydir административного проекта (там уже есть gitadmin.pub - он взят с сервера). Переходим в gitosis-admin и сообщаем git о добавлении файлов git add . Если увидите сообщение "fatal: LF would be replaced by CRLF in ", то это из-за автоматического проеобразования. Его можно отключить (и заодно Symlinks) в глобальных настройках git config --global core.autocrlf false git config --global core.symlinks false Применяем изменения git commit -a -m "Allow gitadmin write access to test" git push Пути, порт и др. указывать не надо, git всё запомнил. Если на сервере взглянем на содержимое файла /root/.ssh/authorized_keys, то обнаружим публичные ключи новых пользователей. gitosis.conf тоже изменится. 7) Создадим на клиентской машине репозиторий project1 - в том же каталоге, где располагается gitosis-admin, то есть создадим каталог project1 на том же уровне. Инициализируем новый репозиторий git init В каталоге project1, создадим какой-то файлик командами echo start project1 > readme git add . И затем git commit -a -m "start test project1" git push --set-upstream ssh://root@myserver.ru:port/project1.git master Затем внесем любые изменения в readme project1, выполним git commit -a -m "start test 2 project1" git push Обращаю внимание - git все запомнил, никаких лишних опций теперь использовать не надо. Повторим операции для project2. 8) Проверка и настройка gitlist Проверям работоспособность gitlist, набрав в браузере url http://myserver.ru/gitlist/ или (на случай, если не проводили настройки lighttpd или ошиблись в них) http://myserver.ru/gitlist/index.php Если все правильно сделали, попадем на стартовую страничку gitlist с проектом gitosis-admin.git, project1.git и project2.git. Посмотрев Commits для gitosis-admin.git, project1.git и project2.git, увидим, что делали. Однако, мы доступились через web-интерфейс к gitosis-admin.git, но зачем нам открывать административный репозиторий ? Закроем, добавив в config.ini (по ftp или перейдя на сервер) после комментария ; You can hide repositories from GitList, just copy this for each repository you want to hide строку hidden[] = '/media/DISK_A1/system/root/repositories/gitosis-admin.git' После этого административный репозиторий будет скрыт в gitlist. ---- **__Перейдем на сервер__** 1) Теперь настала пора автоматизировать работу связки dropbear-gitosis. Сначала удалим из файла /etc/dropbear.init/authorized_keys все ключи, не имеющие отношения к root. Если Вы не отступали от инструкций, в файле должна остаться только одна первая строчка. Теперь заменяем содержимое файла /etc/dropbear/dropbear-gitosis на нижеприведенное #!/bin/sh MOUNT="/media/DISK_A1/system" PATH=$PATH:$MOUNT/bin:$MOUNT/sbin:$MOUNT/usr/bin:$MOUNT/usr/sbin:$MOUNT/usr/libexec/git-core if [ $# -ne 0 ] then gitosis-serve $1 $2 $3 $4 $5 fi KEYSFILE="authorized_keys" KEYSDBINIT=$MOUNT/etc/dropbear.init/$KEYSFILE KEYSGITINIT=$MOUNT"/root/.ssh/"$KEYSFILE KEYSDB=/tmp/dropbear/$KEYSFILE KEYSDBTMP=$(mktemp) echo '### autogenerated by dropbear-gitosis, DO NOT EDIT' > $KEYSDBTMP cat $KEYSDBINIT >> $KEYSDBTMP echo '### strings below regenerated from autogenerated gitosis authorized_key file' >> $KEYSDBTMP cat $KEYSGITINIT >> $KEYSDBTMP sed -i 's/gitosis-serve/\/tmp\/dropbear\/dropbear-gitosis/g' $KEYSDBTMP sed -i 's/,no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty//g' $KEYSDBTMP mv $KEYSDBTMP $KEYSDB chmod 600 $KEYSDB 2) Теперь снова надо внести изменения в /etc/init.d/S10dropbear, для этого завершим работу dropbear /media/DISK_A1/system/etc/init.d/S10dropbear stop ---- **__Перейдем на клиентскую машину__** 1) Итак, окончательные изменения в /etc/init.d/S10dropbear вносим по ftp, добавив после команды (которую ранее добавляли) ln -s /tmp/dropbear $MOUNT/etc/dropbear еще одну команду $MOUNT/etc/dropbear.init/dropbear-gitosis Сохраним файл и **перезапустим роутер**. Ждем, пока произойдет загрузка. Проверяем все с "чистого листа" )) Если все работает - см. ниже: ---- **__Известные проблемы и их решение__** 1) Попытка создания проектов с большими файлами или с большим количеством файлов вызывает сетевую ошибку FATAL ERROR: Network error: Software caused connection abort fatal: The remote hang up unexpectedly fatal: recursion detected in die handler При этом в журнале есть записи такого вида 6 апр 13:01:44 dropbear[24035] Exit (root): Received data after eof Причина в малом буфере Dropbear. Увеличим размер буфера добавим ключ -W 819200 в скрипте запуска S10dropbear $DROPBEAR -d $DSS -r $RSA -W 819200 2) Если Вы используете gitosis, не устанавливайте python-openssl из-за проявления Segmentation Fault в .../lib/python2.7/lib-dynload/_ssl.so. ---- **__Выводы__** 1) На кинетике создан (почти) полноценный многопользовательский git-сервер с возможностью удаленного администрирования (gitosis), а также web-интерфейсом для чтения проектов (gitlist). 2) Под логином root возможность работы с git-сервером отключена, но git (и gitosis) на сервере работают из-под root. 3) Проблемы безопасности (возможность работы пользователей git-сервера под root) решены при организации работы связки dropbear-gitosis. **//Успешных коммитов !//**