Skip to main content

Command Palette

Search for a command to run...

Syllabus học automation (3)

Updated
30 min readView as Markdown

PHASE 8 - Platform Engineering (Ngày 226–265)

TUẦN 46 - DOCKER FUNDAMENTALS

Ngày 226: Image & Container

  • Mục tiêu: Hiểu khác biệt giữa image (bản thiết kế) và container (bản chạy).

  • Lý thuyết: Layer trong Docker image, image cache.

  • Thực hành: Build image cho API Task (Phase 2), chạy container, vào shell container để kiểm tra.

Ngày 227: Dockerfile Best Practice

  • Mục tiêu: Viết Dockerfile nhỏ gọn, build nhanh.

  • Lý thuyết: Order layer theo tần suất thay đổi, .dockerignore.

  • Thực hành: Tối ưu lại Dockerfile Ngày 226, đo dung lượng và thời gian build trước/sau.

Ngày 228: Multi-stage Build

  • Mục tiêu: Giảm dung lượng image production.

  • Lý thuyết: Build stage vs runtime stage.

  • Thực hành: Chuyển Dockerfile sang multi-stage cho ứng dụng TypeScript (build ở stage 1, chạy JS đã compile ở stage 2).

Ngày 229: Docker Networking

  • Mục tiêu: Cho nhiều container giao tiếp với nhau đúng cách.

  • Lý thuyết: Bridge network, DNS nội bộ giữa container.

  • Thực hành: Chạy API Task + Postgres trong 2 container riêng, kết nối qua network tên miền nội bộ.

Ngày 230: Volume & Persistence

  • Mục tiêu: Không mất dữ liệu khi container bị xóa.

  • Lý thuyết: Named volume vs bind mount.

  • Thực hành: Cấu hình volume cho Postgres container, xóa container và tạo lại, xác nhận dữ liệu còn nguyên.

TUẦN 47 - DOCKER PRODUCTION

Ngày 231: Docker Compose

  • Mục tiêu: Quản lý nhiều service liên quan bằng 1 file khai báo.

  • Lý thuyết: docker-compose.yml structure, service dependency (depends_on).

  • Thực hành: Viết Compose file chạy toàn bộ stack: API Task + Postgres + Redis + RabbitMQ.

Ngày 232: Environment & Secret trong Docker

  • Mục tiêu: Không hard-code thông tin nhạy cảm vào image.

  • Lý thuyết: .env file, build-time vs runtime variable.

  • Thực hành: Tách toàn bộ config (DB password, API key) ra .env, verify image không chứa secret bằng docker history.

Ngày 233: Health Check

  • Mục tiêu: Biết container có thực sự "sống" hay chỉ đang chạy nhưng lỗi.

  • Lý thuyết: HEALTHCHECK instruction, liveness vs readiness (chuẩn bị cho Kubernetes).

  • Thực hành: Thêm healthcheck cho API Task container, giả lập lỗi để container báo unhealthy.

Ngày 234: Image Security Scanning

  • Mục tiêu: Phát hiện lỗ hổng bảo mật trong image trước khi deploy.

  • Lý thuyết: Vulnerability scanning (Trivy), base image tối giản (distroless/alpine).

  • Thực hành: Chạy Trivy scan image API Task, sửa base image để giảm số lỗ hổng.

Ngày 235: Container Registry

  • Mục tiêu: Lưu trữ và phân phối image cho team/CI.

  • Lý thuyết: Docker Hub, GitHub Container Registry (GHCR), tagging strategy.

  • Thực hành: Push image API Task lên GHCR, cấu hình tag theo git commit SHA.

TUẦN 48 - KUBERNETES BASICS

Ngày 236: Pod & Deployment

  • Mục tiêu: Chạy container trên Kubernetes theo đúng mô hình quản lý.

  • Lý thuyết: Pod là gì, Deployment quản lý ReplicaSet ra sao.

  • Thực hành: Cài Minikube/kind, viết Deployment YAML chạy API Task, apply và kiểm tra pod.

Ngày 237: Service

  • Mục tiêu: Truy cập được vào pod dù pod bị thay thế liên tục.

  • Lý thuyết: ClusterIP, NodePort, LoadBalancer.

  • Thực hành: Tạo Service cho Deployment Ngày 236, test gọi API từ trong cluster.

Ngày 238: Rolling Update

  • Mục tiêu: Deploy phiên bản mới mà không downtime.

  • Lý thuyết: Rolling update strategy, maxSurge/maxUnavailable.

  • Thực hành: Đổi image tag sang version mới, quan sát Kubernetes tự động rolling update từng pod.

Ngày 239: Kubectl Debugging

  • Mục tiêu: Tự tìm ra nguyên nhân khi pod không chạy được.

  • Lý thuyết: kubectl describe, kubectl logs, kubectl exec.

  • Thực hành: Cố tình gây lỗi (sai image tag, thiếu env), dùng kubectl để tìm và sửa lỗi.

Ngày 240: Practice - Deploy Full Stack cơ bản

  • Mục tiêu: Deploy nhiều service liên quan lên Kubernetes.

  • Lý thuyết: Ôn tập Deployment/Service.

  • Thực hành: Deploy API Task + Postgres (dùng tạm PVC đơn giản) lên Minikube, xác nhận API hoạt động qua Service.

TUẦN 49 - KUBERNETES INTERMEDIATE

Ngày 241: StatefulSet

  • Mục tiêu: Chạy đúng cách các service có trạng thái (như DB).

  • Lý thuyết: StatefulSet vs Deployment, stable network identity, ordered deployment.

  • Thực hành: Chuyển Postgres từ Deployment sang StatefulSet, quan sát tên pod cố định (postgres-0).

