【Hexo】一键部署至远程服务器
【Hexo】一键部署至远程服务器
時光前言
浏览洪哥博客时看到了一篇文章,使用Git将Hexo部署到远程服务器,觉得很有用,正好解决了我无法自动化部署至云服务器的烦恼。
首先讲一下我目前的部署方案,我之前介绍过如何进行Hexo文章的自动备份 和 自动部署,我目前采用的就是这种方案,目前我一共有三个博客站点,一个部署在GitHub(blog.shiguang666.eu.org),一个部署在Vercel(blog.shiguang88.icu),一个部署在云服务器(blog.shiguangdev.cn),因为Vercel关联了GitHub账户,本质上前两种都是部署在GitHub上,只不过不是在同一个仓库,部署到云服务器的站点每次都要手动更新文件,非常麻烦。
接下来介绍下如何使用Git将Hexo一键部署至远程云服务器。
1、环境说明
1.1、远程和本地都需要安装Git
Linux上安装Git命令如下:
基于 Debian/Ubuntu 的系统:
1 | sudo apt install git -y |
基于 Red Hat/CentOS/Fedora 的系统:
对于 CentOS/RHEL 7 及以下版本
1
sudo yum install git -y
(对于 CentOS/RHEL 8 及以上版本)
1
sudo dnf install git -y
1.2、远程服务说明
我的博客采用 1Panel 管理面板进行部署,网站主目录为:
1 | /opt/1panel/apps/openresty/openresty/www/sites/blog.shiguangdev.cn |
静态网页文件需要放在index目录内
2、操作步骤
2.1、创建仓库
连接云服务器,切换到博客主目录
1 | cd /opt/1panel/apps/openresty/openresty/www/sites/blog.shiguangdev.cn/ |
在博客主目录创建一个文件夹,存放仓库文件
1 | mkdir repo |
切换到仓库目录,初始化裸仓库
hexo.git
是一个 文件夹,但它是一个特殊的文件夹,称为 裸仓库(bare repository)。
- 裸仓库 是一个没有工作目录(working directory)的 Git 仓库。
- 它只包含 Git 的版本控制数据(如
.git
目录中的内容),而不包含实际的文件内容。- 裸仓库通常用于 共享代码 或 部署代码,而不是用于开发。
1 | cd repo |
2.2、创建钩子
1 | vim /opt/1panel/apps/openresty/openresty/www/sites/blog.shiguangdev.cn/repo/hexo.git/hooks/post-receive |
输入i
进入编辑模式,然后将下面那两行代码粘贴进去,输入:wq
保存退出。
1 | !/bin/bash |
根据实际情况修改目录位置,这个脚本的作用是 将 Git 仓库中的最新代码强制更新到指定的目标目录。
这里,我指定的目标目录是 :
1 | /opt/1panel/apps/openresty/openresty/www/sites/blog.shiguangdev.cn/index |
Git 仓库位于
1 | /opt/1panel/apps/openresty/openresty/www/sites/blog.shiguangdev.cn/repo/hexo.git |
给钩子脚本赋予可执行权限
1 | chmod +x /opt/1panel/apps/openresty/openresty/www/sites/blog.shiguangdev.cn/repo/hexo.git/hooks/post-receive |
2.3、修改Hexo配置
进入本地hexo博客的根目录,编辑站点配置文件 _config.yml
,找到deploy
,添加如下配置
1 | deploy: |
其中root@xx.xx.xx.xx
是Git账户@站点IP/域名
至此配置完成,本地执行hexo d
即可进行一键部署,部署时需要进行授权
注意:
如果有站点采用了 自动部署的方式进行部署,那么云服务器的站点需要单独执行,执行后注释掉deploy配置,否则会导致自动部署失败
推荐使用 SSH连接远程服务器,这样就不用每次都输入密码进行验证了。
同理,部署云服务器节点时需要注释掉其他节点部署配置,由于自动部署每次都是通过脚本下载的hexo插件进行部署,所以也存在一些弊端,比如不支持自定义插件脚本或样式。
这样反而更麻烦了,不如直接停掉自动部署,自动备份依旧保留。
想要禁用自动部署,直接引用源码仓库的Actions功能就行了。
部署时使用hexo d
进行一键部署多个服务节点了。