问题的提出
上传github太慢了,而且本地的服务器更好控制,因此选择将hexo博客转移到自己的私有服务器
思路
由于hexo本身就是一个静态站,所以只需要用nginx指向对应的hexo文件夹,然后设置好文件格式就可以直接使用
操作
在服务器端设置git裸仓库
# 需要注意的是此处不建议使用root用户,否则到后面会有权限冲突,使用非root用户即可
mkdir blog.git
cd blog.git
# 注意此处使用的是gitd的裸仓库,远端服务器一般建议直接使用裸仓库
git init --bare
裸仓库是一个重要的git仓库概念,可以参考裸仓库的相关介绍这篇文章。
总结就是
-
裸仓库
由版本控制文件组成,其本身就是.git文件夹的结构。不能在裸仓库文件夹下直接操作,例如add和commit操作都是不允许的,其文件夹中也看不到git分支中的文件。这种仓库只能在远端推送或者拉取,通常用于多人协作,版本库放在服务器上
-
普通仓库
普通仓库由源代码和版本控制文件组成,其根目录下就是源代码,根目录中的.git文件夹里面放的就是版本控制文件,可以对其中的源代码进行直接操作,但是不能在远端直接推送代码到当前分支,故常用于本地的版本控制
本地调试
因为我本身有一个正常的hexo博客,故本地调试只需要改一下_config.yml文件,在其中的deploy项中填写:
deploy:
type: git
message: update
# 注意master和main分支的处理
repo: yourusername@server_ip:~/path_to_your_blog.git,main
然后就可以上传了
# hexo打包
hexo g
# hexo上传至服务器
hexo d
复制仓库
因为git裸仓库是无法直接操作文件的,也就无法让nginx直接指向文件夹,所以我们需要使用git clone来将其中的分支来复制到一个普通仓库中,即
mkdir blog
cd blog
# 初始化一个git普通仓库
git init
# 把blog.git复制到blog中
git clone /XXXX/blog.git /XXXX/blog
# 在blog中拉取blog.git中的对应分支
git pull origin main
此时能够在blog文件夹中看到对应的hexo文件了
Nginx配置
复制一下我的nginx配置,nginx默认配置文件在/etc/nginx/niginx.conf
里面
server {
listen 9000 ssl ;
listen [::]:9000 ssl;
root /home/yyh/blog/;
server_name blog.yyhnet.top;
ssl_certificate /etc/letsencrypt/live/blog.yyhnet.top/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/blog.yyhnet.top/privkey.pem;
location / {
root /home/yyh/blog/;
expires 1h;
index index.html;
#下面这个types很重要,不使用的话会导致CSS不加载
types {
text/html html;
image/gif gif;
image/jpeg jpg;
image/png png;
image/vnd.microsoft.icon ico;
text/css css;
application/javascript js;
}
default_type application/octet-stream;
if (-f $request_filename) {
rewrite ^/(.*)$ /$1 break;
}
}
}
然后检查一下nginx的配置文件的可用性,然后重启nginx服务即可
# 检查配置文件
nginx -t
# 重启nginx服务
service nginx restart
后续使用
后续使用的话有三步
# 本地客户端打包上传至服务器
hexo g
hexo d
# 进入blog文件夹
cd blog
# 与裸仓库进行同步
git pull origin main
后续优化
上文中的方法在本机上传blog后,还需要进入服务器让blog文件夹与裸仓库进行同步,十分的不便,因此在这里加入一个git钩子,使得本机上传后自动触发blog文件夹与裸仓库的同步,此后就不需要再进入服务器进行同步了。
此处我们修改的是post-receive文件,其位于我们裸仓库中的.git/hooks/
文件夹中,需要我们手动创建,其中hooks文件夹还可以放很多其他的文件,这些文件的文件名表示了这些钩子的触发条件,例如此处的post-receive表示在收到上传后运行钩子程序。这里的钩子程序实际上就是一个bash脚本
#脚本的Shebang行,用于
#!/bin/bash -l
#将GIT_REPO这个变量赋值为/home/yyh/blog.git
GIT_REPO=/home/yyh/blog.git
#将TMP_GIT_CLONE这个变量赋值为/home/yyh/temp/blog
TMP_GIT_CLONE=/home/yyh/temp/blog
PUBLIC_WWW=/home/yyh/blog
#进行脚本实际操作
#删除之前的blog临时文件夹
rm -rf ${TMP_GIT_CLONE}
#从裸仓库复制到blog临时文件夹中
git clone -b main $GIT_REPO $TMP_GIT_CLONE
#删除之前的blog文件夹
rm -rf ${PUBLIC_WWW}
cp -rf ${TMP_GIT_CLONE} ${PUBLIC_WWW}