【问题标题】:Strapi - how to switch and migrate from Cloudinary to S3 in productionStrapi - 如何在生产中从 Cloudinary 切换和迁移到 S3
【发布时间】:2022-10-20 21:06:44
【问题描述】:

鉴于 Cloudinary 作为多媒体托管服务(图像和视频)的成本相当高,我们的客户决定他们想要切换到 AWS S3 作为文件托管。

问题是应用程序中已经有很多文件(数千张图像和视频),所以仅仅切换提供程序是不够的 - 我们还需要迁移所有文件并让它看起来最终没有真正改变用户。

Strapi 论坛上以某种方式涵盖了该主题:https://forum.strapi.io/t/switch-from-cloudinary-to-s3/15285,但除了模糊描述的过程之外,没有发布任何解决方案。

有没有办法可靠地执行迁移,而不会丢失任何数据,也不需要在客户端(通过 REST/GraphQL API 与 Strapi 通信的应用程序)端进行任何更改?

【问题讨论】:

    标签: amazon-s3 strapi


    【解决方案1】:

    执行迁移分为三个步骤:

    1. 在 Strapi 中将提供商从 Cloudinary 切换到 S3
    2. 将文件从 Cloudinary 迁移到 S3
    3. 执行数据库更新以将 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 数据库上进行了测试,使用其他数据库时可能会有细微的变化)。查看“文件”表,应该有urlformatsprovider 列。

      提供者列很简单,只需将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 上拥有的所有数据。

    【讨论】:

      猜你喜欢
      • 2015-03-27
      • 2020-03-17
      • 1970-01-01
      • 1970-01-01
      • 2021-08-30
      • 2011-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多