Tính năng
Thư viện media với thư mục, trình sửa ảnh và lưu trữ R2
Ảnh theo thư mục, sửa trực tiếp, nhập từ URL an toàn, lưu trên ổ đĩa hoặc Cloudflare R2.
Cập nhật lần cuối:

Thư viện media lưu ảnh, video và tài liệu theo từng website; mỗi file bắt buộc có alt. Mặc định lưu trên đĩa local, mỗi site có thể chuyển sang Cloudflare R2 riêng.
Tóm tắt nhanh
- Lưu theo từng site: đĩa local hoặc R2.
- Thư mục, lưới/danh sách, tìm kiếm, lightbox.
- Sửa ảnh: xoay, lật, cắt, đổi kích thước.
- Nhập từ URL có chống SSRF.
- WebP khi upload cho site R2, tùy chọn.

Tính năng chính
- Thư mục Giới hạn trong site đang chọn; kéo thả nhiều file.
- Trình sửa ảnh Xoay, lật, cắt, đổi kích thước tối đa 8192 px.
- Nhập từ URL Máy chủ tải ảnh về, chặn dải địa chỉ nội bộ.
- WebP khi upload Chỉ site R2 bật
r2.compressToWebp. - Cloudflare R2 Khai báo
bucketvàaccountIdcho từng site. - Alt bắt buộc Mọi file phải có văn bản thay thế.
Ảnh cũng vào thư viện khi dán hoặc kéo thả trong trình soạn thảo Markdown. Mỗi file thuộc một site (quản lý nhiều website).
Lưu ở đâu
| Điều kiện | Nơi lưu |
|---|---|
Site có r2.bucket và r2.accountId, R2_OFF khác true |
Cloudflare R2 |
| Mọi trường hợp còn lại | Đĩa local (MEDIA_DIR) |
Lưu ý Site có media công khai trên R2 phải đặt
r2.publicBaseUrl. Hai khóa R2 chỉ ghi, không bao giờ trả qua REST hay GraphQL.
Sửa ảnh tại chỗ

Cảnh báo Sửa ảnh ghi đè file tại cùng đường dẫn nên URL không đổi, nhưng không hoàn tác được. Cần bản gốc thì tải bản sao lên trước.
Nhập ảnh từ URL an toàn
Endpoint POST /api/media/from-url có lớp chống SSRF:
- Chỉ nhận
httpvàhttps - Từ chối nếu địa chỉ thuộc dải private hoặc reserved
- Tối đa 3 redirect, mỗi bước kiểm tra lại
- Tối đa 15 giây và 25 MB mỗi ảnh

Sao lưu
Sao lưu cả database và file media. Docker: lưu volume media_data; R2: bật versioning hoặc rclone sync. Hướng dẫn ở tự host.
Cảnh báo
docker compose down -vxóa volume media. Chưa có lệnh di chuyển sẵn từ local sang R2; xem tài liệu.
Thực hành tốt
- Điền
altmô tả đúng nội dung ảnh - Đặt tên file có nghĩa; cùng tên sẽ ghi đè
- Dùng ảnh đúng kích thước, định dạng nhẹ (hiệu năng và cache)
- Sao lưu database và media cùng lúc
Quyền thao tác media xem phân quyền người dùng. Muốn thử, mở bản demo.
Câu hỏi thường gặp
KDIGI CMS lưu file media ở đâu?
MEDIA_DIR (Docker: /app/media), tách theo id site. Site khai báo bucket và accountId Cloudflare R2 thì upload mới đi vào R2.Chỉnh sửa ảnh có làm mất ảnh gốc không?
Có tự chuyển ảnh sang WebP không?
r2.compressToWebp (mặc định tắt). JPEG, PNG, TIFF, AVIF được chuyển; SVG và GIF động thì không.Cần sao lưu những gì để không mất ảnh?
media_data. R2: dùng versioning của bucket hoặc rclone sync.Đọc tiếp
Trình soạn thảo Markdown
Soạn bài bằng Markdown với Milkdown: slash menu, dán từ Google Docs/Word, bảng, gallery, shortcode. Nội dung xuất HTML sạch, đúng cấu trúc cho SEO.
Quản lý nhiều website
Một bảng quản trị cho nhiều website: tách dữ liệu theo site, cấu hình tên miền, thương hiệu, SEO riêng. Phù hợp agency và doanh nghiệp nhiều thương hiệu.
Phân quyền người dùng
Bốn vai trò super-admin, admin, editor, author; gán theo từng website; tác giả gửi bài chờ duyệt. Có tài khoản demo để thử ngay không cần cài đặt.
Tự host
Cài KDIGI CMS trên VPS của bạn bằng Docker Compose hoặc Coolify: yêu cầu hệ thống, biến môi trường, sao lưu, nâng cấp và các bước tăng cường bảo mật.