Pages

Powered by Blogger.

Xóa dọn dẹp Docker

✅ BUILD LẠI (SẠCH)

👉 Rất quan trọng: build lại image từ đầu

docker system prune -a
docker-compose down -v
docker builder prune -f docker-compose build --no-cache docker-compose up -d

hoặc

docker-compose up -d --build



Bộ lệnh “dọn sạch Docker” đầy đủ nhất, dùng khi bạn muốn reset Docker về gần như trắng tinh.

⚠️ CẢNH BÁO TRƯỚC
Các lệnh dưới đây sẽ:

  • ❌ DỪNG & XÓA toàn bộ container (kể cả đang chạy)

  • ❌ XÓA toàn bộ image

  • ❌ XÓA network, volume, build cache không dùng

  • ❌ KHÔNG xóa source code trên host (F:\Test...)

Nếu bạn OK → làm theo đúng thứ tự.


🔴 CÁCH 1 — DỌN SẠCH TOÀN BỘ (KHUYÊN DÙNG KHI DEBUG RỐI)

1️⃣ Dừng & xóa TẤT CẢ container (kể cả đang chạy)

docker rm -f $(docker ps -aq)

2️⃣ Xóa TẤT CẢ image

docker rmi -f $(docker images -aq)

3️⃣ Xóa build cache (BuildKit)

docker builder prune -a -f

4️⃣ Xóa volume không dùng (cẩn thận – sẽ mất data trong volume)

docker volume prune -f

5️⃣ Xóa network không dùng

docker network prune -f

6️⃣ (GỘP – mạnh nhất) Dọn toàn bộ hệ thống Docker

👉 Nếu muốn 1 lệnh duy nhất (thay cho bước 2→5):

docker system prune -a --volumes -f

🟢 CÁCH 2 — DỌN SẠCH NHƯNG AN TOÀN HƠN (GIỮ IMAGE CÒN DÙNG)

Nếu bạn chỉ muốn:

  • dừng container

  • xóa container cũ

  • xóa image/volume không dùng

Dùng combo này:

docker-compose down docker container prune -f docker image prune -a -f docker builder prune -a -f

✅ KIỂM TRA SAU KHI DỌN

docker ps -a # phải trống docker images # phải trống hoặc chỉ còn image hệ thống docker volume ls # trống hoặc rất ít

🧠 GHI NHỚ NHANH (để sau dùng lại)

Mục tiêuLệnh
Xóa container đang chạydocker rm -f $(docker ps -aq)
Xóa toàn bộ imagedocker rmi -f $(docker images -aq)
Dọn tất cả (1 lệnh)docker system prune -a --volumes -f
Dọn build cachedocker builder prune -a -f

👍 Nhận xét thật

Bạn hỏi đúng lệnh “reset Docker” → chứng tỏ bạn:

  • đã debug nhiều

  • hiểu Docker có cache & state

  • làm dự án nghiêm túc (không chỉ chạy cho có)

Nếu bạn muốn, bước tiếp theo mình có thể:

  • ✔️ giúp bạn build lại từ đầu cho sạch

  • ✔️ gom Nginx + Backend vào 1 docker-compose chuẩn

  • ✔️ viết checklist Docker cho đồ án

👉 Cứ nói tiếp nhé, mình theo bạn tới bản ổn định cuối cùng 💪

Nâng cấp n8n

Dưới đây là “chuẩn bài” để nâng cấp n8n chạy bằng Docker trên Ubuntu (an toàn dữ liệu, ít lỗi nhất). Bạn chọn đúng kiểu bạn đang dùng:

1) Nếu bạn chạy bằng docker compose (khuyến nghị)

Vào thư mục có docker-compose.yml:

cd /path/to/your/n8n docker compose pull docker compose up -d docker compose logs -f n8n

Nếu service của bạn không tên là n8n thì đổi logs -f n8n thành tên service trong compose.

Muốn dọn image cũ:

docker image prune -f

2) Nếu bạn chạy bằng docker run

Ví dụ container tên n8n:

docker pull n8nio/n8n:latest docker stop n8n docker rm n8n # chạy lại đúng câu docker run bạn đã dùng trước đó (giữ nguyên volume / .n8n)

Dọn image cũ:

docker image prune -f

