CloudFront com S3
Configure o Amazon CloudFront como a camada de CDN para arquivos do LibreChat armazenados no S3, incluindo links de mídia estáveis, cookies assinados e URLs de download assinadas.
O CloudFront permite que o LibreChat mantenha arquivos no S3 enquanto disponibiliza imagens, avatares e downloads por meio de URLs de CDN estáveis. Esta é a configuração recomendada da AWS quando você deseja a durabilidade do S3 sem expor os usuários a URLs de imagem pré-assinadas do S3 que expiram.
Quando usar o CloudFront
Use o CloudFront quando você quiser:
- URLs de avatar e imagem estáveis que continuam sendo renderizadas em toda a UI
- Cache de borda global na frente de um bucket S3
- Cookies assinados para imagens inline privadas e avatares
- URLs assinadas autorizadas pelo backend para downloads
- Invalidação de cache opcional quando arquivos são excluídos
S3 ainda é necessário
A estratégia de arquivo cloudfront armazena objetos no S3 e retorna URLs do CloudFront. Configure as variáveis de ambiente do S3 primeiro, depois adicione o bloco cloudfront no librechat.yaml.
Requisitos
- Um bucket S3 privado
- Uma distribuição CloudFront com o bucket S3 como origem
- Um Origin Access Control (OAC) ou política de acesso à origem equivalente para que o CloudFront possa ler do S3
AWS_REGIONeAWS_BUCKET_NAMEAWS_ACCESS_KEY_IDeAWS_SECRET_ACCESS_KEY, a menos que sua implantação utilize um provedor de identidade AWS, como o IRSACLOUDFRONT_KEY_PAIR_IDeCLOUDFRONT_PRIVATE_KEYao usar cookies assinados ou URLs de download assinadas
Variáveis de Ambiente
AWS_ACCESS_KEY_ID=your_access_key_id
AWS_SECRET_ACCESS_KEY=your_secret_access_key
AWS_REGION=us-east-1
AWS_BUCKET_NAME=your_bucket_name
# Required for signed cookies and signed CloudFront download URLs
CLOUDFRONT_KEY_PAIR_ID=K1234567890ABC
CLOUDFRONT_PRIVATE_KEY="-----BEGIN RSA PRIVATE KEY-----\n...\n-----END RSA PRIVATE KEY-----"CLOUDFRONT_PRIVATE_KEY deve conter a chave privada PEM completa. No .env, coloque-a entre aspas e preserve as quebras de linha, ou injete-a a partir do gerenciador de segredos da sua plataforma.
Configuração Básica
Use fileStrategies quando você quiser o CloudFront para imagens e avatares, mantendo os documentos em URLs assinadas do S3:
version: 1.3.11
fileStrategies:
avatar: 'cloudfront'
image: 'cloudfront'
document: 's3'
cloudfront:
domain: 'https://cdn.example.com'
imageSigning: 'none'
urlExpiry: 3600Use fileStrategy se todos os tipos de arquivo devem usar o CloudFront:
fileStrategy: 'cloudfront'
cloudfront:
domain: 'https://cdn.example.com'Cookies Assinados
Signed cookies são o modo seguro para imagens inline privadas e avatares. Eles permitem que o LibreChat mantenha URLs estáveis do CloudFront em mensagens e registros, enquanto autoriza o acesso com cookies de curta duração.
fileStrategies:
avatar: 'cloudfront'
image: 'cloudfront'
document: 's3'
cloudfront:
domain: 'https://cdn.example.com'
imageSigning: 'cookies'
cookieDomain: '.example.com'
cookieExpiry: 1800
urlExpiry: 3600
requireSignedAccess: trueRequisitos de Domínio
Para cookies assinados, a API do LibreChat e o hostname do CloudFront devem compartilhar um domínio pai:
- API:
https://api.example.com - CNAME do CloudFront:
https://cdn.example.com cookieDomain: ".example.com"
cookieDomain deve começar com um ponto. O navegador não enviará cookies do CloudFront para um domínio não relacionado.
O que os Cookies Protegem
O LibreChat limita o escopo de cookies assinados aos caminhos de mídia inline:
/i/...imagens privadas enviadas ou geradas, restritas ao usuário/a/...ativos de avatar, com escopo para o tenant quandotenantIdestiver presente
Documentos, uploads gerais e saídas de código permanecem fora desses caminhos de mídia inline. Os downloads são autorizados pelo backend e retornados como URLs assinadas do CloudFront.
Atualização de Cookie
Quando o modo signed-cookie está ativo, o LibreChat anuncia um endpoint de atualização de cookie na configuração de inicialização:
POST /api/auth/cloudfront/refreshSessões autenticadas atualizam cookies durante fluxos de autenticação, atualização de token e caminhos de nova tentativa de imagem do CloudFront. A resposta de atualização inclui o tempo de vida do cookie e o tempo de atualização recomendado.
Downloads Assinados
O LibreChat usa URLs assinadas do CloudFront para downloads autorizados. A configuração urlExpiry controla o tempo de vida delas em segundos:
cloudfront:
domain: 'https://cdn.example.com'
imageSigning: 'cookies'
cookieDomain: '.example.com'
urlExpiry: 3600Para substituições de nome de arquivo e content-type em download direto, configure a política de cache/solicitação de origem do CloudFront para encaminhar estas query strings para o S3:
response-content-dispositionresponse-content-type
Para caminhos de download, anexe uma política de cabeçalhos de resposta com:
X-Content-Type-Options: nosniff- Uma Content Security Policy restritiva, como
default-src 'none'
Invalidação de Cache
Por padrão, o LibreChat exclui o objeto S3 e não cria uma invalidação do CloudFront. Habilite a invalidação quando arquivos excluídos precisarem desaparecer do cache de borda imediatamente:
cloudfront:
domain: 'https://cdn.example.com'
distributionId: 'E1234ABCD'
invalidateOnDelete: truedistributionId é obrigatório quando invalidateOnDelete é true. A identidade AWS usada pelo LibreChat também precisa de cloudfront:CreateInvalidation.
Caminhos de Objeto Multi-Região
includeRegionInPath adiciona a região de armazenamento às chaves de objeto recém-geradas:
cloudfront:
domain: 'https://cdn.example.com'
storageRegion: 'us-east-2'
includeRegionInPath: trueQuando ativado, as novas chaves incluem segmentos de caminho que reconhecem a região, por exemplo:
/i/r/us-east-2/t/tenantId/images/userId/file.png
/a/r/us-east-2/t/tenantId/avatars/userId/avatar.png
/r/us-east-2/t/tenantId/images/userId/file.pdfIsso afeta apenas chaves geradas recentemente. Arquivos existentes não são movidos. O LibreChat não configura origens do CloudFront, Route 53 ou roteamento regional para você.
Referência de Bloco do CloudFront
| Key | Type | Description | Example |
|---|---|---|---|
| domain | string | Domínio de distribuição do CloudFront ou CNAME. Obrigatório. | domain: "https://cdn.example.com" |
| distributionId | string | ID de distribuição usado para invalidações de cache. | distributionId: "E1234ABCD" |
| invalidateOnDelete | boolean | Crie uma invalidação do CloudFront quando um arquivo for excluído. Padrão: false. | invalidateOnDelete: false |
| imageSigning | string | Modo de acesso a mídia inline. Use `"none"` para acesso público via CloudFront ou `"cookies"` para cookies assinados. `"url"` é reservado e não implementado para imagens. | imageSigning: "cookies" |
| cookieDomain | string | Domínio pai compartilhado para cookies assinados. Obrigatório quando `imageSigning` for `"cookies"`. | cookieDomain: ".example.com" |
| cookieExpiry | number | Tempo de vida do cookie assinado em segundos. Padrão: 1800. Máximo: 604800. | cookieExpiry: 1800 |
| urlExpiry | number | Tempo de vida da URL de download assinada em segundos. Padrão: 3600. | urlExpiry: 3600 |
| storageRegion | string | Rótulo de região opcional para caminhos de objeto com reconhecimento de região. | storageRegion: "us-east-2" |
| includeRegionInPath | boolean | Incluir `storageRegion` nas chaves de objeto recém-geradas. Padrão: false. | includeRegionInPath: false |
| requireSignedAccess | boolean | Falhar na inicialização se o acesso CloudFront com signed-cookie não puder ser inicializado. Padrão: false. | requireSignedAccess: true |
Permissões AWS Sugeridas
Use permissões IAM de privilégio mínimo para o bucket S3. Adicione a permissão de invalidação do CloudFront apenas se invalidateOnDelete estiver habilitado.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ["s3:PutObject", "s3:GetObject", "s3:DeleteObject", "s3:ListBucket"],
"Resource": ["arn:aws:s3:::my-librechat-bucket", "arn:aws:s3:::my-librechat-bucket/*"]
},
{
"Effect": "Allow",
"Action": "cloudfront:CreateInvalidation",
"Resource": "arn:aws:cloudfront::123456789012:distribution/E1234ABCD"
}
]
}Solução de problemas
- Logs de inicialização
CloudFront domain is required: adicionecloudfront.domain. - Logs de inicialização
S3 must be initialized: configure as variáveis de ambiente do S3 primeiro. - Cookies assinados não estão configurados: confirme
imageSigning: "cookies",cookieDomain,CLOUDFRONT_KEY_PAIR_IDeCLOUDFRONT_PRIVATE_KEY. - O navegador ainda não consegue carregar imagens: confirme se os nomes de host da API e da CDN compartilham o domínio pai configurado e se os cookies são permitidos com
SecureeSameSite=None. - Downloads ignoram o nome do arquivo/tipo de conteúdo: atualize a política de cache/solicitação de origem do CloudFront para encaminhar as strings de consulta de substituição de resposta.
Como está este guia?