Записки программиста, обо всем и ни о чем. Но, наверное, больше профессионального.

2012-06-06

Remote Git repository (HTTP/HTTPS)

Захотелось мне сделать сервер с репозиториями Git, и чтобы работать с ними через HTTP/HTTPS. Как сказал бы Бендер - Well, I gonna go build my own Git server with blackjack and hookers.

Пацан сказал — пацан сделал. Даю отчет о создании HTTP(S) Git сервера on Debian Wheezy.

Сначала надо поднять сервер Git (Gitolite)

это довольно просто
Все инструкции подробно расписаны, вот только вместо утягивания гитолайт с гитхаба я поставил его из пакетов. Кому лень читать инструкции, вот лог действий:

на клиенте от имени valik
  ssh-keygen
  ssh-copy-id '-p 22 -i ~/.ssh/id_rsa valik@scmserv'
  ssh -p 22 -i ~/.ssh/id_rsa valik@scmserv
  cp ~/.ssh/authorized_keys /tmp/valik.pub
  exit
  sudo aptitude install git

на сервере от рута
  useradd -d /home/git/ -m git
  passwd git
  aptitude install gitolite
  chmod a+r /tmp/valik.pub
  su -l git
  gl-setup -q /tmp/valik.pub

обратно на клиенте
  git clone ssh://git@scmserv/gitolite-admin
  cd gitolite-admin/
  nano conf/gitolite.conf # добавил репозиторий test_td
  git add .
  git commit -m "new repo"
  git commit --amend --author='valik <vasnake@gmail.com>'
  git push
  ssh git@scmserv info

В итоге на сервере scmserv есть репозиторий test_td с которым уже можно работать через сеть, по каналу ssh.

Теперь клиент для винды

Тоже ничего сложного

Если вышеупомянутый при установке сервера ключ ssh зацепить за сессию ssh в PuTTY, проблем не будет. А для этого надо сконвертировать ключ SSH в ключ PuTTY при помощи тулзы puttygen.exe, скормив ей файл id_rsa

Еще я споткнулся об формирование урла к репозиторию. Правильный URL, на текущий момент, выглядит так
ssh://git@scmserv/test_td
хотя и есть соблазн написать
ssh://valik@scmserv/test_td.git
но его надо побороть, ибо имя пользователя гитолайт возьмет из ключа, который возьмется из сессии путти, а добавка .git тут в принципе не нужна.

В ЧерепахнутомГите (tortoisegit) все операции выполняются по правой кнопе мыши. Наигравшись, можно приступать к следующему шагу, благодяря которому можно и не заморачиваться с ключами для PuTTY, ибо далее мы получим доступ к хранилищу (можно я так буду называть repository?) через HTTP(S).

Git repository which can be pushed into and pulled from over HTTP

Оказывается, все что нужно, это обеспечить доступ к папке с хранилищем через WebDAV.
По сцылкам приведены инструкции, которыми я пользовался. Как всегда, жизнь потребовала корректив. Вот ниже и зафиксирована моя персональная версия инструкции по созданию HTTP(s) канала к Git repository.

Apache web server, SSL


Понятно, первым делом
aptitude install apache2 openssl

Потом надо озаботится ключом и сертификатом для SSL
root@scmserv:~# mkdir /etc/ssl/localcerts
root@scmserv:~# openssl req -new -x509 -days 3650 -nodes -out /etc/ssl/localcerts/apache.pem -keyout /etc/ssl/localcerts/apache.key
 Country Name (2 letter code) [AU]:RU
 State or Province Name (full name) [Some-State]:Moscow
 Locality Name (eg, city) []:Moscow
 Organization Name (eg, company) [Internet Widgits Pty Ltd]:ALGIS LLC
 Organizational Unit Name (eg, section) []:IT dept
 Common Name (e.g. server FQDN or YOUR name) []:scmserv.algis.com
 Email Address []:valik@algis.com
root@scmserv:~# l /etc/ssl/localcerts/apache*
-rw------- 1 root root  916 Jun  5 17:22 /etc/ssl/localcerts/apache.key
-rw------- 1 root root 1086 Jun  5 17:22 /etc/ssl/localcerts/apache.pem
Получили самоподписанный сертификат.

