在自我托管的Ghost Blog上将Ghost 3.x升级到4.x的所有步骤

95 阅读8分钟

在这篇文章中,我将展示在自我托管的Ghost Blog上将Ghost 3.x升级到4.x的所有步骤。本指南包括所有必要的步骤,例如:

  • 更新ghost-cli
  • mysql从5升级到8

在升级过程中,你可能会遇到这样的错误:

Ghost能够启动,但在启动过程中出现了错误。不能用角色(管理员)删除权限(重置所有密码)--权限不存在

Ghost能够启动,但在启动过程中出现错误: alter tableoauth add constraintoauth_user_id_foreign foreign key (user_id) referencesusers (id) - UNKNOWN_CODE_PLEASE_REPORT: Referencing column 'user_id' and referenced column 'id' in foreign key constraint 'oauth_user_id_foreign' are incompatible.

消息:Ghost v4.16.0与当前Node版本不兼容。

系统检查失败,消息是:'Linux版本不是Ubuntu 16或18'。

以及其他与你的MySQL数据库有关的Ghost整理和Node错误。

在升级到Ghost 4的过程中,你会找到一个适用于所有这些的解决方案。

因为这个信息,我决定从3升级到Ghost 4。

关键安全更新可用 - 请尽快更新Ghost

会员账户的接管

在开始升级之前,你可以先熟悉一下:

第一步:备份你的Ghost安装

让所有Ghost内容得到备份的最好方法是通过导出。

更多信息请查看:

导出Ghost内容:

Ghost 3

  • 设置- 从左侧窗格的菜单
  • 实验室
  • 按下导出你的内容按钮

幽灵4

  • 设置--从左下角的齿轮图标开始
  • 实验室
  • 按Export your content.按钮

注意:你可以从以下地方下载你的Ghost主题和媒体内容/var/www/your_ghost/content/images/

使用完整的服务器备份

在我的案例中,我使用的是Digital Ocean,它提供频繁的快照。在这种情况下,这是一个非常有用的功能。

在任何情况下都要确保你可以恢复你以前的网站版本。

注意:使用cloudflare,以尽量减少你这边的停机时间。

第2步:更新到最新的3.x版本

在升级到Ghost 4之前,需要首先更新到最新的Ghost 3版本。

这可以通过以下方式完成:

ghost update v3

为了检查哪个是你当前的版本,请使用:

ghost -v
Ghost-CLI version: 1.17.3
Ghost version: 3.42.6

步骤3:更新节点版本并重新安装最新的Ghost 3.x

你可以查看Ghost的官方页面,了解Node的更新,升级Node.js

你可能需要遵循的步骤取决于你安装的Node - 即npm。更多细节请查看本帖中的红利步骤1:

curl -sL https://deb.nodesource.com/setup_14.x | sudo -E bash
sudo apt-get install -y nodejs

要触发依赖关系的重新安装,并重新安装你当前版本的Ghost,你需要使用:

ghost update v3 --force

步骤4:更新到Ghost 4

最后,你可以通过以下方式更新到Ghost 4:

ghost update

或通过

ghost update v4 --force

检查你的Ghost是否正在运行!如果没有,你需要检查与MySQL 5与MySQL 8整理有关的MySQL问题。

如果你面临与MySQL有关的错误,请检查奖励步骤2

奖励步骤1:更新节点和Ghost CLI

根据你的版本、操作系统和环境,这一步可能有点不同。

为了避免像这样的错误:

消息:Ghost v4.16.0与当前的Node版本不兼容。

系统检查失败,消息是。'Linux版本不是Ubuntu 16或18'

信息:你所使用的Node.js版本不被支持。
被支持:^10.13.0 || ^12.10.0
已安装:14.17.6

检查接下来的步骤:

更新Ghost CLI

关于Ghost CLI更新的官方文档可以在这个链接中找到。Ghost-CLI安装和更新

sudo npm install -g ghost-cli@latest

检查Node和NPM的版本

首先,你可以通过以下方式检查你的npmnode 版本:

node -v && npm -v

结果会是这样的:

v14.17.6
6.14.15

列出可用的Node版本

要列出所有可用的Node版本:

nvm ls-remote

结果将是一个长长的列表,如:

       v14.17.5   (LTS: Fermium)
->     v14.17.6   (LTS: Fermium)
       v14.18.0   (Latest LTS: Fermium)
        v15.0.0
        v15.0.1

安装稳定的Node

为了安装长期支持(LTS)版本的Node,你可以使用:

nvm install lts/fermium

nvm install 14.18.0

改变默认的Node

为了改变Ghost和你的系统所使用的Node版本,可以使用:

nvm use 14.18.0

nvm alias default 14.18.0
nvm use default

奖励步骤2:升级到Ghost 4:MySQL 5 VS MySQL 8

在从3.x升级到4.x期间,可能会面临几个MySQL问题。

这些问题主要是与整理的问题有关:

  • Ghost 3 / MySQL 5 -utf8mb4_general_ci
  • Ghost 4 / MySQL 8 -utf8mb4_0900_ai_ci

建议使用新的utf8mb4_0900_ai_ci ,它更好,性能更快。欲了解更多信息,请阅读:

其他可能的解决方案

