最近开始使用 hexo 和 hugo 写博客,静态博客相对于 Wordpress, Typecho 等的好处包括速度的安全性,但在部署和易用性方面可能略逊一筹,这也是劝退很多新手的主要原因。
如何将 hexo 和 hugo 发布到自己的云服务器,最直观的做法便是在本地用hexo g
生成静态网页文件,再将其通过 FTP 等方式上传。但这样的方法看起来简单,实则操作起来麻烦,也不能保证传输的准确性,于是得想想其他方法。
既然无法很好做到传输,那么可以直接将博客的写作环境搭建在服务器本地中。具体做法是直接在服务器中安装 code-server 进行编写、编译,这样免去了传输的过程。并且 code-server 是一个“行走的”开发环境,在任何设备上访问自己的 code-server 地址就可以便捷地进行开发。
code-server 的具体使用方法可参考:
还有一种方法是下文要讲的 Git Hook 部署。使用这种方法可以将文件一键推送到服务器中。目前我写博客便是两种方法的结合,即在 code-server 中进行编码写作,编译后通过 git 推送到另一台云服务器中。
配置 git
1.安装 git
apt-get install git
2.创建 git 用户
为了安全,我们创建一个 git 用户以专门运行 git 服务。
adduser git
3.创建证书登录
将计算机中的~/.ssh/id_rsa.pub
文件里的内容添加到服务器的/home/git/.ssh/authorized_keys
中。添加公钥之后可以防止每次 push 都输入密码。
如果你之前没有生成过公钥,则可能就没有
id_rsa.pub
文件,具体的生成方法,可以 参考这里
4.初始化 Git 仓库
可以将其放在/var/repo/blog.git
目录下:
mkdir /var/repo
cd /var/repo
git init --bare blog.git
使用--bare
参数,Git 就会创建一个裸仓库,裸仓库没有工作区,我们不会在裸仓库上操作,它只为共享而存在。
5.配置 Git Hook
我们这里要配置的是post-receive
的 hook ,在整个 git 操作完成后被运行。
在blog.git/hooks
目录下新建一个post-receive
文件:
cd /var/repo/blog.git/hooks
vim post-receive
在post-receive
文件中写入如下内容:
#!/bin/bash
git --work-tree=/var/www/hexo --git-dir=/var/repo/blog.git checkout -f
注意,这里的/var/www/hexo
要换成你的部署目录,并且必须是空目录,否则 git 推送时会报错;并且也要赋予 git 用户操作这个文件夹的权限,或者直接将其chmod 777
。
设置这个文件的可执行权限:
chmod +x post-receive
6.改变拥有者
改变blog.git
目录的拥有者为git
用户:
chown -R git:git blog.git
7.禁用 shell 登录权限
出于安全考虑,我们要让git
用户不能通过shell
登录。编辑/etc/passwd
,在/etc/passwd
中找到类似下面的一行:
git:x :1001:1001:,,,:/home/git:/bin/bash
将其改为
git:x :1001:1001:,,,:/home/git:/usr/bin/git-shell
这样就可以通过 ssh 正常使用 git ,而无法登录 shell 。
至此,服务器端的配置就完成了。
本地配置
hexo
deploy:
type: git
repo: git@服务器ip:/var/repo/blog.git
branch: master
如果ssh端口不是80怎么办? 可不能在上面的ip后直接加上端口号,因为:
后的内容会被解析,这就导致报错。
可以在本地 ssh 的 config(~/.ssh/config) 中进行设置:
Host myServer
HostName 你的ip
Port 你的ssh端口
然后 hexo 中配置:
deploy:
type: git
repo: git@myServer:/var/repo/blog.git
branch: master
就可以了。