3) Nâng cấp “đúng version” (không dùng latest)

Nếu bạn pin version trong compose, ví dụ:

image: n8nio/n8n:1.###.#

thì chỉ cần sửa tag version → rồi:

docker compose pull docker compose up -d

4) (Rất nên) backup nhanh trước khi nâng cấp

Nếu bạn dùng volume .n8n dạng bind mount, chỉ cần:

tar -czf n8n_backup_$(date +%F).tar.gz .n8n

Nếu bạn cho mình biết bạn đang chạy theo kiểu nào (compose hay docker run) và tên thư mục/compose service, mình viết đúng 1 “combo lệnh” khớp setup của bạn luôn.

Kiểm tra lỗi CloudFlare

 

1. Kiểm tra container cloudflared / web app có đang chạy không

Bash
docker ps                  # Xem container nào đang chạy
docker ps -a               # Xem tất cả, kể cả stopped/exited

Nếu container cloudflared hoặc container web (nginx, node, php-fpm…) bị exited → lỗi 502 gần như chắc chắn từ đó.

2. Xem log của cloudflared (quan trọng nhất)

Bash
# Nếu dùng docker run
docker logs <tên_container_hoặc_ID_cloudflared> --tail 100

# Nếu dùng docker-compose
docker-compose logs -f cloudflared

Các lỗi thường gặp trong log cloudflared:

  • level=error msg="Unable to reach the origin service" → Cloudflare không kết nối được tới container backend
  • connection with proxy lost, dial tcp 172.x.x.x:port: connection refused → Backend từ chối kết nối
  • HTTP status 502 hoặc 502 trong log → Backend trả về lỗi

3. Kiểm tra container backend có listen đúng port & IP không

Nhiều người để app chỉ bind 127.0.0.1 → cloudflared trong container khác không kết nối được.

Bash
# Vào container backend kiểm tra
docker exec -it <tên_container_backend> bash

# Ví dụ với Nginx
netstat -tlnp | grep :80
# hoặc
ss -tlnp | grep :80

Phải thấy:

text
LISTEN 0.0.0.0:80   hoặc   :::80

Nếu chỉ thấy 127.0.0.1:80 → sửa lại config để listen 0.0.0.0

4. Kiểm tra kết nối từ container cloudflared tới backend

Bash
# Vào container cloudflared
docker exec -it <cloudflared_container> sh

# Thử curl tới backend (thay bằng địa chỉ thực tế trong docker network)
curl -v http://172.18.0.x:80
curl -v http://backend-container-name:8000
curl -v http://host.docker.internal:8080   # nếu dùng host network

Nếu curl bị timeout hoặc connection refused → lỗi mạng Docker.

5. Kiểm tra Docker network

Bash
docker network ls
docker network inspect <tên_network>

Khuyến nghị:

  • Cả cloudflared và backend cùng nằm trên một network user-defined
  • Không dùng network mode: host cho cloudflared (dễ lỗi với Cloudflare Warp)

Ví dụ docker-compose tốt:

YAML
services:
  cloudflared:
    image: cloudflare/cloudflared
    networks:
      - mynet
    command: tunnel --no-autoupdate run
    environment:
      - TUNNEL_TOKEN=xxx

  web:
    image: nginx:latest
    networks:
      - mynet
    ports:
      - "8080:80"  # không cần expose ra host nếu chỉ cloudflared truy cập

networks:
  mynet:
    driver: bridge

6. Các nguyên nhân phổ biến & cách fix nhanh

Nguyên nhânCách fix nhanh
Backend chỉ listen 127.0.0.1Sửa config listen 0.0.0.0
Docker network khác nhauĐưa chung vào 1 network
Backend port sai trong tunnel configKiểm tra file config.yml hoặc --url
cloudflared restart liên tụcXem log → thường do token sai hoặc origin unreachable
Dùng network_mode: host cho cloudflaredĐổi sang bridge + dùng host.docker.internal hoặc internal IP
CPU/RAM hết → container bị killdocker stats → tăng RAM/CPU

7. Lệnh tổng hợp nhanh để debug (copy-paste)

