VPS搭建git服务器

有一些项目是你在本地写的代码,不用放在公司的服务器上,但又需要版本管理。我已经受够了没有版本管理的本地代码,稍一修改就有可能导致无法还原。鉴于此类情况,一般我们会选择上传到免费的github上面去寄存。但是,说实话有些内容其实属于公司的隐私,不方便对外公开。那么这种情况下,就需要自己搭建一个版本管理的服务器,专供自己使用,如果他人也想看,可以授权。

我手头正好有一个VPS,为何不拿它来搭建git服务器呢?

1. 服务器端安装Git

我的VPS系统是CentOS 6,一般情况下,VPS都会预装Git,可以直接输入命令git来查看,如果没有安装的话,可以使用yum来安装

1
yum install git

2. 服务器端添加git用户

我们创建一个专门用来管理git服务的用户,取名为git

1
2
3
4
5
6
// 查看是否存在git用户
id git
// 如果不存在,则创建git用户
useradd git
// 为git用户设置密码
passwd git

3. 服务器端创建Git仓库

假设我们Git仓库的父目录为/data/git,在此目录下我们创建一个名为example.git的仓库,仓库的后缀名为.git

1
2
3
4
5
6
// 创建example.git仓库
mkdir -p /data/git/example.git
// 初始化example.git仓库
git init --bare /data/git/example.git
// 修改example.git仓库目录下的权限为git用户
chown -R git:git /data/git/example.git

4. 客户端克隆远程仓库

假设我们客户端Git仓库的父目录为~/data/git,现在需要从服务器端克隆下刚才创建的example.git仓库

1
2
3
mkdir -p ~/data/git
cd ~/data/git
git clone ssh://git@yourVpsIp:yourVpsPort/data/git/example.git

注意,默认SSH的端口号为22,但VPS一般会修改这个端口号,可以在/etc/ssh/sshd_config文件中找到Port字段来查看具体端口号

输入git用户密码后,即可看到example.git仓库克隆成功!

至此,一个最简单的VPS上的git服务器就已经搭建完成了

在客户端打开~/.ssh/known_hosts 隐藏文件,可以看到刚才创建的连接,被记录在该文件中。还有一个example.git仓库的隐藏配置文件位于~/data/git/example.git/.git/config

5. 进阶篇,Git免密操作

5.1 客户端创建SSH公钥和私钥

什么是客户端的免费操作?说白了就是之前每次使用git命令的时候都要输一遍git用户的密码,有了免密操作之后,每次执行git命令都无需输入密码。

首先在隐藏目录~/.ssh下查看,是否已经存在id_rsa以及id_rsa.pub文件。其中id_rsa是ssh私钥,id_rsa.pub是ssh公钥。那这两个文件有什么用呢?

id_rsa.pub,即ssh公钥放到服务器上,用户使用ssh连接VPS,会上传id_rsa.pub,如果服务器上的公钥和用户上传的公钥匹配,那么此次ssh操作无需输入密码。

下面的命令是根据邮箱来创建ssh公钥和私钥的,将yourEmail替换成你的邮箱即可

1
ssh-keygen -t rsa -C "yourEmail"
5.2 服务器端打开RSA认证

打开/etc/ssh/sshd_config文件,就是我前面说的记录VPS的SSH端口号的文件

1
2
3
4
5
6
7
// 打开文件
vi /etc/ssh/sshd_config


// 取消这些注释
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys

保存并重启sshd服务

1
service sshd restart

根据上面的AuthorizedKeysFile字段可以得知,ssh公钥存放在.ssh/authorized_keys文件中。由于管理Git服务的用户是git,所以真正存放ssh公钥的路径为/home/git/.ssh/authorized_keys

1
2
3
4
5
6
// 切换git用户
su git
// 回到git用户的主目录
cd ~
// 创建.ssh隐藏文件夹
mkdir .ssh
5.3 将客户端公钥导到服务器端

在客户端输入命令

1
ssh git@yourVpsIp -p yourVpsPort 'cat >> .ssh/authorized_keys' < ~/.ssh/id_rsa.pub

上传完毕后,在服务器端查看一下.ssh/authorized_keys文件的权限是否属于git用户

1
2
su git
ls -al ~/.ssh

确保.ssh文件及其目录下的文件.ssh/authorized_keys所属人以及所属权限组都是git用户。

注意,接下来修改.ssh目录的权限为700,修改.ssh/authorized_keys文件的权限为600。这一步极其重要,如果采用默认权限的话,rsa权限认证,也就是git免密操作永远都无法成功,只会要求你输入git用户的密码,回到了第4步。

rsa权限认证的步骤为,先对比用户上传的ssh公钥和服务器端的公钥是否一致,如果一致则不用输入密码,如果不一致或着没有上传,则输入密码。

5.4 再次克隆远程仓库

将刚才克隆的远程仓库删除

1
2
cd ~/data/git/
rm -r example.git

然后重新克隆

1
git clone ssh://git@yourVpsIp:yourVpsPort/data/git/example.git

这一次是不是不用再输入git用户的密码了呢,如果不再提示输入密码,并且直接克隆成功,那么恭喜你,git免密操作成功!如果仍旧要输密码,确保你哪一个步骤没有做对。

我们再换一台主机,我用的是自己的linux虚拟机,这台主机没有上传自己的ssh公钥,本地也没有ssh私钥,使用上面的命令克隆仓库,你会发现,这一次服务器提示要求你输入git用户的密码。说明rsa认证功能是正确的。

6. 禁止git用户使用ssh登录服务器

考虑到安全因素,需要禁止git用户ssh登录服务器,过程很简单,打开/etc/passwd文件,找到git用户那一行

1
2
3
4
// 原行
git:x:502:504::/home/git:/bin/bash
// 修改为
git:x:502:504::/home/git:/usr/bin/git-shell

保存后,git用户可以通过ssh正常使用git服务,但无法登录shell。

总结

搭建Git服务器其实并不复杂,如果只是自己或少数人使用的话,没必要配置得过于复杂。就像到过程中的第4步,其实就够了。我只是出于好奇心,才去做了rsa认证。

avatar

chilihotpot

You Are The JavaScript In My HTML