技巧: 迁移博客到 VPS (借助hook)

朋友还是发现了我的博客。。笑,看来我隐修失败了?那么给网站提提速度吧。

记录一下把博客从 GitHub 迁移到自己的服务器的过程。

其他可选方式还有,七牛云镜像存储(但这有个问题,后期不能添加评论系统(需要vps的数据库支持))

如果使用七牛云镜像,可以参考 这篇文章

(我后期要在 vps 上做很多实验,给本站添加很多功能,所以不考虑 七牛云 了)

目标:

  • 可以提交到服务器和github上 (访问我的 vps 要比 github 快多了)
  • 多态终端(mac/pc)都可以提交 (在家 imac, 外出 mpb13.3)

备选方案

如果既要提交到 Github 上,也要提交到自己的 VPS 上(最红域名连接的是 VPS),这里有几个方案可选:

使用 Github 提供的 webhook.

  • 优点: 本地每次提交到 Github 之后,VPS自动 pull 相关内容
  • 缺点: 多态 mac/nodejs环境 间同步不方面,适合单个主机 nodejs 环境

所以远端 VPS 必须存储一个库,最好是裸库.

使用库自带的 Git hook,远端存储一个裸库

  • 优点: 多个 mac/nodejs 环境也可以同步原始 markdown 资料(写作环境)
  • 缺点: 裸库放在远端浪费上传流量(况且本地已经存在多个版本了,即已经有裸库了)

具体原因: 我的所有blog版本,外层又套了一层库,专门存储各个版本。(而这个库又被 onedrive 云存储)

move

网友的意见,比如: (图片来源: SegmentFault)

但是实际上,heox d 的时候就可以指定多个库的指定分支,而且不止git这一种协议。

All generated files are saved in the public folder. You can copy them to wherever you like.

但是如果使用 FTP, SFTP 等,就要提供密码,具体操作参考,这个不考虑。

最终决定:

  • 本地 NAS 存储所有博客版本(本地集成所有版本裸库) (已经 OK)
  • VPS 保存一个 public 目录的裸库(但不要 –set-upstream; 直接在部署里配置位置即可)
  • 在原本 push 到 Github 的基础上同时 push VPS 的 git 库
  • 切换域名到 VPS

实际操作

下面的步骤,我是按顺序操作的。

服务器

VPS 没有安装服务器,如果要跑起来,必须要安装服务器才可以。

主要是安装 Nginx, 具体参考 Ubuntu 安装 Nginx

  • sudo apt-get install nginx
  • 启动 ngix, sudo /etc/init.d/nginx start

然后访问 VPS 的 IP试试: (本地用 wget 也可以测试 wget http://127.0.0.1)

ngix

停止服务 sudo /etc/init.d/nginx stop

  • 找到配置文件 /etc/nginx/sites-available/default,根目录的 conf 不要动.

配置详情见下面:

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
server
{
listen 80;
listen [::]:80;
server_name www.merlinblog.site merlinblog.site;
index index.html index.htm index.php default.html default.htm default.php;
root /home/git/hexo_public;

#error_page 404 /404.html;
location ~ .*\.(ico|gif|jpg|jpeg|png|bmp|swf)$
{
access_log off;
expires 1d;
}

location ~ .*\.(js|css|txt|xml)?$
{
access_log off;
expires 12h;
}

location / {
try_files $uri $uri/ =404;
}

access_log /home/git/blog.log;
}

建立一个页面

1
echo "hello" > /home/git/hexo_public/index.html

然后启动试试, sudo /etc/init.d/nginx start,OK。

配置域名

配置 域名解析

  • 删除原来项目中的 CNAME 配置
  • 把原来的域名指向这里(域名解析处理好 IP 即可;端口由 Ngix 负责了)

域名解析系统可能还是会指向老的域名系统,可能需要等几分钟。

  • 可以用 ping 测试你的域名是否已经指向了你的 VPS 的 IP

初始化裸库

在 VPS 上初始化一个裸库,为了保存 public 目录的内容。(跟踪public目录的变化)

你可以建立一个用户 git 或者直接使用 root 用户,可选(但你要为此做一些列的 root 身份赋予工作)。

1
adduser git

但是我没有必要,因为我添加 root 用户时,指定的 SSH Key 就是现在的 Key。(也是部署的 key)
如果不行,则要做相应的添加,例如 root 用户还没有添加的话: (给 root 用户设置)

1
2
3
4
mkdir ./.ssh
# 把部署时用到的公钥写入 .ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
chmod 700 ~/.ssh

其实,如果你都能免密码,使用ssh登录到你的 vps,这就没有必要在做其他工作了,即

1
ssh root@ip地址

然后我就以这个身份开始建立一个裸库,如果这里不建立裸库,就不能使用 git 协议push.

当然,如果 hexo d 支持 scp 的话,裸库也不需要了,直接拷贝即可

1
2
3
# git init --bare source.git
# echo "git --work-tree=/home/git/hexo_public --git-dir=/home/git/hexo_source/source.git checkout -f" >> /home/git/hexo_source/source.git/hooks/post-receive
# chmod a+x /home/git/hexo_source/source.git/hooks/post-receive

这样裸库就 OK 了。(一会儿 push 直接使用 root 身份即可)

部署配置

其实 .deploy_git 目录中根本没有指定远端是什么:

origin

也就是说,可以指直接在_config.yml 中配置 repo, 然后 push. (push的时候默认临时指定一个 track stream)

deploy

此时可以看到, vps 的 hexo_public 目录已经有内容了:

final

最终收验

  • 404页面失败, 解决: 恢复配置 error_page

404

  • 反复更新,看下能否即时更新? (OK)

总结

由于 vps 在海外,其实最终效果还是马马虎虎,但是至少比 git pages 快。足够了。

那么后期要做的事情,可以折腾的事情:

  • 填补评论系统 (以每篇文章的 addr_link 加密值为 index)
  • 建立本地图库,过去都是存储在 七牛云上,现在可以建立本地图库了

Merlin 2018.2 最终弄完发现速度快了,但是也没有快很多;有收获就是好事儿。

文章目录
  1. 1. 备选方案
  2. 2. 实际操作
    1. 2.1. 服务器
    2. 2.2. 配置域名
    3. 2.3. 初始化裸库
    4. 2.4. 部署配置
    5. 2.5. 最终收验
  3. 3. 总结
|