# DevOps roadmap

Lộ trình cho người đã làm fullstack và đã học các chứng chỉ Azure trong project này. Đi từ code tới một service chạy được, theo dõi được, và dựng lại được từ file.

Roadmap chia thành 9 khối, khớp với các khối màu trên UI. Thứ tự khối và node lấy từ `roadmap.json`.

```text
Backend -> Linux -> Network -> Data -> Docker -> CI/CD & IaC -> Cloud & Serverless -> Kubernetes -> Monitoring & Logs
```

| Khối | Node | Trạng thái |
| --- | --- | --- |
| Backend | Programming, Git | Programming 4 bài, Git 8 bài |
| Linux | Linux & Shell, Log Server | Linux 9 bài, log 2 bài |
| Network | Networking, Web Server & Proxy | Networking 7 bài, web server 4 bài |
| Data | Database, Caching | Database 6 bài, Redis 1 bài |
| Docker | Docker | 8 bài |
| CI/CD & IaC | CI/CD, Infrastructure as Code, Config Management | CI/CD 9, IaC 4, config 5 |
| Cloud & Serverless | Cloud Providers, Serverless | Cloud 3 bài, serverless 4 bài |
| Kubernetes | Kubernetes | 9 bài |
| Monitoring & Logs | Monitoring, Log tập trung | Monitoring 7, log tập trung 4 |
| Tình huống | Tình huống vận hành | 18 bài thực tế |

Mỗi mục lá đã có bài. Màu trên node là trạng thái đã học, đang học, hoặc bỏ qua. Mức `core`, `important`, `normal` trong các bản trước chỉ còn trong git history của `roadmap.json`.

Mức lấy từ sơ đồ TEL4VN, rồi chỉnh lại cho đúng lộ trình này:

- GitHub Actions giữ là bài chính của CI/CD. Sơ đồ gốc xếp nó thấp hơn Jenkins. Jenkins vẫn để mức quan trọng vì nhiều hệ thống cũ đang dùng.
- Ansible tách thành node Config Management. Puppet, Chef và Salt có bài riêng để đọc hệ thống cũ.
- Không đưa vào: rkt (project đã dừng), Jetty, Travis CI, IBM Bluemix. Unix không tách riêng vì phần Linux đã phủ model đó.

Tạm bỏ vì vượt level hiện tại, sẽ thêm sau: DevSecOps, SRE, Platform engineering, tracing. Phần mô tả vẫn ở cuối file.

Mỗi node trong `roadmap.json` có `topics`, mỗi topic là `{ "name", "level" }`. Node đã có bài lấy bài từ `lessonDir`, có thể lọc bằng `lessonIds` khi một thư mục chia cho nhiều node.

## Programming cho DevOps

Bash đủ cho vài lệnh nối nhau. Script có argument, JSON, và exit code rõ thì chuyển sang một ngôn ngữ. Ruby có bài ngắn để đọc script cũ, không phải ngôn ngữ chính.

**Bài học:**

1. [Python cho script vận hành](./lessons/programming/01-python.md)
2. [Node.js cho CLI nội bộ](./lessons/programming/02-nodejs.md)
3. [Go cho CLI một binary](./lessons/programming/03-go.md)
4. [Ruby cho script vận hành](./lessons/programming/04-ruby.md)

## 1. Linux Basics & Shell Scripting

**Để làm gì:** Đọc được server, sửa permission, điều khiển process, và script những thao tác lặp.

**Gồm những gì:** `man`, file và thư mục, permissions, SELinux, process, systemd, Bash.

**Dùng khi nào:** Phần sau đều chạy trên Linux, kể cả trong container.

**Bài học:**

1. [Đăng nhập, man, và file](./lessons/linux/00-shell-files.md)
2. [File system và permissions](./lessons/linux/01-filesystem-permissions.md)
3. [SELinux: cài và đặt mode](./lessons/linux/08-selinux.md)
4. [Process và systemd](./lessons/linux/02-process-management.md)
5. [Shell scripting](./lessons/linux/03-shell-scripting.md)

## 2. Networking Fundamentals

**Để làm gì:** Chỉ ra request đứt ở DNS, TCP, hay HTTP, rồi cấu hình Nginx đẩy request tới app.

**Gồm những gì:** Mô hình TCP/IP, DNS, HTTP, TLS (`listen 443 ssl`, `openssl req -x509`), `ss`/`systemctl`, `iptables` (`-A`/`-I`/`-L`), reverse proxy, `upstream`, `fastcgi_pass unix:`.

**Dùng khi nào:** Service không kết nối được, hoặc cần một cổng public đứng trước app.

**Bài học:**

1. [Mô hình mạng và protocol](./lessons/networking/01-osi-and-protocols.md)
2. [Công cụ chẩn đoán mạng](./lessons/networking/02-cli-tools.md)
3. [Nginx reverse proxy](./lessons/networking/03-nginx-reverse-proxy.md)

## 3. Docker

**Để làm gì:** Đóng app và dependency thành một image. Máy khác chạy được mà không phải cài lại runtime bằng tay.

