Amazon S3
本文档提供了将 Amazon S3 设置为 LibreChat 文件存储后端的说明。
Amazon S3 是一项可扩展、安全的对象存储服务,可用作 LibreChat 的文件存储后端。请按照以下步骤配置您的 S3 存储桶。
1. 创建 AWS 账户并配置 IAM 用户(或使用 IRSA)
选项 A:使用具有显式凭据的 IAM 用户
-
登录 AWS:
- 打开 AWS Management Console 并使用您的账户登录。
-
创建或使用现有的 IAM 用户:
- 导航至 IAM (Identity and Access Management) 部分。
- 创建一个新的 IAM 用户并授予编程访问权限 (Programmatic Access),或选择一个现有用户。
- 附加适当的策略(例如
AmazonS3FullAccess或具有有限 S3 权限的自定义策略)。 - 创建用户后,您将收到 AWS_ACCESS_KEY_ID 和 AWS_SECRET_ACCESS_KEY。请妥善保管这些信息。
选项 B:在 Kubernetes 中使用 IRSA (IAM Roles for Service Accounts)
如果您正在 Kubernetes(例如 EKS)上部署 LibreChat,可以使用 IRSA 为您的 Pod 分配 AWS 权限,而无需提供显式凭证。要使用 IRSA:
- 为您的 EKS 服务账户创建信任策略(示例如下):
- 创建策略以授予必要的 S3 权限(示例如下):
- 为您的 Kubernetes ServiceAccount 添加注解:
确保您的 LibreChat pod 使用了为 IRSA 添加了注解的 service account。这样,应用程序中的 AWS SDK(使用我们更新后的 S3 初始化代码)将自动使用 IRSA 提供的临时凭证,而无需配置 AWS 凭证的环境变量。
2. 创建 S3 存储桶
- 打开 S3 控制台:
- 创建新存储桶:
- 点击 "Create bucket"。
- 存储桶名称 (Bucket Name): 输入一个唯一的名称(例如
mylibrechatbucket)。 - 区域: 选择最靠近您用户的 AWS 区域(例如
us-east-1或eu-west-1)。 - 配置选项: 根据需要设置其他选项,然后点击 "Create bucket"。
3. 更新您的环境变量
如果您没有使用 IRSA,请在项目根目录中创建或更新您的 .env 文件,并添加以下配置:
- AWS_ACCESS_KEY_ID: 您的 IAM 用户的访问密钥。
- AWS_SECRET_ACCESS_KEY: 您的 IAM 用户密钥。
- AWS_REGION: 您的 S3 存储桶所在的 AWS 区域。
- AWS_BUCKET_NAME: 您创建的 S3 存储桶的名称。
- AWS_ENDPOINT_URL: (可选) 自定义 AWS endpoint URL。对于 MinIO、Cloudflare R2、Hetzner Object Storage、Backblaze B2 和 IDrive e2 等兼容 S3 的服务是必需的。请包含 URL 方案,例如
https://a7g8.da.idrivee2-32.com;不带http://或https://的值可能会在文件流式传输时导致Invalid URL错误。 - AWS_FORCE_PATH_STYLE: (可选) 对于需要路径样式 URL (
endpoint/bucket/key) 而非虚拟托管样式 (bucket.endpoint/key) 的提供商,请设置为true。对于 Hetzner Object Storage、MinIO 以及 SSL 证书不覆盖存储桶子域名的类似提供商,此项为必需。对于 AWS S3 或 Cloudflare R2,无需设置。默认值:false。
如果您在 Kubernetes 上使用 IRSA,则无需在环境中设置 AWS_ACCESS_KEY_ID 和 AWS_SECRET_ACCESS_KEY。AWS SDK 将通过分配给您 pod 的服务账户自动获取临时凭证。请确保仍然提供 AWS_REGION 和 AWS_BUCKET_NAME。
4. 配置 LibreChat 以使用 Amazon S3
更新您的 LibreChat 配置文件 (librechat.yaml),以指定应用程序应使用 Amazon S3 进行文件处理:
S3 预签名 URL 会在视觉资源上过期
S3 不通过 CDN 提供文件服务。LibreChat 通过预签名 URL (presigned URLs) 访问 S3 文件,这些 URL 是具有可配置过期时间(S3_URL_EXPIRY_SECONDS)的临时签名令牌。对于 IAM 用户凭证,AWS 将预签名 URL 的有效期限制为 7 天;而使用临时凭证(如 IRSA 等 STS/IAM 角色)时,有效期仅为几个小时。一旦 URL 过期,其引用的图像或头像在 UI 中将显示为损坏,直到页面刷新并生成新的 URL 为止。
LibreChat 中的刷新逻辑并未在每个视觉界面上保持一致。例如,列表样式的 endpoint 可能会返回已存储的 URL,而详细信息 endpoint 则会刷新它们。这可能导致模型选择器和聊天 UI 中出现可见的头像图片损坏问题。请参阅相关讨论以获取完整上下文。
S3 非常适合用于文档存储(PDF、文本文件、代码),在这些场景下,使用短时预签名下载 URL 是合适的。对于需要在 UI 中持续渲染的图像和头像,请使用 CloudFront with S3、Firebase,或配置 fileStrategies 以仅将这些类型路由到支持 CDN 的策略:
摘要
- 创建 AWS 账户和 IAM 用户(或配置 IRSA):
- 对于传统部署,请创建一个具有编程访问权限的 IAM 用户并获取您的访问密钥。
- 对于 Kubernetes 部署(例如在 EKS 上),请设置 IRSA,以便您的 Pod 自动获取临时凭证。
- 创建 S3 存储桶:
- 使用 Amazon S3 控制台创建一个存储桶,并选择一个唯一的名称和区域。
- 更新环境变量:
- 对于非 IRSA 环境:请在您的
.env文件中设置AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY、AWS_REGION和AWS_BUCKET_NAME。 - 对于 IRSA:仅设置
AWS_REGION和AWS_BUCKET_NAME;确保您的 pod 的服务账户已正确添加注解。
- 配置 LibreChat:
- 在您的
librechat.yaml配置文件中将fileStrategy设置为"s3",或者使用fileStrategies将文档保留在 S3 中,同时通过 CloudFront 发送图像和头像。
通过这些步骤,您的 LibreChat 应用程序将使用 Amazon S3 来处理文件上传、下载和删除。此外,借助 IRSA 支持,您的应用程序可以在 Kubernetes 上安全运行,而无需嵌入长期 AWS 凭证。
注意
请务必确保您的 AWS 凭证安全。请勿将其提交到公共仓库。 根据需要调整 IAM 策略,以遵循最小权限原则。
这篇指南怎么样?