Ngày 242: PersistentVolume & PersistentVolumeClaim

  • Mục tiêu: Hiểu cách Kubernetes quản lý lưu trữ bền vững.

  • Lý thuyết: PV, PVC, StorageClass.

  • Thực hành: Viết PVC cho StatefulSet Postgres Ngày 241, xác nhận dữ liệu còn khi pod restart.

Ngày 243: Ingress

  • Mục tiêu: Expose nhiều service ra ngoài qua 1 điểm vào duy nhất.

  • Lý thuyết: Ingress Controller (nginx), Ingress rule theo host/path.

  • Thực hành: Cài Ingress Controller, cấu hình route api.local/tasks trỏ tới Service API Task.

Ngày 244: ConfigMap & Secret

  • Mục tiêu: Tách cấu hình khỏi image, quản lý secret an toàn hơn Docker Compose.

  • Lý thuyết: ConfigMap cho config thường, Secret cho dữ liệu nhạy cảm (base64, chưa mã hóa thật).

  • Thực hành: Chuyển toàn bộ .env của API Task sang ConfigMap + Secret, mount vào pod.

Ngày 245: Practice - Kubernetes Intermediate

  • Mục tiêu: Củng cố kỹ năng qua bài tổng hợp.

  • Lý thuyết: Ôn tập StatefulSet, PVC, Ingress, ConfigMap/Secret.

  • Thực hành: Deploy lại toàn bộ stack Ngày 240 nhưng dùng đầy đủ StatefulSet + PVC + Ingress + Secret.

TUẦN 50 - KUBERNETES ADVANCED

Ngày 246: Resource Requests & Limits

  • Mục tiêu: Tránh 1 pod chiếm hết tài nguyên node.

  • Lý thuyết: requests vs limits (CPU/Memory), OOMKilled.

  • Thực hành: Đặt resource limit thấp cố ý cho API Task, quan sát pod bị OOMKilled, sửa lại đúng mức.

Ngày 247: Horizontal Pod Autoscaler (HPA)

  • Mục tiêu: Tự động scale pod theo tải.

  • Lý thuyết: HPA dựa trên CPU/metric custom, Metrics Server.

  • Thực hành: Cấu hình HPA cho API Task, tạo tải giả (load test) để quan sát pod tự động tăng.

Ngày 248: Liveness & Readiness Probe

  • Mục tiêu: Kubernetes tự phát hiện và xử lý pod bị treo.

  • Lý thuyết: Liveness probe (restart nếu fail) vs Readiness probe (ngừng route traffic nếu fail).

  • Thực hành: Thêm cả 2 probe cho API Task, giả lập pod bị treo để quan sát Kubernetes tự restart.

Ngày 249: Troubleshooting nâng cao

  • Mục tiêu: Debug các lỗi phức tạp hơn (network, DNS trong cluster).

  • Lý thuyết: kubectl exec vào pod để test DNS/network nội bộ, CrashLoopBackOff nguyên nhân phổ biến.

  • Thực hành: Giả lập 1 pod không kết nối được DB do sai Service name, debug từng bước tới khi tìm ra nguyên nhân.

Ngày 250: Practice - Production Readiness Review

  • Mục tiêu: Tự đánh giá 1 deployment Kubernetes có sẵn sàng production chưa.

  • Lý thuyết: Checklist: probe, resource limit, HPA, secret management.

  • Thực hành: Viết checklist review cho stack đã deploy, đánh dấu phần còn thiếu.

TUẦN 51 - TERRAFORM

Ngày 251: Terraform Fundamentals

  • Mục tiêu: Định nghĩa hạ tầng bằng code thay vì click tay.

  • Lý thuyết: Provider, Resource, terraform plan/apply.

  • Thực hành: Viết Terraform tạo thử 1 resource đơn giản (ví dụ 1 Docker container hoặc 1 file local) để làm quen cú pháp.

Ngày 252: State Management

  • Mục tiêu: Hiểu vì sao Terraform cần "nhớ" trạng thái hạ tầng.

  • Lý thuyết: terraform.tfstate, remote state (S3/Terraform Cloud), state locking.

  • Thực hành: Cấu hình remote state, thử 2 người (giả lập) apply cùng lúc để thấy tác dụng của state lock.

Ngày 253: Variables & Outputs

  • Mục tiêu: Viết Terraform module tái sử dụng được.

  • Lý thuyết: variable, output, .tfvars.

  • Thực hành: Tham số hóa cấu hình đã viết (region, instance size) qua variable.

Ngày 254: Modules

  • Mục tiêu: Đóng gói hạ tầng lặp lại thành module dùng chung.

  • Lý thuyết: Module structure, module registry.

  • Thực hành: Tách phần tạo network/VPC thành 1 module riêng, gọi lại từ 2 môi trường (staging/production).

Ngày 255: Practice - IaC Project

  • Mục tiêu: Dựng hạ tầng cho Kubernetes cluster bằng Terraform.

  • Lý thuyết: Provider cho cloud (AWS/GCP) hoặc local (kind) tùy điều kiện thực hành.

  • Thực hành: Viết Terraform tạo 1 Kubernetes cluster (managed hoặc local), verify bằng kubectl get nodes.

TUẦN 52 - VAULT & EXTERNAL SECRETS

Ngày 256: Vault Fundamentals

  • Mục tiêu: Quản lý secret tập trung, có audit, thay vì rải rác trong K8s Secret/.env.

  • Lý thuyết: Secret Engine, Vault Server, unseal/seal.

  • Thực hành: Cài Vault (dev mode), lưu thử 1 secret (DB password) và đọc lại bằng CLI.