**Gồm những gì:** Cài `docker-ce` + `systemctl start`, CLI (`run`, `-p`, `ps`, `stop`, `rm`, `rmi`, `pull`, `tag`, `exec`, `cp`, `commit`), Dockerfile (`COPY`/`ADD`, Python `pip -r`), BuildKit (cache mount, secret mount), `CMD`/`ENTRYPOINT`, file `.env`, Compose, user-defined network (`create`/`ls`, `--subnet`), YAML (mapping, list, thụt bằng dấu cách).

**Dùng khi nào:** Cần local giống nhau giữa các máy, hoặc chuẩn bị artifact cho Kubernetes.

**Bài học:**

1. [Container và Docker](./lessons/docker/00-concepts.md)
2. [Docker CLI](./lessons/docker/01-cli.md)
3. [Dockerfile](./lessons/docker/02-dockerfile.md)
4. [BuildKit](./lessons/docker/08-buildkit.md)
5. [CMD và ENTRYPOINT](./lessons/docker/09-entrypoint.md)
6. [Biến môi trường](./lessons/docker/10-env.md)
7. [Docker Compose](./lessons/docker/03-compose.md)
8. [YAML](./lessons/docker/11-yaml.md)

## 4. Kubernetes

**Để làm gì:** Chạy nhiều bản container, tự thay Pod hỏng, và giữ một địa chỉ ổn định để gọi vào.

**Gồm những gì:** Pod, `kubectl run`, Deployment, Service, `requests`/`limits`, rolling update / rollback, volume + PVC, env + Secret, init và sidecar, kubectl.

**Dùng khi nào:** Một container đơn lẻ không còn đủ cho scale, rollout, và self-healing.

**Bài học:**

1. [Kiến trúc Kubernetes](./lessons/kubernetes/01-architecture.md)
2. [Deployment và Service](./lessons/kubernetes/02-manifests.md)
3. [kubectl](./lessons/kubernetes/03-kubectl.md)
4. [Rolling update và rollback](./lessons/kubernetes/10-rollout.md)
5. [Volume và PersistentVolume](./lessons/kubernetes/11-volumes.md)
6. [Biến môi trường và Secret](./lessons/kubernetes/12-config-secrets.md)
7. [Init container và sidecar](./lessons/kubernetes/13-init-sidecar.md)

## 5. CI/CD và Infrastructure as Code

**Để làm gì:** Mỗi lần đổi code đều chạy cùng một bộ test. Hạ tầng dựng lại từ file, khỏi click trên portal.

**Gồm những gì:** GitHub Actions cho CI, Terraform cho resource group Azure ở mức bắt đầu.

**Dùng khi nào:** Đã có app và Dockerfile. Lần merge sau chạy giống nhau, dù ai push.

**Bài học:**

1. [GitHub Actions](./lessons/cicd-iac/01-github-actions.md)
2. [Terraform trên Azure](./lessons/cicd-iac/02-terraform.md)

---

## Khung các chặng tiếp theo

Các mục dưới đã có bài trong `lessons/`. Đoạn này giữ phạm vi ban đầu. Nội dung học nằm ở từng file bài, không nằm ở khung này.

### Git và VCS hosting

**Để làm gì:** Giữ lịch sử thay đổi, review trước khi merge, và làm nguồn event cho CI.

**Gồm những gì:** commit, branch, merge, rebase, remote, pull request, bảo vệ branch `main`.

**Dùng khi nào:** Mọi thay đổi code, pipeline, và Terraform đều qua Git trước khi chạy.

