dify需通过docker compose部署并配置.env文件实现s3存储:设置s3_bucket、s3_region、s3_access_key、s3_secret_key、s3_endpoint五项参数,且必须关闭s3_use_aws_managed_iam和s3_use_path_style两个开关。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

你需要让Dify把用户上传的文档、知识库文件、生成的图片等全部存到AWS S3上,而不是默认的本地磁盘或MinIO,避免容器重启后文件丢失、团队协作时版本错乱、迁移时数据找不着——这要求你精准配置S3连接参数,并关闭两个易被忽略的兼容性开关。
确认Dify部署方式与配置入口
本教程仅适用于使用 Docker Compose 部署的 Dify(非K8s、非源码直启)。进入Dify项目根目录下的 docker/ 子目录,找到 .env 文件——它就是所有存储配置的唯一生效入口。别去改 docker-compose.yml 里的硬编码卷映射,那对S3无效。
如果当前没有 .env 文件,请先复制示例:cp .env.example .env。
填写S3基础认证与服务信息
在 .env 文件中,定位并设置以下五项环境变量(必须全部存在且值非空):
【S3_BUCKET】:填你的S3桶名,例如 my-dify-production-bucket;
【S3_REGION】:填桶所在区域代码,例如 us-west-2(不是 us-west-2a 这类可用区);
【S3_ACCESS_KEY】:填拥有该桶 s3:GetObject、s3:PutObject、s3:ListBucket 权限的IAM用户的Access Key ID;
【S3_SECRET_KEY】:填对应Secret Access Key;
【S3_ENDPOINT】:填标准S3服务地址,格式为 https://s3.<region>.amazonaws.com</region>,例如 https://s3.us-west-2.amazonaws.com。
注意:不要在 S3_ENDPOINT 后加斜杠,也不要填带桶名的URL(如 https://my-bucket.s3.us-west-2.amazonaws.com),否则Dify会构造出错误的签名请求而报403。
关闭两个关键兼容性开关
这是90%用户对接失败的根源。在 .env 文件中,必须显式设置以下两项为 false:
方法一:S3_USE_AWS_MANAGED_IAM=falseS3_USE_PATH_STYLE=false
方法二(若已存在但值为空或注释掉):
删掉这两行开头的 # 号,并确保等号右边是 false,不能留空、不能写 False 或 FALSE。
这两个开关控制底层boto3客户端的行为:启用 S3_USE_AWS_MANAGED_IAM 会让Dify跳过密钥校验直接调用EC2元数据服务,只适用于ECS/EKS托管场景;启用 S3_USE_PATH_STYLE 会强制使用 https://s3.region.amazonaws.com/bucket/key 格式,而AWS新桶默认只支持虚拟主机风格(https://bucket.s3.region.amazonaws.com/key),开启即400错误。
验证并启用S3存储
第一步:保存 .env 文件;
第二步:停止当前服务 → docker compose down;
第三步:重新拉起服务 → docker compose up -d;
第四步:查看日志确认插件加载成功 → docker logs dify-plugin-daemon 2>&1 | grep -i "s3\|storage";
第五步:登录Dify Web界面,上传任意一个PDF文件到知识库,观察浏览器开发者工具Network标签页,确认上传请求的目标URL域名是你的S3桶域名(如 https://my-dify-production-bucket.s3.us-west-2.amazonaws.com),而非 /api/files/upload 这类本地接口。










