Hexo博客:在VPS上搭建远程部署环境

原理

将Hexo编译后形成的博客文件($root_path/public/*),通过Git或者rsync传输到VPS,利用Caddy做Web服务器,展示博客内容

  • 使用Git,博客的版本控制也很方便
  • Caddy可以配置反向代理,配合v2ray,轻松搭梯子
  • Caddy自动申请ssl证书,强制HTTPS

传输博客文件到VPS

无论使用哪种工具,最终目的都是将hexo编译后的博客文件传输到VPS

共性:增量同步

Git:可以做到版本控制

rsync:更专业

参考Git Hooks自动部署

先ssh登录服务器,确认所需环境

1
2
git --version
vim --version

创建git用户

root用户登录VPS端

用户名字随意,只用以git传输

1
adduser git

编辑sudo权限

1
2
vim /etc/sudoers
# 退出时 :wq!

root ALL=(ALL:ALL) ALL下增加一行git用户的

1
2
root    ALL=(ALL:ALL) ALL
git ALL=(ALL:ALL) ALL

关闭git用户的shell登录权限

1
vim /etc/passwd

将git所在行的/bin/bash修改为/usr/bin/git-shell

ps: 也可以通过这种方式修改任何用户默认的登录shell

例如修改为zsh

初始化Git仓库

切换到git用户主目录cd /home/git

初始化一个Git仓库

1
2
3
mkdir blog.git              
cd blog.git
git init --bare

添加--bare参数,创建的仓库是不包含工作区的

配置SSH免密登录

将本地的ssh公钥复制到VPS上去

在本地机器上

1
2
3
cd ~/.ssh        # 默认
cat id_rsa.pub|pbcopy # 将公钥复制到剪贴板
# pbcopy是macOS下的剪贴板命令

远程VPS上

1
2
3
4
5
# root用户
cd /home/git
mkdir .ssh
cd .ssh
vim authorized_keys

直接复制到authorized_keys就行

创建post-receive 文件

root用户登录vps

先创建博客的root目录,这里用的是mkdir /var/www/blog

之后要创建多个网站时,都放在/var/www/文件夹下

创建post-receive

1
2
cd /home/git/blog.git/hooks
vim post-receive

复制以下内容

1
2
3
4
5
6
7
8
9
10
#!/bin/bash

GIT_REPO=/home/git/blog.git
TMP_GIT_CLONE=/tmp/blog
PUBLIC_WWW=/var/www/blog

rm -rf ${TMP_GIT_CLONE}
git clone $GIT_REPO $TMP_GIT_CLONE
rm -rf ${PUBLIC_WWW}/*
cp -rf ${TMP_GIT_CLONE}/* ${PUBLIC_WWW}

其中GIT_REPO为博客文件所在仓库的路径,PUBLIC_WWW为博客网站文件的root目录

确认有可执行权限

1
chmod a+x post-receive

管理用户组

确保之前创建的

  • /home/git/blog.git

  • /home/git/.ssh

  • /var/www/blog

  • /home/git/blog.git/hooks/post-receive

用户组权限为git:git

1
2
3
chown -R git:git /home/git/blog.git/
chown -R git:git /home/git/.ssh/
chown -R git:git /var/www/blog

使用ls -alh命令加以确认

本地插件

在本地使用hexo-deployer-git@3.0.0插件,简化部署

1
npm install hexo-deployer-git --save

具体配置参考博客部署

后话

执行hexo d即可将/public文件下的博客网站文件上传到vps的/home/git/blog.git仓库

然后会借用一个临时文件夹,自动将文件复制到网站root目录下

为什么不直接克隆到网站root目录?

在执行 cpcp 命令的时候,.git作为隐藏目录不会被拷贝到 Web 根目录下,也就避免了将整个仓库历史暴露在 Web 服务中。

rsync使用参考:

  1. 详解rsync,一款卓越的增量同步工具
  2. rsync 用法教程|阮一峰的网络日志

准备

服务器和本地都需要至少安装rsync

如果选用远程shell实现拷贝,是无需运行守护程序的

macOS\text{macOS}

macOS 12.4 21F79 arm64自带

或者通过brew

1
brew install rsync

Debian11\text{Debian11}

1
sudo apt install rsync

本地部署-插件配置

可以使用 hexo-deployer-rsync@1.0.0插件

1
npm install hexo-deployer-rsync --save

博客根目录_config.yml中增加配置项:

1
2
3
4
5
6
7
8
9
10
11
deploy:
type: rsync
host: <host>
user: <user>
root: <root>
port: [port] # Default is 22
delete: [true|false] # Default is true
args: <rsync args>
rsh: <remote shell>
verbose: [true|false] # Default is true
ignore_errors: [true|false] # Default is false
  • host: VPS的公网IP
  • user: 用来登录shell的用户,可以选择root,也可以创建一个专门的用户用于免密登录
  • root: 同步的文件夹路径,博客网站根目录,Ex:/var/www/blog
  • port: ssh端口号
  • delete: true,使得远程路径为源路径的镜像,即目的文件夹内不存在源路径没有的文件
  • args: Rsync arguments
  • rsh: 选择远程shell,默认ssh
  • verbose: 显示传输信息
  • ignore_errors: 忽视错误信息,默认关闭

关于免密登录,创建新用户,配置ssh公钥等不再赘述,可以参考创建git用户、配置ssh免密登录

Caddy配置

Caddy可以自动申请SSL证书,强制HTTPS,且配置简单,很适合小型站点,例如个人博客

Caddy下载

我的VPS是Debian 11的系统,其他系统请参考官网文档

1
2
3
4
5
6
7
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list

sudo apt update
sudo apt install caddy
systemctl enable caddy

Caddy配置

Caddy的配置通过Caddyfile完成,查找Caddyfile的位置

1
2
find / -name Caddyfile
# etc/caddy/Caddyfile

Caddy v1. 和v2. 的配置文件有较大差异,很多语法有变动,强烈建议查看官网文档来编写Caddyfile!

The Caddyfile | Caddy

以下是我的Caddyfile,基于Caddy v2.5.1

仅包含配置Web服务器部分

ps: 这里是使用Let's Encrypt 的免费SSL证书示意

若使用自行购买的SSL证书,则依次填入证书和私钥文件的位置

例如:tls /var/cert/floatu.top/$CERT_FILE /var/cert/floatu.top/$KEY_FILE

1
2
3
4
5
6
7
floatu.top
{
tls xxxxxxxxxx@gmail.com
root * /var/www/blog/
file_server
encode gzip
}

重启一下Caddy

1
systemctl restart caddy

访问[https://floatu.top]就可以浏览博客了

参考链接

  1. Hexo博客部署到VPS
  2. 搭建Hexo静态博客并使用Git部署到VPS
  3. 每天学习一个命令:使用 rsync 增量同步备份文件

📔博文图谱

提及本博文的链接