如何在 Heroku 上免费搭建 Ghost 博客

博客又搬了一次家,稍微梳理一下发现这个博客的搬家历程都可以记一笔了:从最初的 Wordpress 到 Jekyll 在到 Jekyll 的加强版 Octopress 再到 LogDown 最后又切换到了 Ghost,从国外到国内换过若干主机,从手动搭建到服务托管再到基于 docker 容器托管... 如果让我重新选择一次的话,我肯定直接选择简书Medium 或者 Tumblr 而不是这么穷折腾了,这就是命,得认命,谁叫我是搞 IT 的呢。

使用最久的博客系统是 Ghost,这个系统非常符合我心目中理想的博客的形态,小而美,干净,纯粹...哦,我说的是后端系统,不是说前端。很早以前偶然在 V2Ex 上看到一个帖子介绍可以在 DaoCloud 上 30 秒免费搭建一个 Ghost 博客,当时 DaoCloud 的政策是给每个用户赠送一定的免费资源配额,用来搭建一个博客刚刚好,几乎就是填写个名字,动几下鼠标就完成。所以这个博客就从 DigitalOcean 搬家到了 DaoCloud,后来我还把 RubyConf China 的官方博客也搬了过来。

最近一段时间发现博客总是不能访问,经常需要登录到 DaoCloud 的管理平台上去手动重启一下博客 Docker 进程,但是过一段时间就又自动停了,检查日志也没有发现什么问题,一开始也没有特别在意(我并不是 DaoCloud 重度用户),几次三番之后觉得总这样不是办法,稍微调研了一下发现,原来之前在 DaoCloud 上的免费资源配额变成了云端受限资源,并且运行环境是云端测试环境,Docker 进程每 24 小时会自动停止。

云端受限资源是 DaoCloud Services 提供给用户用以开发、测试使用的云端免费资源,系统会根据资源使用情况智能回收。 若想部署应用到生产环境,请使用自有主机功能。

毕竟用了 DaoCloud 家一年多的免费资源,所以我没有任何抱怨的意思,可能是 DaoCloud 政策的修改通知被我忽略了。我的建议就是一旦应用自动停止后,访问应用的页面最好能给出一个具体的信息,明确是因为云端受限资源自动停止导致的 404 页面,可能会更好一些。

国外的免费 Ghost 搭建平台很多,最主要的有 OpenShift,Microsoft Azure, Amazon EC2 以及 Heroku。我对 Heroku 最熟悉,所以 Heroku 是我的首选,不过 Heroku 有一项限制就是只支持 PostgreSQL 数据库,而 Ghost 官方决定从 1.0 开始把 MySQL 作为默认数据库,所以选择 Heroku 可能就意味着只能使用 0.11.3 并且将来不升级了。

安装流程并不难,就是一个标准 NodeJS + PG 数据库的应用部署流程,通过 Heroku 自带的命令行程序就可以全部搞定,配置的关键点是给应用实例添加了 PG Addons 后,要通过 heroku config:set KEY=VALUE 的方式把数据库链接相关信息设置到主机实例的环境变量中,然后 Ghost 就可以通过读取环境变量来连接数据库,config.js 文件中的关键配置信息如下:

database: {  
  client: 'pg',
  connection: {
    host     : process.env.POSTGRES_HOST,
    user     : process.env.POSTGRES_USER,
    password : process.env.POSTGRES_PASSWORD,
    database : process.env.POSTGRES_DATABASE,
    port     : '5432',
    charset  : 'utf8'
  }
},
server: {  
  host: '0.0.0.0',
  port: process.env.PORT
}

配置并部署完成后,访问 http://lvguoning.herokuapp.com 一次成功,初始化用户后,在后台直接导入之前已经导出的数据,一次性搞定。不过还没有完,我希望把我的域名 http://lvguoning.com 绑定到这个博客上,这一步出现了一个小插曲,Heroku 总是提示我我的域名已被另外一个应用绑定过,发现是因为之前使用 LogDown 的时候,有一个高级的付费功能可以绑定自己的域名,而 LogDown 也是部署在 Heroku 上的,但是我的 LogDown 付费已过期,但是域名并没有自动解绑,也不提供手动解绑的功能,于是半夜通过微信找 LogDown 的作者 XDite 求助,然后 XDite 很快就帮我搞定解绑,之后再重新绑定域名就没有任何问题了。

发誓不会再把时间浪费在折腾博客系统本身,时间应该用在更有价值的事情上面,希望能通过这个博客多分享一些有价值的学习,思考,心得体会。