Ngày 257: Dynamic Secrets

  • Mục tiêu: Giảm rủi ro khi secret bị lộ (secret có thời hạn ngắn).

  • Lý thuyết: Dynamic Secret Engine cho DB (Vault tự tạo user DB tạm thời).

  • Thực hành: Cấu hình Vault Database Secret Engine cho Postgres, lấy 1 credential tạm thời và test kết nối.

Ngày 258: Vault Policy

  • Mục tiêu: Giới hạn ai/service nào được đọc secret nào.

  • Lý thuyết: Policy syntax (HCL), path-based access control.

  • Thực hành: Viết policy chỉ cho phép service API Task đọc secret DB, không đọc được secret khác.

Ngày 259: External Secrets Operator

  • Mục tiêu: Đồng bộ secret từ Vault vào Kubernetes tự động.

  • Lý thuyết: External Secrets Operator (ESO) kiến trúc, SecretStore/ExternalSecret CRD.

  • Thực hành: Cài ESO, cấu hình đồng bộ secret DB từ Vault vào K8s Secret tự động.

Ngày 260: Practice - Secret Management End-to-End

  • Mục tiêu: Đảm bảo không secret nào còn hard-code trong toàn bộ hệ thống.

  • Lý thuyết: Ôn tập Vault + ESO.

  • Thực hành: Audit lại toàn bộ Deployment đã có, thay hết Secret thủ công bằng ExternalSecret trỏ tới Vault.

TUẦN 53 - GITOPS & CAPSTONE

Ngày 261: GitOps Fundamentals

  • Mục tiêu: Hiểu triết lý "Git là nguồn sự thật duy nhất" cho hạ tầng.

  • Lý thuyết: GitOps vs CI/CD truyền thống, pull-based deployment.

  • Thực hành: Cài ArgoCD, kết nối tới 1 Git repo chứa YAML Deployment API Task.

Ngày 262: Sync Policy

  • Mục tiêu: Kiểm soát cách ArgoCD đồng bộ trạng thái cluster theo Git.

  • Lý thuyết: Manual vs Automated sync, self-heal, prune.

  • Thực hành: Bật Automated Sync, thử sửa trực tiếp trên cluster (kubectl edit) để quan sát ArgoCD tự động sync lại theo Git.

Ngày 263: App of Apps Pattern

  • Mục tiêu: Quản lý nhiều app/service bằng 1 cấu trúc Git thống nhất.

  • Lý thuyết: App of Apps, ApplicationSet.

  • Thực hành: Tổ chức lại repo GitOps quản lý cả API Task, n8n, RabbitMQ theo pattern App of Apps.

Ngày 264: Rollback

  • Mục tiêu: Quay lại phiên bản ổn định nhanh khi deploy lỗi.

  • Lý thuyết: ArgoCD history & rollback, liên hệ với Git revert.

  • Thực hành: Giả lập 1 lần deploy lỗi (sai image tag), thực hiện rollback qua ArgoCD UI/CLI.

Ngày 265: Capstone Phase 8

  • Mục tiêu: Tổng kết toàn bộ Platform Engineering.

  • Lý thuyết: Ôn tập Docker, Kubernetes, Terraform, Vault, GitOps.

  • Thực hành: Demo toàn bộ stack (API Task, Postgres, Redis, RabbitMQ, n8n) chạy trên Kubernetes, hạ tầng tạo bằng Terraform, secret quản lý qua Vault, deploy qua ArgoCD GitOps.

PHASE 9 - Reliability Engineering (Ngày 266–285)

TUẦN 54 - RETRY & BACKOFF

Ngày 266: Retry Pattern

  • Mục tiêu: Xử lý lỗi tạm thời (transient error) mà không cần can thiệp thủ công.

  • Lý thuyết: Transient vs permanent error, khi nào nên/không nên retry.

  • Thực hành: Viết wrapper retry đơn giản cho hàm gọi API Task, giả lập lỗi 2 lần đầu rồi thành công ở lần 3.

Ngày 267: Exponential Backoff

  • Mục tiêu: Tránh "dội bom" hệ thống đang gặp sự cố bằng cách retry dồn dập.

  • Lý thuyết: Exponential backoff formula, max retry, max delay.

  • Thực hành: Nâng cấp wrapper Ngày 266 dùng exponential backoff (1s → 2s → 4s...).

Ngày 268: Jitter

  • Mục tiêu: Tránh nhiều client cùng retry tại đúng 1 thời điểm (thundering herd).

  • Lý thuyết: Full jitter, equal jitter.

  • Thực hành: Thêm jitter ngẫu nhiên vào backoff, viết test mô phỏng 100 client retry cùng lúc để so sánh có/không jitter.

Ngày 269: Retry ở các tầng đã học

  • Mục tiêu: Nhận diện retry đã áp dụng ở đâu trong hệ thống từ đầu khóa tới giờ.

  • Lý thuyết: Ôn lại retry trong Webhook (Phase 2), n8n Error Workflow (Phase 4), RabbitMQ DLQ (Phase 7).

  • Thực hành: Viết bảng liệt kê toàn bộ điểm có retry trong hệ thống đã xây, đánh giá điểm nào còn thiếu.

Ngày 270: Practice - Retry Library

  • Mục tiêu: Có 1 thư viện retry dùng chung cho mọi automation script.

  • Lý thuyết: Ôn tập backoff + jitter.

  • Thực hành: Đóng gói logic retry thành 1 npm module nội bộ @internal/retry, viết unit test.

TUẦN 55 - CIRCUIT BREAKER & RATE LIMIT

Ngày 271: Circuit Breaker Pattern

  • Mục tiêu: Ngừng gọi 1 service đang "chết" thay vì tiếp tục retry vô ích.

  • Lý thuyết: Closed/Open/Half-Open state, threshold.

  • Thực hành: Implement circuit breaker đơn giản quanh 1 API call, giả lập service down liên tục để quan sát state chuyển Open.

