好久没写 Blog 了,净搬家玩儿了。前一段时间,Linode 降价,就把 Blog 从 Vultr Tokyo 区搬到了 Linode Tokyo 2 区,速度并没有太大提升。这两天发现我的信用卡突然可以在 GCP 上注册了,果断试用了个一年份的 GCP 台北彰化机房的 VPS。从家里访问延迟从 200 降到了 90,traceroute 发现也不用过美国转一圈了,效果还是不错的。

新主机打算把包括前置的 nginx 等等全部服务都跑到 Docker 里面,在 Docker 环境里面把请求反代到各个业务服务,主机自己除了 Docker 服务就不跑其它的服务了。在 Docker 里面跑个 GitLab runner,所有的服务配置都挂在 gitlab.com 的私有仓库里,用 GitLab CI Specific Runner 做配置更新。

面对的第一个问题就是把之前 pm2 跑的 Blog 迁到 Docker 里面。Docker 官方有个 Ghost 的镜像,用的时候踩的几个坑记录如下:

因为之前的 Ghost 目录里面,源码和资源(数据库,图片等)存在一起了,文件结构是这样的

/var/www/ghost
+- config.js  # 配置
+- content/   # 资源
|  +- data/   # 数据库
|  +- images/ # 图片
|  ...
+- core/      # 代码
...

因为 Docker Ghost 镜像鼓励源码和资源分离,这样可以把资源挂载出来作为卷,它是这么组织的

/usr/src/ghost # 代码目录
+- config.js   # 配置,软链到 /var/lib/ghost/config.js
+- content/    # 不用
+- core/       # 代码
...

/var/lib/ghost # 资源目录
+- config.js   # 配置
+- data/       # 数据库
+- images/     # 图片
...

这里面有个问题就是 config.js 必须在代码目录里面,但是它应该在卷上挂载出来。于是就把代码目录里面的 config.js 软链到了资源目录里面的 config.js 上了。

搞明白这一点,我就可以挪资料了:

  • 把老主机的 /var/www/ghost/content/* scp 到新主机上 /data/ghost 目录下,不保留 content 目录
  • 把老主机的 /var/www/ghost/config.js 文件 scp 到新主机上 /data/ghost 目录下

这样我们就准备好了挂载的资源目录。

为了让 Ghost Blog 支持 Docker 环境,我还要修改 config.js 里面的一些配置:

  • 因为 nginx 不再是反代到本机了,而是反代到另一个容器里,所以 server.address127.0.0.1 换成 0.0.0.0
  • 之前的数据库文件地址是 path.join(__dirname, '/content/data/ghost.db')。但是因为软链的文件 __dirname 指向的是链接的位置(代码目录 /usr/src/ghost)而非实际文件的位置(资源目录 /var/lib/ghost)所以我们要把 __dirname 换成资源目录。Docker 镜像把资源目录的路径存到了 GHOST_CONTENT 环境变量中,所以我们需要把 database.connection.filename 换成 path.join(process.env.GHOST_CONTENT, '/data/ghost.db')
  • 相同的原因,需要手动指定一下资源目录,在配置里面新增 paths.contentPath,值是 process.env.GHOST_CONTENT 就好了

启动容器的时候要注意的点就是 Ghost 默认的启动配置是 development,我们要手动指定一下配置环境,方法就很多样了:覆写 CMD 为 npm start --production、启动的时候指定参数 --env NODE_ENV=production 都可以。