我正在尝试不同的方法来解决这些错误,比如。

重新创建所有MySQL表

sudo mysqlcheck -o my_ghost_database

这导致了:

my_ghost_database.posts_meta
note     : Table does not support optimize, doing recreate + analyze instead
status   : OK

而没有任何改变。

通过改变DataBase的整理方式

ALTER DATABASE `ghost_production`
DEFAULT CHARACTER SET utf8mb4
DEFAULT COLLATE utf8mb4_general_ci;

改变默认值 /etc/mysql/conf.d/mysql.cnf

  • 编辑/etc/mysql/conf.d/mysql.cnf
  • 添加这一行
[mysqld]
init-connect='SET default_collation_for_utf8mb4=utf8mb4_general_ci'
  • 保存
  • 运行service mysql restart
  • ghost update

这也没能奏效,所有的解决方案都取自本文末尾分享的资源。

修复:UNKNOWN_CODE_PLEASE_REPORT MySQL错误

对我有用的是更新所有表的排序。

所以我在调查每一个整理:

  • 数据库
show full columns from members;
字段类型整理空值键值默认值额外的
idvarchar(24)utf8mb4_0900_ai_ci没有PRI
电子邮件varchar(191)utf8mb4_general_ci没有统一性
创建时间日期没有
创建者varchar(24)utf8mb4_0900_ai_ci没有

和。

SELECT DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME
FROM INFORMATION_SCHEMA.SCHEMATA
WHERE SCHEMA_NAME = 'my_ghost_database';

结果

default_character_set_namedefault_collation_name
utf8mb4utf8mb4_0900_ai_ci

我已经注意到整理方式是混合的:

  • utf8mb4_general_ci
  • utf8mb4_0900_ai_ci
  • 空值

所以我生成了SQL来更新每个表和所有列的排序。

生成SQL来更新所有表和列的拼写方式

SET sql_mode='PIPES_AS_CONCAT';

SELECT DIstinct
'ALTER TABLE ' || TABLE_SCHEMA || '.' || TABLE_NAME || '  CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;'

    FROM INFORMATION_SCHEMA.COLUMNS
    where TABLE_SCHEMA='my_ghost_database'

其中SET sql_mode='PIPES_AS_CONCAT'; 启用MySQL中的双管连接。你将得到所有表的SQL修改语法,如:"你的表"。

ALTER TABLE my_ghost_database.actions  CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
ALTER TABLE my_ghost_database.api_keys  CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;

你需要在代码前加上:SET FOREIGN_KEY_CHECKS=0; ,这将使外键错误只在当前会话中沉默。

否则你会得到所有有问题的外键的错误。

完整的代码可以在下面找到:

SET FOREIGN_KEY_CHECKS=0;


ALTER TABLE my_ghost_database.actions  CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
ALTER TABLE my_ghost_database.api_keys  CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
ALTER TABLE my_ghost_database.brute  CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
ALTER TABLE my_ghost_database.email_batches  CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
ALTER TABLE my_ghost_database.email_recipients  CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
ALTER TABLE my_ghost_database.emails  CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
ALTER TABLE my_ghost_database.integrations  CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
ALTER TABLE my_ghost_database.invites  CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
ALTER TABLE my_ghost_database.labels  CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
ALTER TABLE my_ghost_database.members  CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
ALTER TABLE my_ghost_database.members_email_change_events  CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
ALTER TABLE my_ghost_database.members_labels  CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
ALTER TABLE my_ghost_database.members_login_events  CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
ALTER TABLE my_ghost_database.members_paid_subscription_events  CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
ALTER TABLE my_ghost_database.members_payment_events  CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
ALTER TABLE my_ghost_database.members_products  CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
ALTER TABLE my_ghost_database.members_status_events  CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
ALTER TABLE my_ghost_database.members_stripe_customers  CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
ALTER TABLE my_ghost_database.members_stripe_customers_subscriptions  CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
ALTER TABLE my_ghost_database.members_subscribe_events  CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
ALTER TABLE my_ghost_database.migrations  CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
ALTER TABLE my_ghost_database.migrations_lock  CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
ALTER TABLE my_ghost_database.mobiledoc_revisions  CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
ALTER TABLE my_ghost_database.permissions  CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
ALTER TABLE my_ghost_database.permissions_roles  CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
ALTER TABLE my_ghost_database.permissions_users  CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
ALTER TABLE my_ghost_database.posts  CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
ALTER TABLE my_ghost_database.posts_authors  CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
ALTER TABLE my_ghost_database.posts_meta  CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
ALTER TABLE my_ghost_database.posts_tags  CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
ALTER TABLE my_ghost_database.products  CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
ALTER TABLE my_ghost_database.roles  CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
ALTER TABLE my_ghost_database.roles_users  CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
ALTER TABLE my_ghost_database.sessions  CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
ALTER TABLE my_ghost_database.settings  CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
ALTER TABLE my_ghost_database.snippets  CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
ALTER TABLE my_ghost_database.tags  CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
ALTER TABLE my_ghost_database.tokens  CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
ALTER TABLE my_ghost_database.users  CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
ALTER TABLE my_ghost_database.webhooks  CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;

在这一步之后,Ghost 4成功运行了。

资源