Ngày 272: Circuit Breaker Recovery

  • Mục tiêu: Tự động thử lại dịch vụ đã "chết" mà không gây quá tải.

  • Lý thuyết: Half-Open state, cách xác định service đã hồi phục.

  • Thực hành: Cho service "hồi phục" lại, quan sát circuit breaker chuyển Half-Open rồi Closed đúng logic.

Ngày 273: Rate Limiting Algorithm

  • Mục tiêu: Hiểu sâu hơn các thuật toán rate limit (ôn lại Ngày 198 ở tầng khái niệm).

  • Lý thuyết: Token bucket vs Leaky bucket, so sánh burst handling.

  • Thực hành: Implement thử Token Bucket bằng code (không dùng Redis) để hiểu rõ cơ chế nạp/tiêu token.

Ngày 274: Client-side Rate Limiting

  • Mục tiêu: Tự giới hạn tốc độ gọi ra ngoài để không bị SaaS chặn (quan trọng khi tích hợp nhiều API ở Phase 2).

  • Lý thuyết: Respect Retry-After header, quota theo third-party API.

  • Thực hành: Thêm client-side rate limiter cho module gọi GitHub API (Phase 2), tôn trọng header rate limit trả về.

Ngày 275: Practice - Resilience Wrapper

  • Mục tiêu: Kết hợp retry + circuit breaker + rate limit thành 1 lớp bảo vệ chuẩn.

  • Lý thuyết: Ôn tập toàn bộ tuần.

  • Thực hành: Xây 1 module resilientFetch() gộp cả 3 kỹ thuật, áp dụng cho toàn bộ HTTP call trong hệ thống.

TUẦN 56 - IDEMPOTENCY, DLQ & DISTRIBUTED LOCK

Ngày 276: Idempotency

  • Mục tiêu: Xử lý an toàn khi 1 request/message bị gửi trùng (do retry).

  • Lý thuyết: Idempotency key, idempotent operation design.

  • Thực hành: Thêm Idempotency-Key header cho API tạo Task, đảm bảo gửi trùng request không tạo trùng dữ liệu.

Ngày 277: Idempotency ở tầng Message

  • Mục tiêu: Áp dụng idempotency cho consumer Kafka/RabbitMQ (Phase 7).

  • Lý thuyết: Deduplication bằng message ID + bảng "processed_messages".

  • Thực hành: Thêm bảng processed_messages (Postgres), consumer kiểm tra trước khi xử lý để tránh xử lý trùng.

Ngày 278: Dead Letter Queue - Vận hành

  • Mục tiêu: Có quy trình xử lý message trong DLQ thay vì để đó mãi.

  • Lý thuyết: DLQ reprocessing strategy, alerting khi DLQ có message mới.

  • Thực hành: Viết script/n8n workflow định kỳ kiểm tra DLQ (Phase 7), gửi cảnh báo nếu có message tồn đọng.

Ngày 279: Distributed Lock

  • Mục tiêu: Đảm bảo chỉ 1 instance xử lý 1 tác vụ khi có nhiều worker chạy song song.

  • Lý thuyết: Redlock (Redis-based lock), lock timeout, tránh deadlock.

  • Thực hành: Implement distributed lock bằng Redis cho job "đồng bộ dữ liệu" (Phase 4), test chạy 2 worker cùng lúc.

Ngày 280: Practice - Reliability Audit

  • Mục tiêu: Tự đánh giá độ tin cậy của 1 hệ thống có sẵn.

  • Lý thuyết: Ôn tập idempotency, DLQ, distributed lock.

  • Thực hành: Audit lại pipeline Task → Kafka → Redis/RabbitMQ (Phase 7), bổ sung idempotency và lock còn thiếu.

TUẦN 57 - SRE PRACTICES

Ngày 281: On-call Basics

  • Mục tiêu: Hiểu quy trình vận hành khi có sự cố xảy ra ngoài giờ.

  • Lý thuyết: On-call rotation, escalation policy, severity level.

  • Thực hành: Viết 1 tài liệu On-call Runbook mẫu cho hệ thống API Task (các bước xử lý khi API down).

Ngày 282: Postmortem

  • Mục tiêu: Học được gì sau mỗi sự cố thay vì chỉ "chữa cháy".

  • Lý thuyết: Blameless postmortem, cấu trúc: timeline, root cause, action item.

  • Thực hành: Viết 1 postmortem giả lập cho sự cố "API Task down 30 phút do hết connection pool".

Ngày 283: SLO/SLA/Error Budget

  • Mục tiêu: Định lượng được "đủ tốt" nghĩa là gì cho một hệ thống.

  • Lý thuyết: SLI, SLO, SLA khác nhau thế nào, error budget dùng để ra quyết định release.

  • Thực hành: Định nghĩa SLO cho API Task (ví dụ 99.5% request < 500ms), tính thử error budget theo tháng.

Ngày 284: Alerting Strategy

  • Mục tiêu: Alert đúng người, đúng lúc, không gây "alert fatigue".

  • Lý thuyết: Alert theo symptom (user-facing) thay vì cause, alert threshold hợp lý.

  • Thực hành: Thiết kế 3 alert rule cho API Task (error rate, latency, DLQ tồn đọng) kèm mức độ nghiêm trọng.

Ngày 285: Capstone Phase 9

  • Mục tiêu: Tổng kết toàn bộ Reliability Engineering.

  • Lý thuyết: Ôn tập retry, circuit breaker, idempotency, SRE practice.

  • Thực hành: Viết "Reliability Playbook" hoàn chỉnh cho hệ thống đã xây xuyên suốt khóa học: resilience wrapper, idempotency, DLQ handling, on-call runbook, SLO.

