天天看點

debian下使用gitosis+gitweb搭建SSH認證的git伺服器

       搭建完成Git伺服器後,需要使用兩台機器進行測試,一台機器作為伺服器端server,一台伺服器作為用戶端client。整個系統,需要三個計算機賬戶,這裡假設server端的賬戶名為git,client端需要一個管理者gitadmin,一個開發者gituser。這裡的環境,使用兩台處于同一區域網路内的兩台機器作為server以及client,其中server端系統為debian 6,client端為fedora 16。

1    建立server端賬戶git,用于安裝git相關的服務。

sudo useradd -m git #添加git賬戶

sudo passwd git                #添加git密碼      

       添加完賬戶之後,如果/etc/default/useradd設定合理的話,系統會自動生成相應的宿主目錄。如果沒有的話,而且想把托管項目放在宿主目錄下的話,則需要手動添加。

su git                                #切到建立的git賬戶

sudo mkdir /home/git    #建立宿主目錄

sudo chown git:git /home/git #修改相應的uid及gid      

       debian下建立git賬戶之後,切到git下,相應的bash以及sudo均沒有配置,需要重新配置,這裡為了友善,直接将之前已經配置好的其他使用者的配置檔案拷貝過來。

su root

visudo      #配置sudo,将git ALL=(ALL)ALL添加到裡面,儲存後生效。

su git       #切回git賬戶

sudo cp /home/XXX/.bashrc  /home/git/

sudo cp /home/XXX/.profile  /home/git/    #XXX為你的其他的宿主目錄      

       這樣,server端的git賬戶就建立完畢。client端的管理賬戶admin以及user同理可以建立。

2   server端安裝git及SSH相關服務

  2.1 安裝git并初始化

sudo apt-get install git-core        #安裝git,安裝成功之後,配置git

git config --global user.name "yourname"

git config --global user.email "yourname@yourmail"   #配置git      

  2.2安裝ssh服務

     sudo apt-get install openssh-server openssh-client  

  2.3配置SSH

          安裝完成之後,修改ssh配置檔案/etc/ssh/sshd_config  

Port 22 # 修改成你想要的登陸端口,如2222

   PermitRootLogin no # 禁止root使用者登陸

   StrictModes yes # 檢查密鑰的使用者和權限是否正确,預設打開的

   RSAAuthentication yes # 啟用 RSA 認證

   PubkeyAuthentication yes # 啟用公鑰認證

   PasswordAuthentication no # 禁止密碼認證,預設是打開的

   ServerKeyBits 1024 # 修改後變為此狀态,将ServerKey強度改為1024比特

   PermitEmptyPasswords no # 修改後變為此狀态,禁止空密碼進行登入      

    修改完成之後,重新開機SSH服務:

  sudo /etc/init.d/ssh restart      

3    client端建立管理者賬戶并安裝SSH,生成認證SSH鑰匙對。

sudo useradd -m gitadmin
sudo passwd gitadmin
su gitadmin
cd ~
sudo yum install ssh     #配置完git管理者賬戶并安裝完SSH之後,需要生成管理者gitadmin的SSH鑰匙對。
ssh-keygen -t rsa #注意配置賬戶的權限,使其對目前目錄具有讀寫權限。安裝過程直接敲寫回車即可。      

預設的安裝生成的SSH公鑰,存在宿主目錄/home/gitadmin/.ssh/下面,其中id_rsa.pub作為公鑰,留做備用。開發者賬戶gituser同樣操作。建議将相應公鑰重命名,以免弄混。

sudo cp.ssh/id_rsa.pub ~/temp/
sudo mv ~/temp/id_rsa.pub gitadmin.pub      

4   server 端安裝gitosis

      gitosis是管理git伺服器的工具,相比手動管理,使用起來更加友善。

su git
cd ~
mkdir gitosis_setup
cd gitosis_setup
git clone https://github.com/res0nat0r/gitosis.git
cd gitosis
sudo python setup.py install      #安裝gitosis的過程需要使用python工具包,如果安裝失敗,需要安裝python-setuptools
sudo apt-get install python-setuptools      

5   server端配置并運作gitosis

  5.1将第3步中的client端的管理者gitadmin的公鑰拷貝或者上傳到server端。

  5.2初始化gitosis,初始的過程中需要添加一個管理者。

               假設gitadmin的公鑰位于宿主目錄~中。

su git
cd ~
sudo chmod 777 gitadmin.pub
sudo -H -u git gitosis-init < gitadmin.git    #初始化gitosis      

       此時,會在/home/git目錄下生成一個空倉庫repositories/gitosis-admin.git,次倉庫的目的是管理者gitadmin用來管理git server的,不是托管項目的git。相應的配置檔案位于repositories/gitosis-admin.git/gitosis.conf。

       同時,如果想要别人能夠clone gitosis-admin.git ,需要執行一下操作:

  sudo chmod 755 /home/git/repositories/gitosis-admin.git/hooks/post-update

6     server端安裝并配置gitweb(需要安裝apache2)

  6.1安裝gitweb  

sudo apt-get install gitweb apache2
sudo a2enmod rewrite   #允許rewrite子產品,需要用到。      

  這裡,我們由于有了一個管理者的空倉庫,是以以此作為例子。将/home/git/repositories作為server端項目托管根目錄。編輯配置檔案

/etc/gitweb.conf
sudo vim /etc/gitweb.conf      

  然後修改為如下形式:

