CloudFront dengan S3
Konfigurasikan Amazon CloudFront sebagai lapisan CDN untuk file LibreChat yang disimpan di S3, termasuk tautan media yang stabil, cookie yang ditandatangani, dan URL unduhan yang ditandatangani.
CloudFront memungkinkan LibreChat menyimpan file di S3 sekaligus menyajikan gambar, avatar, dan unduhan melalui URL CDN yang stabil. Ini adalah pengaturan AWS yang direkomendasikan jika Anda menginginkan ketahanan S3 tanpa mengekspos pengguna pada URL gambar presigned S3 yang kedaluwarsa.
Kapan Menggunakan CloudFront
Gunakan CloudFront jika Anda ingin:
- URL avatar dan gambar yang stabil yang terus dirender di seluruh UI
- Global edge caching di depan bucket S3
- Cookie yang ditandatangani untuk gambar inline pribadi dan avatar
- URL yang ditandatangani dan diotorisasi oleh backend untuk unduhan
- Invalidasi cache opsional saat file dihapus
S3 masih diperlukan
Strategi file cloudfront menyimpan objek di S3 dan mengembalikan URL CloudFront. Konfigurasikan variabel lingkungan S3 terlebih dahulu, kemudian tambahkan blok cloudfront di dalam librechat.yaml.
Persyaratan
- Bucket S3 pribadi
- Distribusi CloudFront dengan bucket S3 sebagai origin
- Origin Access Control (OAC) atau kebijakan akses origin yang setara agar CloudFront dapat membaca dari S3
AWS_REGIONdanAWS_BUCKET_NAMEAWS_ACCESS_KEY_IDdanAWS_SECRET_ACCESS_KEY, kecuali jika deployment Anda menggunakan penyedia identitas AWS seperti IRSACLOUDFRONT_KEY_PAIR_IDdanCLOUDFRONT_PRIVATE_KEYsaat menggunakan signed cookies atau signed download URLs
Environment Variables
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 harus berisi kunci privat PEM lengkap. Di dalam .env, beri tanda kutip dan pertahankan baris baru, atau masukkan dari pengelola rahasia platform Anda.
Konfigurasi Dasar
Gunakan fileStrategies jika Anda menginginkan CloudFront untuk gambar dan avatar namun tetap menyimpan dokumen pada URL yang ditandatangani (signed URLs) S3:
version: 1.3.11
fileStrategies:
avatar: 'cloudfront'
image: 'cloudfront'
document: 's3'
cloudfront:
domain: 'https://cdn.example.com'
imageSigning: 'none'
urlExpiry: 3600Gunakan fileStrategy jika setiap tipe file harus menggunakan CloudFront:
fileStrategy: 'cloudfront'
cloudfront:
domain: 'https://cdn.example.com'Signed Cookies
Signed cookies adalah mode aman untuk gambar inline pribadi dan avatar. Fitur ini memungkinkan LibreChat untuk menjaga URL CloudFront yang stabil dalam pesan dan catatan sekaligus memberikan otorisasi akses dengan cookie yang berumur pendek.
fileStrategies:
avatar: 'cloudfront'
image: 'cloudfront'
document: 's3'
cloudfront:
domain: 'https://cdn.example.com'
imageSigning: 'cookies'
cookieDomain: '.example.com'
cookieExpiry: 1800
urlExpiry: 3600
requireSignedAccess: truePersyaratan Domain
Untuk cookie yang ditandatangani (signed cookies), API LibreChat dan nama host CloudFront harus berbagi domain induk yang sama:
- API:
https://api.example.com - CNAME CloudFront:
https://cdn.example.com cookieDomain: ".example.com"
cookieDomain harus diawali dengan titik. Browser tidak akan mengirim cookie CloudFront ke domain yang tidak terkait.
Apa yang Dilindungi oleh Cookies
LibreChat membatasi cookie yang ditandatangani (signed cookies) ke jalur media inline:
/i/...gambar pribadi yang diunggah atau dibuat, dicakup untuk pengguna/a/...aset avatar, dicakup ke penyewa (tenant) saattenantIdada
Dokumen, unggahan umum, dan output kode tetap berada di luar jalur media inline tersebut. Unduhan diotorisasi oleh backend dan dikembalikan sebagai URL CloudFront yang telah ditandatangani.
Penyegaran Cookie
Saat mode signed-cookie aktif, LibreChat mengiklankan endpoint penyegaran cookie dalam konfigurasi startup:
POST /api/auth/cloudfront/refreshSesi terautentikasi menyegarkan cookie selama alur autentikasi, penyegaran token, dan jalur percobaan ulang gambar CloudFront. Respons penyegaran mencakup masa berlaku cookie dan waktu penyegaran yang disarankan.
Unduhan Bertanda Tangan
LibreChat menggunakan URL CloudFront yang ditandatangani untuk unduhan yang diotorisasi. Pengaturan urlExpiry mengontrol masa berlakunya dalam hitungan detik:
cloudfront:
domain: 'https://cdn.example.com'
imageSigning: 'cookies'
cookieDomain: '.example.com'
urlExpiry: 3600Untuk penggantian nama file dan content-type unduhan langsung, konfigurasikan kebijakan cache/origin request CloudFront untuk meneruskan string kueri ini ke S3:
response-content-dispositionresponse-content-type
Untuk jalur unduhan, lampirkan kebijakan header respons dengan:
X-Content-Type-Options: nosniff- Content Security Policy yang restriktif, seperti
default-src 'none'
Invalidasi Cache
Secara default, LibreChat menghapus objek S3 dan tidak membuat invalidasi CloudFront. Aktifkan invalidasi jika file yang dihapus harus segera hilang dari cache edge:
cloudfront:
domain: 'https://cdn.example.com'
distributionId: 'E1234ABCD'
invalidateOnDelete: truedistributionId diperlukan saat invalidateOnDelete bernilai true. Identitas AWS yang digunakan oleh LibreChat juga memerlukan cloudfront:CreateInvalidation.
Jalur Objek Multi-Wilayah
includeRegionInPath menambahkan wilayah penyimpanan ke kunci objek yang baru dibuat:
cloudfront:
domain: 'https://cdn.example.com'
storageRegion: 'us-east-2'
includeRegionInPath: trueSaat diaktifkan, kunci baru menyertakan segmen jalur yang peka terhadap wilayah (region-aware), contohnya:
/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.pdfIni hanya memengaruhi kunci yang baru dibuat. File yang sudah ada tidak dipindahkan. LibreChat tidak mengonfigurasi origin CloudFront, Route 53, atau perutean regional untuk Anda.
Referensi Blok CloudFront
| Key | Type | Description | Example |
|---|---|---|---|
| domain | string | Domain distribusi CloudFront atau CNAME. Wajib diisi. | domain: "https://cdn.example.com" |
| distributionId | string | ID Distribusi yang digunakan untuk invalidasi cache. | distributionId: "E1234ABCD" |
| invalidateOnDelete | boolean | Buat invalidasi CloudFront saat file dihapus. Default: false. | invalidateOnDelete: false |
| imageSigning | string | Mode akses media inline. Gunakan `"none"` untuk akses CloudFront publik atau `"cookies"` untuk cookie yang ditandatangani. `"url"` dicadangkan dan belum diimplementasikan untuk gambar. | imageSigning: "cookies" |
| cookieDomain | string | Domain induk bersama untuk cookie yang ditandatangani. Diperlukan saat `imageSigning` bernilai `"cookies"`. | cookieDomain: ".example.com" |
| cookieExpiry | number | Masa berlaku cookie yang ditandatangani dalam detik. Default: 1800. Maksimum: 604800. | cookieExpiry: 1800 |
| urlExpiry | number | Masa berlaku URL unduhan yang ditandatangani dalam detik. Default: 3600. | urlExpiry: 3600 |
| storageRegion | string | Label wilayah opsional untuk jalur objek yang peka terhadap wilayah. | storageRegion: "us-east-2" |
| includeRegionInPath | boolean | Sertakan `storageRegion` dalam kunci objek yang baru dibuat. Default: false. | includeRegionInPath: false |
| requireSignedAccess | boolean | Gagal memulai jika akses CloudFront signed-cookie tidak dapat diinisialisasi. Default: false. | requireSignedAccess: true |
Izin AWS yang Disarankan
Gunakan izin IAM least-privilege untuk bucket S3. Tambahkan izin invalidasi CloudFront hanya jika invalidateOnDelete diaktifkan.
{
"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"
}
]
}Pemecahan Masalah
- Log startup
CloudFront domain is required: tambahkancloudfront.domain. - Log startup
S3 must be initialized: konfigurasikan variabel lingkungan S3 terlebih dahulu. - Signed cookies tidak disetel: konfirmasi
imageSigning: "cookies",cookieDomain,CLOUDFRONT_KEY_PAIR_ID, danCLOUDFRONT_PRIVATE_KEY. - Browser masih tidak dapat memuat gambar: pastikan hostname API dan CDN berbagi domain induk yang dikonfigurasi dan bahwa cookie diizinkan dengan
SecuredanSameSite=None. - Pengabaian nama file/tipe konten unduhan: perbarui kebijakan cache/permintaan origin CloudFront untuk meneruskan string kueri penggantian respons.
Bagaimana panduan ini?