PHASE 10 - Observability (Ngày 286–305)

TUẦN 58 - LOGGING

Ngày 286: Structured Logging

  • Mục tiêu: Log có thể tìm kiếm/lọc được thay vì chỉ là text.

  • Lý thuyết: Structured log (JSON), log level (debug/info/warn/error), correlation ID.

  • Thực hành: Thêm structured logging (pino/winston) cho API Task, gắn correlation ID xuyên suốt 1 request.

Ngày 287: ELK Stack Overview

  • Mục tiêu: Hiểu kiến trúc thu thập-lưu trữ-tìm kiếm log phổ biến.

  • Lý thuyết: Elasticsearch (lưu trữ/tìm kiếm), Logstash/Filebeat (thu thập), Kibana (hiển thị).

  • Thực hành: Cài ELK stack bằng Docker Compose, đẩy log của API Task vào Elasticsearch qua Filebeat.

Ngày 288: Truy vấn & Dashboard trong Kibana

  • Mục tiêu: Tìm nhanh log liên quan tới 1 sự cố cụ thể.

  • Lý thuyết: Kibana Query Language (KQL), tạo dashboard đơn giản.

  • Thực hành: Tạo dashboard hiển thị số lượng lỗi theo giờ, tìm log của 1 request cụ thể bằng correlation ID.

Ngày 289: Loki

  • Mục tiêu: Biết một lựa chọn logging nhẹ hơn ELK, hợp với Kubernetes.

  • Lý thuyết: Loki + Promtail kiến trúc, khác biệt so với Elasticsearch (index label thay vì full-text).

  • Thực hành: Cài Loki + Promtail cho stack Kubernetes (Phase 8), xem log qua Grafana.

Ngày 290: So sánh ELK vs Loki

  • Mục tiêu: Chọn đúng công cụ logging theo quy mô hệ thống.

  • Lý thuyết: Bảng so sánh chi phí vận hành, khả năng full-text search, tích hợp Kubernetes.

  • Thực hành: Viết bảng so sánh ELK vs Loki dựa trên trải nghiệm thực tế 3 ngày qua.

TUẦN 59 - METRICS (PROMETHEUS)

Ngày 291: Prometheus Fundamentals

  • Mục tiêu: Hiểu mô hình pull-based metrics của Prometheus.

  • Lý thuyết: Time series data, scrape interval, /metrics endpoint.

  • Thực hành: Cài Prometheus, cấu hình scrape target trỏ tới 1 exporter mẫu (node_exporter).

Ngày 292: Instrumenting Ứng dụng

  • Mục tiêu: Tự expose metric từ chính API Task.

  • Lý thuyết: Client library (prom-client cho Node.js), Counter/Gauge/Histogram.

  • Thực hành: Thêm prom-client vào API Task, expose metric số request, latency histogram tại /metrics.

Ngày 293: PromQL cơ bản

  • Mục tiêu: Truy vấn được xu hướng dữ liệu, không chỉ số hiện tại.

  • Lý thuyết: rate(), sum by(), histogram_quantile().

  • Thực hành: Viết PromQL tính p95 latency của API Task trong 5 phút gần nhất.

Ngày 294: Exporter cho hệ thống đã xây

  • Mục tiêu: Có metric cho toàn bộ hạ tầng, không chỉ app.

  • Lý thuyết: postgres_exporter, redis_exporter, rabbitmq exporter có sẵn.

  • Thực hành: Thêm exporter cho Postgres + Redis (Phase 1, 7), scrape vào Prometheus chung.

Ngày 295: Practice - Metrics Coverage Review

  • Mục tiêu: Đảm bảo mọi thành phần quan trọng đều có metric.

  • Lý thuyết: Ôn tập RED method (Rate, Error, Duration) và USE method (Utilization, Saturation, Errors).

  • Thực hành: Audit hệ thống đã xây, liệt kê metric còn thiếu theo RED/USE method.

TUẦN 60 - GRAFANA & ALERTING

Ngày 296: Grafana Data Source

  • Mục tiêu: Kết nối Grafana với mọi nguồn dữ liệu đã có.

  • Lý thuyết: Data source config (Prometheus, Loki), variable trong dashboard.

  • Thực hành: Kết nối Grafana với Prometheus + Loki, tạo dashboard đầu tiên hiển thị request rate.

Ngày 297: Panel Design

  • Mục tiêu: Xây dashboard dễ đọc, đúng trọng tâm (không "vẽ cho đẹp").

  • Lý thuyết: Chọn loại panel phù hợp (time series, stat, gauge), nguyên tắc "1 dashboard = 1 câu hỏi cần trả lời".

  • Thực hành: Xây dashboard "API Task Health" gồm: request rate, error rate, p95 latency, DLQ length.

Ngày 298: Alerting Rules trong Grafana

  • Mục tiêu: Biến metric thành cảnh báo hành động được.

  • Lý thuyết: Alert rule, threshold, evaluation interval.

  • Thực hành: Tạo alert khi error rate > 5% trong 5 phút, test bằng cách giả lập lỗi.

Ngày 299: Tích hợp PagerDuty/Opsgenie

  • Mục tiêu: Alert tới đúng người on-call (liên kết với Phase 9).

  • Lý thuyết: Notification channel trong Grafana, routing theo severity.

  • Thực hành: Cấu hình alert Ngày 298 gửi qua Slack/webhook mô phỏng PagerDuty, gắn với on-call runbook đã viết ở Phase 9.

Ngày 300: Practice - Dashboard cho toàn hệ thống

  • Mục tiêu: Có cái nhìn tổng quan sức khỏe toàn platform trên 1 màn hình.

  • Lý thuyết: Ôn tập panel design.

  • Thực hành: Xây dashboard tổng hợp: API Task, n8n, RabbitMQ, Kafka consumer lag, Kubernetes pod status.

