从octopress到ghost

我曾经非常肯定地和夫人提到过,我们这个博客一建起来就是用来写上几十年的。我花了不下几个礼拜来整理这种octopress类型博客,当时搞得我心力憔悴,但却颇有成效,不仅达到了电子邮件自动发博客的要求,写的几篇octopress使用心得也引人留言、转载交流,霎时间就很有作家的感觉。从12年初开始做这个博客,到现在也有3年时间,用得都很顺畅,的确有些小毛病,也都忍了。

  1. 系统3年没有更新,有些跟不上时代了;
  2. 系统配置繁琐,导入导出系统不完善,迁移成本高。我就不再说disqus评论系统mapping url时有多么悲催了。也因此,当我想要更换服务器的时候,我首先就得考虑是不是花上一个周末把系统这个备份进行迁移,还要做好安装的RVM版本号不对无法达成目标的准备;
  3. 博客的建立还和我的一个性格有关系,当时就是以it simply works的标准来要求的,所以在加入诸如JekyllMail的插件后,打上各种补丁,也只是要求as long as it works,并未对未来迁移预留出足够的认识。使迁移成本巨大;
  4. 最终让我下定决心迁移的原因是,在我打算更新一篇新博客的时候,系统给我来了个罢工(系统的崩溃应该是来自于一篇由thunderbird发出的博客邮件导致,可能是没设置好utf-8,使正文里出现了不必要的BOM信息,在网站rebuild时候,无法继续,解决方法就是回滚git,嗯,要是不会的话,更直白些就是在github中删除了更新的内容,然后)。出现了yaml读取错误,放在以前,我肯定就是不眠不休地试出来了,现在,呵呵。

得亏有了十一长假,我在家里无所事事的时候,想着要不就翻起袖子来个大行动,一次性把这些问题都解决了吧。

寻找合适的博客系统

在网上搜了一下,又试了几个,一开始决定的是wordpress,原因很简单,octopress没有更新的很大原因就是没有太多人为其做出贡献,结果就停滞了。现在,要做博客,一定要有很多人做的项目,这样问题在出现之前网上就已经有人解决了。是这个道理,但是在我部署好以后,我就真的吐槽了,非常不喜欢这个博客的样子,是的,我知道可以更新主题,我的问题是连带的那些主题都是很屎的,只好无奈放弃。后来我就决定我喜欢的主题必须是minimalist类型的,以这个作为出发点开始了新的寻找。

16个minimalist博客系统推荐里,我先找到了svbtle。非常欢喜地点击进去后,发现是付费的。作罢,然后就看到了目前的选择ghost。很小清新的感觉,要不试试。于是就有了现在的博客

ghost的安装

ghost的安装是一种出乎意料的简单,首先它不是静态系统,虽然对vps内存要求高些,但也不是无法达到,最大的好处的不需要build,不需要等待,秒更新。安装时,我具体参考了这篇文字:How To Install Ghost on CentOS.这里要说的是,特别注意安装时候的环境设置问题,一个是npm的安装,一个是node.js的安装。和以前把octopress运行起来了要花整夜的时间相比,这个简直就是秒懂。

安装好后,系统是默认运行在2368端口的,也就是说,直接打开网址是没用的,要添加:2368,参考这篇文字How to Proxy Port 80 to 2368 for Ghost with Nginx。因为我安装的是lnmp的一键包,设置时也花了我不少时间,后来我就直接修改了我自己的default.conf,点击可以下载得到。

完成后几个有用的网址提一下:

  1. debug网址:可以进行导入导出和邮件测试,http://yourdomain.com/ghost/debug
  2. 文章发布网址:http://yourdomain.com/ghost

博文导入导出的问题

安装过程遇到的问题应该大部分要归结到是octopress的迁移问题。很难,也很花时间,我也很庆幸能够找到解决方式,因为我的博客文字从2004年开始书写,算下来应该是过500篇了,我需要做的不仅是文字要,10年前别人在我这的评论也要。

我试了几个从octopress导出到ghost的github程序,最后选定了这个octopress2ghost,因为其他的都不干活。其实,刚开始时这个也是不工作的,我在导出时,一导就报错。然后我就开始试错。没错,这个是非常好的习惯,真的非常好,如果你有的话,我只能恭喜你了。结果发现12年以后所有用octopress写的都可以正常输出,但是之前从wordpress转过来的就有问题了。有问题就要解决,在通过对比后,我发现,wordpress转过来的在文件头date上头尾有两个单引号,我要是可以批量把这对单引号去了,那么应该就是没问题的吧。我收到把2004年的date引号去掉,发现非常反人类,就开始寻找新的批处理方法。我第一个想到的是用python,可惜不会。第二个灵机一现的是用grep和sed方法,我虽然不会,但是找找总归能找到的,确实找到了,不过是我自己试出来的。