**Nguồn:** [Git reference](https://git-scm.com/docs), [GitHub pull requests](https://docs.github.com/en/pull-requests).

### Xem log

**Để làm gì:** App lỗi trên server thì đọc log trước khi đoán. Biết log nằm đâu, lọc theo thời gian, service, từ khoá.

**Gồm những gì:** `/var/log`, `tail -f`, `less`, `grep`, `awk`, `journalctl -u <service> --since`. Log của container và Pod (`docker logs`, `kubectl logs`) nằm trong bài Docker và Kubernetes.

**Dùng khi nào:** Service không start, request trả 500, hoặc cần biết chuyện gì đã xảy ra lúc 3 giờ sáng.

**Nguồn:** [journalctl(1)](https://man7.org/linux/man-pages/man1/journalctl.1.html), [GNU grep manual](https://www.gnu.org/software/grep/manual/grep.html).

### Database và caching

**Để làm gì:** Giữ data của app, và giảm số lần app phải hỏi database.

**Gồm những gì:** PostgreSQL, MySQL/MariaDB, MongoDB ở mức vận hành (user, backup, connection, managed service). Redis cho cache và session. Memcached chỉ khi đụng hệ thống đang dùng nó.

**Dùng khi nào:** App cần nơi chứa data bền, hoặc một query lặp lại nhiều lần trong lúc data ít đổi.

**Nguồn:** [PostgreSQL docs](https://www.postgresql.org/docs/), [Redis docs](https://redis.io/docs/latest/).

### Proxy, cache, và load balancer

**Để làm gì:** Chia request, chặn traffic xấu, và giảm tải cho app.

**Gồm những gì:** Nginx `upstream` với nhiều backend, TLS termination, cache header, firewall và security group. Reverse proxy một upstream đã có bài Nginx.

**Dùng khi nào:** Một process không chịu nổi traffic, hoặc TLS cần xử lý ở biên.

**Nguồn:** [ngx_http_upstream_module](https://nginx.org/en/docs/http/ngx_http_upstream_module.html), [HAProxy documentation](https://docs.haproxy.org/).

### Cloud platforms

**Để làm gì:** Đặt compute, network, và identity trên một nền có API.

**Gồm những gì:** Lộ trình này lấy Azure làm nền chính: resource group, virtual network, identity, App Service hoặc AKS, Container Registry. AWS và Google Cloud dùng cùng các khái niệm account, network, IAM, managed Kubernetes.

**Dùng khi nào:** Lab local không còn giống network, permission, và managed service mà production đang dùng.

**Nguồn:** [Microsoft Learn — Azure](https://learn.microsoft.com/en-us/azure/), [Azure Architecture Center](https://learn.microsoft.com/en-us/azure/architecture/).

### Serverless

**Để làm gì:** Chạy code theo request hoặc event mà không quản lý server, trả tiền theo lần chạy.

**Gồm những gì:** AWS Lambda, Azure Functions, Google Cloud Functions; edge runtime như Cloudflare Workers; nền tảng deploy frontend có function như Vercel, Netlify. Khái niệm chung: trigger, cold start, timeout, giới hạn bộ nhớ.

**Dùng khi nào:** API nhỏ, webhook, cron job, xử lý file upload. Không hợp với process chạy lâu hoặc cần giữ connection.

**Nguồn:** [AWS Lambda docs](https://docs.aws.amazon.com/lambda/), [Azure Functions docs](https://learn.microsoft.com/en-us/azure/azure-functions/), [Cloudflare Workers docs](https://developers.cloudflare.com/workers/), [Vercel Functions](https://vercel.com/docs/functions).

### Monitoring, logging, observability

**Để làm gì:** Biết service còn ổn trước khi user báo, và lần một request qua nhiều service.

**Gồm những gì:** metrics, logs, traces; Prometheus; OpenTelemetry. Ba tín hiệu trả lời ba câu khác nhau, không cái nào thay cái kia.

**Dùng khi nào:** Đã có service chạy, cần số liệu cho sự cố, capacity, và SLO.

**Nguồn:** [Prometheus overview](https://prometheus.io/docs/introduction/overview/), [OpenTelemetry docs](https://opentelemetry.io/docs/).

---

### Configuration management

Terraform tạo resource. Ansible cấu hình bên trong máy đã có. Puppet, Chef và Salt là bài đọc thêm khi gặp hệ thống cũ.

**Để làm gì:** Đưa nhiều máy về cùng một config sau khi hạ tầng đã được tạo.

**Gồm những gì:** Ansible inventory, playbook, module, idempotence. Puppet và Chef để đọc manifest của hệ thống cũ.

**Dùng khi nào:** Cần cài package, viết file config, hoặc quản lý user trên nhiều host.

**Nguồn:** [Ansible documentation](https://docs.ansible.com/).

---

## Để sau

Các mục dưới không có trên UI. Giữ lại mô tả để thêm vào khi cần.

### DevSecOps

**Để làm gì:** Đưa check bảo mật vào cùng đường với code, khỏi để một cổng kiểm ở cuối kỳ.

**Gồm những gì:** secret scanning, dependency review, image scanning, least privilege, supply chain của GitHub Actions. Khung thực hành của NIST SSDF và OWASP.

**Dùng khi nào:** Pipeline đã chạy ổn và bắt đầu có quyền vào registry, cloud, hoặc production.

**Nguồn:** [NIST SP 800-218](https://csrc.nist.gov/pubs/sp/800/218/final), [OWASP Cheat Sheet Series](https://cheatsheetseries.owasp.org/), [GitHub Actions security hardening](https://docs.github.com/en/actions/reference/security/secure-use).

### SRE và reliability

**Để làm gì:** Đo reliability bằng số đã chốt, rồi quyết định khi nào được release.

**Gồm những gì:** SLI, SLO, error budget, toil, incident response. DevOps nói về cách dev và ops cùng ship phần mềm. SRE đưa reliability của phần mềm đó vào cách vận hành.

**Dùng khi nào:** Hệ thống đã có user, và cần một ngưỡng rõ cho “đủ ổn định”.

**Nguồn:** [Google SRE book](https://sre.google/sre-book/table-of-contents/), [DORA](https://dora.dev/).

### Platform engineering

**Để làm gì:** Gom các tool ở trên thành đường tự phục vụ cho nhiều team, guardrail có sẵn.

**Gồm những gì:** Internal developer platform, golden path, template service, ephemeral environment. Lớp này nằm trên CI, IaC, Kubernetes, và observability.

**Dùng khi nào:** Nhiều team đang tự dựng pipeline và hạ tầng, mỗi team một kiểu.

**Nguồn:** [CNCF Platforms White Paper](https://tag-app-delivery.cncf.io/whitepapers/platforms/).
