Học sinh học trọn một lộ trình từ Starters tới IELTS mà không rời thương hiệu Teado. Đưa exam.flyer.us về teacher.teado.ai/exam và ieltsguru.ai về teacher.teado.ai/ielts, hai tên miền gốc vẫn chạy song song.
Tài liệu trả lời yêu cầu ngày 29/09/2026, nguyên văn:
nếu giờ anh muốn host toàn bộ site exam.flyer.us thêm một version nữa ở teacher.teado.ai/exam thì sẽ setup thế nào
có cần tốn nhiều effort không? ý anh là product sẽ song song chạy ở exam.flyer.us và teacher.teado.ai/exam nha. access both will work
nếu anh muốn cho ieltsguru.ai vào teacher.teado.ai/ielts... luôn có được không? Thì sprint tới sẽ anh cho vào và viết luôn PRD tasks này
Trợ lý AI soạn trong một phiên làm việc. Phần hiện trạng hạ tầng kiểm chứng trực tiếp bằng dig, curl và đọc mã nguồn webs-exam, webs-ielts, partner-web, flyer-rs ngày 29/09/2026. Phần ước tính công và lộ trình là đề xuất, chưa qua thảo luận với đội kỹ thuật. Con số đếm tệp lấy bằng grep nên là cận dưới: nó bắt được đường dẫn viết thẳng, không bắt được đường dẫn ghép chuỗi lúc chạy.
Teado.ai trở thành nơi một học sinh đi trọn con đường từ tiểu học tới IELTS, không phải chuyển sang thương hiệu khác giữa chừng.
| Mục tiêu | Thước đo |
|---|---|
| Học sinh không rời thương hiệu | Không lời mời vào lớp nào từ giáo viên Teado trỏ sang tên miền flyer.us. |
| Đủ bậc, không đứt đoạn | Từ Starters tới IELTS, mọi bậc giao và làm được dưới cùng một tên miền. |
| Không phá thứ đang chạy | exam.flyer.us và ieltsguru.ai hoạt động không đổi. |
| Đo được nguồn | Phân biệt được lượt dùng ở tên miền gốc và ở dưới Teado. |
Bậc học không phải xây mới. Cơ sở dữ liệu đã có 13 bậc đang mở, phủ trọn từ tiểu học tới IELTS.
| Nhóm tuổi | Bậc | Số bài | Ghi chú |
|---|---|---|---|
| Tiểu học | SET Primary | 10.143 | Nền tảng lớn nhất của kho |
| Starters | 2.911 | ||
| Movers | 2.841 | ||
| Flyers | 1.852 | ||
| TOEFL Primary | 896 | ||
| IOE | 585 | ||
| Trung học cơ sở | SET Junior | 2.449 | Nối tiếp bậc tiểu học |
| KET | 1.292 | ||
| TOEFL Junior | 40 | ||
| Trung học phổ thông | PET | 2.412 | |
| Luyện thi | IELTS | 3.974 | Đang nằm ở một sản phẩm riêng |
| Dùng chung | Practice | 15.475 | Luyện tập tự do |
| Placement Test | 53 | Xếp bậc đầu vào |
Giáo viên Teado giao bài xong thì học sinh bị đẩy sang một thương hiệu khác. Nguyên nhân nằm ở ba hằng số trong partner-web/src/constants.ts, đều chỉ có một giá trị duy nhất, không có nhánh theo tên miền.
| Việc của học sinh | Hiện đi đâu | Vấn đề |
|---|---|---|
| Nhận lời mời vào lớp | exam.flyer.us | Giáo viên gắn nhãn Teado, học sinh nhận link FLYER. Phụ huynh thấy hai thương hiệu cho một khoá học. |
| Làm bài được giao | exam.flyer.us | Toàn bộ trải nghiệm học nằm ngoài Teado. |
| Lớp IELTS | ielts.flyer.us | Còn đi qua một lần chuyển hướng không mã hoá sang ieltsguru.ai. |
| Xem kết quả | exam.flyer.us | Liên kết kết quả gửi cho phụ huynh mang tên miền khác. |
| # | Yêu cầu | Mô tả |
|---|---|---|
| FR1 | Đủ bậc trong kho của Teado | Giáo viên Teado thấy và giao được cả 13 bậc đang mở. Đã đạt, chỉ cần xác nhận lại khi phát hành. |
| FR2 | Lời mời vào lớp mang tên miền Teado | Giáo viên đăng nhập ở Teado thì mã lớp sinh ra link teacher.teado.ai/exam/..., không phải exam.flyer.us. |
| FR3 | Học sinh làm bài dưới Teado | Trọn vòng: vào lớp, nhận bài, làm, nộp từng phần, kết thúc, xem kết quả — tất cả dưới teacher.teado.ai/exam. |
| FR4 | Lớp IELTS dưới Teado | Tương tự FR3 với teacher.teado.ai/ielts, thay cho chuyển hướng sang ieltsguru.ai. |
| FR5 | Xếp bậc đầu vào | Placement Test chạy được dưới Teado, để học sinh mới được xếp đúng bậc trước khi bắt đầu. |
| FR6 | Chuyển bậc liền mạch | Học sinh lên bậc từ Starters tới IELTS không phải đổi tài khoản, không phải đổi tên miền. Đây là yêu cầu phân biệt Teado với việc ghép hai sản phẩm rời. |
| FR7 | Liên kết kết quả và báo cáo | Mọi liên kết gửi cho phụ huynh sinh ra từ tài khoản Teado đều mang tên miền Teado. |
| FR8 | Hai tên miền gốc chạy song song | exam.flyer.us và ieltsguru.ai hoạt động y như trước. Đây là ràng buộc, không phải mục tiêu phụ. |
| FR9 | Chuyển tiếp êm cho link cũ | Link exam.flyer.us đã phát cho học sinh trước đó vẫn mở được, không hỏng. |
| FR10 | Đo được theo bề mặt | Mỗi sự kiện mang thuộc tính phân biệt tên miền, theo quy ước của bộ sự kiện đo lường. |
EXAM_URL, IELTS_URL, STUDY_URL phải chuyển từ giá trị cố định sang hàm suy theo tên miền đang phục vụ. Làm chỗ này một lần thì cả sáu yêu cầu cùng được giải; bỏ sót thì mỗi màn hình lại tự sinh link sai một kiểu.
| # | Yêu cầu | Ngưỡng |
|---|---|---|
| NFR1 | Đăng nhập dùng chung | Đăng nhập một lần ở Teado thì vào được cả phần làm bài, không đăng nhập lại. Đã sẵn sàng: máy chủ suy miền cookie từ Host. |
| NFR2 | Tốc độ không kém bản gốc | Thời gian hiện nội dung đầu tiên dưới đường dẫn con không chậm hơn bản gốc quá 10%. |
| NFR3 | Không trùng lặp với công cụ tìm kiếm | Bản dưới Teado đặt canonical trỏ về bản gốc. |
| NFR4 | Phát hành cùng ngày | Hai bản dựng từ cùng một commit, chênh nhau tối đa một ngày. |
| NFR5 | Không chặng không mã hoá | Mọi chuyển hướng dùng https. Hiện ielts.flyer.us đang vi phạm. |
| Việc | Lý do |
|---|---|
| Xây nội dung mới | 13 bậc đã đủ phủ tiểu học tới IELTS. Thiếu hụt nội dung là việc riêng của đội học thuật. |
| Tách nhận diện thương hiệu | Hiện hai tên miền dùng chung logo và tiêu đề. Đáng làm nhưng là dự án riêng. |
| Đưa Study vào Teado | STUDY_URL cũng cố định, nhưng tự học chưa phải trọng tâm của lộ trình này. |
| Ứng dụng di động | Liên kết sâu của ứng dụng chỉ khai cho flyer.us. Chấp nhận giai đoạn đầu. |
Bốn điều kiểm chứng trực tiếp, không suy đoán.
Định tuyến theo Host xảy ra ở ingress HAProxy trong cụm EKS, không phải ở CloudFront. Thêm một ứng dụng dưới đường dẫn con là thêm một luật ingress, không phải dựng hạ tầng mới.
/exam đang bị chiếmteacher.teado.ai/exam hiện trả về 200, do partner-web phục vụ — cùng buildId với trang chủ. Đây là trang bắt-tất của partner-web. Luật mới phải đứng trước partner-web trong thứ tự khớp của ingress.
flyer-rs/api/src/http/cookie.rs suy ra thuộc tính Domain của cookie từ Host của request. Request tới teacher.teado.ai/exam nhận cookie .teado.ai — đúng cái Teado đang dùng. Không phải dựng lại cơ chế chuyển phiên qua hash URL như giữa flyer.us và teado.ai.
apps/exam/next.config.mjs dòng 25 và 32 có sẵn basePath = '/exam', đang bị chú thích từ 2022. Trong phần rewrite còn luật /exam/:locale → /:locale. Có người đã đi đường này rồi, nên phần khung đã có.
Hệ quả trực tiếp cho yêu cầu chạy song song:
| Nơi phục vụ | basePath | Bản dựng |
|---|---|---|
exam.flyer.us/ | rỗng | Bản A, giữ nguyên như hiện nay |
teacher.teado.ai/exam | /exam | Bản B, dựng riêng từ cùng mã nguồn |
Hai bản dựng nghĩa là: một mã nguồn, hai ảnh Docker, hai deployment, hai bộ biến môi trường. Một lần phát hành phải dựng và kiểm hai lần.
/exam rồi chuyển tiếp xuống bản dựng gốc. Nhưng khi đó Next vẫn phát tài nguyên ở /_next/* và sinh liên kết trỏ về /vi/.... Trên teacher.teado.ai hai đường này thuộc về partner-web, nên khách chọn một liên kết là rơi sang ứng dụng khác, còn tài nguyên thì tranh nhau. Cách này hỏng, không phải chỉ kém.
basePath tự sửa liên kết đi qua next/link và next/router. Nó không sửa đường dẫn viết cứng, window.location, và thuộc tính src của next/image. Đó là phần phải rà tay.
| Hạng mục | exam | IELTS | Ghi chú |
|---|---|---|---|
| Số route | 91 | 51 | Mỗi route cần thử lại dưới tiền tố |
| Tệp nguồn | 1.029 | 631 | |
| URL tuyệt đối viết cứng | 25 | 65 | Phải đổi sang đường dẫn tương đối |
router.push('/…') | 53 | 29 | basePath tự xử lý, chỉ cần thử lại |
window.location.href = | 25 | 10 | Không được tự xử lý, phải sửa tay |
src="/…" | 17 | — | Ảnh cần thêm tiền tố |
grep nên chỉ bắt được đường dẫn viết thẳng. Đường dẫn ghép chuỗi lúc chạy không hiện ra. Dự phòng thêm khoảng 30% cho phần này.
| Giai đoạn | exam | IELTS |
|---|---|---|
| Bật basePath, sửa đường dẫn cứng | 3–4 ngày | 4–5 ngày |
| Bản dựng thứ hai trong CI | 1–2 ngày | 1–2 ngày |
| Luật ingress và kiểm chứng | 1 ngày | 2–3 ngày |
| Thử lại toàn bộ route | 2–3 ngày | 2 ngày |
| Tổng | 1,5–2 tuần | 2–3 tuần |
| # | Cách làm | Đánh giá |
|---|---|---|
| A | Ingress theo đường dẫn + basePath | Đề xuất. Thêm luật host=teacher.teado.ai, path=/exam trỏ vào bản dựng B. Đúng tầng, không thêm chặng mạng, hai bản độc lập nhau. |
| B | Rewrite trong partner-web | partner-web thành máy chủ proxy cho ứng dụng khác. Thêm một chặng mạng, vẫn cần basePath, và mọi sự cố của exam kéo theo partner-web. |
| C | Tên miền con riêngexam.teado.ai | Rẻ hơn hẳn: không cần basePath, không cần bản dựng thứ hai. Chỉ thêm DNS và một luật host. Nhưng không đạt mục tiêu một cửa vào duy nhất. |
IELTS không nằm sẵn trong hạ tầng chung như exam, nên có ba việc phát sinh.
| Điểm khác | Hiện trạng |
|---|---|
| CloudFront khác | ieltsguru.ai nằm ở một distribution riêng, không phải deoempogczwja như ba tên miền kia. |
| Có cả Cloudflare | www.ieltsguru.ai trỏ Cloudflare, còn tên miền gốc trỏ CloudFront. Hai lớp biên khác nhau cho cùng một trang. |
| Tên miền cũ chỉ chuyển hướng | ielts.flyer.us trả 302 sang http://ieltsguru.ai/, và trỏ thẳng vào ELB của HAProxy, không qua CloudFront. |
| Chưa có basePath | Khác exam, webs-ielts chưa có sẵn phần khung đã chuẩn bị. |
| Dùng chung máy chủ | Thuận lợi. Vẫn gọi api.flyer.us nên cookie hoạt động y như exam. |
ielts.flyer.us chuyển sang http://ieltsguru.ai/ chứ không phải https. Khách đi qua một chặng không mã hoá trước khi được nâng lên https. Đây là lỗi độc lập với tài liệu này, nên sửa sớm dù có làm hay không.
| # | Task | Kho | Nội dung |
|---|---|---|---|
| 0 | Chốt phương án và mục tiêu | — | Một tên miền duy nhất, hay chỉ cần giữ thương hiệu Teado. Quyết định này đổi khối lượng gấp năm lần. |
| 1 | Bật basePath cho exam | webs-exam | Bỏ chú thích dòng 25 và 32 của apps/exam/next.config.mjs, đọc từ biến môi trường để một mã nguồn dựng được cả hai bản. |
| 2 | Rà đường dẫn cứng trong exam | webs-exam | 25 URL tuyệt đối, 25 chỗ window.location.href, 17 chỗ src="/". Đổi sang đường dẫn tương đối hoặc thêm tiền tố. |
| 3 | Bản dựng thứ hai trong CI | webs-exam | Thêm nhánh dựng ảnh với basePath=/exam, gắn thẻ ảnh riêng, deployment riêng trong namespace production. |
| 4 | Luật ingress cho /exam | hạ tầng | Host teacher.teado.ai, path /exam, trỏ service exam bản B. Phải khớp trước luật bắt-tất của partner-web. |
| 5 | Bật basePath cho IELTS | webs-ielts | Thêm mới, chưa có sẵn như exam. |
| 6 | Rà đường dẫn cứng trong IELTS | webs-ielts | 65 URL tuyệt đối, 10 chỗ window.location.href. Nhiều hơn exam vì trang đang tự trỏ về ieltsguru.ai. |
| 7 | Luật ingress cho /ielts | hạ tầng | Kèm việc đưa IELTS về cùng CloudFront với ba tên miền kia, hoặc giữ riêng và chấp nhận hai lớp biên. |
| 7b | Ba hằng số URL suy theo tên miền | partner-web | Task quan trọng nhất. EXAM_URL, IELTS_URL, STUDY_URL trong src/constants.ts chuyển từ giá trị cố định sang hàm đọc Host. Giải một lần cho FR2 tới FR7. |
| 7c | Rà mọi nơi sinh link cho học sinh | partner-web | Mã lớp, liên kết kết quả, liên kết báo cáo gửi phụ huynh. Kiểm bằng cách đăng nhập ở Teado rồi soát mọi link sinh ra. |
| 7d | Placement Test dưới Teado | webs-exam | FR5. Xếp bậc đầu vào phải chạy được trước khi học sinh bắt đầu lộ trình. |
| 8 | Thẻ canonical và sitemap | cả hai | Bản dưới teado trỏ canonical về bản gốc, để không chia nhỏ tín hiệu SEO. Xem ca biên 1. |
| 9 | Sửa 302 của ielts.flyer.us | hạ tầng | Đang trả http://, đổi sang https://. Làm được ngay, không phụ thuộc task nào. |
| 10 | Gắn surface vào sự kiện | cả hai | Phân biệt lượt dùng ở tên miền gốc và ở dưới teado. Theo quy ước của bộ sự kiện đo lường. |
| # | Tình huống | Xử lý |
|---|---|---|
| 1 | Trùng lặp nội dung với Google | Cùng một trang ở hai địa chỉ. Bản dưới teado đặt canonical trỏ về bản gốc, giống cách landing đang làm. Không dùng noindex vì mất luôn cơ hội xếp hạng nếu sau này đổi ý. |
| 2 | Khách đăng nhập ở teado rồi mở link exam.flyer.us | Hai cookie khác miền nên phải đăng nhập lại. Chấp nhận, hoặc dùng cơ chế token qua hash URL đã có sẵn trong partner-web. |
| 3 | Liên kết chia sẻ sinh ra từ bản dưới teado | Phải mang tiền tố /exam. Nếu sinh thiếu, khách nhận link rơi vào trang bắt-tất của partner-web. |
| 4 | Ứng dụng di động mở liên kết sâu | apple-app-site-association và assetlinks.json hiện chỉ khai cho flyer.us. Thêm teado.ai hoặc chấp nhận liên kết sâu chỉ chạy ở tên miền gốc. |
| 5 | Tiền tố ngôn ngữ chồng lên tiền tố đường dẫn | Đường thành /exam/vi/.... Luật rewrite /exam/:locale có sẵn trong config được viết cho tình huống này, cần kiểm lại nó còn đúng. |
| 6 | Khách gõ teacher.teado.ai/exam khi bản B chưa lên | Hiện trả 200 rỗng của partner-web. Trong lúc chuyển tiếp nên cho chuyển hướng sang exam.flyer.us thay vì để trang trắng. |
| 7 | Phát hành lệch giữa hai bản | Hai bản dựng từ cùng commit nhưng có thể lên không cùng lúc. Chốt quy tắc: bản gốc lên trước, bản dưới teado lên sau trong cùng ngày. |
| 8 | Tài nguyên tĩnh dùng chung CDN | assetPrefix đang đọc NEXT_PUBLIC_CDN_URL. Hai bản phải trỏ hai tiền tố khác nhau, nếu không bản này nạp gói của bản kia. |
| # | Tiêu chí |
|---|---|
| 1 | exam.flyer.us hoạt động không khác gì trước khi phát hành, kiểm bằng ảnh chụp đối chiếu. |
| 2 | Cả 91 route của exam mở được dưới teacher.teado.ai/exam, không route nào trả về trang bắt-tất của partner-web. |
| 3 | Đăng nhập ở teacher.teado.ai rồi vào /exam thì không phải đăng nhập lại. |
| 4 | Không lời gọi tài nguyên nào rơi vào /_next/ ở gốc tên miền teado. |
| 5 | Làm trọn một bài thi dưới đường dẫn con: bắt đầu, nộp từng phần, kết thúc, xem kết quả. |
| 6 | Mọi liên kết chia sẻ sinh ra dưới teado đều mang tiền tố đúng. |
| 7 | Canonical của bản dưới teado trỏ về bản gốc. |
| 8 | Lặp lại tiêu chí 1 tới 7 cho IELTS với 51 route. |
| 9 | Không một link nào sinh ra từ tài khoản Teado trỏ sang flyer.us. Soát mã lớp, liên kết kết quả, liên kết báo cáo. |
| 10 | Một học sinh đi trọn lộ trình thử: làm Placement, được xếp bậc, làm một bài Starters, một bài PET, một bài IELTS — cùng một tài khoản, cùng một tên miền. |
| 11 | Link exam.flyer.us phát trước đó vẫn mở được bình thường. |
| Rủi ro | Cách giảm |
|---|---|
| Chi phí bảo trì nhân đôi vĩnh viễn | Đây là rủi ro lớn nhất, và nó không mất đi sau khi làm xong. Mỗi lần phát hành exam từ nay phải dựng và kiểm hai bản. Cân nhắc phương án C nếu mục tiêu chỉ là thương hiệu. |
| Đường dẫn cứng sót lại | Hỏng âm thầm: khách chọn một nút rồi rơi sang ứng dụng khác mà không có lỗi nào được ghi. Bắt bằng cách duyệt tự động toàn bộ route và chặn mọi điều hướng ra ngoài tiền tố. |
| Thứ tự luật ingress | partner-web có luật bắt-tất trên cùng host. Đặt sai thứ tự là /exam vẫn rơi vào partner-web. Kiểm chứng số 2 tồn tại vì điều này. |
| IELTS nằm ngoài hạ tầng chung | Đưa về cùng CloudFront là việc riêng, nên tách thành task độc lập và làm trước, không gộp vào việc bật basePath. |