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文件,配置之后就不需要在提交的是输入密码啦。


第九步:关闭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
|
第十步:配置钩子程序
- 在git库下面的hooks目录里面创建文件post-receive,例如路径为:/home/git/hexogit2.git/hooks
- hooks文件夹下如果有post-receive文件则修改,没有则新建文件
- 给shell文件配置777权限,并且保证文件是git用户的
- 还需要给检出的目录也配置用户为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
|