前言
之前,我的博客一直是使用 Hexo 框架部署到 GitHub Pages 的。最近购买了服务器,想要将博客从 GitHub Pages 迁移到服务器上,一方面可以加速访问,提高用户体验,另一方面博客可以被百度搜索引擎搜到,毕竟国内还是用百度的人多。本篇记录一下迁移的过程,以供他人参考
其实一开始是打算在服务器直接建 Hexo 项目的,只转移博客的 md 源文件。后来发现每次上传都要 ssh 连接,非常的不方便,所以改用建立远程仓库的方式
在服务器建立 Git 仓库
安装 Git
正常情况下 Linux 操作系统都会自带 Git,通过 git --version 输出版本号判断是否已安装 Git。如果没有安装请自行搜索教程
创建 Git 仓库
新建一个 Git 裸仓库,并且新建一个 post-receive 文件
裸仓库是一个没有工作目录的 Git 仓库,它只包含 .git 目录,不包含项目文件,只包含版本控制信息。这种类型的仓库通常用于作为远程仓库使用,或者作为多个仓库的共同基础
我这里选择在 /home/ubuntu 下新建一个 git 文件夹,用来存放裸仓库
在 git 文件夹下执行 git init --bare hexo.git 命令新建一个裸仓库
使用任意你喜欢的方式在 hexo.git 文件夹下的 hooks 文件夹中新建一个 post-receive 文件,写入以下内容:
| 1 | git --work-tree=/home/ubuntu/hexo --git-dir=/home/ubuntu/git/hexo.git checkout -f | 
post-receive 是 Git hooks 的一种,它位于 Git 服务器上的裸仓库中。Git 钩子是脚本,它们在 Git 仓库的各种重要动作发生时自动执行。post-receive 钩子在推送操作完成后执行
这条命令指定 /home/ubuntu/hexo 作为工作目录,所有上传的文件都会保存到这个文件夹下,指定 /home/ubuntu/git/hexo.git checkout 为 Git 仓库目录。checkout -f 命令会强制检出当前 HEAD 指向的分支的最新状态到工作目录。这会覆盖工作目录中的所有文件,丢弃所有未提交的更改,从而覆盖原博客旧文件
由于我已经提前创建 /home/ubuntu/hexo,所以才会指定它为工作目录。在上传前要确保工作目录存在
同时要授予该文件可执行权限:
| 1 | chmod +x /home/ubuntu/git/hexo.git/hooks/post-receive | 
配置 Git 密钥
由于我之前已经生成过了密钥,所以这里不需要再重新生成了,Windows 下密钥的默认保存位置为 C:/Users/用户名/.ssh/id_rsa.pub,Linux 下的默认位置为 ~/.ssh/id_rsa.pub
如果没有生成过的话可以使用 ssh-keygen 命令创建密钥
之后在服务器的 ~/.ssh 目录下新建 authorized_keys 文件,使用任意你喜欢的方式将 id_rsa.pub 文件中的所有内容复制到 authorized_keys 文件中
之后修改权限
| 1 | chmod 600 ~/.ssh/authorized_keys | 
修改 Hexo 上传仓库
修改 Hexo 项目根目录下的 _config.yml 文件:
| 1 | deploy: | 
其中 ubuntu 为仓库拥有者的用户名,x.x.x.x 为服务器公网 ip,冒号后的为远端仓库路径
这时候我们使用 hexo g,就可以将原本应该 push 到 GitHub pages 的文件,push 到我们服务器的仓库了

配置 Nginx
访问博客
不出意外的话,现在已经可以通过访问 4000 端口号或域名进入博客了