sed  -ig "s/[\'\"]/ /g" *.markdown

这个命令会把目录里所有的文字中所有的单引号都去掉,你看,是个笨方法吧,运气好的是,哥确实没有使用单引号的习惯。

这样经过处理的_posts文件夹中的文件就合适octopress2ghost的script进行操作了。然后产生了第二个问题,单个文件输出ok,也能导入到ghost,一整个文件夹就是不行。解决的方法呢?嗯,仍然是笨方法,按年份就行输出。我把posts按年份划分文件夹2004,2005...2014,分别进行如下命令的处理。

python octopress2ghost.py 2004 GhostData.json | python -mjson.tool > 2004.json

在2008年的文件夹里,仍然出现读取失败,同样的道理,按月份进行试错,找出了无法输出的2008-08-19的一篇博客,之后单独发布到ghost解决问题。当然,找出出错的这篇后,就可以对剩下所有的进行导出了,也成功啦。

导出没问题,那么导入应该也没问题吧。多年以后,当我再次打开这篇文章的时候,我一定会对自己说,前人总结的墨菲定律(本科法律英语老师Gilbert的版本)真的是诚不欺我。

When something can go wrong, it will!

导入的时候,出现如下错误提示:

Value in [posts.slug] cannot be blank. Value in [tags.name] cannot be blank. Value in [tags.slug] cannot be blank

我百思不得其解,我在所得到的json文件里确实没有看到这些中括号命名的函数啊,你让我咋整。后来是回忆了一下,以前在学习python的时候,嗯,强调一下是自学,json文档应该是嵌入式的,[tags.slug]就是[tags]下的[slug],想到这个,解决方法豁然开朗,搜索[slug]中值为空的,删除即可。问题解决。还是笨方法,试错试出来的。我个人认为非常像特斯拉的设计,哈哈。

...DOE(design of experiment)。我一口鲜血差点就喷了出来。搞工程的人对这个概念应该都很熟悉,就是穷举所有的可能数字排列组合,然后选取其中一部分组合进行仿真和实测,比较输出的结果...

导入成功后,基本上博客的正文就全部没问题了。正文没有问题不代表整个系统没有问题,是的,还需要一个评论系统,长达十年的评论移植。

评论系统的导入导出

首先要按照disqus的评论系统,好在ghost是个很完善的生态,如何安装已经有了guide,照着做就可以了,没问题的。我个人不需要comment count,所以我只是更新了第一个post.hbs,sound and fast. disqus的评论运作方式是这样的,它不管你博客正文写的是啥,只要是这篇博客的地址和它数据库中的地址一模一样,它就把数据库中的评论给调出来,所以,解决评论系统导出的最笨方法就是运行tools中的url mapping选项,先下载出评论系统url的指针csv文件,然后一个一个对照,比如,这篇文章以前的网址是这个,现在是那个,只要两个并排单元格列出,disqus就会把网址更新。很简单,也很耗时,因为哥以前做octopress时的as long as it works的原则,留下了很多重复链接,头尾高达千余个,我就这样一个一个找出来,对应到当前的网址。我希望未来不要再做这样的活了,至少不要让我再做。哈哈。。
把我折腾的死去活来的csv url mapping

系统的微调

正如我所说的,我选择了ghost下的一个minimalist的主题,系统很整齐和漂亮。通过对.hbs文件的一些微调可以得到自己所想要的效果。比如:

  1. 建立navigation page。在发布时直接点击小齿轮,发布为静态页面,这样你得到的url就没有时间戳,干净的像http://colorsr.us/about,然后在default.hbs上进行相应修改即可。
  2. 我发现了一个很棒的mardown编辑器,自动和evernote同步,叫马克飞象,很强大,是chrome offline应用,估计以后会是我的主流书写器。
  3. 我比较郁闷的是,每次点击主页都会跳到latest post,而这个网页地址又没有相应改变,所以无法留言。其他也还好,目前。今天先到这儿,let us call it a day. hmm, a rough day.
  4. 另外几个问题要注意的有,比如,给林夫人加个账户,让网站自动运行在vps重启后。小问题,都可以解决的。碰到无法继续下去情形,请参看改用如下语句。
            npm install pm2 -g --unsafe-perm
pm2 startup centos

ghost迁移小结

ghost是个好系统,套用我之前在做octopress的一句话来说就是,嗯,我和林夫人应该可以用这个写上很久,怎么也得要60年吧。