通过GitHook部署Hexo博客到VPS上
条评论前言
参考链接:
Hexo部署到VPS - Configuration | NightFury’s Blog = NightFury = 行动胜于空想
Deploy Hexo Blog to VPS |部署Hexo博客到VPS | Yingchi’s blog (peiyingchi.com)——这篇通过rsync部署
前置条件:已经在本地搭建好了Hexo博客,本地搭建博客也可以在本站找到对应教程。
网上有两种自动部署方案:rsync和git hook,本文用最常用的git hook。
吐槽:Hexo只是个静态博客,一点点页面只占几十M内存…也没必要用Docker,不方便本地修改内容再同步
git用户设置
- 创建git用户
安装git和用得到的软件
1 | apt update -y && apt install sudo vim git |
创建git用户,根据提示输入密码(不显示)
1 | adduser git |
- 赋予git用户sudo权限
1 | 获取sudoers文件读写执行权限 |
找到root ALL=(ALL:ALL) ALL
这一行并在下方新加一行:
1 | git ALL=(ALL:ALL) ALL |
1 | 改回sudoers文件权限为仅读写 |
- 配置git用户的ssh
先在电脑本地生成ssh密钥(如果已经有了就不用再生成),打开cmd输入:
1 | ssh-keygen -t rsa -b 4096 -C "your_email@example.com" |
然后在你的C盘/用户/用户名/.ssh/
里会有私钥id_rsa
和公钥id_rsa.pub
,复制公钥的内容。
1 | cd /home/git |
把复制的公钥粘贴进去并保存。
现在就配置好了ssh,我们可以在cmd
中通过ssh git@VPS的IP
连接到VPS的git用户,进行各种操作。
1 | 限制仅允许所有者读写、执行文件。防止未经授权的用户访问和修改关键的 SSH 文件,从而提高系统的安全性 |
目的:因为SSH密钥匹配免密登录,所以后面hexo d
能直接通过ssh连接推送到VPS的仓库,而不用输入密码。
- 关闭git用户shell权限
git用户不需要太大权限,只需要能操作git仓库即可。
因此可以关闭 git 用户的 shell 权限:
1 | cd / |
将最后一行的 git:x:1000:1000:,,,:/home/git:/bin/bash
修改为 git:x:1000:1000:,,,:/home/git:/usr/bin/git-shell
。
这样,我们可以正常通过 ssh 登录 git,但无法使用 shell,因为我们为 git 用户指定的 git-shell 每次一登录就自动退出。
1 | C:\Users\Administrator>ssh git@142.171.245.130 |
如果报错:
1 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ |
那就把本地电脑的C盘/用户/用户名/.ssh/known.hosts
文件删除,再次连接应该就行了。
创建博客网站目录
1 | cd / |
初始化blog.git博客仓库
1 | 进入git用户目录 |
确保目录的用户权限组为git
1 | root@lumengde:/# ls -l /var/www/blog |
一般来讲执行这三个指令,返回的是root root
,所以需要修改权限来变成git git
1 | sudo chown git:git -R /var/www/blog |
执行完再ls -l xxx
检查一下。
配置git hooks脚本
通过编写 Git Hooks 脚本,本地上传博客后,能自动把仓库里的文件拉取到网站目录中。
1 | cd / |
当hexo d
部署到VPS的blog.git仓库上时,Git Hooks 脚本自动执行流程:
- 删除临时目录
/tmp/blog
里的所有内容 - 将
/blog.git
仓库内的文件拷贝到临时目录/tmp/blog
里 - 删除网站目录
/www/blog
内所有内容 - 将目录
/tmp/blog
里的内容拷贝到网站目录/www/blog
内
赋予post-receive文件可执行权限
1 | chmod +x post-receive |
Nginx配置反向代理
Nginx Proxy Manager
好用是好用,但是我们最好还是了解下Nginx怎么用,配置怎么写,以后图方便了再用NPM。
安装Nginx
官方链接,跟着做就行:【nginx: Linux packages】
【注意】中间安装Stable还是Mainline版本,选前者 Stable。
nginx -v
能够看到Nginx版本号说明安装成功。
配置Nginx
1 | 新版nginx文件结构和以前版本不一样,所以这一步跟往年教程不一样: |
粘贴以下配置信息,server_name更改为你的域名:
1 | server { |
注意如果多于一个server,后续listen 80
无需default
。编辑好后,保存并退出。
1 | 启动Nginx |
如果启动Nginx报错(很有用):
补充知识
1 | 旧版的Nginx配置文件为`/etc/nginx/sites-available`里的`default`;现在安装的新版配置文件为`/etc/nginx/conf.d`里的`default.conf`。 |
配置Hexo,同步到服务器
打开Hexo的配置文件_config.yml
,修改以下内容:
1 | url: 你的博客域名 |
原先使用Github Page需要用到CNAME
,但是这里Nginx的server_name
指定了域名对应的网站文件目录,所以非必须。
然后Hexo三连
,博客的/public
文件夹会同步到github的xxx.github.io仓库main分支和VPS的blog.git仓库的master分支里。
域名解析
我是海外VPS,博客没备案且有违规文章,怕IP被封,所以套了cloudflare。以下是解析记录以供参考。
Type | Name | Content | Proxy status | TTL | Actions |
---|---|---|---|---|---|
A | blog | 142.171.245.130 | Proxied | Auto | Edit |
A | lumengde.com | 142.171.245.130 | Proxied | Auto | Edit |
如果你也用了CloudFlare,需要把SSL/TLS改成Flexible(灵活模式)
,不然可能会报错误代码521,因为我们还没申请SSL证书,无法使用HTTPS,Nginx也没监听443端口。
此时,打开你的博客网站域名,就能访问博客主页。但是只能通过HTTP协议,即http://xxxx.com 来访问,我们Nginx配置监听的也是HTTP对应的80端口。后面还需要配置在SSL/TLS证书才能用https
。
报错解决:
如果无法正常访问,可以打开DNSPod 域名检测工具 网站健康免费诊断 - WHOIS查询_网络拨测_故障排查_证书_备案 - 腾讯云 DNSPod输入你的域名检查哪里有问题。
如果是国内云服务器,记得在安全组中打开80 443端口。并且国内服务器给域名备案才能访问。
成功访问后可以测测网站访问速度:网站测速-免费域名检测-网站测速-ping检测-域名污染-域名被墙-dns查询-IPv6网站测试-路由跟踪查询-劫持检测-SSL检测-TCP检测-UDP检测 (aicesu.io)
申请SSL证书
用Certbot给在Cloudflare上的domain申请Let’s Encrypt的泛域名证书
Certbot是一个ACME客户端,也是ACME客户端的参考实现,使用Python编写。Certbot默认使用Let's Encrypt
作为证书颁发机构。选择Let’s Encrypt是因为它颁发的 SSL/TLS 证书是免费的。
泛域名证书,简单来说,申请了*.lumengde.com
,则该域名的所有子域名都包含在内都可以使用该SSL/TLS证书,不用一个域名一个域名地申请,又乱又麻烦。
参考教程:更新:为 NGINX 配置免费的 Let’s Encrypt SSL/TLS 证书 (nginx-cn.net)
下载Let’s Encrypt客户端:
1 | apt-get update |
利用certbot
自动完成 NGINX 的 SSL/TLS 配置:
1 | sudo certbot --nginx -d example.com -d *.example.com |
使用 NGINX 插件生成证书,certbot
会在 NGINX 配置中查找并修改包含 server_name 指令(含有您为其请求证书的域名)的 server 块。输入自己的邮箱即可。
证书生成后,NGINX 重新加载新设置。certbot
生成一条消息:Congratulations!xxxxx
,显示证书成功生成,并指示证书在服务器上的位置。
如果用了cloudflare,这里会报错,直接看下一小节
1 | Performing the following challenges: |
解决办法:看下一小节。
此时我们再打开default.conf
文件,能看到它自动为我们的server
块添加了监听443端口和一些ssl配置。
重启Nginx更新一下配置即可
1 | sudo systemctl reload nginx |
然后输入https://xxx.com
就能正常打开了(没开魔法访问可能需要等一会DNS缓存)
- 自动更新Let’s Encrypt证书
我们申请的Let’s Encrypt证书只有90天有效期,到期需要手动更新,比较麻烦。这里我们添加一个cron任务来实现自动更新证书。
1 | 打开crontab文件 |
保存并关闭文件。所有已安装的证书将自动更新和重新加载。
该命令每天中午12点检查服务器上的证书是否会在未来 30 天内到期,如果是,则更新证书。--quiet
指令告知 certbot
不要生成输出。
Cloudflare申请Let’s Encrypt证书
参考教程:用Certbot给在Cloudflare上的domain申请Let’s Encrypt的泛域名证书 - 微言解语 (ausmis.com)
- 获取Cloudflare API Tokens
打开Cloudflare,点击人像->My Profile->API Tokens->Create Token->选择Edit zone DNS->
Zone Resources可以Special zone选你的域名,仅该域名能使用该API Token(更安全),每次有新域名都申请各自的API Token;或者改为All zones,所有域名都可用(更方便)
最后点Continue to summary
就好了。申请完Token之后要保存下来,仅显示一次
且后面要用到,同时Cloudflare也提供一个验证的脚本,在shell上执行一下看看该token能否正常工作。
- 配置cloudflare.ini
接下来开始准备cloudflare.ini文件,这个文件会被Certbot用于直接做DNS Challenge,所以非常重要,没有这个文件就无法生成泛域名证书了。
1 | 创建目录 |
安装Certbot的Cloudflare API的插件。
1 | sudo apt update && apt install python3-certbot-dns-cloudflare |
- 生成泛域名证书
1 | certbot --dns-cloudflare -d lumengde.com -d *.lumengde.com -i nginx |
提示:Which server blocks would you like to modify?
,选择所有跟*.lumengde.com
有关的server的序号,英文逗号隔开。直接回车则为全选。
脚本运行中要问你要Cloudflare的配置文件,输入下面字符串:
1 | ~/.secret/certbot/cloudflare.ini |
然后它就会自动修改Nginx里的配置,网站开放443端口,可以使用https访问了。此时cf里把SSL/TLS改成Full或者Full(Strict)都行了。
再回到上一小节默认创建一个自动跟新证书的cron任务即可。
注意:生成的这一段话只需要在主域名的server块有就行,能作用到整个配置文件的所有server块中。
1 | ssl_certificate /etc/letsencrypt/live/lumengde.com/fullchain.pem; # managed by Certbot |
扩展阅读(看不懂):[记录]使用Certbot与Cloudflare插件申请通配符证书 - 掘金 (juejin.cn)
本文标题:通过GitHook部署Hexo博客到VPS上
文章作者:德德
发布时间:2024-06-14
最后更新:2024-06-14
原始链接:https://lumengde123.github.io/posts/c74a.html
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 CN 许可协议。转载请注明出处!