在这篇文章中,我将展示在自我托管的Ghost Blog上将Ghost 3.x升级到4.x的所有步骤。本指南包括所有必要的步骤,例如:
- 更新
ghost-cli
- mysql从5升级到8
在升级过程中,你可能会遇到这样的错误:
Ghost能够启动,但在启动过程中出现了错误。不能用角色(管理员)删除权限(重置所有密码)--权限不存在
或
Ghost能够启动,但在启动过程中出现错误: alter table
oauth
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的版本
首先,你可以通过以下方式检查你的npm
和node
版本:
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;
字段 | 类型 | 整理 | 空值 | 键值 | 默认值 | 额外的 |
---|---|---|---|---|---|---|
id | varchar(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_name | default_collation_name |
---|---|
utf8mb4 | utf8mb4_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成功运行了。