Skip to main content
LibreChat is joining ClickHouse to power the open-source Agentic Data Stack 🎉 Learn more
LibreChat

Amazon S3

本文档提供了将 Amazon S3 设置为 LibreChat 文件存储后端的说明。

Amazon S3 是一项可扩展、安全的对象存储服务,可用作 LibreChat 的文件存储后端。请按照以下步骤配置您的 S3 存储桶。

1. 创建 AWS 账户并配置 IAM 用户(或使用 IRSA)

选项 A:使用具有显式凭据的 IAM 用户

  1. 登录 AWS:

  2. 创建或使用现有的 IAM 用户:

    • 导航至 IAM (Identity and Access Management) 部分。
    • 创建一个新的 IAM 用户并授予编程访问权限 (Programmatic Access),或选择一个现有用户。
    • 附加适当的策略(例如 AmazonS3FullAccess 或具有有限 S3 权限的自定义策略)。
    • 创建用户后,您将收到 AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY。请妥善保管这些信息。

选项 B:在 Kubernetes 中使用 IRSA (IAM Roles for Service Accounts)

如果您正在 Kubernetes(例如 EKS)上部署 LibreChat,可以使用 IRSA 为您的 Pod 分配 AWS 权限,而无需提供显式凭证。要使用 IRSA:

  1. 为您的 EKS 服务账户创建信任策略(示例如下):
    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Principal": {
            "Federated": "arn:aws:iam::{AWS_ACCOUNT}:oidc-provider/oidc.eks.us-east-1.amazonaws.com/id/{EKS_OIDC}"
          },
          "Action": "sts:AssumeRoleWithWebIdentity",
          "Condition": {
            "StringEquals": {
              "oidc.eks.us-east-1.amazonaws.com/id/{EKS_OIDC}:sub": "system:serviceaccount:librechat:librechat",
              "oidc.eks.us-east-1.amazonaws.com/id/{EKS_OIDC}:aud": "sts.amazonaws.com"
            }
          }
        }
      ]
    }
  2. 创建策略以授予必要的 S3 权限(示例如下):
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "VisualEditor0",
      "Effect": "Allow",
      "Action": [
        "s3:PutObject",
        "s3:GetObjectAcl",
        "s3:GetObject",
        "s3:ListBucket",
        "s3:DeleteObject"
      ],
      "Resource": [
        "arn:aws:s3:::my-example-librechat-bucket/*",
        "arn:aws:s3:::my-example-librechat-bucket"
      ]
    }
  ]
}
  1. 为您的 Kubernetes ServiceAccount 添加注解:
    确保您的 LibreChat pod 使用了为 IRSA 添加了注解的 service account。这样,应用程序中的 AWS SDK(使用我们更新后的 S3 初始化代码)将自动使用 IRSA 提供的临时凭证,而无需配置 AWS 凭证的环境变量。

2. 创建 S3 存储桶

  1. 打开 S3 控制台:
  1. 创建新存储桶:
  • 点击 "Create bucket"
  • 存储桶名称 (Bucket Name): 输入一个唯一的名称(例如 mylibrechatbucket)。
  • 区域: 选择最靠近您用户的 AWS 区域(例如 us-east-1eu-west-1)。
  • 配置选项: 根据需要设置其他选项,然后点击 "Create bucket"

3. 更新您的环境变量

如果您没有使用 IRSA,请在项目根目录中创建或更新您的 .env 文件,并添加以下配置:

AWS_ACCESS_KEY_ID=your_access_key_id
AWS_SECRET_ACCESS_KEY=your_secret_access_key
AWS_REGION=your_selected_region
AWS_BUCKET_NAME=your_bucket_name
AWS_ENDPOINT_URL=https://your_endpoint_url
# AWS_FORCE_PATH_STYLE=false
  • 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_IDAWS_SECRET_ACCESS_KEY。AWS SDK 将通过分配给您 pod 的服务账户自动获取临时凭证。请确保仍然提供 AWS_REGIONAWS_BUCKET_NAME

4. 配置 LibreChat 以使用 Amazon S3

更新您的 LibreChat 配置文件 (librechat.yaml),以指定应用程序应使用 Amazon S3 进行文件处理:

version: 1.3.11
cache: true
fileStrategy: '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 S3Firebase,或配置 fileStrategies 以仅将这些类型路由到支持 CDN 的策略:

fileStrategies:
  avatar: 'cloudfront'
  image: 'cloudfront'
  document: 's3'

摘要

  1. 创建 AWS 账户和 IAM 用户(或配置 IRSA):
  • 对于传统部署,请创建一个具有编程访问权限的 IAM 用户并获取您的访问密钥。
  • 对于 Kubernetes 部署(例如在 EKS 上),请设置 IRSA,以便您的 Pod 自动获取临时凭证。
  1. 创建 S3 存储桶:
  • 使用 Amazon S3 控制台创建一个存储桶,并选择一个唯一的名称和区域。
  1. 更新环境变量:
  • 对于非 IRSA 环境:请在您的 .env 文件中设置 AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEYAWS_REGIONAWS_BUCKET_NAME
  • 对于 IRSA:仅设置 AWS_REGIONAWS_BUCKET_NAME;确保您的 pod 的服务账户已正确添加注解。
  1. 配置 LibreChat:
  • 在您的 librechat.yaml 配置文件中将 fileStrategy 设置为 "s3",或者使用 fileStrategies 将文档保留在 S3 中,同时通过 CloudFront 发送图像和头像。

通过这些步骤,您的 LibreChat 应用程序将使用 Amazon S3 来处理文件上传、下载和删除。此外,借助 IRSA 支持,您的应用程序可以在 Kubernetes 上安全运行,而无需嵌入长期 AWS 凭证。

注意

请务必确保您的 AWS 凭证安全。请勿将其提交到公共仓库。 根据需要调整 IAM 策略,以遵循最小权限原则。

这篇指南怎么样?