{
  "id": "devops",
  "title": "DevOps",
  "groups": [
    {
      "id": "backend",
      "title": "Backend",
      "color": "#e8f0fe",
      "tracks": [
        {
          "id": "programming",
          "shortTitle": "Programming",
          "title": "Programming cho DevOps",
          "summary": "Python cho script đọc JSON và gọi lệnh. Node.js khi team đã viết JavaScript. Go khi cần một binary không kèm runtime.",
          "lessonDir": "programming",
          "topics": []
        },
        {
          "id": "git",
          "shortTitle": "Git",
          "title": "Git & VCS Hosting",
          "summary": "Commit, branch, pull request, tag và cách sửa sai. Pipeline nào cũng bắt đầu từ một lần push.",
          "lessonDir": "git",
          "topics": []
        }
      ]
    },
    {
      "id": "linux",
      "title": "Linux",
      "color": "#e6f4ea",
      "tracks": [
        {
          "id": "linux",
          "shortTitle": "Linux & Shell",
          "title": "Linux & Shell Scripting",
          "summary": "Làm quen với server Linux: file, permission, process, systemd và viết Bash script. Windows Server chỉ cần mức biết vận hành, không phải hệ điều hành chính.",
          "lessonDir": "linux",
          "topics": []
        },
        {
          "id": "logs",
          "shortTitle": "Log Server",
          "title": "Xem log trên server",
          "summary": "Đọc file trong /var/log bằng tail, grep, awk. Service systemd thì dùng journalctl, và biết log có còn sau reboot hay không.",
          "lessonDir": "logs",
          "topics": []
        }
      ]
    },
    {
      "id": "network",
      "title": "Network",
      "color": "#f3e8fd",
      "tracks": [
        {
          "id": "networking",
          "shortTitle": "Networking",
          "title": "Networking",
          "summary": "DNS, TCP, HTTP, TLS (Nginx listen 443 ssl), ss/systemctl, iptables, reverse proxy, upstream, PHP-FPM unix sock.",
          "lessonDir": "networking",
          "topics": []
        },
        {
          "id": "webserver",
          "shortTitle": "Web Server & Proxy",
          "title": "Web Server, Proxy & Load Balancer",
          "summary": "Apache làm reverse proxy như Nginx. Thêm load balancer, CDN, và Caddy khi muốn HTTPS tự xin certificate.",
          "lessonDir": "webserver",
          "topics": []
        }
      ]
    },
    {
      "id": "data",
      "title": "Data",
      "color": "#e7f6f2",
      "tracks": [
        {
          "id": "database",
          "shortTitle": "Database",
          "title": "Database",
          "summary": "Tạo user đủ quyền, dump và restore. PostgreSQL là bài chính, có lệnh MySQL tương ứng. MongoDB là bài riêng.",
          "lessonDir": "database",
          "topics": []
        },
        {
          "id": "caching",
          "shortTitle": "Caching",
          "title": "Caching",
          "summary": "Cache có TTL. Redis mặc định không xoá key khi đầy RAM. Memcached chỉ là RAM, không persistence.",
          "lessonDir": "caching",
          "topics": []
        }
      ]
    },
    {
      "id": "docker",
      "title": "Docker",
      "color": "#e0f4f8",
      "tracks": [
        {
          "id": "docker",
          "shortTitle": "Docker",
          "title": "Docker",
          "summary": "Cài docker-ce và start daemon, rồi CLI (run, -p, pull, tag, exec, cp, commit), Dockerfile, BuildKit, CMD và ENTRYPOINT, file .env, Compose, user-defined network, YAML.",
          "lessonDir": "docker",
          "topics": []
        }
      ]
    },
    {
      "id": "cicd",
      "title": "CI/CD & IaC",
      "color": "#fff1e0",
      "tracks": [
        {
          "id": "cicd",
          "shortTitle": "CI/CD",
          "title": "CI/CD",
          "summary": "Tự động test và build mỗi lần push code, rồi deploy khi merge. GitHub Actions là tool của lộ trình này. Jenkins vẫn gặp nhiều ở hệ thống cũ.",
          "lessonDir": "cicd-iac",
          "lessonIds": [
            "cicd-github-actions",
            "cicd-jenkins",
            "cicd-gitlab",
            "cicd-azure-pipelines",
            "cicd-secrets-oidc",
            "cicd-circleci",
            "cicd-cloud-build",
            "cicd-teamcity",
            "cicd-bitbucket"
          ],
          "topics": []
        },
        {
          "id": "iac",
          "shortTitle": "Infrastructure as Code",
          "title": "Infrastructure as Code",
          "summary": "Tạo resource cloud bằng code thay vì bấm portal: review được, chạy lại được. Terraform là tool chính. Bicep cho tài nguyên Azure, CloudFormation cho AWS.",
          "lessonDir": "cicd-iac",
          "lessonIds": [
            "iac-terraform",
            "iac-bicep",
            "iac-cloudformation",
            "iac-deployment-manager"
          ],
          "topics": []
        },
        {
          "id": "config",
          "shortTitle": "Config Management",
          "title": "Configuration Management",
          "summary": "Inventory, ad-hoc, rồi playbook chạy lại được. Lần hai phải ra ok nếu máy đã đúng trạng thái.",
          "lessonDir": "config",
          "topics": []
        }
      ]
    },
    {
      "id": "cloud",
      "title": "Cloud & Serverless",
      "color": "#fce8f3",
      "tracks": [
        {
          "id": "cloud",
          "shortTitle": "Cloud Providers",
          "title": "Cloud Providers",
          "summary": "Cùng một việc, khác tên: resource group và subscription, VPC, IAM role, AKS/EKS/GKE. Workload dùng identity của platform, không để access key trên disk.",
          "lessonDir": "cloud",
          "topics": []
        },
        {
          "id": "serverless",
          "shortTitle": "Serverless",
          "title": "Serverless",
          "summary": "Lambda và Azure Functions cho job ngắn, stateless. Workers và Vercel ở gần user. Đừng mở Postgres từ mọi thành phố chỉ vì có edge.",
          "lessonDir": "serverless",
          "topics": []
        }
      ]
    },
    {
      "id": "kubernetes",
      "title": "Kubernetes",
      "color": "#e8eaf6",
      "tracks": [
        {
          "id": "kubernetes",
          "shortTitle": "Kubernetes",
          "title": "Kubernetes",
          "summary": "Pod, Deployment, Service, rollout/undo, volume/PVC, Secret, init/sidecar. OpenShift là Kubernetes có thêm lớp của Red Hat.",
          "lessonDir": "kubernetes",
          "topics": []
        }
      ]
    },
    {
      "id": "observability",
      "title": "Monitoring & Logs",
      "color": "#fdecea",
      "tracks": [
        {
          "id": "monitoring",
          "shortTitle": "Monitoring",
          "title": "Monitoring & Alerting",
          "summary": "Prometheus kéo metric. Counter thì xem rate, không xem số thô. Grafana vẽ và chỉ bắn alert khi lỗi đủ lâu.",
          "lessonDir": "monitoring",
          "topics": []
        },
        {
          "id": "central-logs",
          "shortTitle": "Log tập trung",
          "title": "Log tập trung",
          "summary": "Elastic index nội dung log. Loki index label. Azure dùng Kusto trong Log Analytics. Đừng gắn user id làm label của Loki.",
          "lessonDir": "central-logs",
          "topics": []
        }
      ]
    },
    {
      "id": "practice",
      "title": "Tình huống",
      "color": "#fff6d8",
      "tracks": [
        {
          "id": "cases",
          "shortTitle": "Tình huống",
          "title": "Tình huống vận hành",
          "summary": "Sự cố hay gặp: khoanh đúng tầng, đo một thứ, rồi mới đổi một thứ. Rollback khi bản vừa deploy là nghi phạm và bản trước còn chạy được.",
          "lessonDir": "cases",
          "topics": []
        }
      ]
    }
  ]
}