$projectroot = "/home/git/repositories";
$git_temp = "/tmp";
#$home_link = $my_uri || "/";
$home_text = "indextext.html";
$projects_list = $projectroot;
$stylesheet = "/gitweb.css";
$logo = "/git-logo.png";
$favicon = "/git-favicon.png";
# enable human readable URLs
$feature{'pathinfo'}{'default'} = [1];      

  6.2然後,配置apache2,建立一下新的虛拟host檔案gitweb。

  sudo vim /etc/apache2/sites-available/gitweb      

  将建立的gitweb檔案内容修改為:

<VirtualHost *>
ServerName git.mydomain.com
ServerAlias git

DocumentRoot /home/git/repositories
SetEnv GITWEB_CONFIG /etc/gitweb.conf

RewriteEngine on
RewriteRule ^/$ /gitweb [PT]
RewriteRule ^/(.*.git/(?!/?(HEAD|info|objects|refs)).*)?$ /gitweb%{REQUEST_URI} [L,PT]

# Aliases
ScriptAlias /gitweb /usr/lib/cgi-bin/gitweb.cgi
Alias /gitweb.css /usr/share/gitweb/gitweb.css
Alias /git-logo.png /usr/share/gitweb/git-logo.png
Alias /git-favicon.png /usr/share/gitweb/git-favicon.png

# Logfiles
ErrorLog /var/log/apache2/gitweb.error.log
CustomLog /var/log/apache2/gitweb.access.log combined
</VirtualHost>      
  sudo a2ensite gitweb         #使其生效。      

  上述配置檔案中開了RewriteEngine on,需要配置一下apache2。修改/etc/apache2/httpd.conf檔案。添加

  LoadModule rewrite module /usr/lib/apache2/modules/mod rewrite.so      

  然後,儲存後,從其apache2的服務。

  /etc/init.d/apache2 restart      

7    client端管理者gitadmin管理gitosis,以上述倉庫為例。

  7.1 首先,管理者從git伺服器上clone下生成的目标倉庫。

su gitadmin
cd ~
mkdir gitproject
cd gitproject
git clone [email protected]:gitosis-admin.git   #此處是同一區域網路内的兩台機器,直接輸入server端的ip位址即可。主目錄前面已經設為repositories/
cd gitosis-admin/
ls -al
總用量 24
drwxr-xr-x 5 sshtest sshtest 4096  3月 30 00:51 .
drwxrwxr-x 3 sshtest sshtest 4096  3月 30 00:04 ..
drwxrwxr-x 8 sshtest sshtest 4096  3月 30 00:53 .git
-rw-rw-r-- 1 sshtest sshtest  205  3月 30 00:51 gitosis.conf
drwxrwxr-x 2 sshtest sshtest 4096  3月 30 00:51 keydir      

       可以看到,目錄實際上也是一個git項目,這正式gitosis的有意思的地方,利用git管理git伺服器。除了.git以外,裡面檔案有一個配置檔案conf,一個目錄keydir。

      gitosis.conf正是管理者配置git伺服器的配置檔案,用于配置使用者和權限。keydir目錄存放的是所有組成員user的公鑰。打開配置檔案conf

vim gitosis.conf
[gitosis]
[group gitosis-admin]
writable = gitosis-admin
members = [email protected]      

   可見此時,git伺服器上隻有一個管理者[email protected]。其擁有讀寫權限。

  7.2 管理者修改配置檔案

          這一步,跟大多數的git的管理是一樣的,管理者修改完之後,commit,然後push到伺服器端。這裡建立一個新項目倉庫為例。

vim gitosis.conf
[gitosis]
gitweb=yes
[group gitosis-admin]
writable = gitosis-admin
members = [email protected]
[group apps]
writable=apps
[email protected] [email protected]      

這裡,gitweb=yes啟用對gitweb的支援。group apps定義了一個新的空倉庫apps,同時授予了gitadmin以及user兩個使用者讀寫權限。注意,此時user的公鑰由于沒有添加,是以無法連接配接伺服器。修改完儲存之後,管理者gitadmin執行:

git commit -am "created a new apps repo"
git push      

push到服務端之後,立即生效。

  7.3 添加其他成員的公鑰

su gitadmin
cd ~/gitproject/gitosis-admin/
sudo cp user.pub key keydir/
git add keydir/usr.pub
git commit -am "granted a new user rights to apps"
git push      

  7.4 client端user連接配接gitserver

su user
cd ~/gitproject
git remote add origin git@YOUR_SERVER:apps.git    #建立映射關系,或者直接如下,clone自動建立master的映射關系
git clone git@YOUR_SERVER:apps.git  #之後就可以進行正常的git操作。最後push到伺服器
git push origin master:refs/heads/master      

  搞定,現在,確定基本服務都開啟之後,在server端打開  http://localhost/cgi-bin/gitweb.cgi,client端打開相應的http://servername/cgi-bin/gitweb.cgi。看看效果吧:

8 參考閱讀

http://wiki.ubuntu.org.cn/index.php?title=Git%E6%9C%8D%E5%8A%A1%E5%99%A8Gitosis%E5%AE%89%E8%A3%85%E8%AE%BE%E7%BD%AE&variant=zh-hans

http://serverfault.com/questions/72732/how-to-set-up-gitweb

http://blog.csdn.net/wirror800/article/details/5189564