使用阿里云ECS创建Git服务器

使用阿里云ECS创建Git服务器

现有阿里云ECS服务器一台(2C+4G+40G+4M,操作系统为Ubuntu16.04),现搭建私有Git服务器。

1.首先,服务器安装git

sudo apt-get install git
sudo apt-get install git-core

2.检测服务端是否已安装并运行ssh

(以下表示以安装并运行ssh)

root@iZ25eua1h3uZ:~# ps -e | grep ssh
  771 ?        00:00:00 sshd
 8407 ?        00:00:00 sshd

3.源码安装gitosis

gitosis是一个用来控制用户权限的第三方工具,使用它可以方便的实现git仓库的用户权限管理。它可以规定哪些用户有访问哪些代码仓库的权限(以及是可读还是可写)。
gitosis本身就是以一个代码仓库的形式存在于服务器中,被指定的仓库管理员有权限将gitosis给clone到本地,在本地编辑所有用户的权限数据之后再push到服务器上,服务器就会自动更新每个用户的权限。

#因为是源码安装,所以我们可以先在根目录下创建一个文件夹用来下载源码
mkdir src  
cd ~/src  
git clone https://github.com/res0nat0r/gitosis.git
#进入到下载下来的文件夹中
cd ~/src/gitosis
#安装
sudo python setup.py install 

可能出现的错误:如果报错ImportError:No module named Setuptools,说明python的安装包缺少setuptools包。

#解决方法
sudo apt-get install python-setuptools 

4.在server端新建用户git。

这里建议创建新用户git而不建议使用root用户,因为出于安全考虑,我们可以把git用户的ssh远程连接权限禁用掉(一般来说只要被配置为gitosis的管理员用户,就无法通过ssh命令来远程登录服务器),从而在所有人都使用git用户做版本控制的时候保证系统安全。

sudo adduser git

5.在客户端生成密钥

linux系统下进入root/.ssh/文件夹,windows系统下进入系统盘/当前用户文件夹/.ssh文件夹。

ssh-keygen 

6.将客户端公钥拷贝到服务器上

这里拷贝的是超级管理员的公钥

#这里需要创建一个文件夹public_key_path用来防止这个公钥
scp ~/.ssh/id_rsa.pub git@Server:/public_key_path/id_rsa.pub

7.使用超级管理员的公钥来初始化gitosis

sudo -H -u git gitosis-init < /public_key_path/id_rsa.pub

如果成功的话,会出现下面两行输出

initilailized empty Git repository in /home/git/repositories/gitosis-admin.git/
Reinitillized existing Git repository in /home/git/repositories/gitossi-admin.git/

可能出现的错误:

gitosis.init.InsecureSSHKeyUsername: Username contains not allowed characters: ‘xxx@xxx’。
这是引文客户端生成的密钥不满足gitosis对公钥的格式要求导致的(合法的公钥可以有多种不同的格式)。网上有博客说这种情况下一直重启电脑重新生成秘钥知道通过,非常不建议这么做。。。。
解决方法如下:

#在客户端创建密钥的时候这样创建
#-t表示使用的密钥算法格式,-C表示公钥中的用户信息,这个username很重要,后面也会用到,建议写成简洁的用户名
ssh-keygen -t rsa -C "username"

8.修改gitosis中更新用户信息的文件的权限

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

9.超级管理员的客户端clone服务端的gitosis

git clone git@Server:gitosis-admin.git 

这样会在当前目录下fork一个gitosis-admin的目录。里面有一个配置文件gitosisi.conf和一个存放pub key的目录keydir。

10.给代码仓库添加新用户并授权

如果要新建仓库,或者修改已有仓库中的用户权限,都要编辑客户端的gitosis.conf文件

#初始的gitosis.conf文件应该是这个样子
[gitosis]
#这表示一个组
[group gitosis-admin]
#这一行的含义是当前组的用户对gitosis-admin这个仓库有写权限
#如果是 readonly = repo_name 就表示组里的用户对仓库只有读权限
writable = gitosis-admin
#这一行说明组里有哪些用户,多个用户之间用空格分割
#注意这里出现的每一个用户,都要把他的公钥放到客户端的keydir文件夹中
#这个username就是上文中生成公钥时候的那个username,它被写在公钥里
members =  username

我们现在尝试给用户小明创建一个新的仓库,编辑conf文件如下

[gitosis]

[group gitosis-admin]
writable = gitosis-admin
members =  username

[group repo_for_xm]
writable = repo_for_xm
#注意要将xiaoming的公钥文件放入keydir文件夹
members =  xiaoming

然后来一套git标准push操作把对用户权限的更改push到服务器

git add -> git commit -> git push

在管理员完成以上操作之后,用户小明就可以在本地创建仓库,然后push,这样就会在服务端建立对应的仓库。

git init
#do something
git remote add origin git@Server:repo_for_xm.git
#在经过下面这一步push之后,小明就可以愉快的使用服务端的仓库啦
git push origin master

注意:只有在服务端的gitosis.conf中明确记录“用户-仓库-权限”三元组,对应的用户才可以对仓库进行操作,并且所有合法用户的公钥都在gitosis-admin下的keydir文件夹中有副本。基于gitosis的权限控制不接受未被记录的匿名用户进行任何操作,即使该匿名用户知道服务端git账户的密码。

11.本地web页面查看git

如果想要在本地通过web页面查看git版本信息,可以做如下操作

sudo apt-get install lighttpd
git instaweb

这会在本地的1234端口开启一个HTTP服务,可以查看git仓库的信息。
如果要停止,执行以下命令。

git instaweb –stop

版权声明:本文为Dream_Owner原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。