[{"data":1,"prerenderedAt":1201},["ShallowReactive",2],{"search-posts-dataset":3,"post-detail-/posts/incident-checklist":159,"all-published-articles-list":1140,"series-posts-/posts/incident-checklist":1200},[4,20,35,48,62,75,87,99,111,122,135,149],{"path":5,"title":6,"description":7,"categories":8,"tags":11,"date":16,"image":17},"/posts/incident-checklist","Checklist xử lí sự cố máy chủ Linux: Phục hồi sau thảm họa","Qui trình phản ứng và xử lí sự cố máy chủ Linux khi hệ thống bị sập, tràn RAM/HDD hoặc nghi ngờ bị xâm nhập: Các bước chuẩn đoán, cô lập, phân tích log và khôi phục.",[9,10],"linux","devops",[12,13,14,15],"incident","troubleshooting","security","sysadmin","2026-08-15T00:00:00.000Z",{"src":18,"alt":19},"/img/incident-response.webp","Xử lí sự cố máy chủ Linux",{"path":21,"title":22,"description":23,"categories":24,"tags":27,"date":31,"image":32},"/posts/backup-postgres-docker","Sao lưu tự động PostgreSQL trong Docker với cron job và gzip","Hướng dẫn xây dựng script tự động backup database PostgreSQL chạy trong Docker container: gzip, cron hàng ngày, tự động xóa bản sao lưu cũ và kiểm thử phục hồi.",[25,26],"docker","database",[28,29,30,10],"postgresql","backup","automation","2025-10-20T00:00:00.000Z",{"src":33,"alt":34},"/img/postgres-backup.webp","Sao lưu tự động PostgreSQL Docker",{"path":36,"title":37,"description":38,"categories":39,"tags":40,"date":44,"image":45},"/posts/docker-compose-production","Thiết kế Docker compose chuẩn Production","Hướng dẫn thực chiến xây dựng docker-compose.yml hoàn chỉnh cho Production: healthchecks, restart policies, resource limits, quản lí .env và Persistent Volumes",[25,10],[41,42,43],"production","compose","backend","2025-10-15T00:00:00.000Z",{"src":46,"alt":47},"/img/docker-compose.webp","Docker Compose Production Best Practices",{"path":49,"title":50,"description":51,"categories":52,"tags":53,"date":58,"image":59},"/posts/monitoring-server-basics","Giám sát server Linux từ cơ bản đến nâng cao: htop, ncdu, prometheus và Uptime Kuma","Cẩm nang toàn diện về giám sát hiệu năng máy chủ Linux: Khai thác công cụ CLI thời gian thực (Htop, Btop, Ncdu), thiết lập hệ thống cảnh báo sự cố Uptime Kuma qua Telegram và thu thập chỉ số với Prometheus & Grafana.",[9,10],[54,55,56,57],"monitoring","grafana","prometheus","uptime","2024-10-18T00:00:00.000Z",{"src":60,"alt":61},"/img/monitoring.webp","Giám sát máy chủ Linux",{"path":63,"title":64,"description":65,"categories":66,"tags":68,"date":71,"image":72},"/posts/nginx-reverse-proxy","Hướng dẫn cấu hình Nginx Reverse Proxy với SSL Certbot và Docker chuẩn Production","Cẩm nang toàn diện cấu hình Nginx Reverse Proxy trên Ubuntu: Tích hợp chứng chỉ SSL Let's Encrypt miễn phí qua Certbot, hỗ trợ WebSockets, HTTP/2, nén Brotli/Gzip và Rate Limiting chống DDoS.",[9,67],"nginx",[10,69,70],"ssl","webserver","2024-10-10T00:00:00.000Z",{"src":73,"alt":74},"/img/nginx.webp","Nginx Reverse Proxy với SSL",{"path":76,"title":77,"description":78,"categories":79,"tags":80,"date":83,"image":84},"/posts/how-to-secure-a-vps","Bảo mật máy chủ Linux VPS: Cẩm nang toàn diện 8 bước chống tấn công","Hướng dẫn thực chiến từng bước thiết lập bảo mật máy chủ Linux VPS mới: Vô hiệu hóa mật khẩu SSH, thiết lập SSH Key Ed25519, cấu hình Fail2ban, tường lửa UFW và cập nhật tự động Unattended-Upgrades.",[9,14],[81,82,10],"vps","hardening","2024-10-05T00:00:00.000Z",{"src":85,"alt":86},"/img/linux-security.webp","Bảo mật máy chủ Linux VPS",{"path":88,"title":89,"description":90,"categories":91,"tags":92,"date":95,"image":96},"/posts/systemd-node-service","Quản lí ứng dụng Node.js trong Production với Systemd Service và Journalctl","Hướng dẫn triển khai ứng dụng Node.js, Go hoặc Python dưới dạng Systemd Service trên Linux: Tự động khởi động lại khi crash, quản lý biến môi trường, giới hạn bộ nhớ RAM và theo dõi log thời gian thực với Journalctl.",[9,10],[93,94,43,41],"systemd","nodejs","2024-10-01T00:00:00.000Z",{"src":97,"alt":98},"/img/systemd.webp","Quản lý ứng dụng với Systemd Service",{"path":100,"title":101,"description":102,"categories":103,"tags":104,"date":107,"image":108},"/posts/how-to-install-docker-on-ubuntu-server","Hướng dẫn cài đặt Docker & Docker compose trên Ubuntu server","Hướng dẫn toàn diện cách cài đặt Docker Engine và Docker Compose V2 trên Ubuntu Server, cấu hình bảo mật non-root user, tối ưu daemon và xử lí xung đột tường lửa UFW",[9,25],[105,10,106],"beginner","ubuntu","2024-09-30T00:00:00.000Z",{"src":109,"alt":110},"/img/docker.webp","Cài đặt Docker trên Ubuntu Server",{"path":112,"title":113,"description":114,"categories":115,"tags":116,"date":118,"image":119},"/posts/ssh-key-authentication","Xác thực SSH Key từ cơ bản đến nâng cao: Ed25519, SSH Config và Bảo mật đa tầng","Cẩm nang toàn diện về xác thực SSH Key trên máy chủ Linux: So sánh Ed25519 vs RSA, cấu hình SSH Config quản lí hàng chục VPS, chuyển tiếp Agent Forwarding, và các qui tắc bảo mật chống lộ khóa.",[9,14],[117,10,15],"ssh","2024-09-25T00:00:00.000Z",{"src":120,"alt":121},"/img/ssh-keys.webp","Xác thực SSH Key Linux",{"path":123,"title":124,"description":125,"categories":126,"tags":127,"date":131,"image":132},"/posts/ufw-firewall-basics","Làm chủ tường lửa UFW trên Linux: Qui tắc, giới hạn kết nối và xử lí xung đột Docker","Hướng dẫn toàn diện làm chủ tường lửa UFW (Uncomplicated Firewall) trên Ubuntu: Thiết lập chính sách mặc định, mở cổng theo IP, giới hạn brute-force (Rate Limiting) và khắc phục lỗi Docker bypass tường lửa.",[9,14],[128,129,130,15],"ufw","firewall","networking","2024-09-20T00:00:00.000Z",{"src":133,"alt":134},"/img/ufw-firewall.webp","Cấu hình Tường lửa UFW Linux",{"path":136,"title":137,"description":138,"categories":139,"tags":141,"date":145,"image":146},"/posts/git-deploy-key","Tự động hóa triển khai với Git deploy keys: Thiết lập an toàn cho GitHub và GitLab","Hướng dẫn thiết lập Git Deploy Key chuẩn bảo mật để kéo mã nguồn tự động từ GitHub hoặc GitLab về máy chủ Production: Phân quyền Read-Only, cấu hình SSH Config và tích hợp Webhook tự động cập nhật.",[140,10],"git",[142,143,144,30],"github","gitlab","cicd","2024-09-18T00:00:00.000Z",{"src":147,"alt":148},"/img/git-deploy.webp","Git Deploy Keys cho máy chủ",{"path":150,"title":151,"description":152,"categories":153,"tags":154,"date":155,"image":156},"/posts/ubuntu-server-initial-setup","Qui trình thiết lập ban đầu cho Ubuntu Server: Swap, Timezone, User và Firewall","Hướng dẫn các bước thiết lập chuẩn mực ban đầu cho máy chủ Ubuntu Server mới: Cấu hình múi giờ Việt Nam (Asia/Ho_Chi_Minh), tạo phân vùng RAM ảo (Swap File), phân quyền Sudoer và kích hoạt tường lửa UFW.",[9],[106,105,15],"2024-09-15T00:00:00.000Z",{"src":157,"alt":158},"/img/ubuntu.webp","Thiết lập ban đầu Ubuntu Server",{"id":160,"title":6,"author":161,"body":162,"categories":1128,"date":16,"description":7,"draft":1129,"extension":1130,"image":1131,"meta":1132,"navigation":275,"path":5,"seo":1133,"series":1134,"series_order":1134,"slug":1135,"stem":1136,"tags":1137,"updated":1138,"__hash__":1139},"post/posts/incident-checklist.md","Dương Thụ",{"type":163,"value":164,"toc":1104},"minimal",[165,170,179,187,194,197,201,204,226,228,232,239,244,311,315,333,340,347,378,382,415,419,505,507,511,514,518,538,553,557,582,586,635,639,682,684,688,691,695,792,796,838,842,879,881,885,896,1041,1052,1054,1058,1061,1087,1089,1093,1100],[166,167,169],"h2",{"id":168},"giới-thiệu-bình-tĩnh-trước-thảm-họa-hệ-thống","Giới thiệu: Bình tĩnh trước thảm họa hệ thống",[171,172,173,174,178],"p",{},"Một ngày đẹp trời, bạn nhận được cảnh báo liên tục trên Telegram hoặc điện thoại từ khách hàng: ",[175,176,177],"strong",{},"Website không thể truy cập, API phản hồi lỗi 502 Bad Gateway hoặc máy chủ hoàn toàn không thể kết nối qua SSH","..",[171,180,181,182,186],{},"Trong khoảnh khắc áp lực cao đó, điều nguy hiểm nhất là hoảng loạn và gõ bừa bãi các lệnh xóa dữ liệu hoặc restart máy chủ ",[183,184,185],"a",{"href":150},"Ubuntu"," mà chưa kịp ghi nhận nguyên nhân chính xác..",[171,188,189,190,193],{},"Bài viết này cung cấp một ",[175,191,192],{},"Qui trình phản ứng sự cố chuẩn mực (Incident Response Checklist)"," gồm 6 giai đoạn rõ ràng, giúp bạn từng bước chẩn đoán chính xác nguyên nhân gốc rễ (root cause) và khôi phục dịch vụ nhanh nhất có thể..",[195,196],"hr",{},[166,198,200],{"id":199},"giai-đoạn-1-đánh-giá-sơ-bộ-và-giữ-bình-tĩnh-triage","Giai đoạn 1: Đánh giá sơ bộ và giữ bình tĩnh (triage)",[171,202,203],{},"Trước khi thực hiện bất kì thao tác thay đổi nào:",[205,206,207,214,220],"ol",{},[208,209,210,213],"li",{},[175,211,212],{},"Ghi lại mốc thời gian",": Ghi nhận thời điểm nhận cảnh báo và thời điểm bắt đầu xử lí.",[208,215,216,219],{},[175,217,218],{},"Kiểm tra kênh liên lạc",": Thông báo cho các bên liên quan (Product Manager, Khách hàng) rằng đội ngũ kĩ thuật đã tiếp nhận sự cố và đang điều tra.",[208,221,222,225],{},[175,223,224],{},"Mở tài liệu ghi chép sự cố (Incident Log)",": Ghi lại từng lệnh bạn chuẩn bị chạy và kết quả output tương ứng.",[195,227],{},[166,229,231],{"id":230},"giai-đoạn-2-chuẩn-đoán-nhanh-tình-trạng-phần-cứng-quick-healthcheck","Giai đoạn 2: Chuẩn đoán nhanh tình trạng phần cứng (Quick healthcheck)",[171,233,234,235,238],{},"Nếu bạn vẫn có thể SSH vào máy chủ, hãy chạy ngay các lệnh kiểm tra 4 tài nguyên cốt lõi (",[175,236,237],{},"USE Method - Utilization, Saturation, Errors","):",[240,241,243],"h3",{"id":242},"_1-kiểm-tra-tải-cpu-và-tiến-trình-cpu-load","1. Kiểm tra Tải CPU và Tiến trình (CPU Load)",[245,246,251],"pre",{"className":247,"code":248,"language":249,"meta":250,"style":250},"language-bash shiki shiki-themes github-dark github-dark github-dark","uptime\n# Xem Load Average 1m, 5m, 15m. Nếu Load Average > Số lượng nhân CPU thì máy chủ đang bị nghẽn CPU.\n\ntop -b -n 1 | head -n 20\n# Xác định xem tiến trình nào đang chiếm 100% CPU.\n","bash","",[252,253,254,263,270,277,305],"code",{"__ignoreMap":250},[255,256,259],"span",{"class":257,"line":258},"line",1,[255,260,262],{"class":261},"sb7EE","uptime\n",[255,264,266],{"class":257,"line":265},2,[255,267,269],{"class":268},"sGGCZ","# Xem Load Average 1m, 5m, 15m. Nếu Load Average > Số lượng nhân CPU thì máy chủ đang bị nghẽn CPU.\n",[255,271,273],{"class":257,"line":272},3,[255,274,276],{"emptyLinePlaceholder":275},true,"\n",[255,278,280,283,287,290,293,297,300,302],{"class":257,"line":279},4,[255,281,282],{"class":261},"top",[255,284,286],{"class":285},"sKJT9"," -b",[255,288,289],{"class":285}," -n",[255,291,292],{"class":285}," 1",[255,294,296],{"class":295},"sWuGj"," |",[255,298,299],{"class":261}," head",[255,301,289],{"class":285},[255,303,304],{"class":285}," 20\n",[255,306,308],{"class":257,"line":307},5,[255,309,310],{"class":268},"# Xác định xem tiến trình nào đang chiếm 100% CPU.\n",[240,312,314],{"id":313},"_2-kiểm-tra-bộ-nhớ-ram-swap-memory-exhaustion","2. Kiểm tra Bộ nhớ RAM & Swap (Memory Exhaustion)",[245,316,318],{"className":247,"code":317,"language":249,"meta":250,"style":250},"free -h\n# Xem dung lượng RAM trống và Swap trống.\n",[252,319,320,328],{"__ignoreMap":250},[255,321,322,325],{"class":257,"line":258},[255,323,324],{"class":261},"free",[255,326,327],{"class":285}," -h\n",[255,329,330],{"class":257,"line":265},[255,331,332],{"class":268},"# Xem dung lượng RAM trống và Swap trống.\n",[171,334,335,336,339],{},"Nếu ",[252,337,338],{},"available"," RAM gần bằng 0 và Swap bị sử dụng hết, máy chủ đang bị tràn RAM nghiêm trọng.",[171,341,342,343,346],{},"Kiểm tra xem hệ điều hành có vừa kích hoạt ",[175,344,345],{},"OOM Killer"," để tiêu diệt tiến trình của bạn không:",[245,348,350],{"className":247,"code":349,"language":249,"meta":250,"style":250},"sudo dmesg -T | grep -i -E 'oom|out of memory|killed process'\n",[252,351,352],{"__ignoreMap":250},[255,353,354,357,361,364,366,369,372,375],{"class":257,"line":258},[255,355,356],{"class":261},"sudo",[255,358,360],{"class":359},"skqr8"," dmesg",[255,362,363],{"class":285}," -T",[255,365,296],{"class":295},[255,367,368],{"class":261}," grep",[255,370,371],{"class":285}," -i",[255,373,374],{"class":285}," -E",[255,376,377],{"class":359}," 'oom|out of memory|killed process'\n",[240,379,381],{"id":380},"_3-kiểm-tra-dung-lượng-ổ-đĩa-disk-space-inodes","3. Kiểm tra Dung lượng Ổ đĩa (Disk Space & Inodes)",[245,383,385],{"className":247,"code":384,"language":249,"meta":250,"style":250},"df -h\n# Kiểm tra xem có phân vùng nào đạt mức 100% không.\n\ndf -i\n# Kiểm tra số lượng file (Inodes). Đôi khi dung lượng ổ cứng còn trống nhưng Inodes bị đầy 100% do hàng triệu file session/cache nhỏ.\n",[252,386,387,394,399,403,410],{"__ignoreMap":250},[255,388,389,392],{"class":257,"line":258},[255,390,391],{"class":261},"df",[255,393,327],{"class":285},[255,395,396],{"class":257,"line":265},[255,397,398],{"class":268},"# Kiểm tra xem có phân vùng nào đạt mức 100% không.\n",[255,400,401],{"class":257,"line":272},[255,402,276],{"emptyLinePlaceholder":275},[255,404,405,407],{"class":257,"line":279},[255,406,391],{"class":261},[255,408,409],{"class":285}," -i\n",[255,411,412],{"class":257,"line":307},[255,413,414],{"class":268},"# Kiểm tra số lượng file (Inodes). Đôi khi dung lượng ổ cứng còn trống nhưng Inodes bị đầy 100% do hàng triệu file session/cache nhỏ.\n",[240,416,418],{"id":417},"_4-kiểm-tra-kết-nối-mạng-và-cổng-dịch-vụ-network-ports","4. Kiểm tra Kết nối Mạng và Cổng dịch vụ (Network & Ports)",[245,420,422],{"className":247,"code":421,"language":249,"meta":250,"style":250},"# Kiểm tra các cổng đang lắng nghe và số lượng kết nối\nsudo ss -tulpn\n\n# Đếm số lượng kết nối đang mở theo từng IP\nsudo ss -tan | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr | head -n 15\n",[252,423,424,429,439,443,448],{"__ignoreMap":250},[255,425,426],{"class":257,"line":258},[255,427,428],{"class":268},"# Kiểm tra các cổng đang lắng nghe và số lượng kết nối\n",[255,430,431,433,436],{"class":257,"line":265},[255,432,356],{"class":261},[255,434,435],{"class":359}," ss",[255,437,438],{"class":285}," -tulpn\n",[255,440,441],{"class":257,"line":272},[255,442,276],{"emptyLinePlaceholder":275},[255,444,445],{"class":257,"line":279},[255,446,447],{"class":268},"# Đếm số lượng kết nối đang mở theo từng IP\n",[255,449,450,452,454,457,459,462,465,467,470,473,476,478,481,483,486,489,491,493,496,498,500,502],{"class":257,"line":307},[255,451,356],{"class":261},[255,453,435],{"class":359},[255,455,456],{"class":285}," -tan",[255,458,296],{"class":295},[255,460,461],{"class":261}," awk",[255,463,464],{"class":359}," '{print $5}'",[255,466,296],{"class":295},[255,468,469],{"class":261}," cut",[255,471,472],{"class":285}," -d:",[255,474,475],{"class":285}," -f1",[255,477,296],{"class":295},[255,479,480],{"class":261}," sort",[255,482,296],{"class":295},[255,484,485],{"class":261}," uniq",[255,487,488],{"class":285}," -c",[255,490,296],{"class":295},[255,492,480],{"class":261},[255,494,495],{"class":285}," -nr",[255,497,296],{"class":295},[255,499,299],{"class":261},[255,501,289],{"class":285},[255,503,504],{"class":285}," 15\n",[195,506],{},[166,508,510],{"id":509},"giai-đoạn-3-phân-tích-log-dịch-vụ-root-cause-analysis","Giai đoạn 3: Phân tích Log Dịch vụ (Root Cause Analysis)",[171,512,513],{},"Tùy theo dịch vụ bị lỗi, hãy kiểm tra log tương ứng:",[240,515,517],{"id":516},"đối-với-nginx-web-server","Đối với Nginx / Web Server:",[245,519,521],{"className":247,"code":520,"language":249,"meta":250,"style":250},"sudo tail -n 100 /var/log/nginx/error.log\n",[252,522,523],{"__ignoreMap":250},[255,524,525,527,530,532,535],{"class":257,"line":258},[255,526,356],{"class":261},[255,528,529],{"class":359}," tail",[255,531,289],{"class":285},[255,533,534],{"class":285}," 100",[255,536,537],{"class":359}," /var/log/nginx/error.log\n",[539,540,541,547],"ul",{},[208,542,543,546],{},[252,544,545],{},"Connection refused",": Ứng dụng backend (Node.js/Python/Go) đã bị tắt hoặc đang chết.",[208,548,549,552],{},[252,550,551],{},"Connection timed out",": Backend phản hồi quá chậm hoặc bị khóa cơ sở dữ liệu (Database Deadlock).",[240,554,556],{"id":555},"đối-với-dịch-vụ-systemd-nodejsgopython","Đối với Dịch vụ Systemd (Node.js/Go/Python):",[245,558,560],{"className":247,"code":559,"language":249,"meta":250,"style":250},"sudo journalctl -u my-app -n 100 --no-pager\n",[252,561,562],{"__ignoreMap":250},[255,563,564,566,569,572,575,577,579],{"class":257,"line":258},[255,565,356],{"class":261},[255,567,568],{"class":359}," journalctl",[255,570,571],{"class":285}," -u",[255,573,574],{"class":359}," my-app",[255,576,289],{"class":285},[255,578,534],{"class":285},[255,580,581],{"class":285}," --no-pager\n",[240,583,585],{"id":584},"đối-với-docker-containers","Đối với Docker Containers:",[245,587,589],{"className":247,"code":588,"language":249,"meta":250,"style":250},"docker ps -a\n# Tìm container nào có trạng thái Exited (1) hoặc CrashLoopBackOff\n\ndocker logs --tail 100 \u003Ccontainer_name>\n",[252,590,591,601,606,610],{"__ignoreMap":250},[255,592,593,595,598],{"class":257,"line":258},[255,594,25],{"class":261},[255,596,597],{"class":359}," ps",[255,599,600],{"class":285}," -a\n",[255,602,603],{"class":257,"line":265},[255,604,605],{"class":268},"# Tìm container nào có trạng thái Exited (1) hoặc CrashLoopBackOff\n",[255,607,608],{"class":257,"line":272},[255,609,276],{"emptyLinePlaceholder":275},[255,611,612,614,617,620,622,625,628,632],{"class":257,"line":279},[255,613,25],{"class":261},[255,615,616],{"class":359}," logs",[255,618,619],{"class":285}," --tail",[255,621,534],{"class":285},[255,623,624],{"class":295}," \u003C",[255,626,627],{"class":359},"container_nam",[255,629,631],{"class":630},"sFJ4l","e",[255,633,634],{"class":295},">\n",[240,636,638],{"id":637},"đối-với-cơ-sở-dữ-liệu-postgresql-mysql","Đối với Cơ sở dữ liệu PostgreSQL / MySQL:",[245,640,642],{"className":247,"code":641,"language":249,"meta":250,"style":250},"# Kiểm tra dung lượng bảng và kết nối đang active\ndocker exec -it production_postgres psql -U pgadmin -d core_production -c \"SELECT count(*) FROM pg_stat_activity;\"\n",[252,643,644,649],{"__ignoreMap":250},[255,645,646],{"class":257,"line":258},[255,647,648],{"class":268},"# Kiểm tra dung lượng bảng và kết nối đang active\n",[255,650,651,653,656,659,662,665,668,671,674,677,679],{"class":257,"line":265},[255,652,25],{"class":261},[255,654,655],{"class":359}," exec",[255,657,658],{"class":285}," -it",[255,660,661],{"class":359}," production_postgres",[255,663,664],{"class":359}," psql",[255,666,667],{"class":285}," -U",[255,669,670],{"class":359}," pgadmin",[255,672,673],{"class":285}," -d",[255,675,676],{"class":359}," core_production",[255,678,488],{"class":285},[255,680,681],{"class":359}," \"SELECT count(*) FROM pg_stat_activity;\"\n",[195,683],{},[166,685,687],{"id":686},"giai-đoạn-4-kế-hoạch-khôi-phục-dịch-vụ-mitigation","Giai đoạn 4: Kế hoạch Khôi phục dịch vụ (mitigation)",[171,689,690],{},"Tùy thuộc vào nguyên nhân đã xác định ở Giai đoạn 3:",[240,692,694],{"id":693},"trường-hợp-a-ổ-đĩa-bị-đầy-100-disk-full","Trường hợp A: Ổ đĩa bị đầy 100% (Disk Full)",[245,696,698],{"className":247,"code":697,"language":249,"meta":250,"style":250},"# 1. Dọn dẹp cache gói phần mềm APT\nsudo apt-get clean\n\n# 2. Xóa các log journal cũ hơn 2 ngày\nsudo journalctl --vacuum-time=2d\n\n# 3. Dọn dẹp các Docker image và container rác\ndocker system prune -af\n\n# 4. Tìm kiếm các file log khổng lồ (>500MB)\nsudo find /var/log -type f -size +500M\n",[252,699,700,705,715,719,724,733,738,744,758,763,769],{"__ignoreMap":250},[255,701,702],{"class":257,"line":258},[255,703,704],{"class":268},"# 1. Dọn dẹp cache gói phần mềm APT\n",[255,706,707,709,712],{"class":257,"line":265},[255,708,356],{"class":261},[255,710,711],{"class":359}," apt-get",[255,713,714],{"class":359}," clean\n",[255,716,717],{"class":257,"line":272},[255,718,276],{"emptyLinePlaceholder":275},[255,720,721],{"class":257,"line":279},[255,722,723],{"class":268},"# 2. Xóa các log journal cũ hơn 2 ngày\n",[255,725,726,728,730],{"class":257,"line":307},[255,727,356],{"class":261},[255,729,568],{"class":359},[255,731,732],{"class":285}," --vacuum-time=2d\n",[255,734,736],{"class":257,"line":735},6,[255,737,276],{"emptyLinePlaceholder":275},[255,739,741],{"class":257,"line":740},7,[255,742,743],{"class":268},"# 3. Dọn dẹp các Docker image và container rác\n",[255,745,747,749,752,755],{"class":257,"line":746},8,[255,748,25],{"class":261},[255,750,751],{"class":359}," system",[255,753,754],{"class":359}," prune",[255,756,757],{"class":285}," -af\n",[255,759,761],{"class":257,"line":760},9,[255,762,276],{"emptyLinePlaceholder":275},[255,764,766],{"class":257,"line":765},10,[255,767,768],{"class":268},"# 4. Tìm kiếm các file log khổng lồ (>500MB)\n",[255,770,772,774,777,780,783,786,789],{"class":257,"line":771},11,[255,773,356],{"class":261},[255,775,776],{"class":359}," find",[255,778,779],{"class":359}," /var/log",[255,781,782],{"class":285}," -type",[255,784,785],{"class":359}," f",[255,787,788],{"class":285}," -size",[255,790,791],{"class":359}," +500M\n",[240,793,795],{"id":794},"trường-hợp-b-tiến-trình-bị-treo-hoặc-tràn-ram-high-memory-cpu","Trường hợp B: Tiến trình bị treo hoặc tràn RAM (High Memory / CPU)",[245,797,799],{"className":247,"code":798,"language":249,"meta":250,"style":250},"# Khởi động lại dịch vụ mượt mà\nsudo systemctl restart my-app\n\n# Hoặc khởi động lại Docker compose\ndocker compose restart\n",[252,800,801,806,819,823,828],{"__ignoreMap":250},[255,802,803],{"class":257,"line":258},[255,804,805],{"class":268},"# Khởi động lại dịch vụ mượt mà\n",[255,807,808,810,813,816],{"class":257,"line":265},[255,809,356],{"class":261},[255,811,812],{"class":359}," systemctl",[255,814,815],{"class":359}," restart",[255,817,818],{"class":359}," my-app\n",[255,820,821],{"class":257,"line":272},[255,822,276],{"emptyLinePlaceholder":275},[255,824,825],{"class":257,"line":279},[255,826,827],{"class":268},"# Hoặc khởi động lại Docker compose\n",[255,829,830,832,835],{"class":257,"line":307},[255,831,25],{"class":261},[255,833,834],{"class":359}," compose",[255,836,837],{"class":359}," restart\n",[240,839,841],{"id":840},"trường-hợp-c-bị-tấn-công-dosddos-từ-một-dải-ip-độc-hại","Trường hợp C: Bị tấn công DoS/DDoS từ một dải IP độc hại",[245,843,845],{"className":247,"code":844,"language":249,"meta":250,"style":250},"# Chặn tức thời IP đang spam hàng chục nghìn kết nối\nsudo ufw insert 1 deny from 203.0.113.50 to any\n",[252,846,847,852],{"__ignoreMap":250},[255,848,849],{"class":257,"line":258},[255,850,851],{"class":268},"# Chặn tức thời IP đang spam hàng chục nghìn kết nối\n",[255,853,854,856,859,862,864,867,870,873,876],{"class":257,"line":265},[255,855,356],{"class":261},[255,857,858],{"class":359}," ufw",[255,860,861],{"class":359}," insert",[255,863,292],{"class":285},[255,865,866],{"class":359}," deny",[255,868,869],{"class":359}," from",[255,871,872],{"class":285}," 203.0.113.50",[255,874,875],{"class":359}," to",[255,877,878],{"class":359}," any\n",[195,880],{},[166,882,884],{"id":883},"giai-đoạn-5-dấu-hiệu-máy-chủ-bị-xâm-nhập-compromise-hacked","Giai đoạn 5: Dấu hiệu máy chủ bị xâm nhập (compromise / hacked)",[171,886,887,888,891,892,895],{},"Nếu bạn phát hiện các tiến trình lạ có tên ngẫu nhiên (dạng ",[252,889,890],{},"kdevtmpfsi",", ",[252,893,894],{},"xmrig","...) chiếm 100% CPU:",[205,897,898,976,1010],{},[208,899,900,903,904],{},[175,901,902],{},"Kiểm tra Crontab của toàn bộ user",":\n",[245,905,907],{"className":247,"code":906,"language":249,"meta":250,"style":250},"for user in $(cut -f1 -d: /etc/passwd); do echo \"=== $user ===\"; crontab -u $user -l 2>/dev/null; done\n",[252,908,909],{"__ignoreMap":250},[255,910,911,914,917,920,923,926,928,930,933,936,939,942,945,948,951,954,957,959,962,965,968,971,973],{"class":257,"line":258},[255,912,913],{"class":295},"for",[255,915,916],{"class":630}," user ",[255,918,919],{"class":295},"in",[255,921,922],{"class":630}," $(",[255,924,925],{"class":261},"cut",[255,927,475],{"class":285},[255,929,472],{"class":285},[255,931,932],{"class":359}," /etc/passwd",[255,934,935],{"class":630},"); ",[255,937,938],{"class":295},"do",[255,940,941],{"class":285}," echo",[255,943,944],{"class":359}," \"=== ",[255,946,947],{"class":630},"$user",[255,949,950],{"class":359}," ===\"",[255,952,953],{"class":630},"; ",[255,955,956],{"class":261},"crontab",[255,958,571],{"class":285},[255,960,961],{"class":630}," $user ",[255,963,964],{"class":285},"-l",[255,966,967],{"class":295}," 2>",[255,969,970],{"class":359},"/dev/null",[255,972,953],{"class":630},[255,974,975],{"class":295},"done\n",[208,977,978,903,988],{},[175,979,980,981,984,985],{},"Kiểm tra các file trong thư mục tạm ",[252,982,983],{},"/tmp"," và ",[252,986,987],{},"/dev/shm",[245,989,991],{"className":247,"code":990,"language":249,"meta":250,"style":250},"ls -la /tmp /var/tmp /dev/shm\n",[252,992,993],{"__ignoreMap":250},[255,994,995,998,1001,1004,1007],{"class":257,"line":258},[255,996,997],{"class":261},"ls",[255,999,1000],{"class":285}," -la",[255,1002,1003],{"class":359}," /tmp",[255,1005,1006],{"class":359}," /var/tmp",[255,1008,1009],{"class":359}," /dev/shm\n",[208,1011,1012,903,1015],{},[175,1013,1014],{},"Kiểm tra lịch sử đăng nhập SSH",[245,1016,1018],{"className":247,"code":1017,"language":249,"meta":250,"style":250},"last -n 20\nsudo grep \"Accepted\" /var/log/auth.log\n",[252,1019,1020,1029],{"__ignoreMap":250},[255,1021,1022,1025,1027],{"class":257,"line":258},[255,1023,1024],{"class":261},"last",[255,1026,289],{"class":285},[255,1028,304],{"class":285},[255,1030,1031,1033,1035,1038],{"class":257,"line":265},[255,1032,356],{"class":261},[255,1034,368],{"class":359},[255,1036,1037],{"class":359}," \"Accepted\"",[255,1039,1040],{"class":359}," /var/log/auth.log\n",[1042,1043,1045],"info-box",{"type":1044},"warning",[171,1046,1047,1048,1051],{},"Nếu máy chủ đã bị chiếm quyền root hoàn toàn bởi mã độc, giải pháp an toàn duy nhất là: ",[175,1049,1050],{},"Sao lưu dữ liệu sạch → Hủy VPS cũ → Tạo VPS mới từ đầu và khôi phục dữ liệu",". Không nên cố gắng vá một máy chủ đã bị rootkit cài sâu vào hệ thống.",[195,1053],{},[166,1055,1057],{"id":1056},"giai-đoạn-6-đánh-giá-hậu-sự-cố-post-mortem-review","Giai đoạn 6: Đánh giá hậu sự cố (Post-Mortem Review)",[171,1059,1060],{},"Sau khi dịch vụ đã hoạt động ổn định trở lại, hãy tiến hành cuộc họp rút kinh nghiệm và trả lời 4 câu hỏi:",[205,1062,1063,1069,1075,1081],{},[208,1064,1065,1068],{},[175,1066,1067],{},"Chuyện gì đã xảy ra?"," (Mô tả chi tiết diễn biến sự cố).",[208,1070,1071,1074],{},[175,1072,1073],{},"Nguyên nhân gốc rễ là gì?"," (Do thiếu RAM, do câu lệnh SQL chậm, hay do file log không được xoay vòng?).",[208,1076,1077,1080],{},[175,1078,1079],{},"Tại sao hệ thống cảnh báo không phát hiện sớm hơn?"," (Cần bổ sung ngưỡng cảnh báo nào vào Uptime Kuma?).",[208,1082,1083,1086],{},[175,1084,1085],{},"Hành động khắc phục lâu dài (Action Items)",": Các việc cần làm để lỗi này KHÔNG BAO GIỜ lặp lại lần thứ hai.",[195,1088],{},[166,1090,1092],{"id":1091},"tổng-kết","Tổng kết",[171,1094,1095,1096,1099],{},"Sự cố hệ thống là điều không thể tránh khỏi trong quá trình vận hành phần mềm. Sự khác biệt giữa một đội ngũ nghiệp dư và chuyên nghiệp nằm ở ",[175,1097,1098],{},"sự chuẩn bị sẵn sàng, quy trình chuẩn đoán mạch lạc và các bước xử lý bình tĩnh, chính xác",". Hãy lưu lại checklist này vào sổ tay kỹ thuật của bạn!",[1101,1102,1103],"style",{},"html pre.shiki code .sb7EE, html code.shiki .sb7EE{--shiki-default:#B392F0;--shiki-dark:#B392F0;--shiki-light:#B392F0}html pre.shiki code .sGGCZ, html code.shiki .sGGCZ{--shiki-default:#6A737D;--shiki-dark:#6A737D;--shiki-light:#6A737D}html pre.shiki code .sKJT9, html code.shiki .sKJT9{--shiki-default:#79B8FF;--shiki-dark:#79B8FF;--shiki-light:#79B8FF}html pre.shiki code .sWuGj, html code.shiki .sWuGj{--shiki-default:#F97583;--shiki-dark:#F97583;--shiki-light:#F97583}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html pre.shiki code .skqr8, html code.shiki .skqr8{--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF;--shiki-light:#9ECBFF}html pre.shiki code .sFJ4l, html code.shiki .sFJ4l{--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8;--shiki-light:#E1E4E8}",{"title":250,"searchDepth":265,"depth":265,"links":1105},[1106,1107,1108,1114,1120,1125,1126,1127],{"id":168,"depth":265,"text":169},{"id":199,"depth":265,"text":200},{"id":230,"depth":265,"text":231,"children":1109},[1110,1111,1112,1113],{"id":242,"depth":272,"text":243},{"id":313,"depth":272,"text":314},{"id":380,"depth":272,"text":381},{"id":417,"depth":272,"text":418},{"id":509,"depth":265,"text":510,"children":1115},[1116,1117,1118,1119],{"id":516,"depth":272,"text":517},{"id":555,"depth":272,"text":556},{"id":584,"depth":272,"text":585},{"id":637,"depth":272,"text":638},{"id":686,"depth":265,"text":687,"children":1121},[1122,1123,1124],{"id":693,"depth":272,"text":694},{"id":794,"depth":272,"text":795},{"id":840,"depth":272,"text":841},{"id":883,"depth":265,"text":884},{"id":1056,"depth":265,"text":1057},{"id":1091,"depth":265,"text":1092},[9,10],false,"md",{"src":18,"alt":19},{},{"title":6,"description":7},null,"incident-checklist","posts/incident-checklist",[12,13,14,15],"2026-08-26","XbkcGfELR2",[1141,1145,1150,1155,1160,1165,1170,1175,1180,1185,1190,1195],{"path":5,"title":6,"categories":1142,"tags":1143,"date":16,"draft":1129,"slug":1135,"description":7,"image":1144},[9,10],[12,13,14,15],{"src":18,"alt":19},{"path":21,"title":22,"categories":1146,"tags":1147,"date":31,"draft":1129,"slug":1148,"description":23,"image":1149},[25,26],[28,29,30,10],"backup-postgres-docker",{"src":33,"alt":34},{"path":36,"title":37,"categories":1151,"tags":1152,"date":44,"draft":1129,"slug":1153,"description":38,"image":1154},[25,10],[41,42,43],"docker-compose-production",{"src":46,"alt":47},{"path":49,"title":50,"categories":1156,"tags":1157,"date":58,"draft":1129,"slug":1158,"description":51,"image":1159},[9,10],[54,55,56,57],"monitoring-server-basics",{"src":60,"alt":61},{"path":63,"title":64,"categories":1161,"tags":1162,"date":71,"draft":1129,"slug":1163,"description":65,"image":1164},[9,67],[10,69,70],"nginx-reverse-proxy",{"src":73,"alt":74},{"path":76,"title":77,"categories":1166,"tags":1167,"date":83,"draft":1129,"slug":1168,"description":78,"image":1169},[9,14],[81,82,10],"how-to-secure-a-vps",{"src":85,"alt":86},{"path":88,"title":89,"categories":1171,"tags":1172,"date":95,"draft":1129,"slug":1173,"description":90,"image":1174},[9,10],[93,94,43,41],"systemd-node-service",{"src":97,"alt":98},{"path":100,"title":101,"categories":1176,"tags":1177,"date":107,"draft":1129,"slug":1178,"description":102,"image":1179},[9,25],[105,10,106],"how-to-install-docker-on-ubuntu-server",{"src":109,"alt":110},{"path":112,"title":113,"categories":1181,"tags":1182,"date":118,"draft":1129,"slug":1183,"description":114,"image":1184},[9,14],[117,10,15],"ssh-key-authentication",{"src":120,"alt":121},{"path":123,"title":124,"categories":1186,"tags":1187,"date":131,"draft":1129,"slug":1188,"description":125,"image":1189},[9,14],[128,129,130,15],"ufw-firewall-basics",{"src":133,"alt":134},{"path":136,"title":137,"categories":1191,"tags":1192,"date":145,"draft":1129,"slug":1193,"description":138,"image":1194},[140,10],[142,143,144,30],"git-deploy-key",{"src":147,"alt":148},{"path":150,"title":151,"categories":1196,"tags":1197,"date":155,"draft":1129,"slug":1198,"description":152,"image":1199},[9],[106,105,15],"ubuntu-server-initial-setup",{"src":157,"alt":158},[],1789616168244]