TUẦN 61 - TRACING (OPENTELEMETRY)

Ngày 301: Distributed Tracing Fundamentals

  • Mục tiêu: Theo dõi 1 request đi qua nhiều service khác nhau.

  • Lý thuyết: Trace, Span, Span context propagation.

  • Thực hành: Vẽ sơ đồ 1 request thực tế (Task created → Kafka → n8n → Slack) và đánh dấu các span sẽ có.

Ngày 302: Cài đặt OpenTelemetry

  • Mục tiêu: Có trace thật cho hệ thống đã xây.

  • Lý thuyết: OpenTelemetry SDK, exporter (OTLP), Collector.

  • Thực hành: Thêm OpenTelemetry SDK vào API Task, xuất trace tới Jaeger/Tempo chạy local.

Ngày 303: Instrument Service Phụ

  • Mục tiêu: Có trace xuyên suốt nhiều service, không chỉ 1 service.

  • Lý thuyết: Context propagation qua HTTP header (traceparent), qua message queue.

  • Thực hành: Thêm tracing cho worker Kafka consumer (Phase 7), đảm bảo trace ID được truyền từ producer sang consumer.

Ngày 304: Trace Analysis

  • Mục tiêu: Dùng trace để tìm bottleneck thực sự trong hệ thống.

  • Lý thuyết: Đọc waterfall view của trace, xác định span nào chiếm nhiều thời gian nhất.

  • Thực hành: Phân tích 1 trace của request chậm, xác định service/bước nào là nguyên nhân.

Ngày 305: Capstone Phase 10

  • Mục tiêu: Tổng hợp toàn bộ Observability thành 1 stack hoàn chỉnh.

  • Lý thuyết: Ôn tập Logging, Metrics, Tracing (3 trụ cột Observability).

  • Thực hành: Demo full observability stack cho hệ thống automation đã xây: log tập trung (Loki), metrics + alert (Prometheus/Grafana), tracing (OpenTelemetry), tất cả liên kết qua correlation/trace ID.

PHASE 11 - AI Automation (Ngày 306–335)

TUẦN 62 - MCP (MODEL CONTEXT PROTOCOL)

Ngày 306: MCP Fundamentals

  • Mục tiêu: Hiểu vì sao cần 1 protocol chuẩn để AI model gọi tool bên ngoài.

  • Lý thuyết: MCP Server/Client, Tool, Resource trong MCP.

  • Thực hành: Đọc tài liệu MCP chính thức, vẽ sơ đồ luồng: Client (Claude) → MCP Server → hệ thống thật (ví dụ API Task).

Ngày 307: Xây MCP Server cơ bản

  • Mục tiêu: Expose 1 chức năng thật thành tool cho AI dùng được.

  • Lý thuyết: Định nghĩa Tool (schema input/output), MCP SDK.

  • Thực hành: Viết 1 MCP Server đơn giản expose tool "tạo Task mới" (gọi lại API Task ở Phase 2).

Ngày 308: Kết nối MCP Server với Client

  • Mục tiêu: Xác nhận AI thực sự gọi được tool đã xây.

  • Lý thuyết: Cấu hình MCP Server trong client (Claude Desktop/Code), authentication cho MCP.

  • Thực hành: Kết nối MCP Server Ngày 307 vào Claude Desktop, thử yêu cầu AI "tạo 1 task mới" bằng ngôn ngữ tự nhiên.

Ngày 309: MCP Resource

  • Mục tiêu: Cho AI đọc được dữ liệu ngữ cảnh, không chỉ gọi action.

  • Lý thuyết: Resource trong MCP (đọc dữ liệu tĩnh/động).

  • Thực hành: Thêm 1 Resource expose danh sách Task hiện có để AI đọc trước khi quyết định hành động.

Ngày 310: Practice - MCP Server hoàn chỉnh

  • Mục tiêu: Có 1 MCP Server production-ready cho hệ thống Task.

  • Lý thuyết: Ôn tập Tool + Resource, error handling trong MCP.

  • Thực hành: Hoàn thiện MCP Server với 3-4 tool (tạo/sửa/xóa/tìm Task) có validate input đầy đủ.

TUẦN 63 - FLOWISE

Ngày 311: Flowise Setup

  • Mục tiêu: Làm quen công cụ xây AI workflow kéo-thả.

  • Lý thuyết: Kiến trúc Flowise (dựa trên LangChain), node types cơ bản (LLM, Prompt, Chain).

  • Thực hành: Cài Flowise (Docker), dựng 1 chatflow đơn giản: nhận câu hỏi → gọi LLM → trả lời.

Ngày 312: Xây Chatflow có Tool

  • Mục tiêu: Cho AI gọi được hành động thật, không chỉ trả lời text.

  • Lý thuyết: Tool/Function node trong Flowise, Agent node.

  • Thực hành: Thêm Tool gọi API Task vào chatflow, thử hỏi "tạo giúp tôi 1 task tên X" bằng ngôn ngữ tự nhiên.

Ngày 313: Kết nối Flowise với Tool bên ngoài

  • Mục tiêu: Mở rộng khả năng của chatflow bằng hệ thống đã xây từ đầu khóa.

  • Lý thuyết: HTTP Request Tool, Custom Tool trong Flowise.

  • Thực hành: Thêm Tool gọi n8n webhook (Phase 4) để trigger workflow onboarding từ chatflow.

Ngày 314: Memory trong Flowise

  • Mục tiêu: Chatbot nhớ được ngữ cảnh cuộc hội thoại.

  • Lý thuyết: Conversation Memory, Buffer Memory vs Summary Memory.

  • Thực hành: Thêm Memory node, test hội thoại nhiều lượt có tham chiếu ngữ cảnh trước đó.

