Strapi生产环境下如何从Cloudinary切换并迁移至AWS S3
从Cloudinary迁移至AWS S3且无感知的Strapi完整方案
一、前期准备
- 配置AWS S3存储桶:创建对应存储桶,开启静态网站托管(或搭配CloudFront做CDN保障访问速度),设置匹配业务需求的CORS规则,确保Strapi服务器和前端客户端能正常访问资源。
- 安装Strapi S3插件:执行命令
npm install @strapi/provider-upload-aws-s3,然后在config/plugins.js中填入S3的accessKeyId、secretAccessKey、region、bucket等配置参数。 - 全量备份数据:导出Strapi数据库(比如MySQL用
mysqldump,PostgreSQL用pg_dump),同时批量备份Cloudinary上的所有媒体文件(可通过Cloudinary Admin API写脚本批量下载,或用rclone工具同步)。
二、批量迁移媒体文件到S3
- 批量同步文件:推荐用rclone工具直接同步Cloudinary资源到S3,提前配置好rclone的Cloudinary和S3远程连接后,执行命令:
若用脚本实现,可调用Cloudinary的rclone sync cloudinary:/ s3:your-bucket-nameresources/listAPI批量获取所有资源URL,循环下载后上传到S3。 - 保持路径一致性:迁移时严格保留Cloudinary中文件的路径结构,确保S3中的文件路径和原路径完全一致,后续替换数据库URL时更高效。
三、批量替换Strapi数据库中的媒体URL
- 定位存储表:Strapi的媒体文件信息存在
upload_files表,核心字段url存储的是Cloudinary的资源地址,provider_metadata字段里也可能包含Cloudinary相关地址。 - 执行SQL更新:以MySQL为例,执行批量替换语句:
请根据实际的Cloudinary域名和S3域名调整替换规则,执行后随机查询几条记录验证URL替换是否正确。UPDATE upload_files SET url = REPLACE(url, 'https://res.cloudinary.com/your-cloud-name/image/upload/', 'https://your-bucket.s3.your-region.amazonaws.com/'), provider_metadata = REPLACE(provider_metadata, 'https://res.cloudinary.com/your-cloud-name/image/upload/', 'https://your-bucket.s3.your-region.amazonaws.com/');
四、切换Strapi上传提供商
- 修改上传配置:在
config/plugins.js中,将上传提供商从cloudinary切换为aws-s3,确保配置参数无误。 - 重启Strapi:让新的上传配置生效,此时新上传的媒体文件会直接存储到AWS S3。
五、无感知过渡验证
- 暂留Cloudinary资源:短期内不要删除Cloudinary上的文件,避免有遗漏的旧URL导致访问失败(也可配置Cloudinary的301重定向到S3地址,不过数据库URL替换完成后这一步可选)。
- 全链路测试:访问前端所有涉及媒体资源的页面,确认图片、视频加载正常;测试新文件上传流程,验证资源是否正确存储到S3并能正常访问。
- 日志监控:查看Strapi服务器和S3的访问日志,确保没有404错误,所有资源请求都指向S3地址。
六、收尾工作
- 确认所有资源稳定访问后,删除Cloudinary上的旧文件,关闭Cloudinary服务以终止成本支出。
- 再次备份更新后的数据库和S3存储桶,确保数据安全。
内容的提问来源于stack exchange,提问作者Karel Křesťan
相关产品推荐
相关产品推荐

