执行数据库更新以将 Strapi 从 Cloudinary 重新路由到 S3
切换供应商
这是唯一有据可查的步骤,所以我将在这里简要介绍一下。
首先,您需要通过运行yarn remove @strapi/provider-upload-cloudinary 卸载 Cloudinary Strapi 插件并通过运行yarn add @strapi/plugin-sentry 安装 S3 插件。
完成此操作后,您需要创建 AWS 基础设施(S3 存储桶和具有足够权限的 IAM)。请按照官方 Strapi S3 插件文档https://market.strapi.io/providers/@strapi-provider-upload-aws-s3 和本指南https://dev.to/kevinadhiguna/how-to-setup-amazon-s3-upload-provider-in-your-strapi-app-1opc 进行操作。
通过登录您的 Strapi 管理面板并访问媒体库,检查您是否已正确完成所有操作。如果一切顺利,所有图像都应该丢失(您将看到所有元数据,如大小和扩展名,但不是实际图像)。尝试通过单击“添加新资产”按钮上传新图像。此图像应该会成功上传并且也会出现在您的 S3 存储桶中。
如上所述一切正常后,继续进行实际的数据迁移。
文件迁移
将文件从 Cloudinary 迁移到 S3 的最简单(且防错)方法是在本地下载它们,然后使用 AWS 控制台上传它们。如果您只有数百个(或少到数千个)文件要迁移,您可能实际上使用 Cloudinary Web UI 来下载所有文件(从 Cloudinary Web App 一次下载 1000 个文件的限制)。
如果这不适合您,可以使用 CLI 使用您的终端轻松下载所有文件:
pip3 install cloudinary-cli (下载 CLI)
cld config -url {CLOUDINARY_API_ENV}(api env 可以在您登录 cloudinary 时看到的第一页上找到)
cld -C {CLOUD_NAME} sync --pull . /(此步骤开始下载。根据您有多少文件,可能需要一段时间。从您要下载文件的目录运行此命令。{CLOUD_NAME} 可以在 {CLOUDINARY_API_ENV} 上方找到Cloudinary仪表板,你应该在终端运行第二个命令后看到它。对我来说,这个命令在下载过程中失败了好几次,但你可以再次运行它,它会继续没有任何问题。)
将文件下载到您的计算机后,只需使用拖放 S3 功能将它们上传到您的 S3 存储桶中。
更新数据库
Strapi 将链接保存到数据库中的所有文件。这意味着即使您将提供程序切换到 S3 并复制了所有文件,Strapi 仍然不知道在哪里可以找到这些文件,因为数据库中的链接指向 Cloudinary 服务器。
您需要更新 Strapi 数据库中的三个列(此方法在 Postgres 数据库上进行了测试,使用其他数据库时可能会有细微的变化)。查看“文件”表,应该有url、formats 和provider 列。
提供者列很简单,只需将cloudinary 替换为aws-s3。
网址和格式更难,因为您只需要替换字符串的一部分 - 更准确地说,Cloudinary 以 {CLOUDINARY_LINK}/{VERSION}/{FILE} 格式存储 url,而 S3 使用 {S3_BUCKET_LINK}/{FILE} 格式。
我的朋友和同事想出了以下 SQL 查询来执行更新:
UPDATE files SET
formats = REGEXP_REPLACE(formats::TEXT, '"https://res.cloudinary.com/{CLOUDINARY_PROJECT}/((image)|(video))/upload/vd{10}/([w.]+)"', '"https://{BUCKET_NAME}.s3.{REGION}/"', 'g')::JSONB,
url = REGEXP_REPLACE(url, 'https://res.cloudinary.com/{CLOUDINARY_PROJECT}/((image)|(video))/upload/vd{10}/([w.]+)', 'https://{BUCKET_NAME}.s3.{REGION}/', 'g')
只是不要忘记用正确的字符串替换 {CLOUDINARY_PROJECT}、{BUCKET_NAME} 和 {REGION}(查看这些值的最简单方法是访问数据库,转到 files 表并检查其中一个旧网址和您在末尾上传的文件切换供应商步。
此外,在运行查询之前,不要忘记备份您的数据库!更好的是,制作生产数据库的副本并在您搞乱生产之前对其运行查询。
就这样! Strapi 现在正在将文件上传到 S3 存储桶,您还可以访问您之前在 Cloudinary 上拥有的所有数据。