15.14 - Review and Assessment
Mục tiêu bài học
- Nắm được ý chính của bài và mối liên hệ với module.
- Áp dụng được kiến thức vào bối cảnh CRM/.NET backend.
- Sẵn sàng chuyển sang bài kế tiếp với nền tảng chắc chắn.
Nội dung bài học
15.14.1 — Thực hành
Bài 1: Dockerize CRM API
Mục tiêu: Chạy CRM API hoàn chỉnh trên máy local bằng Docker Compose.
Yêu cầu:
- Viết
Dockerfilemulti-stage cho CRM API (build + runtime stage, non-root user). - Thêm
.dockerignorephù hợp. - Viết
docker-compose.ymlvới các service:crm-api,sqlserver,redis. - Cấu hình
depends_on+healthcheckđảm bảo API chỉ start sau khi DB healthy. - Thêm Seq service, cấu hình Serilog trong API ghi log vào Seq.
- Chạy
docker compose up -d, mởhttp://localhost:5000/swaggervàhttp://localhost:5341(Seq). - Chạy
docker compose logs -f crm-api, tạo một customer qua Swagger, xác nhận log xuất hiện trong Seq.
Deliverable: docker-compose.yml, Dockerfile, .dockerignore, screenshot Seq dashboard có log.
Bài 2: GitHub Actions Pipeline
Mục tiêu: Tự động build, test, và deploy khi push lên nhánh main.
Yêu cầu:
- Tạo workflow
.github/workflows/deploy.ymlvới 3 job:build-and-test,docker-build-push,deploy. - Dùng GitHub Container Registry (
ghcr.io) làm private registry. - Job
build-and-test: restore → build → test (dotnet test với TRX report). - Job
docker-build-push: build image, tag bằngsha-{commit}vàlatest, push lên ghcr.io. - Job
deploy: SSH vào VPS (hoặc dùng mock), chạydocker compose pull && docker compose up -d. - Thêm environment
productionvới required reviewer. - Push code, theo dõi Actions tab, xác nhận pipeline xanh.
Deliverable: File workflow YAML, screenshot Actions run thành công.
Bài 3: Production Checklist
Mục tiêu: Hardening CRM API cho production.
Yêu cầu:
- Health check: implement
/health,/health/ready,/health/livevớiAspNetCore.Diagnostics.HealthChecks. Check SQL Server và Redis. - Structured logging: cấu hình Serilog với
WriteTo.SeqvàWriteTo.Console(JsonFormatter). Log enrichment:MachineName,ThreadId,CorrelationId(via middleware). - HTTPS: cấu hình Kestrel với HTTPS trong production. Nếu deploy Docker Compose, cấu hình nginx terminate SSL với Let's Encrypt.
- Secret management: loại bỏ tất cả hardcode credential, dùng biến môi trường hoặc
.envfile. Kiểm tradocker inspectkhông thấy secret trong image layer. - Graceful shutdown: đảm bảo API xử lý
SIGTERMđúng cách (ASP.NET Core làm tự động, verify bằngdocker stopvà xem log). - Rate limiting: thêm
AddRateLimitercho endpoint public (ASP.NET Core 7+).
Deliverable: Code health check, cấu hình Serilog, nginx config, danh sách checklist đã hoàn thành.
15.14.2 — Tóm tắt
Module này đưa CRM từ máy dev ra production với đầy đủ hạ tầng:
- Docker multi-stage build giảm image size xuống còn ~220 MB, không leak source code hay SDK.
- Docker Compose là "hợp đồng" stack — một lệnh
docker compose up -ddựng toàn bộ CRM. - GitHub Actions tự động hóa pipeline: commit code → test → build image → deploy, giảm human error.
- Linux VPS với nginx + Certbot là lựa chọn tiết kiệm cho project nhỏ-vừa.
- Azure Container Apps là lựa chọn cloud managed phù hợp khi không muốn quản lý server.
- Structured logging (Serilog + Seq) và health check là nền tảng observability không thể thiếu.
- Kubernetes cần thiết khi scale lên nhiều node — Module 18 sẽ đi sâu hơn.
- .NET Aspire giúp local development cloud-native dễ hơn, nhưng không thay thế Docker Compose cho production.
Mindset production: Security (non-root, no hardcoded secrets), Observability (logs, health, metrics), Automation (CI/CD, IaC) — ba trụ cột mọi deploy production cần có.
15.14.3 — Checklist trước khi sang bài tiếp theo
- Bạn đã nắm được các khái niệm chính và giải thích lại được bằng ví dụ của riêng mình.
- Bạn đã chạy hoặc mô phỏng ít nhất một ví dụ trong bài.
- Bạn đã hoàn thành phần quiz/lab cơ bản (hoặc ít nhất tự làm lại theo trí nhớ).
- Bạn đã ghi lại 3 ý chính: học được gì, còn vướng gì, sẽ áp dụng ở đâu trong CRM.
15.14.4 — Kiểm tra & Thực hành (100 điểm)
15.14.5 — Bối cảnh giáo trình (mục tiêu xuyên suốt)
Trục CRM — một mục tiêu rõ: bạn hướng tới CRM production trong From Zero → Senior .NET (Backend-first). Giáo trình ưu tiên backend, bám chuỗi API → dữ liệu → vận hành → kiến trúc phân tán, thay vì trải rộng theo hướng full-stack. Mỗi module củng cố một lớp kỹ năng trên cùng một CRM học tập bạn phát triển xuyên suốt khóa.
| Chuỗi năng lực | Đóng góp vào CRM học tập |
|---|---|
| Giai đoạn 1 — Foundation | Đọc hiểu yêu cầu, mô hình client–server, Git — nền collaboration khi CRM lớn dần. |
| Giai đoạn 2 — C# + P1 | Domain, OOP, LINQ, async, DI — rule nghiệp vụ & tầng ứng dụng (Inventory là bản mẫu trước CRM). |
| Giai đoạn 3 — ASP.NET + P2 | Host, routing, validation, JWT, SignalR — CRM Backend API thực tế. |
| Giai đoạn 4 — Data + P3 | SQL, EF, cache, job, container — CRM ổn định & có thể triển khai. |
| Giai đoạn 5 — Senior + Final | Clean Architecture, event/outbox, gateway, observability, perf — CRM/ERP chịu tải & có chủ. |
15.14.5.1 — Vai trò giai đoạn này trong chuỗi
SQL, EF Core, cache, job nền, Docker + Project 3 — CRM chạy được như môi trường thật (dữ liệu, hiệu năng, vận hành).
15.14.5.2 — Vị trí bài học (trước / sau)
| Mốc | Điểm nối trong giáo trình |
|---|---|
| Trước | Module 14 — Caching + Background Jobs |
| Tiếp theo | Project 3 — Production CRM Platform |
15.14.6 — Quy trình làm bài (hệ thống)
| Bước | Việc cần làm | Output nên có |
|---|---|---|
| 1 | Làm Quiz trước, tự ghi đáp án + 1 dòng lý do | Không xem đáp án; giữ bản nháp |
| 2 | Đối chiếu Đáp án; sửa hiểu sai, ghi takeaway vào README hoặc nhật ký học | 3–5 bullet “tôi đã hiểu…” |
| 3 | Làm Lab theo rubric; trong README nêu phần CRM nào được chạm (Lead, Customer, Deal, Billing…) | Repo / zip + ảnh dotnet run hoặc log |
| 4 | Tự chấm theo bảng điểm; chuẩn bị 1 phút “vấn đáp” nếu mentor hỏi ngẫu nhiên | Điểm + chỗ còn yếu |
15.14.7 — Phần A — Quiz trắc nghiệm (20 điểm)
Gợi ý làm bài: mỗi câu 4 điểm. Ưu tiên suy nghĩ hệ quả trên CRM (tiền, dữ liệu, đa tenant, hiệu năng, bảo mật) — không chỉ nhớ định nghĩa.
Mỗi câu 4 điểm.
Multi-stage Dockerfile với .NET thường nhằm?
A. Tăng kích thước image B. Image runtime nhỏ, không mang SDK vào prod C. Bắt buộc dùng Windows D. Tắt HTTPSĐáp án: B.
HEALTHCHECKtrong Compose/K8s probe dùng để?
A. Backup DB B. Orchestrator biết instance có sẵn sàng traffic C. Build nhanh hơn D. Mã hóa volumeĐáp án: B.
Secret trong production không nên?
A. Dùng Docker secrets / vault / env inject B. Hardcode trong Git C. Mount file read-only D. User Secrets dev-onlyĐáp án: B.
docker compose upkhácdocker buildở?
A. Giống nhau B. Compose orchestrate nhiều service/network/volume C. Chỉ xóa image D. Chỉ cho Windows containerĐáp án: B.
Non-root user trong container giúp?
A. Giảm attack surface khi container bị compromise B. Tăng RAM C. Bắt buộc cho HTTP/2 D. Thay TLSĐáp án: A.
15.14.8 — Phần B — Lab thực tế (80 điểm)
Lab & rubric: trong README, map từng nhóm điểm rubric sang phần CRM (Lead, Customer, Deal, Billing, Notification…) và artifact (test, log, screenshot, migration).
| Tiêu chí | Điểm | Ghi chú |
|---|---|---|
Dockerfile multi-stage + image chạy được dotnet API | 25 | |
docker-compose.yml: API + SQL Server hoặc Postgres + (tuỳ chọn) Redis | 25 | |
Health check wired vào compose depends_on condition (hoặc tương đương) | 15 | |
| GitHub Action build + push image (hoặc build matrix) | 10 | |
| README: biến môi trường, port, lệnh chạy | 5 |
15.14.8.1 — Ngưỡng tổng điểm (Quiz 20 + Lab 80)
| Mức | Điểm | Ý nghĩa |
|---|---|---|
| Đạt | ≥ 70 | Đủ nền để học module kế mà không “lủng” kiến thức cốt lõi. |
| Khá | ≥ 85 | Có minh chứng code + nêu được liên hệ CRM rõ ràng trong README. |
| Giỏi | ≥ 95 | Có mở rộng / edge case / ADR ngắn / test bổ trợ (tùy rubric từng bài). |
15.14.9 — Phần C — Reflect & nối chuỗi (không chấm điểm)
Viết 5–8 câu (README hoặc docs/learning-log.md):
- Kiến thức module / project này sẽ được tái sử dụng trực tiếp ở module hoặc project CRM nào tiếp theo? (ghi tên module / P2 / P3 / Final).
- Nếu bỏ qua phần lab, rủi ro lớn nhất cho CRM ở giai đoạn sau là gì?
- Một quyết định kỹ thuật (nhỏ) bạn sẵn sàng ghi thành ADR một đoạn sau khi làm lab.
15.14.10 — Tài liệu tham khảo
- Docker Documentation — tài liệu chính thức Docker
- Dockerize an ASP.NET Core app — Microsoft Docs
- Docker Compose file reference — v3 spec
- GitHub Actions for .NET — CI/CD với .NET
- appleboy/ssh-action — deploy via SSH
- Azure Container Apps docs — Microsoft Docs
- Serilog Documentation — structured logging
- ASP.NET Core Health Checks — Microsoft Docs
- .NET Aspire docs — cloud-native local dev
- AspNetCore.Diagnostics.HealthChecks — extended health checks (SQL, Redis, URLs)
- Kubernetes Basics — chính thức từ CNCF
Bài tập tổng hợp
- Tóm tắt bài học bằng ngôn ngữ của bạn.
- Liên hệ nội dung với một tình huống thực tế trong dự án.
- Đề xuất một cải tiến cụ thể sau khi học bài này.
Tự kiểm tra
- Bạn có thể giải thích lại nội dung chính trong 2 phút không?
- Bạn có ví dụ áp dụng thực tế chưa?
- Bạn biết bước tiếp theo cần học/triển khai là gì không?
Kết luận
Hoàn thành bài này giúp bạn có góc nhìn đầy đủ hơn trước khi đi tiếp trong module.
Điều hướng
- Bài trước: 15.13 — Ví dụ thực tế nhanh
- Bài tiếp theo: Không có (bài cuối module).
- Về module: Trang mục lục