1
 

Linux配置GIT服务器以及部署hexo博客

为了配置hexo博客,所以需要在自己的服务器上搭建一个GIT,用来同步博客数据和自动部署。

第一步:在linux上配置GIT

1
2
3
4
5
因为服务器是centos 7所以配置git使用yumm命令
yum install git

检验GIT是否安装完成
git --version

第二步:创建git用户组以及用户

1
2
3
4
groupadd git   	#创建用户组
adduser git -g git # 这里没有设置密码,第一个git是用户名,第二个是git组

passwd git # 为用户git设置密码

第三步:创建登录证书SSH

1
2
3
4
5
6
su git		#切换到git用户
mkdir /home/git/.ssh # 创建.ssh目录存放密钥
chmod 700 /home/git/.ssh
chmod 600 /home/git/.ssh/authorized_keys

chown -R git:git /home/git # 将整个GIT文件夹的权限都给到 git用户和git组

第四步:win用户机创建密钥

在win机器上使用SSH链接GIT,需要先在win机器上创建SSH-Key,然后把其中的公钥上传到Linux服务器,添加到Linux上的GIT用户下,具体就是把公钥追加到git用户下的authorized_keys文件中。

如果你的GIT项目有多人参与,则可以让他们每个人都在自己的机器上生成一个SSH-Key,然后把公钥发送给你,你把每个人的公钥添加到GIT用户的authorized_keys文件中,则这些用户就可以访问你的GIT项目。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
git ssh-keygen -t rsa
id_rsa(私钥)和id_rsa.pub(公钥),都在git/.ssh目录下,现在.ssh目录下有三个文件
-rw------- 1 git git 400 Sep 2 00:04 authorized_keys
-rw------- 1 git git 1679 Sep 2 00:03 id_rsa
-rw-r--r-- 1 git git 400 Sep 2 00:03 id_rsa.pub
其中两个id_rsa.pub和id_rsa用于自动生成的公钥和私钥
authorized_keys,是上面自己创建的目录,用于记录可用的公钥,
cat id_rsa.pub >> authorized_keys
把公钥写入到自己创建的 authorized_keys 文件中,代码这个代表可以用于登录系统

id_rsa是私钥文件,id_rsa.pub是公钥文件。

文件名字短,内容长的是私钥
文件名字长,内容短的是公钥,发布到GIT上

第五步:win私钥转换成ppk文件

使用工具putty工具把id_rsa私钥转换成.ppk文件,SSH key默认生成的秘钥格式是OpenSSH格式,他和ppk密钥可以自由互相转换,只不过是两种不同格式的文本而已,转换工具是putty工具可以从官网下载。

为什么需要这一步,因为我的win电脑上使用了GIT的增强工具TortoiseGit,TortoiseGit使用的秘钥默认是ppk密钥,而GIT默认使用的是OpenSSH秘钥,所以我需要配置一下ppk秘钥

putty工具可以从下面地址下载:

1
2
3
4
5
https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html
具体选择:
MSI (‘Windows Installer’)里面的 64-bit putty-64bit-0.74-installer.msi安装就可以。
具体的转换步骤我参照的网址如下:
https://www.jianshu.com/p/7818b3ad1d72

第六步:在本地配置两个GIT库的链接

在win下的用户目录里面创建.ssh文件夹,在文件夹里面创建文件,名称config,路径和内容如下

1
我的文件路径是C:\Users\用户名\.ssh\config

文件内容是:

1
2
3
4
5
6
7
8
9
10
11
12
13
# 第一个SSH key
Host 124.222.222.222
HostName 124.222.222.222
# 因为我自己的这台服务器的SSH登录端口把默认的22端口封了,改成 36487,所以需要在这里配置。
Port 36487
IdentityFile C:\\Users\\xxx\\.ssh\\自己服务器\\id_rsa
PreferredAuthentications publickey

# 第二个SSH Key
Host code.github.com
HostName code.github.com
IdentityFile C:\\Users\\xxx\\.ssh\\GITHUB\\id_rsa
PreferredAuthentications publickey

检验配置是生效

1
2
ssh -T git@code.github.com
ssh -T git@124.222.222.222

第七步:在服务器上创建GIT项目

1
2
3
4
5
6
7
cd /home/git/
mkdir data
chown -R git:git data/ # 给git用户权限
cd data/
git init --bare gitdata.git # 记得用--bare初始库,不要直接用 git init

创建好之后GIT仓库的路径为:/home/git/hexogit2.git

第八步:测试仓库

本地直接右键拉取仓库

1
git clone git@152.222.222.222:/home/git/hexogit2.git

但是这个时候推送的时候可能还是需要提供密码,提供GIT用户的密码就可以,但是为了方便,可以配置之前的.ppk文件。

在黄色区域部分配置自己的.ppk文件,配置之后就不需要在提交的是输入密码啦。

image-20200902220222701

image-20200902220514377

第九步:关闭git用户的ssh权限

1
2
3
4
vi etc/passwd
将 git:x:1001:1001:,,,:/home/git:/bin/bash
改为: git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell

第十步:配置钩子程序

  1. 在git库下面的hooks目录里面创建文件post-receive,例如路径为:/home/git/hexogit2.git/hooks
  2. hooks文件夹下如果有post-receive文件则修改,没有则新建文件
  3. 给shell文件配置777权限,并且保证文件是git用户的
  4. 还需要给检出的目录也配置用户为git才可以,git才可以操作那个目录

