博客从 Ghost 迁移到 Hexo
这两天我的博客不能访问了,因为 Azure 服务器这个月到期了,服务器被彻底回收了。我立刻买了一个阿里云的服务器,安装好环境,配置好我钟爱的 Ghost 博客。因为之前的博客数据都备份的很好,很快恢复了全部博文。然后把我的域名修改一下解析,访问 www.race604.com,完美。正当我舒一口气的时候,网页突然变成了这样:

WTF,这是什么鬼,竟然要!!备!!案!!,因为之前的服务器实在香港,所以一直不知道还有这么回事。我按照网上的流程,赶紧走备案流程,填写资料、上传身份证、打印核验单、签字、拍照片照相上传,提交。我能做的就是等了。
同时,我向群里的大神们求助,了解到,如果使用阿里云的服务器,使用 80
端口搭建网站,必需要备案,而且备案流程需要 20 天左右,今天接到阿里云客服的电话,也确认需要 18 到 20 个工作日。我当时的表情是这样的:

群里面又好几个朋友主动 Share 给我主机,非常感激。还有朋友建议使用 Hexo 加 Github 或者 GitCafe 的 Pages 服务来搭建静态博客。在接下来差不多一个月的备案审核的等待中,我准备用这种方案来支撑一下。
吐槽了这么多,稍微平复了一下我焦躁的心情,下面说一下具体博客迁移的过程,有一些小坑,希望看了本文的朋友能避免。
1. Hexo 安装
Hexo 是基于 Node.js 的,那就非常简单了,就像项目主页上所展示的,几条命令就搞定了。当然前提是你要安装好 Node.js 和 npm。
$ npm install hexo-cli -g
$ hexo init blog
$ cd blog
$ npm install
$ hexo server
2. Hexo 写文章
Hexo 写文章,首先在你的 Hexo blog 根目录,使用如下命令:
$ hexo new <title>
这会在生成 source/_posts/<title>.md
Markdown 文件,这里的 <title>
就是标题,也是文章的 URL。文章就在这个 .md
文件写就可以了,但是需要注意一点,看一下这个生成的文件:
title: hello world
date: 2015-08-04 21:19:56
tags:
---
...
可见,在文件的头部,用 YAML 格式编写一些文章的基本信息。每个字段的含义就不解释了,特别需要注意的是,如果 title
字段有特殊字符,可能后面生成回出错,所以最好加上双引号("")。具体还有哪些字段可以设置,可以参考这里。 写好文章以后,使用如下命令,即可生成博客了:
$ hexo g
Hexo 所有命令,可以参考这里。具体的部署,放到后面说。
3. Ghost 博客导出
重前面我们可以看到,只要把文章导出成 .md
文件,放到 source/_posts/
目录下即可。
Ghost 博客后台有导出工具,导出的是一个 JSON 文件,包含了很详细的博文信息。因为文章较多,如果直接解析这 JSON 文件还有点费劲。因为 Ghost 后台是数据库存储,直接从数据库中导出更方便。
分析一下 Ghost 的数据库,发现 Schema 非常简单直接:文章存储在 posts
表中,特别是,表中 markdown
列,保存了文章的 Markdown 原文件;标签在 tags
表中;文章的标签,在一个关联表 posts_tags
表中。我们需要的数据有:标题、发布日期、文章标签、slug(文章的 URL)、正文等。
因为我的 Ghost 用的是 MySQL,我打算用 Python 直接从 MySQL 数据库中把文章读出来,Python 脚本主要的代码如下:
con = mdb.connect('localhost', user, password, dbname)
cur = con.cursor()
cnt = cur.execute('select id,slug,title,markdown,published_at from posts')
print 'Total %s posts' % cnt
posts = cur.fetchmany(cnt)
for row in posts:
print "post: %s" % row[1]
output = open(outDir + "/" + row[1]+'.md', 'w')
output.write("title: \"%s\"\n" % row[2])
output.write("date: %s\n" % row[4])
output.write("tags: [")
tagcnt = cur.execute('select name from posts_tags join tags on posts_tags.tag_id = tags.id where posts_tags.post_id = %s' % row[0])
for i in range(tagcnt):
if i > 0 :
output.write(' ,')
tag = cur.fetchone()
output.write("%s" % tag)
output.write("]\n")
output.write("---\n")
output.write(row[3])
output.close()
print 'export finish, OK!'
完整的脚本在 Github 上 GhostExport。执行本脚本,会按照 Hexo 的文档格式,把所有的文章到导出指定的目录中。
另外,此脚本依赖于 mysql-python,可以通过如下命令安装:
$ sudo apt-get install python-setuptools
$ sudo apt-get install libmysqld-dev
$ sudo apt-get install libmysqlclient-dev
$ sudo apt-get install python-dev
$ sudo easy_install mysql-python
把所有导出的 .md
文件放到 source/_posts/
目录下,执行如下命令:
$ hexo g
$ hexo server
然后在浏览器中打开:http://0.0.0.0:4000/, 就可以看到你的博客效果了。
4. 部署
Hexo 可以部署在 GitHub 和 GitCafe。因为是国内访问,我先考虑部署在国内的 GitCafe 上,这样访问速度快一些。你要注册一下你 GitCafe 账号,上传你的 ssh 公钥。具体步骤流水账如下:
- 在 GitCafe 注册账号;
- 在这里添加你的 ssh 公钥,这是为了让你在本机上不用输入密码上传代码,具体步骤参考这里。也可以专门为 GitCafe 单独设置一个 ssh 秘钥,参考这篇的秘钥配置部分(其他部分最好不要看了,因为我按照他描述的步骤,走了很多弯路);
- 在 GitCafe 上创建一个空的公开的项目,项目名必须和你的用户名完全一致,其他就不用管了;
- 配置 Hexo 部署,修改 Hexo 根目录的 _config.xml 文件,如下:
deploy:
type: git
repository: git@gitcafe.com:<username>/<username>.git
branch: gitcafe-pages
其中,`type` 是 `git`,有些博客写成 `github`,是部署不成功的。 `repository` 替换成你自己刚创建的 repo 地址,例如我的就是:`git://gitcafe.com/race604/race604.git`。
5. 部署,执行如下命令:
hexo d
然后访问 http://<username>.gitcafe.io
就能看到你的博客。例如我的是:http://race604.gitcafe.io
到这里基本使用就没有问题了。如果需要更多好玩的,请继续往下看:
5. 添加自定义域名
如果你有自己的独立域名,在 GitCafe 上前面创建的项目,进入“项目设置”,选择“Pages 服务”,在这添加你的域名。
设置你的域名解释,添加一条 "CNAME" 解析到 <username>.gitcafe.io
,例如,我就添把 www.race604.com 添加 CNAME 解析到 race604.gitcafe.io,直接访问 http://www.race604.com/ 即可。
6. 主题
自己的博客怎么能没有各种酷酷的主题,这里是官方的主题页面。这里推荐一个很漂亮的主题 Yilia,也是我用的主题。安装非常方便,官方文档说的很清楚。
7. 同时部署 Github 和 GitCafe
在群里,有大神建议同事部署 Github 和 GitCafe,配置 DNS,国外访问 GitHub,国内就访问 GitCafe。具体教程有: 1. 在github和gitcafe上同时部署hexo博客;
2. DNS 设置国内国外分别访问参考这篇后半部分。
8. 添加百度统计
网站怎么能没有访问统计,Hexo 添加百度统计也非常容易。因为我用的是 Yilia 主题,这篇文章详细介绍了 Yilia 主题怎么添加百度统计。
9. 添加搜索
今天刚好干货集中营提到了,使用微搜索可以轻松添加站内搜索。我试了一下,确实非常方便,我也给我的博客添加上了,欢迎搜索。具体添加方法,可以模仿前面的添加百度统计一节。
10. 兼容 Ghost 问题
- 评论
Yilia 主题用的多说评论,我之前的 Ghost 也是多说。但是因为里面的评论文章 Key 配置的不一样,所以不能自动迁移过来,确实有点遗憾。 - 文章 URL
在_config.xml
中,文章的 URL 默认配置是:
permalink: :year/:month/:day/:title/
为了和以前的 Ghost 文章 URL 一致,修改如下:
permalink: :title/
另外,因为 Ghost 的 Tags 文章列表,路径是 /tag/tagname,而 Hexo 默认是 /tags/tagname,这个也可以为与 Ghost 一致,修改 _config.xml
:把 tag_dir: tags
改为 tag_dir: tag
即可。但是 Hexo 是大小写敏感的,所以还是不能完全兼容 Ghost 的所有的 URL。 3. RSS Feed
Hexo 默认没有输出 RSS Feed,可以通过安装 hexo-generator-feed 插件输出 RSS。但是输出的 RSS 路径有点不一样,以前订阅博客的朋友,可能就收不到更新了,还有我的自动邮件列表也不工作了。
总结
现在我的博客迁移已经完成了,写了这么多,总结一下:
- 选择国内的 VPS 需要备案,备案时间最少 18 到 20 个工作日;
- 做好数据备份;
- Blog 平台切换有很多代价,包括时间和兼容性。在迁移的时候,需要全面评估。