Ngày 315: Practice - Flowise Assistant

  • Mục tiêu: Có 1 trợ lý AI thật sự hữu ích cho công việc automation.

  • Lý thuyết: Ôn tập Tool, Memory, Agent.

  • Thực hành: Hoàn thiện 1 chatflow "Automation Assistant" có thể tạo Task, tra cứu trạng thái, trigger workflow n8n.

TUẦN 64 - LANGFLOW

Ngày 316: LangFlow Overview

  • Mục tiêu: Biết thêm 1 lựa chọn xây AI flow trực quan.

  • Lý thuyết: Kiến trúc LangFlow, so sánh với Flowise (cả hai đều dựa LangChain).

  • Thực hành: Cài LangFlow, dựng lại chatflow cơ bản tương tự Ngày 311.

Ngày 317: Component & Custom Component

  • Mục tiêu: Mở rộng LangFlow khi component có sẵn không đủ.

  • Lý thuyết: Component structure trong LangFlow, viết custom component bằng Python.

  • Thực hành: Viết 1 custom component gọi API Task, dùng trong flow.

Ngày 318: So sánh Flowise vs LangFlow

  • Mục tiêu: Chọn đúng công cụ theo team (JS-centric vs Python-centric).

  • Lý thuyết: Bảng so sánh ngôn ngữ nền tảng, ecosystem, khả năng mở rộng.

  • Thực hành: Viết bảng so sánh Flowise vs LangFlow dựa trên trải nghiệm thực tế.

Ngày 319: Xây lại Assistant trong LangFlow

  • Mục tiêu: Củng cố kỹ năng qua việc làm lại bài quen thuộc trên công cụ mới.

  • Lý thuyết: Ôn tập Tool/Memory trong LangFlow.

  • Thực hành: Xây lại "Automation Assistant" (Ngày 315) trong LangFlow.

Ngày 320: Practice - Chọn công cụ AI Flow

  • Mục tiêu: Tổng kết và ra quyết định công cụ cho tổ chức.

  • Lý thuyết: Ôn tập MCP, Flowise, LangFlow.

  • Thực hành: Viết tài liệu khuyến nghị "khi nào dùng MCP trực tiếp, khi nào dùng Flowise/LangFlow" cho team.

TUẦN 65 - RAG

Ngày 321: RAG Fundamentals

  • Mục tiêu: Hiểu vì sao cần RAG thay vì chỉ hỏi LLM trực tiếp.

  • Lý thuyết: Retrieval-Augmented Generation là gì, vấn đề hallucination LLM giải quyết được nhờ RAG.

  • Thực hành: Vẽ sơ đồ pipeline RAG: document → chunk → embedding → lưu trữ → truy vấn → LLM trả lời.

Ngày 322: Chunking Strategy

  • Mục tiêu: Chia tài liệu thành đoạn hợp lý để retrieval chính xác.

  • Lý thuyết: Fixed-size chunking, semantic chunking, overlap.

  • Thực hành: Viết script chunk 1 bộ tài liệu (ví dụ docs của hệ thống Task) theo 2 chiến lược, so sánh kết quả.

Ngày 323: Embedding

  • Mục tiêu: Biến văn bản thành vector để so sánh độ tương đồng.

  • Lý thuyết: Embedding model, cosine similarity.

  • Thực hành: Dùng 1 embedding API (hoặc model local) tạo vector cho các chunk Ngày 322.

Ngày 324: Retrieval Strategy

  • Mục tiêu: Lấy đúng đoạn tài liệu liên quan nhất cho câu hỏi.

  • Lý thuyết: Top-k retrieval, hybrid search (keyword + vector), re-ranking.

  • Thực hành: Viết truy vấn thử "cách reset mật khẩu tài khoản" và kiểm tra chunk nào được retrieve.

Ngày 325: Đánh giá chất lượng RAG

  • Mục tiêu: Biết đo lường RAG có "trả lời đúng" hay không.

  • Lý thuyết: Precision/Recall cho retrieval, đánh giá answer relevance thủ công.

  • Thực hành: Viết bộ 10 câu hỏi test, đánh giá thủ công chất lượng câu trả lời của pipeline RAG đã xây.

TUẦN 66 - VECTOR DATABASE

Ngày 326: pgvector

  • Mục tiêu: Dùng lại PostgreSQL (đã học sâu ở Phase 1) để lưu vector.

  • Lý thuyết: Extension pgvector, kiểu dữ liệu vector, so sánh với vector DB chuyên dụng.

  • Thực hành: Cài pgvector, tạo bảng lưu embedding của các chunk Ngày 322-323, query bằng <-> (cosine distance).

Ngày 327: Qdrant

  • Mục tiêu: Làm quen 1 vector DB chuyên dụng, hiệu năng cao hơn cho quy mô lớn.

  • Lý thuyết: Collection, Point, Payload trong Qdrant.

  • Thực hành: Cài Qdrant (Docker), import lại cùng bộ embedding, so sánh tốc độ query với pgvector.

Ngày 328: Indexing Strategy cho Vector

  • Mục tiêu: Vector search vẫn nhanh khi dữ liệu lớn.

  • Lý thuyết: HNSW index, trade-off giữa tốc độ và độ chính xác.

  • Thực hành: Thử điều chỉnh tham số HNSW trong Qdrant, quan sát ảnh hưởng tới tốc độ/độ chính xác.

Ngày 329: Kết hợp Metadata Filtering

  • Mục tiêu: Kết hợp vector search với filter thông thường (như SQL WHERE).

  • Lý thuyết: Payload filter trong Qdrant, filter kết hợp với vector search.

  • Thực hành: Query "tài liệu liên quan tới X, chỉ trong phòng ban Y" kết hợp vector search + metadata filter.