chmod 600 /etc/ssl/localcerts/apache*
chown www-data /etc/ssl/localcerts/apache*
a2enmod ssl

Конфиги сайта
nano /etc/apache2/sites-available/default
 <VirtualHost *:80>
   ServerAdmin webmaster@localhost
   DocumentRoot /var/www
   <Directory />
     Options FollowSymLinks
     AllowOverride None
   </Directory>
   <Directory /var/www/>
     Options Indexes FollowSymLinks MultiViews
     AllowOverride None
     Order allow,deny
     allow from all
   </Directory>
   ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
   <Directory "/usr/lib/cgi-bin">
     AllowOverride None
     Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
     Order allow,deny
     Allow from all
   </Directory>
   ErrorLog ${APACHE_LOG_DIR}/error.log
   LogLevel warn
   CustomLog ${APACHE_LOG_DIR}/access.log combined
 </VirtualHost>

nano /etc/apache2/sites-available/default-ssl
 <IfModule mod_ssl.c>
 <VirtualHost _default_:443>
   ServerAdmin webmaster@localhost
   DocumentRoot /var/www
   <Directory />
     Options FollowSymLinks
     AllowOverride None
   </Directory>
   <Directory /var/www/>
     Options Indexes FollowSymLinks MultiViews
     AllowOverride None
     Order allow,deny
     allow from all
   </Directory>
   ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
   <Directory "/usr/lib/cgi-bin">
     AllowOverride None
     Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
     Order allow,deny
     Allow from all
   </Directory>
   ErrorLog ${APACHE_LOG_DIR}/error.log
   LogLevel warn
   CustomLog ${APACHE_LOG_DIR}/ssl_access.log combined
   SSLEngine on
   SSLCertificateFile    /etc/ssl/localcerts/apache.pem
   SSLCertificateKeyFile /etc/ssl/localcerts/apache.key
   <FilesMatch "\.(cgi|shtml|phtml|php)$">
     SSLOptions +StdEnvVars
   </FilesMatch>
   <Directory /usr/lib/cgi-bin>
     SSLOptions +StdEnvVars
   </Directory>
   BrowserMatch "MSIE [2-6]" \
     nokeepalive ssl-unclean-shutdown \
     downgrade-1.0 force-response-1.0
   BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown
 </VirtualHost>
 </IfModule>

nano /etc/apache2/ports.conf
 NameVirtualHost *:80
 Listen 80
 <IfModule mod_ssl.c>
  Listen 443
 </IfModule>
 <IfModule mod_gnutls.c>
  Listen 443
 </IfModule>

a2ensite default
a2ensite default-ssl
service apache2 stop
service apache2 start
Получили рабочий HTTP(S) сервер.

Web Git repository

Теперь я хочу видеть по урл
http://scmserv.algis.com/test_td.git/
свое хранилище
/home/git/repositories/test_td.git

для чего я его залинковал в подпапку вебсервера, ну и права доступа к файлам и каталогам пришлось докручивать
root@scmserv:~# pushd /home/git/repositories/test_td.git
chown -R www-data.git .
chmod -R ug+rw .
chmod -R a+r /home/git
chmod a+x /home/git
find /home/git -type d -exec chmod a+x {} \;
ln -s /home/git/repositories/test_td.git /var/www/test_td.git
Теперь в браузере я могу видеть содержимое хранилища.

DAV

Последние штрихи, прикручивание DAV к апачевскому конфигу
a2enmod dav*
nano /etc/apache2/conf.d/git.conf
 <Location /test_td.git>
  DAV on
  Allow from all
  Order allow,deny
  Require valid-user
  AuthType Basic
  AuthName "Git test_td repo"
  AuthUserFile /etc/apache2/git.passwd
  AuthGroupFile /etc/apache2/git.groups
 </Location>

htpasswd -c /etc/apache2/git.passwd valik
nano /etc/apache2/git.groups
 writers: valik git
 readers: guest
