Strapi v4.10.0 及更新版本中提供数据导出功能。请参阅 更新和迁移文档 以升级您的应用程序。
strapi transfer
命令将您的数据从一个 Strapi 实例传输到另一个 Strapi 实例。transfer
命令使用严格的架构匹配,这意味着您的两个 Strapi 实例需要是彼此的精确副本,但所包含的数据除外。默认的 transfer
命令会传输您的内容(实体和关系)、文件(资产)、项目配置和架构。该命令允许您传输数据:
- 从本地 Strapi 实例到远程 Strapi 实例
- 从远程 Strapi 实例到本地 Strapi 实例
- 如果您在目标实例中使用 SQLite 数据库,则在“传输”操作运行时其他数据库连接将被阻止。
- 管理员用户和 API 令牌不会被转移。
- 如果您在项目中使用 websockets 或 Socket.io,传输命令将失败。您需要暂时禁用 websockets 或 Socket.io或确保您的 websocket 服务器在与 Strapi 服务器不同的端口上运行,或者在 Strapi 内的特定路由上运行以使用传输命令。
CLI 命令由以下参数组成:
选项 | 描述 |
---|---|
--to | 目标 Strapi 实例上的 /admin 端点的完整 URL(例如 --to https://my-beautiful-strapi-website/admin ) |
‑‑to‑token | 从 Strapi 目标实例传输令牌。 |
--from | 要从中提取数据的远程 Strapi 实例的 /admin 端点的完整 URL (例如,--from https://my-beautiful-strapi-website/admin ) |
‑‑from‑token | 从 Strapi 源实例传输令牌。 |
--force | 自动对所有提示(包括潜在的破坏性请求)回答“是”,并以非交互方式运行。 |
--exclude | 使用逗号分隔的数据类型排除数据。可用的类型有:content 、files 和 config 。 |
--only | 仅包含这些数据。可用的类型有:content 、files 和 config 。 |
--throttle | 在传输期间在“块”之间注入人为延迟的时间(以毫秒为单位)。 |
需要 --to
或 --from
。
数据传输由传输令牌授权,这些令牌从管理面板管理。从管理面板,您可以管理基于角色的令牌权限,包括 view
、create
、read
、regenerate
和 delete
。
使用 nginx 和将请求代理到本地主机的服务器时,可能会出现问题。为了防止这些问题,请通过更改 /etc/nginx/sites-available/yourdomain
中的配置文件来确保所有标头都正确转发,如下所示:
server {
listen 80;
server_name <yourdomain>;
location / {
proxy_pass http://localhost:1337;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_set_header Host $host;
include proxy_params;
}
}
生成传输令牌
应在 管理面板配置 文件中定义 salt 传输令牌。
strapi transfer
命令需要目标实例颁发的传输令牌。要在管理面板中生成传输令牌,请使用 用户指南 中的说明。
设置并运行数据传输
启动数据传输取决于您是要将数据推送到远程实例还是从远程提取数据:
将数据推送到远程
- 启动目标实例的 Strapi 服务器。
- 在新的终端窗口中,导航到源实例的根目录。
- 运行以下最小命令来启动传输,确保
destinationURL
是管理面板的完整 URL(即 URL 包含/admin
部分):bashyarnbashyarn strapi transfer --to destinationURL
- 出现提示时添加传输令牌。
- 对 CLI 提示回答 是 或 否:“传输将删除所有远程 Strapi 资产及其数据库。您确定要继续吗?”
从远程提取数据
- 启动源实例的 Strapi 服务器。
- 在新的终端窗口中,导航到目标实例的根目录。
- 运行以下最小命令来启动传输,确保
remoteURL
是管理面板的完整 URL(即 URL 包含/admin
部分):bashyarnbashyarn strapi transfer --from remoteURL
- 出现提示时添加传输令牌。
- 对 CLI 提示回答 是 或 否:“传输将删除所有本地 Strapi 资产及其数据库。您确定要继续吗?”。
绕过所有 transfer
命令行提示
使用 strapi transfer
命令时,您需要确认传输将删除现有数据库内容。--force
标志允许您绕过此提示。此选项对于以编程方式实现 strapi transfer
很有用。如果使用 --force
选项,则必须将 to-token
选项与转移令牌一起传递。
--force
选项会绕过有关内容删除的所有警告。
示例:使用 --force
绕过 transfer
命令行提示
yarn strapi transfer --to https://example.com/admin --to-token my-transfer-token --force
传输期间仅包含指定的数据类型
默认的 strapi transfer
命令会传输您的内容(实体和关系)、文件(资产)、项目配置和架构。--only
选项允许您通过传递逗号分隔的字符串(类型之间没有空格)来仅传输列出的项目。可用值为 content
、files
和 config
。架构始终会被传输,因为 strapi transfer
使用架构匹配。
示例:仅传输文件
yarn strapi transfer --to https://example.com/admin --only files
在传输过程中排除数据类型
默认的 strapi transfer
命令会传输您的内容(实体和关系)、文件(资产)、项目配置和架构。--exclude
选项允许您通过将这些项目传递到逗号分隔的字符串中(类型之间没有空格)来排除内容、文件和项目配置。您无法排除架构,因为 strapi transfer
使用架构匹配。
示例:从传输中排除文件
yarn strapi transfer --to https://example.com/admin --exclude files
从传输中排除的任何类型的文件都将在您的目标实例中删除。例如,如果您排除 config
,则目标实例中的项目配置将被删除。
使用环境变量管理数据传输
环境变量 STRAPI_DISABLE_REMOTE_DATA_TRANSFER
可用于禁用远程数据传输。除了管理面板中的 RBAC 权限 之外,这还可以帮助您保护 Strapi 应用程序。要使用 STRAPI_DISABLE_REMOTE_DATA_TRANSFER
,您可以将其添加到 .env
文件中或在 start
脚本前添加。请参阅以下示例:
STRAPI_DISABLE_REMOTE_DATA_TRANSFER=true yarn start
有关在 Strapi 中使用环境变量的更多详细信息,请参阅 环境配置文档。
在本地测试传输命令
transfer
命令不用于在两个本地实例之间传输数据。export
和 import
命令就是为此目的而设计的。但是,您可能希望在测试实例上本地测试 transfer
,以便在将其与远程实例一起使用之前更好地了解该功能。以下文档提供了 transfer
过程的完整示例。
创建并克隆新的 Strapi 项目
- 使用安装命令创建一个新的 Strapi 项目:bash
npx create-strapi-app@latest <project-name> --quickstart
- 在项目中创建至少 1 个内容类型。如果您需要有关创建第一个内容类型的说明,请参阅 快速入门指南。
在此步骤中,请勿向您的项目添加任何数据。
- 将项目提交到 git 存储库:bash
git init git add 。 git commit -m "first commit"
- 克隆项目存储库:bash
cd .. # 移动到父目录 git clone <path to created git storage>.git/ <new-instance-name>
向第一个 Strapi 实例添加数据
- 返回第一个 Strapi 实例并将数据添加到内容类型。
- 停止第一个实例上的服务器。
创建转移令牌
- 导航到第二个 Strapi 实例并在根目录中运行
build
和start
命令:bashyarnbashyarn build && yarn start
- 注册管理员用户。
- 创建并复制转移令牌。
- 让服务器保持运行。
传输数据
- 返回第一个 Strapi 实例。
- 在终端中运行
strapi transfer
命令:bashyarnbashyarn strapi transfer --to http://localhost:1337/admin
- 出现提示时,应用传输令牌。
- 传输完成后,您可以返回第二个 Strapi 实例并查看内容是否已成功传输。
在某些情况下,您可能会收到针对 localhost
的连接被拒绝错误。尝试将地址更改为 http://127.0.0.1:1337/admin。