搭建git服务器遇到的坑

关于搭建git服务器,本来没什么好写的,强大的Google基本能帮助我们把事情搞定了。但偏偏我还是在坑里挣扎了几个晚上,就来记录一下吧,万一正好你也遇到这些坑了呢。我主要被坑在了linux的用户系统上,一直啪哒客户端的代码,对这个早没有什么知觉了。

我是准备在Google Cloud Platform上搭建自己的博客,按照这篇文章https://onbing.com/gcp/配置好了虚拟机,装上了nginx,还在阿里云申请了一个免费的https证书。为了在终端里用ssh直接登录服务器,创建了一个用户shinancao,在我本地的~/.ssh/config中增加了一项:

1
2
3
4
5
Host myblog  
HostName xxx.xxx.xxx.xxx
Port 22
User shinancao
IdentityFile ~/.ssh/myblog

一切准备就绪,接下来就是搭建Git服务器,把本地的博客文件推到服务器上去。到这里时,我参考了这两篇文章:在服务器上搭建hexo博客搭建Git服务器。安装上了git,然后开始配置git仓库,按照第一篇文章中的步骤来的:

1
2
3
4
5
6
7
cd ~
mkdir repos && cd repos
mkdir shinancao.blog.git && cd shinancao.blog.git
git init --bare
cd hooks
touch post-receive
vi post-receive

到这里我都一直忽略了一个问题,我是用shinancao这个用户登录进虚拟机来创建文件的,所以以上产生的文件及文件夹的权限均属于shinancao这个用户。第一篇文章中所提到的内容应该都是以root用户来操作的,最后在clone和push时都需要输入密码。

然而我还是按照我之前使用git的习惯,在~/.ssh/config在又增加了一项:

1
2
3
4
5
Host blog.shinancao.cn  
HostName shinancao.cn
User git
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa_blog_GCD

然后把对应的公钥复制到了虚拟机中.ssh/authorized_keys文件中,一切看似都配置了好了,测试一下:

1
ssh -T git@blog.shinancao.cn

报访问被拒绝…

1
Permission denied (publickey,gssapi-keyex,gssapi-with-mic).

于是Google走起,可是两个晚上呀!都没有解决呀!谢天谢地,最后在stackoverflow的一个角落提到了文件的用户权限。猛然意识到~/.ssh/configUser的值就是服务器上git仓库的所属用户!遂把本地的配置改为:

1
2
3
4
5
Host blog.shinancao.cn  
HostName shinancao.cn
User shinancao
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa_blog_GCD

然后测试ssh -vvv -T shinancao@blog.shinancao.cn,没有报Permission denied了,但是阻塞住了,最后直接用git clone shinancao@blog.shinancao.cn:repos/shinancao.blog.git来试,居然可以啦!

(又12点多了,开心的去睡觉…)

故事到这里本来可以收尾了,但是强迫症没办法,User的值还是git看起来舒服一些,而且shinancao的用我想用来日常文件管理,用git用户来专门管理git仓库。于是我以shinancao的身份登录到虚拟机上,添加了git用户,然后把相关的文件和文件夹的用户都改为了git。再到本地测试一下又报没有访问权限,嗯,想法还是比较天真,执行git clone shinancao@blog.shinancao.cn:repos/shinancao.blog.git,其实相当于用git用户来访问虚拟机,所以根本就访问不到shinancao用户下面的东西,即使它们的用户权限是gitgit用户下还没有任何文件。好吧,只能从头来过了,把git仓库和公钥的配置过程,在git用户下再走一次。这次git的操作到此就都可以跑通了。

接下来还要使博客在浏览器中能够正常访问,上面已经创建了一个钩子post-receive

1
2
3
4
5
6
7
8
9
10
#!/bin/bash -l
GIT_REPO=$HOME/repos/shinancao.blog.git
TMP_GIT_CLONE=$HOME/tmp/git/shinancao.cn
PUBLIC_WWW=/var/www/shinancao.cn
rm -rf ${TMP_GIT_CLONE}
git clone $GIT_REPO $TMP_GIT_CLONE
rm -rf ${PUBLIC_WWW}/*
cp -rf ${TMP_GIT_CLONE}/* ${PUBLIC_WWW}
cd ~
exit

用于把git仓库中的内容,拷贝到网站的目录下。PUBLIC_WWW原本是没有的,自己创建一下,注意该文件夹的用户权限:拥有者git,所属组root,权限775,这个目录下的每一层都要如此设置。这样使得gitroot用户都可以对其可读可写可执行。

1
2
3
4
chmod -R 775 dir #更改该文件夹及其子文件的权限
sudo chown -R git dir #更改该文件夹及其子文件的拥有者为git
sudo chgrp -R root dir #更改该文件夹及其子文件的所属组为root
usermod -a -G root git #为了保险起见,将git用户加入到root组

最后修改/etc/nginx/nginx.conf的root值为/var/www/shinancao.cn,然后重启nginx。

但,还没完!此时访问网站报403错误,在这里找到的解决办法:解决nginx出现403错误

终于可以愉快的访问啦~~,所以,各位old铁,我的博客搬家咯,以后请来访:https://shinancao.cn