把Hexo部署到云服务器

前言

虽然我们可以把Hexo免费部署到Github Pages上,但是考虑到国内网络访问Github并不是那么友好,我决定把博客部署到自己的云服务器上。部署的前提是得有一个云服务器,本文以腾讯云为例简单说明一下,主要是记录自己踩过的坑,避免哪天重新搭建的时候重复踩坑。

服务器环境

我服务器装的是腾讯云提供有的宝塔面板镜像,CentOs 7.9 64位,集成软件:LNMP,LAMP,tomcat,Node.js。当然不装宝塔也可以,只是对于博主这种非Linux技术栈的人来说,宝塔面板方便很多。

部署步骤

友情提示

本文除非明确说明是在本地操作的,否则所有步骤都是在云服务器上操作。

Git安装

参考:Hexo博客部署到腾讯云服务器(使用宝塔面板)

其实上面镜像安装完毕后,自带已经有git,但是我跟着这篇文章(文章中Git安装及配置的1~3步)重新安装了一遍最新版,安装在/home/git/目录下,安装的版本是2.29.2。如果是用自带的git的话,应该也没什么问题。

创建git用户并部署环境

创建git用户

1
adduser git

新增git用户(注意这个git只是该主机上的一个用户的名字)

修改sudoers文件

输入指令

1
2
3
4
//修改权限
chmod 740 /etc/sudoers
// 编辑sudoers文件
vim /etc/sudoers

可以进入编辑模式,对sudoers文件内容进行修改

找到以下内容:

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

新增一行代码:

1
git     ALL=(ALL)       ALL

修改后如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
## Next comes the main part: which users can run what software on 
## which machines (the sudoers file can be shared between multiple
## systems).
## Syntax:
##
## user MACHINE=COMMANDS
##
## The COMMANDS section may have other options added to it.
##
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
git ALL=(ALL) ALL

## Allows members of the 'sys' group to run networking, software,
## service management apps and more.
# %sys ALL = NETWORKING, SOFTWARE, SERVICES, STORAGE, DELEGATING, PROCESSES, LOCATE, DRIVERS

输入以下代码,保存并退出

1
:wq

最后改回权限:

1
chmod 400 /etc/sudoers

以上步骤可通过宝塔面板直接找到文件编辑

修改sshd_config文件

输入以下代码编辑sshd_config文件

1
vim /etc/ssh/sshd_config