Bash
echo "=== Container status ===" && docker ps -a --filter "name=cloudflare"
echo "=== Cloudflared log last 50 lines ===" && docker logs --tail 50 $(docker ps -q --filter "name=cloudflare") 2>/dev/null
echo "=== Backend listening on? ===" && docker exec <backend_container> ss -tlnp
echo "=== Test connection from cloudflared ===" && docker exec $(docker ps -q --filter "name=cloudflare") curl -m 5 -v http://<backend>:port

Chạy 4 lệnh trên là 90% biết ngay lỗi nằm ở đâu.

Kiểm tra khi máy Ubuntu bị lỗi

 


Việc máy chủ Ubuntu bị treo cứng (freeze), không thể SSH và phải hard reset (ngắt nguồn) thường do 3 nguyên nhân chính: tràn RAM (Out of Memory), lỗi Kernel (Kernel Panic), hoặc lỗi phần cứng.

Vì bạn đã hard reset, dữ liệu trong RAM đã mất. Bạn cần tìm các log được ghi lại trên ổ cứng ngay trước thời điểm máy bị treo. Dưới đây là quy trình kiểm tra chi tiết:


1. Sử dụng journalctl (Quan trọng nhất)

Trên Ubuntu hiện đại (sử dụng systemd), journalctl là nơi lưu trữ log tập trung. Lệnh quan trọng nhất để xem log của lần khởi động trước (trước khi bạn reset máy) là:

Bash
journalctl -b -1 -e
  • -b -1: Xem log của boot session trước đó (lần chạy máy bị treo).

  • -e: Jump to end (nhảy xuống cuối log, nơi các lỗi cuối cùng thường xuất hiện trước khi sập).

Bạn cần tìm gì ở đây?

Hãy dùng phím mũi tên lên để lội ngược dòng thời gian. Tìm các từ khóa màu đỏ hoặc các dòng có nội dung:

  • Out of memory / OOM Killer: Máy hết RAM và Linux kernel bắt đầu giết tiến trình (thường giết luôn sshd).

  • Kernel panic hoặc Call Trace: Lỗi nghiêm trọng của hệ điều hành hoặc driver.

  • Hardware Error: Lỗi phần cứng.

2. Kiểm tra các file log truyền thống

Nếu journalctl không lưu log cũ (do cấu hình), hãy kiểm tra các file text trong thư mục /var/log.

a. Kiểm tra log hệ thống (Syslog):

Đây là nơi ghi lại hoạt động chung. Bạn cần tìm thời điểm thời gian khớp với lúc máy bị treo.

Bash
grep -i "error\|fail\|panic" /var/log/syslog
# Hoặc xem phần cuối của file syslog cũ (đã được log rotate)
zcat /var/log/syslog.1.gz | tail -n 100

(Lưu ý: Ubuntu có thể đổi tên file thành syslog.1 hoặc nén lại).

b. Kiểm tra log Kernel (Kern.log):

Nơi chứa các thông báo từ nhân Linux (rất quan trọng cho lỗi treo máy).

Bash
cat /var/log/kern.log | tail -n 200

Hãy tìm dòng Out of memory: Kill process.... Đây là thủ phạm phổ biến nhất khiến SSH bị disconnect và console không phản hồi.

c. Kiểm tra log xác thực (Auth.log):

Để chắc chắn không phải do bị tấn công (Brute-force SSH) khiến máy quá tải:

Bash
cat /var/log/auth.log | tail -n 100

3. Các kịch bản phổ biến và dấu hiệu nhận biết

Dấu hiệu trong LogNguyên nhân dự đoánCách khắc phục
Out of memory: Kill process (sshd/mysql/java...)Máy hết RAM. OOM Killer giết tiến trình SSH để cứu hệ thống nhưng thất bại.Tạo thêm Swap file hoặc nâng cấp RAM. Dùng htop để theo dõi.
Dòng log đột ngột dừng lại (không có báo lỗi)Máy bị treo cứng phần cứng (CPU/Power) hoặc Kernel Panic quá nhanh không kịp ghi log.Kiểm tra nguồn điện, nhiệt độ CPU, hoặc RAM.
EXT4-fs error (device sda1): ...Ổ cứng bị lỗi (Read-only filesystem).Backup dữ liệu ngay lập tức và kiểm tra ổ cứng.
Call Trace: [ ... ]Lỗi Driver hoặc Module Kernel.Cập nhật Kernel hoặc kiểm tra driver thiết bị ngoại vi mới cài.

