Tài liệu cho file-storage API chạy trên Muse VM (cổng 8790). Giao diện web ở trang chủ cũng dùng chính các endpoint này.
Dán bản Markdown vào bất kỳ AI agent nào (Muse, ChatGPT…) là agent đó hiểu và dùng được API ngay — chỉ cần bạn đưa thêm token cho nó.
| Đường vào | Địa chỉ | Ghi chú |
|---|---|---|
| Domain (HAProxy TierHive) | https://cloud.chungsuclq.skin | Địa chỉ chính thức — dùng được cả khi bật Cloudflare WARP, không giới hạn dung lượng upload |
| Tailscale Funnel | https://muse-vm.tail588220.ts.net | Có HTTPS; phải tắt WARP mới vào được |
| Nội bộ VM | http://127.0.0.1:8790 | Chỉ gọi được từ bên trong Muse VM |
Trong các ví dụ dưới đây, $BASE là một trong các địa chỉ trên và $TOKEN là token truy cập của kho.
Mọi endpoint (trừ GET /health, GET /, GET /hoc và trang này) đều yêu cầu token. Hai cách gửi:
Authorization: Bearer $TOKENGET /files/<name>?token=$TOKEN — tiện cho thẻ <img>, <video>, <audio> trong trình duyệt.Thiếu hoặc sai token, API trả 401 {"error":"unauthorized"}. Giao diện web lưu token trong localStorage của trình duyệt (khóa ftoken) sau lần nhập đầu tiên.
Kiểm tra server còn sống. Luôn trả:
curl $BASE/health
# {"status": "ok"}
Thống kê dung lượng đĩa và số file trong kho.
curl -H "Authorization: Bearer $TOKEN" $BASE/stats
# {"total": 161057947648, "free": 158..., "disk_used": ...,
# "files": 15, "files_bytes": 2488776781}
| Trường | Ý nghĩa |
|---|---|
total / free / disk_used | Dung lượng đĩa (byte): tổng / còn trống / đã dùng |
files / files_bytes | Số file trong kho và tổng kích thước của chúng |
Liệt kê toàn bộ file trong kho (mảng JSON, sắp xếp theo tên).
curl -H "Authorization: Bearer $TOKEN" $BASE/files
# [{"name": "phim.mp4", "size": 1512345678, "mtime": 1762345678}, ...]
size tính bằng byte; mtime là thời gian sửa cuối dạng Unix epoch (giây).
Tải file lên. Tên file gửi qua header X-Filename (URL-encode), nội dung file là body thô (raw). Giới hạn 16 GB/file.
curl -X POST --data-binary @phim.mp4 \
-H "Authorization: Bearer $TOKEN" \
-H "X-Filename: phim.mp4" \
$BASE/upload
# 201 {"name": "phim.mp4", "size": 1512345678, "sha256": "…"}
Tải lên / ghi đè một file theo tên (tương đương POST /upload nhưng tên nằm trên URL).
curl -T truyen.pdf -H "Authorization: Bearer $TOKEN" $BASE/files/truyen.pdf
# 201 {"name": "truyen.pdf", "size": ..., "sha256": "…"}
Tải file về. Hỗ trợ Range request (trả 206 + Content-Range) nên trình duyệt xem phim/audio sẽ tua và phát theo đoạn được. Kèm header Content-Disposition: attachment.
curl -H "Authorization: Bearer $TOKEN" -O $BASE/files/phim.mp4
# hoặc mở thẳng trên trình duyệt (token qua query):
# $BASE/files/phim.mp4?token=$TOKEN
Xóa một file khỏi kho. Thao tác không hoàn tác được.
curl -X DELETE -H "Authorization: Bearer $TOKEN" $BASE/files/phim.mp4
# {"deleted": "phim.mp4"}
Kho chia được thành các folder — giống cơ chế folder/namespace của Cloudinary: mỗi web/app khi kết nối API chỉ cần khai đúng tên folder của mình là file tự tách riêng, web này không lẫn file của web kia. Ví dụ web luyện thuyết trình dùng folder hoc, kho phim dùng folder phim, truyện dùng truyen.
/. File không khai folder thì nằm ở thư mục gốc (folder rỗng "") — toàn bộ file cũ đều đang ở gốc.?folder=<tên> cho GET /files, GET/PUT/DELETE /files/<name>; riêng upload dùng header X-Folder: <tên> (hoặc query ?folder=). Folder chưa có sẽ được tự tạo khi upload/chuyển file vào.Liệt kê mọi folder kèm số file và tổng dung lượng. Phần tử đầu tiên luôn là thư mục gốc (name rỗng).
curl -H "Authorization: Bearer $TOKEN" $BASE/folders
# [{"name": "", "files": 16, "bytes": ...},
# {"name": "phim", "files": 3, "bytes": ...}]
Tạo folder mới (body JSON).
curl -X POST -H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"name": "phim"}' $BASE/folders
# 201 {"folder": "phim"}
Upload thẳng vào một folder bằng header X-Folder:
curl -X POST --data-binary @tap1.mp4 \
-H "Authorization: Bearer $TOKEN" \
-H "X-Filename: tap1.mp4" -H "X-Folder: phim" \
$BASE/upload
Chuyển một file giữa các folder (body JSON: name, src, dst; để trống nghĩa là thư mục gốc). Folder đích chưa có sẽ tự tạo; nếu đích đã có file trùng tên, API trả 409.
curl -X POST -H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"name": "tap1.mp4", "src": "", "dst": "phim"}' $BASE/move
# {"moved": "tap1.mp4", "to": "phim"}
Xóa một folder và toàn bộ file trong đó. Không xóa được thư mục gốc.
curl -X DELETE -H "Authorization: Bearer $TOKEN" $BASE/folders/phim
# {"deleted_folder": "phim", "files": 3}
| Đường dẫn | Nội dung |
|---|---|
GET / | Giao diện quản lý kho (upload, tìm kiếm, xem trước, tải, xóa) |
GET /docs | Trang tài liệu này |
GET /api.md | Toàn bộ tài liệu API dạng Markdown — cho AI agent đọc (không cần token) |
GET /hoc | App luyện thuyết trình CSoNet (không cần token) |
| Mã | Ý nghĩa |
|---|---|
200 | Thành công (GET, DELETE) |
201 | Đã lưu file (POST /upload, PUT) |
206 | Trả một phần file theo Range |
400 | Thiếu/sai tên file, hoặc body rỗng |
401 | Thiếu hoặc sai token |
404 | Không có file / đường dẫn này |
409 | Trùng tên file ở folder đích khi chuyển file (/move) |
413 | File vượt quá 16 GB |
/ sẽ bị loại. Nên tránh ký tự đặc biệt ngoài chữ, số, dấu . - _ và khoảng trắng.