在sshd_config文件中设置以下几项(注意有些以#开头的是被注释了的,需要打开注释)

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

以上步骤可通过宝塔面板直接找到文件编辑

设置git用户密码

1
sudo passwd git

需要记下这个密码,后续步骤可能会提示输入

配置ssh

在这一步骤开始之前,首先得确保我们得有密钥,当然一般我们已经搭建过Hexo博客,那么肯定已经创建过了,一般是存放在C/User/你的用户名/.ssh下。

没找到的话,可以参考:

Git生成SSH密钥(这里的步骤是在本地主机操作)

要注意的是,配置ssh主要是为了本地可以免密登录到服务器,这里生成密钥的时候不能设置密码,生成过程应该连按回车跳过密码步骤。

id_rsa.pub
id_rsa

最后在本地获得这两个文件,有后续的是公钥,没后续的是私钥,把他们放到服务器的/home/git/.ssh路径中

切换到git用户(重要!)

1
su git

然后编辑authorized_keys文件

1
2
3
4
5
6
7
8
9
10
11
12
13
cd ~

mkdir .ssh

cd .ssh

vi authorized_keys

// 这个时候把公钥,也就是~/.ssh/id_rsa.pub文件内的文本内容复制粘贴到authorized_keys文件中

chmod 600 ~/.ssh/authorized_keys

chmod 700 ~/.ssh

最后用以下指令测试是否可以免密登录服务器

1
ssh -v git@服务器的公网ip

若提示需要密码,先检查

  1. 是否先用su git切换到git用户再进行其他步骤
  2. 密钥创建时不能带密码

如果仍然提示需要密码,可以根据以下文章修改,主要是权限问题:

git仓库与网站部署

这一步骤主要讲如何在本地生成后,利用hexo d推送生成内容到服务器上,如果已经实现了提交网站源码自动提交生成内容的自动部署(参考:Hexo-Butterfly主题博客搭站记录),或者需要实现云服务器CI的,可以跳过这一步骤,直接跳到[利用Github Actions搭建云服务器CI流程](##利用Github Actions搭建云服务器CI流程),实现服务器上的自动部署

切换到git用户(重要!)

1
su git

我们需要创建一个网站根目录,博主创建在/www/wwwroot/Hexo这个路径

1
mkdir /www/wwwroot/Hexo

创建git仓库

1
2
3
cd ~
// 默认是创建在home/git/目录下
git init --bare blog.git

使用–bare参数,Git 就会创建一个裸仓库,裸仓库没有工作区,我们不会在裸仓库上进行操作,它只为共享而存在

修改blog.git权限

1
chown git:git -R blog.git

在 /home/hexo/blog.git 下,有一个自动生成的 hooks 文件夹,我们创建一个新的 git 钩子 post-receive,用于自动部署。

1
vim blog.git/hooks/post-receive //这里必须在git用户下用指令创建,不能用其他用户或宝塔面板创建

设置钩子,在该文件写入(这个操作可以在宝塔面板写入)

1
git --work-tree=/www/wwwroot/Hexo --git-dir=/home/git/blog.git checkout -f

这里有一点要注意的,因为我博客原本也是部署在Github Pages上的,现在Github新的仓库默认分支名是main,而不是master,所以_Config.yml文件中的deploy项配置的分支是main,而服务器的git仓库默认分支是master,如果在服务器上我们仍然是push到main的话,需要在钩子上添加分支名称,如下:

1
git --work-tree=/www/wwwroot/hexo --git-dir=/home/git/blog.git checkout -f main

最后修改该钩子文件权限

1
chmod +x /home/git/blog.git/hooks/post-receive

在本地修改hexo的_Config.yml配置

1
2
3
4
5
deploy:
type: git
repository:
git@你网站地址:/home/git/blog.git
branch: master #这个是服务器上的仓库的分支名,我的是main

这时在本地执行三连

1
Hexo clean && Hexo g && hexo d

这个时候生成的网页文件已经推到服务器了

若未设置站点,可在宝塔面板添加站点,根目录设置到/www/wwwroot/hexo,这里就不再赘述了,可在网上参考或看宝塔文档

然后在浏览器输入自己站点的域名,能正确看到博客内容,即部署成功了

如果不成功,先检查下以上步骤是不是都是在git用户下进行的,不然会有权限问题,如果还是不行,可以尝试删除本地Hexo目录的.deploy_git文件夹,再执行Hexo三连,参考:hexo d 显示成功 但是在网站上面内容没有更新

利用Github Actions搭建云服务器CI流程

这一步主要是在我们已经使用Github管理我们的Hexo博客源码时,借助Github Action实现只需要提交源码,就会自动生成网页文件,并把文件推到服务器上

使用GithubActions自动部署应用到自己的服务器(ECS)

详细步骤可以参考上面链接,下面贴出我用的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# workflow name
name: Hexo Blog CI

# master branch on push, auto run
on:
push:
branches:
- source

jobs:
build:
runs-on: ubuntu-latest

steps:
# check it to your workflow can access it
# from: https://github.com/actions/checkout
- name: Checkout Repository
uses: actions/checkout@v2
with:
ref: source

# from: https://github.com/actions/setup-node
- name: Setup Node.js 14.x
uses: actions/setup-node@master
with:
node-version: "14.x"

- name: Setup Hexo Dependencies
run: |
npm install hexo-cli -g
npm install

- name: Setup Deploy Private Key
env:
HEXO_DEPLOY_PRIVATE_KEY: ${{ secrets.HEXO_DEPLOY_PRIVATE_KEY }}
run: |
mkdir -p ~/.ssh/
echo "$HEXO_DEPLOY_PRIVATE_KEY" > ~/.ssh/id_rsa
chmod 600 ~/.ssh/id_rsa
ssh-keyscan github.com >> ~/.ssh/known_hosts

- name: Setup Git Infomation
run: |
git config --global user.name '用户名'
git config --global user.email '邮箱'

- name: Hexo Clean && Hexo g
run: |
hexo clean
hexo g
- name: Deploy
uses: easingthemes/ssh-deploy@v2.0.7
env:
SSH_PRIVATE_KEY: ${{ secrets.HEXO_DEPLOY_PRIVATE_KEY }}
ARGS: "-avz --delete"
SOURCE: "public/"
REMOTE_HOST: ${{ secrets.REMOTE_HOST }}
REMOTE_USER: ${{ secrets.REMOTE_USER }}
TARGET: ${{ secrets.TARGET }}

需要在仓库的setting-secrets配上以下字段

  • HEXO_DEPLOY_PRIVATE_KEY:私钥
  • REMOTE_HOST:网站ip地址
  • REMOTE_USER:用户名(git)
  • TARGET:服务器上的网站路径(/www/wwwroot/Hexo)

若action失败,请检查服务器/www/wwwroot/Hexo目录权限所有者是不是git

宝塔面板 SSL 证书安装部署

手把手教你申请腾讯云免费SSL证书
宝塔面板 SSL 证书安装部署

把博客部署到自己服务器,并使用自己的域名访问时,若没有部署SSL可能会在浏览器有不安全的提示,可以按上面步骤免费部署。

参考