service apache2 restart
Теперь вебсервер обслуживает хранилище Git через протокол DAV. В общем, готово.
Правда, пришлось еще кое-что подкрутить
git@scmserv:/home/git/repositories/test_td.git$ git update-server-info
mv hooks/post-update.sample hooks/post-update
chmod +x hooks/post-update
Думаю, из этих трех команд две последние — лишние. Но не мешают и ладно.

На клиенте

На клиентской стороне полезно и даже, может, необходимо отконфигурять пару параметров.
Командой
$ git config remote.httptestrepo.url http://valik@scmserv.algis.com/test_td.git
В локальный реп гита вносится такая настройка (в файле .git\config)
[remote "httptestrepo"]
 url = http://valik@scmserv.algis.com/test_td.git
После чего можно ссылаться на сетевое хранилище вот так
$ git push httptestrepo master

Если же хочется задействовать https, то помимо задания секурного урл
$ git config remote.httptestrepo.url https://valik@scmserv.algis.com/test_td.git
придется еще отключить проверку сертификатов (у нас самоподписанный, чоужтам)
$ git config http.sslVerify false
Что дает в файле конфига такое
[http]
 sslVerify = false

Вот теперь можно пушить и пуллить из сетевого репозитория Git, по HTTP(S) каналу.

Комментариев нет:

Отправить комментарий

Архив блога

Ярлыки

linux (241) python (191) citation (186) web-develop (170) gov.ru (159) video (124) бытовуха (115) sysadm (100) GIS (97) Zope(Plone) (88) бурчалки (84) Book (83) programming (82) грабли (77) Fun (76) development (73) windsurfing (72) Microsoft (64) hiload (62) internet provider (57) opensource (57) security (57) опыт (55) movie (52) Wisdom (51) ML (47) driving (45) hardware (45) language (45) money (42) JS (41) curse (40) bigdata (39) DBMS (38) ArcGIS (34) history (31) PDA (30) howto (30) holyday (29) Google (27) Oracle (27) tourism (27) virtbox (27) health (26) vacation (24) AI (23) Autodesk (23) SQL (23) Java (22) humor (22) knowledge (22) translate (20) CSS (19) cheatsheet (19) hack (19) Apache (16) Manager (15) web-browser (15) Никонов (15) Klaipeda (14) functional programming (14) happiness (14) music (14) todo (14) PHP (13) course (13) scala (13) weapon (13) HTTP. Apache (12) SSH (12) frameworks (12) hero (12) im (12) settings (12) HTML (11) SciTE (11) USA (11) crypto (11) game (11) map (11) HTTPD (9) ODF (9) Photo (9) купи/продай (9) benchmark (8) documentation (8) 3D (7) CS (7) DNS (7) NoSQL (7) cloud (7) django (7) gun (7) matroska (7) telephony (7) Microsoft Office (6) VCS (6) bluetooth (6) pidgin (6) proxy (6) Donald Knuth (5) ETL (5) NVIDIA (5) Palanga (5) REST (5) bash (5) flash (5) keyboard (5) price (5) samba (5) CGI (4) LISP (4) RoR (4) cache (4) car (4) display (4) holywar (4) nginx (4) pistol (4) spark (4) xml (4) Лебедев (4) IDE (3) IE8 (3) J2EE (3) NTFS (3) RDP (3) holiday (3) mount (3) Гоблин (3) кухня (3) урюк (3) AMQP (2) ERP (2) IE7 (2) NAS (2) Naudoc (2) PDF (2) address (2) air (2) british (2) coffee (2) fitness (2) font (2) ftp (2) fuckup (2) messaging (2) notify (2) sharepoint (2) ssl/tls (2) stardict (2) tests (2) tunnel (2) udev (2) APT (1) CRUD (1) Canyonlands (1) Cyprus (1) DVDShrink (1) Jabber (1) K9Copy (1) Matlab (1) Portugal (1) VBA (1) WD My Book (1) autoit (1) bike (1) cannabis (1) chat (1) concurrent (1) dbf (1) ext4 (1) idioten (1) join (1) krusader (1) license (1) life (1) migration (1) mindmap (1) navitel (1) pneumatic weapon (1) quiz (1) regexp (1) robot (1) science (1) serialization (1) spatial (1) tie (1) vim (1) Науру (1) крысы (1) налоги (1) пианино (1)