身如不系之舟

发布于     更新于
升级和迁移 ghost

心似已灰之木,身如不系之舟。 问汝平生功业,黄州惠州儋州。

升级迁移 ghost

之前一直用 docker 来运行 ghost ,默认就是 sqlite 数据库,今天想日常升级一下。直接重新拉取镜像进行更新,没想到容器一直重启,看了一下日志,原来是默认切换到了 mysql 导致连不上数据库。

首先还原到之前的版本,备份数据。然后重装。

还原和备份

可以在 ghost.db - settings - notifications 的公告信息里边找到之前的版本,版本不对就一直启动不了:

[{"dismissible":true,"location":"bottom","status":"alert","id":"0d8b6620-4679-11ed-b101-0fd952ca12e7","createdAtVersion":"5.7.0","custom":false,"createdAt":"2022-10-07T18:48:45.000Z","type":"info","top":false,"message":"Ghost <a href=\"https://github.com/TryGhost/Ghost/releases\">5.18.0</a> has been released, <a href=\"https://ghost.org/update/?v=5.7.0\">click here</a> to upgrade.","seen":false,"addedAt":"2022-10-09T07:18:54.413Z"}]

这里的 5.7.0 可以看到之前的版本。docker run 指定版本就行。

ghost:5.7.0

还原之后登陆进去导出数据。

重装

查了一下文档,通过环境变量来指定 mysql 配置似乎可行:

docker run -d --name some-ghost \
-e url=https://years.huching.net \
-e database__client=mysql \
-e database__connection__host=***:*** \
-e database__connection__user=*** \
-e database__connection__password=*** \
-e database__connection__database=ghost \
-v /path/to/ghost-data:/var/lib/ghost/content -p 3001:2368 --restart unless-stopped ghost

但是启动还是不行,大概的报错是这些:

DatabaseError: Invalid database host.
"Please double check your database config."
at /var/lib/ghost/versions/***/node_modules/knex-migrator/lib/database.js:50:23

排查半天没有结果,最后用 ghost-cli 装一遍:

先是专门建一个用户

adduser  ghost-user
usermod -aG sudo ghost-user
su - ghost-user

创建一个目录并且设置权限

sudo mkdir -p /var/www/ghost5
sudo chown ghost-user:ghost-user /var/www/ghost5
sudo chmod 775 /var/www/ghost5
cd /var/www/ghost5

最后通过 ghost setup 启动,但是没想到还是启动失败,一样报错。

于是试一下用命令行直接连 mysql

mysql --host=hostname:1234 --user=adminuser --password=PWD dbname

发现还是报错:

ERROR 2005 (HY000): Unknown MySQL server host

所以找到问题,应该是我指定了 mysql 的端口,用拼接在 hostname 的格式导致连接不上。

比如换成这样就可以:

mysql --host=hostname --port:1234 --user=adminuser --password=PWD dbname

搜一下 ghost mysql port 发现能够通过参数设置:

先运行 ghost config 来生成一个配置文件,修改配置文件,然后在里边加上指定端口,然后重新启动 ghost restart

要指定端口的话,需要在这里加上 port

"database": {
  "client": "mysql",
  "connection": {
    "host": "127.0.0.1",
    "port": 3306,
    "user": "your_database_user",
    "password": "your_database_password",
    "database": "your_database_name"
  }
}

至此问题解决了。所以前面用 docker 运行的时候,理论上应该也可以用环境变量指定端口:

docker run -d --name some-ghost \
-e url=https://years.huching.net \
-e database__client=mysql \
-e database__connection__host=****** \
-e database__connection__port=*** \
-e database__connection__user=*** \
-e database__connection__password=*** \
-e database__connection__database=ghost \
-v /path/to/ghost-data:/var/lib/ghost/content -p 3001:2368 --restart unless-stopped ghost