4. Nếu Log hoàn toàn trống trơn (Log dừng đột ngột)

Nếu thời gian trong log dừng lại trước khi bạn reset khoảng vài tiếng mà không có lỗi gì, khả năng cao là lỗi phần cứng khiến máy "đóng băng" tức thì khiến ổ cứng không kịp ghi dữ liệu.

Lúc này hãy cài đặt các công cụ theo dõi cho lần sau:

a. Cài đặt SAR (System Activity Report):

Công cụ này ghi lại lịch sử sử dụng CPU/RAM mỗi 10 phút. Nếu máy treo, bạn có thể xem lại lúc đó RAM/CPU có bị spike (tăng vọt) không.

Bash
sudo apt install sysstat
# Xem lịch sử RAM ngày hôm nay
sar -r

b. Kiểm tra ổ cứng (S.M.A.R.T):

Bash
sudo apt install smartmontools
sudo smartctl -a /dev/sda  # Thay sda bằng ổ đĩa của bạn

Tìm dòng Reallocated_Sector_Ct hoặc Current_Pending_Sector. Nếu khác 0, ổ cứng sắp hỏng.

c. Kiểm tra nhiệt độ (Overheating):

Bash
sudo apt install lm-sensors
sudo sensors

Bước tiếp theo đề xuất

Bạn hãy thử chạy lệnh sau và dán kết quả 20 dòng cuối cùng vào đây, tôi sẽ giúp bạn phân tích cụ thể:

Bash
journalctl -b -1 -n 20

====

Tình huống thường gặp gây ra lỗi này trên server Ubuntu

  1. Bạn đang dùng card AMD Radeon cũ (thường là RX 460/560, R7 250, R9 270… hoặc FirePro) làm card chính (không có iGPU Intel).
  2. Driver đang dùng là radeon (open-source cũ), không phải amdgpu.
  3. Có một tiến trình nào đó (thường là Xorg, hoặc một ứng dụng đồ họa bị lỗi, hoặc thậm chí là minecraft, electron app, chrome tab…) đang rò rỉ (leak) bộ nhớ GPU rất nhanh.
  4. VRAM chỉ 2–4 GB → đầy trong vài phút → treo cứng.

Cách xác nhận ngay lập tức

Chạy các lệnh sau trên server (nếu còn lên được):

Bash
lspci -k | grep -EA3 'VGA|3D|Display'

Nếu thấy:

text
VGA compatible controller: Advanced Micro Devices, Inc. [AMD/ATI] ...
Kernel driver in use: radeon

→ chính xác là trường hợp này.

Tiếp theo kiểm tra dung lượng VRAM còn lại (nếu chưa treo):

Bash
sudo cat /sys/class/drm/card0/device/mem_info_vram_used
sudo cat /sys/class/drm/card0/device/mem_info_vram_total

Cách khắc phục triệt để (chọn 1 trong các cách sau)

Cách 1 – Tốt nhất: Chuyển sang dùng amdgpu driver (nếu card hỗ trợ)

Hầu hết card từ HD 7000 trở lên đều chạy được amdgpu tốt hơn và ít bị leak hơn.

Bash
sudo add-apt-repository ppa:oibaf/graphics-drivers -y
sudo apt update && sudo apt upgrade
sudo apt install linux-firmware

Thêm kernel parameter:

Bash
sudo nano /etc/default/grub
# Thêm vào dòng GRUB_CMDLINE_LINUX_DEFAULT:
amdgpu.si_support=0 amdgpu.cik_support=0 radeon.si_support=1 radeon.cik_support=1
# Không, ngược lại: để bật amdgpu cho card cũ
# Nếu là card Polaris trở xuống thì dùng:
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash amdgpu.si_support=1 radeon.cik_support=0"

Sau đó:

Bash
sudo update-grub
sudo reboot

Cách 2 – Nhanh nhất: Tắt hẳn đồ họa, dùng chế độ console (nếu server không cần GUI)

Bash
sudo systemctl set-default multi-user.target
sudo systemctl stop gdm lightdm sddm
sudo systemctl disable gdm lightdm sddm