Ngày 330: Practice - RAG Pipeline hoàn chỉnh

  • Mục tiêu: Có 1 pipeline RAG production-ready.

  • Lý thuyết: Ôn tập chunking, embedding, retrieval, vector DB.

  • Thực hành: Hoàn thiện pipeline RAG dùng Qdrant, tích hợp vào MCP Server (Ngày 306-310) như 1 Tool "tra cứu tài liệu nội bộ".

TUẦN 67 - AGENT WORKFLOW & CAPSTONE

Ngày 331: Multi-Agent Design

  • Mục tiêu: Hiểu khi nào nên chia 1 AI thành nhiều agent chuyên biệt.

  • Lý thuyết: Orchestrator agent, specialist agent, communication giữa agent.

  • Thực hành: Thiết kế (trên giấy) hệ multi-agent cho "AI Helpdesk": 1 agent phân loại câu hỏi, 1 agent tra cứu RAG, 1 agent thực thi hành động (tạo ticket).

Ngày 332: Human-in-the-loop Pattern

  • Mục tiêu: Đảm bảo AI không tự ý thực hiện hành động nhạy cảm.

  • Lý thuyết: Approval gate cho agent (liên hệ Approval Flow Phase 4), khi nào cần con người xác nhận.

  • Thực hành: Thêm bước "chờ người duyệt" trước khi Agent thực thi hành động tạo/xóa dữ liệu quan trọng.

Ngày 333: Xây AI Helpdesk - Phần Retrieval & Routing

  • Mục tiêu: Hiện thực hóa phần đầu của hệ multi-agent đã thiết kế.

  • Lý thuyết: Ôn tập RAG (tuần 65-66), Agent trong Flowise/LangFlow.

  • Thực hành: Xây agent phân loại câu hỏi + agent tra cứu RAG (dùng pipeline Ngày 330).

Ngày 334: Xây AI Helpdesk - Phần Action & Integration

  • Mục tiêu: Hoàn thiện khả năng AI thực thi hành động thật qua MCP/n8n.

  • Lý thuyết: Kết nối Agent với MCP Server (Ngày 310) và n8n webhook (Phase 4).

  • Thực hành: Thêm agent thực thi: tạo Jira ticket / gửi Slack khi cần, có human-in-the-loop cho hành động nhạy cảm.

Ngày 335: Capstone Phase 11 - AI Helpdesk hoàn chỉnh

  • Mục tiêu: Tổng kết toàn bộ AI Automation.

  • Lý thuyết: Ôn tập MCP, RAG, Vector DB, Multi-Agent.

  • Thực hành: Demo end-to-end AI Helpdesk: nhận câu hỏi → tra cứu RAG (Qdrant) → nếu cần hành động thì gọi MCP/n8n có duyệt của người → trả lời qua Slack.

CAPSTONE PROJECTS - Kế hoạch tích hợp cuối khóa (8 tuần, Ngày 336–375)

Capstone 1 - Automation Platform (2 tuần, Ngày 336–345)

Stack: Retool + PostgreSQL + n8n Chức năng: Workflow Builder, Approval System, Audit Log

  • Tuần 1: Thiết kế schema (Phase 1) cho workflow definition + audit log; xây n8n workflow engine chạy được các bước cấu hình động.

  • Tuần 2: Xây UI Retool (Phase 3) cho phép người dùng tạo/duyệt workflow không cần code; hoàn thiện audit trail đầy đủ; demo end-to-end.

Capstone 2 - Enterprise Process Platform (2 tuần, Ngày 346–355)

Stack: Camunda + RabbitMQ + PostgreSQL Chức năng: Procurement, Change Request, Incident Management

  • Tuần 1: Deploy lại 3 quy trình BPMN đã xây ở Phase 6 lên 1 Camunda cluster chung; kết nối RabbitMQ (Phase 7) làm lớp giao tiếp giữa Camunda worker và hệ thống ngoài.

  • Tuần 2: Thêm reliability layer (Phase 9: retry, idempotency) và observability (Phase 10: log/metrics/trace) cho toàn bộ 3 quy trình; demo.

Capstone 3 - Platform Automation Hub (2 tuần, Ngày 356–365)

Stack: Kubernetes + Vault + Terraform + ArgoCD + n8n Chức năng: User Provisioning, Secret Management, Infrastructure Requests

  • Tuần 1: Dùng Terraform (Phase 8) dựng hạ tầng; deploy toàn bộ hệ thống (API Task, n8n, Camunda, RabbitMQ...) qua ArgoCD GitOps; kết nối Vault cho toàn bộ secret.

  • Tuần 2: Xây n8n workflow "User Provisioning" (SCIM/SSO - bổ sung ở Phase 2) gọi Terraform/Vault để tự động cấp phát tài nguyên; demo self-service "Infrastructure Request" qua Retool.

Capstone 4 - AI Automation Platform (2 tuần, Ngày 366–375)

Stack: n8n + Flowise + Qdrant + MCP + Slack Chức năng: AI Helpdesk, Knowledge Retrieval, Approval Agent

  • Tuần 1: Hoàn thiện lại AI Helpdesk (Phase 11) với dữ liệu thật của toàn bộ hệ thống đã xây (docs, quy trình, FAQ nội bộ) làm nguồn RAG.

  • Tuần 2: Kết nối Approval Agent với Approval Flow (Phase 4) và Camunda (Phase 6) để AI có thể đề xuất hành động nhưng luôn cần người duyệt; demo tổng kết toàn khóa học trước "hội đồng" (bạn bè/mentor/nhà tuyển dụng giả lập).

Knowledge

Part 1 of 50