最近开始使用 hexo 和 hugo 写博客,静态博客相对于 Wordpress, Typecho 等的好处包括速度的安全性,但在部署和易用性方面可能略逊一筹,这也是劝退很多新手的主要原因。

如何将 hexo 和 hugo 发布到自己的云服务器,最直观的做法便是在本地用hexo g生成静态网页文件,再将其通过 FTP 等方式上传。但这样的方法看起来简单,实则操作起来麻烦,也不能保证传输的准确性,于是得想想其他方法。

既然无法很好做到传输,那么可以直接将博客的写作环境搭建在服务器本地中。具体做法是直接在服务器中安装 code-server 进行编写、编译,这样免去了传输的过程。并且 code-server 是一个“行走的”开发环境,在任何设备上访问自己的 code-server 地址就可以便捷地进行开发。

code-server 的具体使用方法可参考:

随时随地写代码--基于Code-server部署自己的云开发环境
日期: 2022-06-25   标签: #部署  #折腾 
前言 在平时的学习工作中,我们经常会用到代码编辑器,Vscode已经成为我们的首选。但是本地编辑器有个弊端就是当我们在家庭和公司之间移动的时候 ......

还有一种方法是下文要讲的 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

就可以了。