Hexo博客迁移

我把hexo从GitHub迁移到了自己的VPS

疫情发生之后,阿里云开启了一个免费领取学生机VPS的活动,可以免费使用半年的VPS。我有幸领到一个,然后想想不能晾在那里,机器性能又太差几乎啥也干不了,所以打算把博客迁回来,这样就没有延迟了。

流程

  1. 服务端搭建
  2. 客户端配置更改
  3. 发布

阿里云服务端配置

领取到机器之后,首先选择机器的操作系统,我装的是ubuntu16,因为搭建的是web应用,所以需要去安全组里面打开80端口。

服务端首先我们需要装两个软件:Git和Nginx,用来保存博客和转发代理。

git安装

1
sudo apt-get install git

Nginx安装

1
sudo apt-get install nginx

安装完后分别输入git —version、nginx -v,出现相应版本号即为安装成功

安装好这两项之后,我们需要新建一个专门推送更新博客的用户,然后配置对应的博客存放文件夹和web访问文件夹。

新建推送用户

1
2
3
4
useradd git
passwd git // 设置密码
chmod 740 /etc/sudoers
vim /etc/sudoers

找到

1
2
## Allow root to run any commands anywhere
root ALL=(ALL) ALL

在下面添加一行

1
git     ALL=(ALL)      ALL

保存退出后改回权限:

1
chmod 400 /etc/sudoers

然后给新加的用户git设置权限,编辑/etc/passwd将:git:x:1003:1003:,,,:/home/git:/bin/bash 改成:git:x:1003:1003:,,,:/home/git:/usr/bin/git-shell 这样git就只能使用git-shell而不能使用bash。

git服务器打开RSA认证

1
vim /etc/ssh/sshd_config

修改为以下权限

1
2
3
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys

设置ssh免密证书

如果开发的电脑是windows系统,找到user/.ssh文件下的id_rsa.pub文件,拷贝其中公钥,粘贴到authorized_keys

可以执行ssh命令测试是否可以免密登录

创建远程仓库

首先在新建一个repo文件夹做仓库,设置权限

1
2
3
sudo mkdir /var/repo/
sudo chown -R $USER:$USER /var/repo/
sudo chmod -R 755 /var/repo/

然后新建blog仓库

1
2
cd /var/repo
git init --bare hexoBlog.git

配置Nginx托管目录

新建一个文件夹用于托管nginx的转发,并设置权限。

1
2
3
sudo mkdir -p /var/www/hexo
sudo chown -R $USER:$USER /var/www/hexo
sudo chmod -R 755 /var/www/hexo

然后配置nginx

1
2
#ubuntu配置命令是这个,centOS不一样
sudo vim /etc/nginx/sites-available/default

找到root配置项,改为/var/www/hexo,只修改root行就可以了

1
2
3
4
5
6
7
8
9
10
11
12
13
server {
listen 80 default_server; listen [::]:80 default_server ipv6only=on;
root html;
index index.html index.htm;
}

#改为
server {
listen 80 default_server;
listen [::]:80 default_server ipv6only=on;
root /var/www/hexo;
index index.html index.htm;
}

保存退出,重启 Nginx 服务,使改动生效

1
2
# ubuntu的命令,其他系统也不一样
sudo /etc/init.d/nginx restart

可以测试ip访问一下,如果配置前能访问配置后无法访问说明修改成功了。

创建Git钩子

钩子,就是用来触发关键事件的工具。当我们提交的时候,git钩子可以自动的将我们提交的博客转输到nginx的文件夹下,这样就可以简化很多工作了。

1
sudo vim /var/repo/hexoBlog.git/hooks/post-receive

在文件中添加以下内容

1
2
#!/bin/bash
git --work-tree=/var/www/hexo --git-dir=/var/repo/hexoBlog.git checkout -f

保存退出,并修改权限使其成为可执行文件

1
chmod +x /var/repo/hexoBlog.git/hooks/post-receive

这样子服务端的配置就完成了,我在配置这里的部分花费了好多时间。

客户端(本地)配置

因为在本地已经有hexo的博客源码,我只需要修改配置文件_config.yml就可以直接推送到VPS。找到deploy部分,修改repo链接。

1
2
3
4
deploy:
type: git
repo: git@服务器的公网IP地址:/var/repo/hexoBlog.git
branch: master

修改完成后,测试部署一下

1
hexo g && hexo d

然后http访问一下就完成了

问题

主要问题是客户端无法deploy到服务端,钩子没有自动触发两个问题,下面说一下解决方案。

无法deploy服务端

爆出错误类似22端口未打开,和Error: spawn git ENOENT等等。两个步骤去解决,本地下载一个git程序,使用git bash去推送。然后再重新设置一下服务端的/var/repo/hexoBlog.git文件权限。可能是推送的文件地址无法git用户无法访问导致。

git钩子没有触发

推送成功后,浏览器还是无法访问。这种时候钩子触发失败,也是文件权限的问题,重新设置一下/var/www/hexo文件夹的访问权限,让钩子可以访问文件夹。

参考博客

https://www.jianshu.com/p/271a1649a853
https://www.jianshu.com/p/e1ccd49b4e5d
https://www.jianshu.com/p/86e80be14d8f
https://blog.csdn.net/qq_35561857/article/details/81590953
https://www.jianshu.com/p/70bf58c48010

对于客户端的配置我基本没写,因为我本地之前已经配置好了。要是需要配置本地可以看一下参考博客。