服务器部署Hexo-admin
Arn0

之前试了一下用Netlify托管我的Hexo博客,但用着感觉不太顺心。所以就试着直接用HexoAdmin来管理文章。虽说Netlify有可视化的编辑器,手机也可以打开,但是因为那个编辑器并没有自适应页面大小,手机访问直接给你怼个大页面,找个按钮都要比划半天……

所以用手机操作那就非常蛋疼了。虽然PC端体验还行,但是我手边又不是经常有电脑,于是乎就直接将HexoAdmin部署到服务器上了,毕竟HexoAdmin有自适应的页面,手机也可以愉快玩耍。用了几天感觉海星。

安装HexoAdmin

cd 到hexo的根目录,然后安装hexo-admin

1
npm i hexo-admin --save

部署

安装pm2

1
npm i -g pm2

创建run.js

1
2
3
4
5
6
7
8
9
const { exec } = require('child_process')
exec('hexo server -p 4000 -d & ',(error, stdout, stderr) => {
if(error){
console.log('exec error: ${error}')
return
}
console.log('stdout: ${stdout}');
console.log('stderr: ${stderr}');
})

创建pm2任务

1
2
pm2 start ./run.js --name HexoBlog
pm2 save

配置WebServer反向代理

安装Caddy

1
curl https://getcaddy.com | bash -s personal tls.dns.cloudflare

我在这里强烈建议在这个服务器上套一个Cloudflare CDN。所以安装的Caddy会附带一个cloudflare插件。

嘛,如果不想要这个插件的话,可以将tls.dns.cloudflare删掉。

创建Caddy File

创建并编辑/etc/caddy.conf

1
2
3
4
5
6
7
8
9
10
11
12
examples.com
{
proxy / localhost:4000
tls {
dns cloudflare
}

basicauth username password {
realm "xxx's documents"
/admin
}
}

注意

examples.com改为你自己的域名
basicauth那里的usernamepassword分别改为你想要设置的页面访问用户名和密码
如果你不喜欢web server的basicauth的话,可以将上面的basicauth去掉,直接用Hexo-admin自带的Authentification
realm后面的是登陆对话框的提示内容,这里随意修改。

如果你不打算套Cloudflare CDN的话,可以将下面部分去掉。

1
2
3
tls {
dns cloudflare
}

创建Systemd服务

创建/etc/systemd/system/caddy.service
添加下面的内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[Unit]
Description=Caddy HTTP/2 web server
After=syslog.target
After=network.target

[Service]
User=root
Group=root
LimitNOFILE=64000
Environment=CLOUDFLARE_EMAIL=你注册Cloudflre的邮箱
Environment=CLOUDFLARE_API_KEY=你的Cloudflare Global API Key
ExecStart=/usr/local/bin/caddy --conf=/etc/caddy.conf
Restart=on-failure

[Install]
WantedBy=multi-user.target

注意

两行Environment需要根据实际情况更改。如果你不打算套Cloudflare CDN的话,可以将这两行去掉.

这里将用户名指定成root主要是为了方便使用80和443端口。如果觉得不安全,可以参考Use a user, not root, to run caddy #106,但是要用到Docker。

激活Systemd service

1
sudo systemctl enable caddy.service

禁止从外网直接访问hexo-admin(可选)

1
iptables -A INPUT -s 127.0.0.1 -p tcp --dport 4000 -j ACCEPT

如果用的是GCP,并且套了Cloudflare的CDN,那么还可以直接用GCP的防火墙规则。
参考[GCP 防火墙只允许CDN IP访问 保护原站](https://blog.arn0.org/post/GCP 防火墙只允许CDN IP访问 保护源站/)

配置deploy

创建hexo-deploy.sh文件

1
2
#!/usr/bin/env sh
make up

在hexo根木录下的_config.yml添加

1
2
admin:
deployCommand: './hexo-deploy.sh'

HexoAdmin的deploy功能需要依赖hexo-deployer-git,这里安装一下

1
npm install hexo-deployer-git --save

接下来创建Makefile,添加下面内容

1
2
3
4
5
6
7
8
up:
hexo d -g
git add *
git commit -m "update blog"
git push origin hexo-source
sync:
npm i
sudo npm install -g hexo-cli --ignore-scripts

注意

up部分第4行决定了Git推送Hexo所有文件到哪个分支,具体要根据你的需要做些修改。

安装make

Debian/Ubuntu:

1
apt install make

CentOS/Redhat:

1
yum install make

最后启动Caddy服务

1
systemctl start caddy

大功告成

访问你的域名/admin就会直接弹窗要求登陆

点击deploy就会自动部署Hexo

PS: 在这里我是将Github仓库当作备份快照了,没有用到Github的Pages服务。还有我并没有将Hexo-admin的服务部署在这个博客的Web服务器上,而是另外开了台VPS来作为后端服务器,为的就是减轻这个Web服务器的负担,虽然这个破站根本就没有人访问。同时为了避免在自己电脑上写完文章后无法同步到后端服务器,在部署完Hexo-admin后我还设置了一下WebHooks,用来同步所有文件改动,设置WebHooks的方法可以看[我之前的文章](https://blog.arn0.org/post/Hexo 部署到自己的服务器/)。


参考链接

Hexo-admin服务器部署

一种在服务器上部署Hexo博客的思路

给你的 Hexo 博客添加 CMS

 Comments