文件内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/bash
# 配置从GIT中检出的目录位置,在本地GIT上提交的文件,都会检出到这个目录下面,
# 所以GIT用户一定要有这个目录的所有权限
DIR=/home/git/hexogit2source
git --work-tree=${DIR} clean -fd
#直接强制检出到DIR目录
git --work-tree=${DIR} checkout --force

# 暂停删除原来的nginx容器
docker stop hexonginx
docker rm hexonginx
# 直接重新构建一个nginx容器,反正快,博客也不天天更新天天写,直接一个搞定。
docker run -d -p 80:80 -e TZ="Asia/Shanghai" --restart=always --name hexonginx -v /root/hexo/nginx.conf:/etc/nginx/nginx.conf -v /home/git/hexogit2source/public:/usr/share/nginx/hexo nginx

中间一段插曲,测试的时候写了一个shell

1
2
3
4
shell脚本里面的内容是
echo "测试" >> /home/git/hexogit2.git/custom_hooks/log
使用GIT用户执行,GIT用户已经有整个文件夹的权限,shell脚本的权限也有,但是没有log文件的权限,log文件是属于root用户的,所以shell执行了,但是还是报错了。
既然shell执行爆粗,则pull的时候,直接提示错误。。

给GIT用户docker权限,因为nginx是由docker构建的,所以在这里重新构建的时候需要用到docker,给git用户配置docker权限。

1
2
3
sudo groupadd docker  #创建docke用户组
sudo gpasswd -a ${USER} docker #给git用户权限
git用户退出重新进入即可

至此搭建完成,再附上两个bat脚本,用于本地测试运行和直接发布服务器,没错就是截图里面最下面的两个bat文件

快速启动.bat

1
2
3
call hexo clean     ::清理原来构建的文件也就是删掉public文件夹
call hexo generate ::构建
call hexo server ::启动服务,用于本地测试

一键部署脚本.bat

1
2
3
4
5
6
7
8
9
10
11
call hexo clean     		
call hexo generate
call git add public/
call git commit -m '构建'
call git push origin master
::清理原来构建的文件也就是删掉public文件夹
::构建
::把public 添加到git里面
::提交到本地缓存区
::提交到服务器
::代码提交到服务器之后,由git的程序完成后续的构建和部署

call 的用处在于让命令一行一行执行,没有这个参数,win的bat好像是几行一起跑,没办法达到预期。

继续增加步骤逻辑,因为服务器部署在腾讯云上,腾讯云会有漏洞检测和主机风险问题监测,其中有一项检测是:停止22端口登录服务器,并且停止使用账号密码登录,使用密钥文件登录。本来是禁止root账号远程登录的,但是这个没法呀,得用,然后就按照腾讯云提供的步骤进行了配置,配置完成之后,把22端口直接禁用了,改了一个五位数的端口号12345进行登录用,并且只允许用密钥文件登录。重点是配置之后GIT没法上传了,报错误22端口无法访问需要修改,使得GIT可以正常用。

第十一步:修改GIT通过SSH访问服务器默认的端口

当Linux服务器端口修改后GIT push的时候会出现错误:

1
2
3
4
5
6
7
$ git push
ssh: connect to host github.com port 22: Connection timed out
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

解决方法就是修改SSH配置的端口

1
2
3
win打开文件:C:\Users\用户名\.ssh\config

增加一行:Port 12345

修改后的config文件

1
2
3
4
5
6
7
8
9
10
11
12
# 第一个SSH key
Host 124.222.222.222
HostName 124.222.222.222
IdentityFile C:\\Users\\xxx\\.ssh\\自己服务器\\id_rsa
PreferredAuthentications publickey
Port 12345

# 第二个SSH Key
Host code.github.com
HostName code.github.com
IdentityFile C:\\Users\\xxx\\.ssh\\GITHUB\\id_rsa
PreferredAuthentications publickey

第十二步:配置HTTPS

解决强迫症最后一波操作,本人使用腾讯云作为服务器,所有申请HTTPS证书也直接在腾讯云里面申请,无脑按照操作说明提交申请,审核通过会可以下载对应的证书文件,然后腾讯云的官方文档里面描述了nginx tomcat等多种中间件配置https,根据文档进行配置就可以了。

自己修改的部分在HTTPS以及NGINX都配置好之后,要在构建容器的时候把443端口映射到容器里面,把HTTPS密钥文件映射到nginx容器里面。

我把HTTPS需要的两个密钥文件放到了/root/httpssh,现在修改git的钩子push之后执行的文件内容,也就是post-receive文件最后的docker run部分的命令

1
2
3
4
5
6
7
# 直接重新构建一个nginx容器,反正快,博客也不天天更新天天写,直接一个搞定,这样会有那么一瞬间服务丢失
docker run -d -p 443:443 -p 80:80 -e TZ="Asia/Shanghai" --restart=always \
--name hexonginx \
-v /root/hexo/nginx.conf:/etc/nginx/nginx.conf \
-v /root/httpssh:/etc/nginx/httpssh \ # 需要的两个HTTPS证书文件从本地的/root/httpssh文件夹下同步到容器里面的/etc/nginx/httpssh
-v /home/git/hexogit2source/public:/usr/share/nginx/hexo nginx

Nginx的配置文件,这个和腾讯提供的官方文档太一样了,就不往上贴拉。最后补上腾讯的官方文档:

1
2
腾讯SSL证书管理页面:https://console.cloud.tencent.com/ssl
腾讯SSL证书使用页面:https://cloud.tencent.com/document/product/400/35244