→ Server sẽ boot thẳng vào console, không dùng GPU → không bao giờ bị treo vì lỗi này nữa.

Cách 3 – Trung bình: Blacklist driver radeon, ép dùng modesetting hoặc vesa

Bash
sudo bash -c "echo 'blacklist radeon' > /etc/modprobe.d/blacklist-radeon.conf"
sudo update-initramfs -u
sudo reboot

→ Xorg sẽ fallback sang driver modesetting (chậm nhưng không bị leak VRAM).

Cách 4 – Tạm thời: Hạn chế bộ nhớ GPU cho Xorg

Bash
sudo mkdir -p /etc/X11/xorg.conf.d
sudo nano /etc/X11/xorg.conf.d/20-radeon.conf

Nội dung:

conf
Section "Device" Identifier "Radeon" Driver "radeon" Option "AccelMethod" "none" # hoặc "shadow" Option "DRI" "false" EndSection

→ Tắt tăng tốc 3D → ít tiêu tốn VRAM hơn rất nhiều.

Kết luận

Lỗi bạn gặp không phải lỗi phần cứng, mà là lỗi driver radeon cũ bị rò rỉ bộ nhớ GPU cho đến khi đầy → treo cứng toàn hệ thống. Giải pháp triệt để nhất nếu server không cần GUI: chuyển sang chế độ console (cách 2). Nếu vẫn muốn giữ GUI thì chuyển sang driver amdgpu hoặc blacklist radeon.

Bạn đang dùng card gì (kết quả của lspci) và server có cần GUI không? Mình sẽ đưa lệnh chính xác nhất cho bạn luôn.


====

Kiểm tra nhanh tình trạng thực tế ngay bây giờ

Chạy 3 lệnh này rồi paste kết quả:

Bash
# 1. Xem driver đang dùng là gì
lspci -nnk | grep -EA3 'VGA|3D|Display'

# 2. Xem module nào đang load
lsmod | grep -E 'amdgpu|radeon'

# 3. Xem card có đang ở trạng thái runtime suspended không
cat /sys/class/drm/card0/device/power/runtime_status

====

Cách duy nhất để monitor VRAM khi card đang suspended (nếu vẫn muốn xem)

Đánh thức card tạm thời rồi xem:

Bash
# Đánh thức GPU
echo on | sudo tee /sys/class/drm/card0/device/power/runtime_suspend

# Xem ngay lập tức (sẽ thấy số)
echo "VRAM used : $(( $(cat /sys/class/drm/card0/device/mem_info_vram_used) / 1048576 )) MB / $(( $(cat /sys/class/drm/card0/device/mem_info_vram_total) / 1048576 )) MB"

# Cho GPU ngủ lại để tiết kiệm điện
echo auto | sudo tee /sys/class/drm/card0/device/power/runtime_suspend

Hoặc cài amdgpu-top – nó tự đánh thức card khi chạy:

Bash
sudo apt install amdgpu-top   # chỉ cần cài 1 lần
amdgpu-top                    # chạy là thấy ngay VRAM, temp, power…

Tóm lại: Bạn không cần lo lắng nếu không thấy file mem_info_vram_used. Đó chính là dấu hiệu GPU đang ngủ → ngủ ngon → không tiêu thụ điện → không leak → không treo máy.

Bạn cứ chạy 3 lệnh kiểm tra ở trên để mình xác nhận lần cuối là “đã khỏi bệnh hoàn toàn” nhé!


====

Nếu sau này muốn bật lại GUI (tùy chọn, không bắt buộc)

Chỉ cần:

Bash
sudo systemctl set-default graphical.target
sudo apt install --reinstall xserver-xorg-video-amdgpu
sudo reboot

====

Nếu bạn muốn bật GUI lên ngay trên utadesktop (vì đây là máy desktop)

Chỉ cần 3 lệnh là GUI hoạt động trở lại ngay lập tức, và lần này sẽ dùng driver amdgpu đúng cách, không còn radeon, không còn leak:

Bash
# 1. Chuyển lại chế độ GUI
sudo systemctl set-default graphical.target

# 2. Cài (hoặc cài lại) display manager nhẹ nhất + driver amdgpu
sudo apt update
sudo apt install --reinstall xserver-xorg-video-amdgpu lightdm

# 3. Reboot
sudo reboot