Ghost2.30.2

少し前から Ghost CMS を使い温泉ブログを運用している。

雨中温泉

Ghost はブログシステムである。以下を理由として選定したような記憶がある:

  • Android スマートフォンから投稿可能である。
  • Node.js で実装されている。PHP でない。
  • Open Source Community がある。
  • 自分でホスティングし、無料で使える。

まだ使いこなせていないが結構いい感じだと思う。

んで最近、管理画面上部に Ghost2 にすればいいじゃん、と表示されるようになった。 そこで今回 Ghost をバージョン1から2に更新した。手順を調べてもあまり出てこないから、ここで公開することとする。

なお Ghost は Docker 上で動作している。 Docker compose を使い Ghost 本体と MySQL を合わせて起動するようにしている。

フロントの Web サーバーには随分と前に構築した Apache を利用していて、Ghost にリバースプロキシしている。

一応言っておくが、本記事の通りにバージョンアップを実施して色々うまくいかなかったとしても私は責任を負うことはできません。

1. 環境

サーバーはさくらのVPS。

ホスト OS は CentOS 7.6:

$ uname -a
Linux ns.xaxxi.net 3.10.0-957.10.1.el7.x86_64 #1 SMP Mon Mar 18 15:06:45 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
$ cat /etc/centos-release
CentOS Linux release 7.6.1810 (Core) 

Docker 1.13.1:

$ docker --version
Docker version 1.13.1, build b2f74b2/1.13.1

Docker compose 1.24.0:

$ docker-compose --version
docker-compose version 1.24.0, build 0aa59064

2. 従来の環境

アップデート前の詳細なバージョンは控えるのを忘れた。とにかく Version1 であった。

docker-compose.yml には以下のように書いていた:

version: '3.1'
services:
  ghost:
    image: ghost:1-alpine
    restart: always
    ports:
      - 127.0.0.1:8085:2368
    volumes:
      - /home/docker/docker/ghost/data/ghost:/var/lib/ghost/content
    environment:
      # see https://docs.ghost.org/docs/config#section-running-ghost-with-config-env-variables
      url: https://yu.xaxxi.net
      database__client: mysql
      database__connection__host: db
      database__connection__user: root
      database__connection__password: PASSWORDPASSWORDPASSWORD
      database__connection__database: ghost
  db:
    image: mysql:5.7
    restart: always
    volumes:
      - /home/docker/docker/ghost/data/mysql:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: PASSWORDPASSWORDPASSWORD

要点を列挙する:

  • Ghost は localhost の 8085 番ポートを LISTEN する。
  • Ghost と MySQL サーバーを起動している。
  • Ghost、MySQL についてローカルの特定ディレクトリをそれぞれボリュームとしてマウントいている。

起動時には

$ docker-compose up -d

、終了時には

$ docker-compose down

のコマンドを実行する。

3. データのバックアップ

念のため記事データのバックアップを全てとっておく。 今回、このバックアップデータは使わずに済んだため、リストアについては特に触れない。

Docker ボリュームとして指定している data ディレクトリを丸ごと BZIP2 にした。 Permission の関係で root でコマンドを実行する必要があった。

$ su -
# cd /home/docker/docker/ghost
# tar jcvf data-20190905.tar.bz2 data
# ls
data  data-20190905.tar.bz2  docker-compose.yml  run.sh
# exit

4. Ghost1 を最新版に更新

この手順が必要かはわからないが念の為にやった。 いきなり Ghost2 に更新するのではなく、いったん Ghost1 を最新にしておくことで、バージョンアップ時のトラブルを少なくしようということだ。

イメージをいったん削除し、pull で最新イメージを取得。

$ docker-compose down
$ docker-compose pull

その後 Ghost1 を起動して問題無く動作することを確かめた。 なんならこのあと再びバックアップを作成してもいい。データのマイグレが走ったような雰囲気があったら再作成するべきだ。

$ docker-compose up -d

5. Ghost2 にバージョンアップ

docker-compose.yml を書き換えて Ghost2 を使うようにしただけ。

書き換え後の docker-compose.yml の中身は以下:

version: '3.1'
services:
  ghost:
    image: ghost:2-alpine
    restart: always
    ports:
      - 127.0.0.1:8085:2368
    volumes:
      - /home/docker/docker/ghost/data/ghost:/var/lib/ghost/content
    environment:
      # see https://docs.ghost.org/docs/config#section-running-ghost-with-config-env-variables
      url: https://yu.xaxxi.net
      database__client: mysql
      database__connection__host: db
      database__connection__user: root
      database__connection__password: PASSWORDPASSWORDPASSWORD
      database__connection__database: ghost
  db:
    image: mysql:5.7
    restart: always
    volumes:
      - /home/docker/docker/ghost/data/mysql:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: PASSWORDPASSWORDPASSWORD

ghostimageghost:2-alpine にした。

それでまたイメージをいったん削除し、pull で最新イメージを取得。

$ docker-compose down
$ docker-compose pull

これで Ghost2 のイメージが取得された。 この状態で再び Ghost を起動すると自動的にデータ移行が行われた。

$ docker-compose up -d

少し待ってから /admin を Web ブラウザで開けばよい。

なお、いきなりブログページを表示した時には 504 Service Unavailable が出力された。

5. Unable to enable SKIP DNAT rule

条件はよくわからないが、Docker イメージ起動時に以下のエラーが出力されることがあった。

$ docker-compose up -d
Creating network "ghost_default" with the default driver
ERROR: Failed to Setup IP tables: Unable to enable SKIP DNAT rule:  (iptables failed: iptables --wait -t nat -I DOCKER -i br-7d2f50277821 -j RETURN: iptables: No chain/target/match by that name.
 (exit status 1))

このようなときには Docker サービスを再起動してやれば直った。

# systemctl restart docker

6. 参考ページ