Skip to content

Bản đồ nền tảng ​

Trang này là nguồn sự thật duy nhất về cấu trúc hệ thống Conan School. Cả người vận hành lẫn AI trợ lý đều đọc từ đây trước khi sửa bất cứ thứ gì.

Đọc trang này trước

Nếu bạn (hoặc AI) sắp sửa code, hãy đọc Mô hình dữ liệu và Quy tắc triển khai trước. Phần lớn lỗi trong lịch sử dự án đến từ ba cạm bẫy được ghi ở đó.

Các site trong nền tảng ​

DomainThư mục repoVai tròCloudflare
api.conan.schoolapi.conan.school/API trung tâm (Hono + OpenAPI)Workers
tokyo.conan.schoolcom.conan.school/Cổng thành viên (Builder Community)Pages conan-com
www.conan.schoolwww.conan.school/Web marketing công khaiPages
admin.conan.schooladmin.conan.school/Trang quản trịPages admin-conan-school
docs.conan.schooldocs.conan.school/Tài liệu (trang này)Pages docs-conan-school
mentors.conan.schoolmentors.conan.school/Cổng mentorPages
play.conan.schoolplay.conan.school/Trải nghiệm tương tácPages
video.conan.schoolvideo.conan.school/Nền tảng videoPages

Hạ tầng dùng chung ​

Toàn bộ nền tảng chạy chỉ trên Cloudflare, không có máy chủ nào khác.

  • D1, cơ sở dữ liệu chính, conan-platform-production
  • Workers AI + AI Gateway (conan-gateway), mọi lời gọi mô hình đều đi qua gateway để có log và cache
  • Workflows, tác vụ nhiều bước, có thử lại (Member Intelligence, sinh sách)
  • R2, lưu ảnh và media
  • KV, cache
  • Vectorize, tìm kiếm ngữ nghĩa

Luồng xác thực ​

Cổng thành viên Tokyo không gọi thẳng API bằng tên miền chéo. Nó dùng proxy cùng nguồn:

Trình duyệt → tokyo.conan.school/api/*  (Pages Function)
            → api.conan.school/api/*     (kèm cookie thành viên)

Vì vậy /api/session trả 404 khi gọi thẳng api.conan.school là đúng, route đó do Pages Function của Tokyo phục vụ, không phải API trung tâm.

Ba tầng middleware xác thực trong API:

MiddlewareHành viDùng cho
authMiddlewareBắt buộc đăng nhập, 401 nếu khôngHầu hết /api/user/*
optionalAuthMiddlewareCho phép khách vãng lai, userId có thể undefinedNội dung công khai
tenantMiddlewareBắt buộc header x-school-idToàn bộ API đa trường

Cạm bẫy đã từng gây lỗi 500

Với optionalAuthMiddleware, c.get('userId') có thể là undefined. Viết c.get('userId')! chỉ là lời hứa suông với TypeScript, không kiểm tra lúc chạy, truyền undefined vào D1 sẽ ném D1_TYPE_ERROR và trả 500. Luôn kiểm tra thật trước khi dùng.

Đa trường học (multi-tenant) ​

Mọi truy vấn dữ liệu phải lọc theo school_id. Trường mặc định của Tokyo:

5c000000-0001-4000-8000-000000000001

Client bắt buộc gửi header x-school-id; thiếu header sẽ nhận 400 Missing x-school-id.

Đọc tiếp ​

Tài liệu nội bộ nền tảng Conan School.