hexo部署到云服务器

hexo部署到云服务器

安装git并添加git用户

1
2
3
4
$apt install git
$useradd -m git #参数m代表为该用户生成家目录
$passwd git #为git用户设置密码

添加公钥

如果之前没有生成SSH公钥,就回到本地计算机用如下命令生成

1
2
3
$ssh-keygen -t ed25519 -C "your_email@example.com"
# 或者
$ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

在用户文件夹的.ssh目录下,会生成id_rsa和id_rsa.pub文件,分别是私钥和公钥。

视角回到远程计算机

1
2
3
$su - git #切换到git用户
$mkdir ~/.ssh
$vim ~/.ssh/authorized_keys

将id_rsa.pub文件里面的公钥复制粘贴进去,就添加好了。

添加完公钥之后调整权限使得只有git这个用户可用。

1
2
$chmod 600 /home/git/.ssh/authorized_keys
$chmod 700 /home/git/.ssh

在本地主机的终端检查是否可以登录:

1
$ssh -v git@服务器IP #参数v代表verbose,详细显示调试信息,可以去掉

这样就可以用git用户免密登录到服务器了。

配置hooks

和其它版本控制系统一样,Git 能在特定的重要动作发生时触发自定义脚本。 有两组这样的钩子:客户端的和服务器端的。 客户端钩子由诸如提交和合并这样的操作所调用,而服务器端钩子作用于诸如接收被推送的提交这样的联网操作。

你将其理解为一个触发器即可,发生某个事件或者说动作的时候就执行自定义脚本。

Hexo部署博客的过程:

  1. 使用源代码(未渲染的markdown以及主题的代码等)生成网站静态文件
  2. 将静态文件通过git从本地库提交到远程库
  3. git的远程库使用bare参数做成没有工作区的裸仓库形式,将网站目录当做其工作区,在远程裸仓库接收到推送时,将收到的内容检出到网站目录中,完成对网站内容的更新。

首先建好网站目录:

1
2
3
$mkdir -p /data/www/blog
$chown -R git:git /data/www/blog
$chmod -R 755 /data/www/blog

接着建好裸仓库

1
2
3
$cd /home/git
$git init --bare blog.git
$vim blog.git/hooks/post-receive

最后编写hooks/post-receive脚本:

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

这个命令是用于从指定的 Git 仓库(参数git-dir)检出文件到一个非标准的工作目录(参数work-tree),强制覆盖原有文件。

由于新建的是裸仓库,没有工作空间,所以在触发post-receive(接收提交)的时候,需要利用以上钩子将提交内容检出到指定的工作空间中,也就是网站目录下,这样就实现了,git提交到这个远程库就可以更新网站。

最后调一调权限

1
2
$chown -R git:git /home/git/blog.git
$chmod +x /home/git/blog.git/hooks/post-receive

配置Nginx

安装不必多言:

1
$apt install nginx

修改配置

1
$vim /etc/nginx/nginx.conf

主配置文件nginx.conf中导入了sites-enabled目录下所有配置的配置

1
2
3
http {
include /etc/nginx/sites-enabled/*
}

里面只有一个default文件,还是链接着sites-enabled同目录下sites-available下的default的软链接文件。

相关概念参见:Nginx 的 sites-available 和 sites-enabled 的区别 - 简书

这是为了方便配置各个站点而设计的结构。于是在sites-available复制了一份default文件,在sites-enabled新建了对应的链接文件:

1
2
$cp /etc/nginx/sites-available/default /etc/nginx/sites-available/hexo-blog
$ln -s /etc/nginx/sites-available/hexo-blog /etc/nginx/sites-enabled/hexo-blog

然后在配置文件中配置好listen、root、server_name

最后检查重启

1
2
$nginx -t # 测试配置文件有无语法错误
$nginx -s reload # 重载配置文件

这样一来就全部配置好了,可以输入IP在浏览器访问。

部署SSL证书

将域名解析记录修改为新的IP之后,还需要部署SSL证书来让用户可以通过https访问。

免费证书的签发有效期限从一年变为了三个月,三个月要重新申请一次。

在nginx配置目录新建一个目录用来专门放ssl证书文件。

1
$mkdir /etc/nginx/certificate

nginx配置如下,要注意这里的地址是相对于nginx.conf文件的地址而不是相对于sites-available/hexo-blog的地址,因为站点配置最终是被导入到主配置文件当中。

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
server {
listen 80 default_server;
listen [::]:80 default_server;

# SSL configuration
#
listen [::]:443 ssl default_server;
listen 443 ssl default_server;
ssl_certificate certificate/scs1749815856794_mtccy.top_server.crt;
ssl_certificate_key certificate/scs1749815856794_mtccy.top_server.key;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;

root /data/www/blog;

# Add index.php to the list if you are using PHP
index index.html index.htm index.nginx-debian.html;

server_name mtccy.top;

location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
try_files $uri $uri/ =404;
}
}

这样一来就完成了,可以通过域名访问到博客,和几天前过期前一样。

本地配置一键部署

  1. 安装hexo-deployer-git插件
1
$npm install hexo-deployer-git --save
  1. 编辑 _config.yml
1
2
3
4
deploy:
type: git
repo:
tencent: 'git@服务器IP:/home/git/meshddy-blog.git'