Pages

Powered by Blogger.

Một số lệnh debug với docker

anhpt@utaserver:~/n8n_cloudflare$ curl -I http://127.0.0.1:5680/

HTTP/1.1 200 OK

Accept-Ranges: bytes

Cache-Control: public, max-age=86400

Last-Modified: Mon, 24 Nov 2025 17:33:58 GMT

ETag: W/"3500-19ab6edf2bf"

Content-Type: text/html; charset=utf-8

Content-Length: 13568

Vary: Accept-Encoding

Date: Mon, 24 Nov 2025 17:37:48 GMT

Connection: keep-alive

Keep-Alive: timeout=5

Hiển thị các container đang chạy:

 docker ps

Lệnh kiểm tra log của 1 container ID:

  docker logs --tail 30 efafa366b545

  docker logs -f n8n_main_ngrok 

Lệnh khởi động lại:

docker-compose down --remove-orphans

docker-compose up -d


2. Cách chạy scale (chọn 1 trong 2 cách)

Cách A – Dùng docker compose (khuyên dùng, đơn giản nhất)

Bash
# Scale worker lên 8 bản (ví dụ)
docker-compose up -d --scale n8n-worker=8

# Hoặc scale xuống 4
docker-compose up -d --scale n8n-worker=4


Docker Compose có thực sự load được file .env không? Chạy lệnh này để kiểm tra biến môi trường thực tế bên trong container:

Bash
docker-compose config | grep -A 10 -B 10 NGROK_AUTHTOKEN

Kiểm tra lần cuối

Bash
docker logs $(docker ps -q --filter "name=ngrok") --tail 20

→ Nếu thấy dòng session started + URL https://xxxx.ngrok-free.app → xong! → Nếu vẫn thấy ${NGROK_AUTHTOKEN} → bạn còn 1 service ngrok cũ đang chạy ngoài compose → kill nó:

Bash
docker stop $(docker ps -q --filter "ancestor=ngrok/ngrok") 2>/dev/null || true
docker rm $(docker ps -aq --filter "ancestor=ngrok/ngrok") 2>/dev/null || true
docker-compose up -d

Hiện tại bạn chưa thấy 2 thư mục dữ liệu (postgres_data_ngrok và n8n_data_ngrok) vì chúng đang được Docker tạo dưới dạng Docker named volume chứ không phải thư mục thật trong ~/n8n_ngrok.

Kiểm tra đúng vị trí thực tế dữ liệu đang nằm ở đâu

Chạy 2 lệnh này:

Bash
# 1. Xem tất cả volume đang tồn tại
docker volume ls

# 2. Xem chi tiết 2 volume chính của bạn nằm ở đâu trên host
docker volume inspect n8n_ngrok_postgres_data_ngrok
docker volume inspect n8n_ngrok_n8n_data_ngrok

# 1. Chạy một sshd chuẩn trong Docker để test

docker run --rm -d --name test-ssh-real -p 2223:22 lscr.io/linuxserver/openssh-server:latest


# 2. Tạo tunnel ngrok mới cho port 2223

curl -s http://127.0.0.1:4041/api/tunnels -X POST -H "Content-Type: application/json" -d '{

  "name": "test-ssh-real",

  "proto": "tcp",

  "addr": "localhost:2223"

}'


# 3. Lấy port mới

curl -s http://127.0.0.1:4041/api/tunnels | grep -A5 test-ssh-real


# Xem danh sách tunnel hiện có

curl -s http://127.0.0.1:4041/api/tunnels | jq -r '.tunnels[] | .name + " → " + .public_url'


# Xóa cái tunnel test-tcp cũ đi (giải phóng 1 slot)

curl -s http://127.0.0.1:4041/api/tunnels/test-tcp -X DELETE


# Hoặc xóa bất kỳ tunnel nào bạn không cần nữa, ví dụ:

# curl -s http://127.0.0.1:4041/api/tunnels/[tên_tunnel_cũ] -X DELETE


# 1. Xóa tunnel test-ssh-real cũ đi để dọn sạch

curl -s http://127.0.0.1:4041/api/tunnels/test-ssh-real -X DELETE


# 2. Chạy một sshd chuẩn trong Docker, dùng port 2223

docker run --rm -d --name real-ssh-test \

  -e PUID=1000 -e PGID=1000 \

  -e TZ=Asia/Ho_Chi_Minh \

  -e PASSWORD_ACCESS=true \

  -e USER_NAME=abc \

  -e USER_PASSWORD=password123 \

  -p 2223:2222 \

  lscr.io/linuxserver/openssh-server:latest


# 3. Tạo lại tunnel sạch cho port 2223

curl -s http://127.0.0.1:4041/api/tunnels -X POST -H "Content-Type: application/json" -d '{

  "name": "test-ssh-real",

  "proto": "tcp",

  "addr": "localhost:2223"

}'


# 4. Lấy public_url mới ngay lập tức

curl -s http://127.0.0.1:4041/api/tunnels | grep -A3 -B3 test-ssh-real


ssh -p 10335 anhpt@0.tcp.ap.ngrok.io


curl -s http://127.0.0.1:4041/api/tunnels/[tên_tunnel_ssh_cũ] -X DELETE


curl -s http://127.0.0.1:4041/api/tunnels/ssh -X DELETE


curl -s http://127.0.0.1:4041/api/tunnels -X POST -H "Content-Type: application/json" -d '{

  "name": "ssh",

  "proto": "tcp",

  "addr": "localhost:22"

}'


Cách fix nhanh nhất (chỉ 1 giây)

Xóa hoặc comment dòng container_name trong service n8n-worker (và nếu có thì cả n8n-main cũng nên xóa luôn cho sạch):

YAML
n8n-worker:
    image: n8nio/n8n:${N8N_IMAGE_TAG}
    # container_name: ${N8N_WORKER_CONTAINER_NAME}   ← XÓA HOẶC COMMENT DÒNG NÀY
    restart: unless-stopped
    depends_on:
      - postgres
      - redis
    environment:
      - N8N_WORKER_CONCURRENCY=8
      # ... các biến khác giữ nguyên
    command: worker
    volumes:
      - ./n8n_data_ngrok:/home/node/.n8n
    user: "${N8N_USER_UID}:${N8N_USER_GID}"

(Thêm nữa: nếu service n8n-main cũng có container_name: thì cũng nên comment luôn để sau này dễ scale thêm main nếu cần)

Sau khi sửa xong → chạy lại 3 lệnh này:

Bash
# 1. Dừng và xóa container worker cũ (bị lỗi tên)
docker compose down n8n-worker

# 2. Hoặc nếu muốn dọn sạch hoàn toàn
docker compose rm -f n8n-worker

# 3. Chạy lại với scale
docker compose up -d --scale n8n-worker=4

→ Lần này sẽ tạo ra đẹp đẽ:

text
n8n-worker-1
n8n-worker-2
n8n-worker-3
n8n-worker-4

Dưới đây là các lệnh phổ biến nhất để kiểm tra nhanh tình trạng ổ cứng, dung lượng và các mount point trên Ubuntu/Linux – anh chỉ cần copy-paste từng lệnh là ra kết quả ngay:

1. Xem dung lượng tổng quan (đẹp nhất, dễ đọc nhất)

Bash
df -hT

→ Hiển thị % sử dụng, dung lượng trống, loại filesystem (ext4, tmpfs, vfat, …)

2. Xem chi tiết từng partition + mount point

Bash
lsblk -f

→ Cực đẹp, thấy ngay cái nào mount ở đâu, loại filesystem, UUID

3. Xem dung lượng theo thư mục (thư mục nào đang ăn nhiều nhất)

Bash
# Tổng quan top 10 thư mục nặng nhất
du -h / --max-depth=1 2>/dev/null | sort -hr | head -10

# Hoặc chi tiết hơn (bao gồm cả thư mục con)
du -h --max-depth=2 / | sort -hr | head -20

4. Xem thông tin chi tiết ổ cứng (SSD/HDD, model, serial, health)

Bash
# Xem tất cả ổ vật lý
sudo lsblk -d -o NAME,SIZE,ROTA,TYPE,MODEL

# Xem SMART health (chỉ SSD/HDD hỗ trợ)
sudo smartctl -a /dev/sda   # thay sda bằng ổ chính của anh (xem từ lsblk)

5. Xem I/O realtime (ổ đang đọc/ghi bao nhiêu)

Bash
# Cài nếu chưa có
sudo apt install iotop -y

# Chạy (cần root)
sudo iotop

6. Xem inode usage (khi df -h còn trống nhưng báo full)

Bash
df -i

7. One-liner siêu nhanh (thường dùng nhất)

Bash
df -hT | grep -vE "tmpfs|loop|overlay"

→ Chỉ hiện các ổ thật, bỏ tmpfs, loop, overlay của Docker

8. Kiểm tra nhanh tình trạng mount có lỗi không

Bash
cat /proc/mounts | grep -v "tmpfs\|cgroup\|devpts"
# hoặc
mount | grep ^/dev/

Ví dụ thực tế anh có thể chạy ngay:

Bash
# Chạy 3 lệnh này là biết hết tình hình ổ cứng
echo "=== DUNG LƯỢNG ===" && df -hT | grep -vE "tmpfs|loop"
echo "=== CÂY MOUNT ===" && lsblk -f
echo "=== THƯ MỤC NẶNG NHẤT ===" && du -h --max-depth=1 / 2>/dev/null | sort -hr | head -10


Dưới đây là combo lệnh nhanh nhất để kiểm tra toàn diện tình trạng server (CPU, RAM, ổ cứng, I/O, nhiệt độ…) – anh chỉ cần chạy lần lượt hoặc copy cả khối là ra hết thông tin trong 5 giây:

# 1. Tổng quan CPU + RAM + Load + Temp (nếu có sensor)
echo "=== CPU + RAM + TEMP ===" && \
lscpu | grep -E "Model name|CPU\(s)|Thread|Socket" && \
echo "Load average: $(cat /proc/loadavg | awk '{print $1,$2,$3}')" && \
free -h | grep -E "Mem|Swap" && \
(sensors 2>/dev/null || echo "No sensors / cài lm-sensors để xem nhiệt độ")

# 2. Dung lượng ổ cứng (chỉ hiện ổ thật, bỏ tmpfs/overlay)
echo "=== Ổ CỨNG ===" && \
df -hT -x tmpfs -x devtmpfs -x overlay | sort -k6nr

# 3. Inode còn trống (tránh trường hợp full inode)
echo "=== INODE ===" && \
df -hi -x tmpfs -x devtmpfs

# 4. Top 10 thư mục ăn nhiều dung lượng nhất
echo "=== THƯ MỤC NẶNG NHẤT ===" && \
du -h --max-depth=1 /* 2>/dev/null | sort -hr | head -10

# 5. I/O realtime (ai đang đọc/ghi ổ cứng nhiều nhất)
echo "=== I/O REALTIME (top 10) ===" && \
iotop -b -n2 -o | head -20

# 6. Docker đang ăn bao nhiêu ổ cứng
echo "=== DOCKER USAGE ===" && \
docker system df -v

Nếu muốn 1 lệnh duy nhất (copy-paste 1 lần là ra hết)

Bash
echo -e "\n=== SERVER STATUS $(date) ===\nCPU: $(lscpu | grep 'Model name' | awk -F: '{print $2}' | xargs) | $(nproc) cores | Load: $(cat /proc/loadavg)\nRAM: $(free -h | awk '/Mem/{print $3"/"$2" used"}') | Swap: $(free -h | awk '/Swap/{print $3"/"$2}')\n$(df -hT -x tmpfs -x devtmpfs | grep -v overlay | sort -k6nr | head -5)\nDocker: $(docker system df | awk 'NR<=2')\nTop folders:\n$(du -h --max-depth=1 /{*,.[^.]*} 2>/dev/null | sort -hr | head -8)\n" && sensors 2>/dev/null || true


Bonus: Dọn dẹp nhẹ để còn đẹp hơn (không bắt buộc)

Bash
# Dọn snap cũ (giải phóng ~20–25 GB nếu anh không dùng snap nữa)
sudo snap list --all | awk '/disabled/{print $1" "$3}' | while read name rev; do sudo snap remove "$name" --revision="$rev"; done

# Dọn docker không dùng (nếu muốn)
docker system prune -a --volumes



4 cách nhanh nhất để biết chính xác thư mục n8n_ngrok (hoặc bất kỳ thư mục nào) đang nằm trên ổ cứng/phân vùng nào – anh chỉ cần chạy 1 trong 4 lệnh sau là ra ngay:

Cách 1 – Nhanh nhất (99% dùng cái này)

Bash
df -h ./n8n_ngrok
# hoặc đứng trong thư mục rồi chạy:
df -h .

→ Ra ngay phân vùng và % đã dùng.

Ví dụ anh đang ở ~/n8n_ngrok thì chạy:

Bash
anhpt@utaserver:~/n8n_ngrok$ df -h .
Filesystem                     Size  Used Avail Use% Mounted on
/dev/mapper/ubuntu--vg-ubuntu--lv   98G   38G   56G  41% /

→ Thư mục n8n_ngrok đang nằm trên phân vùng / (ổ chính).

Cách 2 – Xem cả cây mount + dung lượng (đẹp như cây gia phả)

Bash
lsblk -f

→ Sẽ thấy rõ thư mục hiện tại nằm dưới mount point nào.

Cách 3 – Xem chính xác block device (ổ vật lý thật)

Bash
df -h ~/n8n_ngrok | tail -1 | awk '{print $1}'
# → ra: /dev/mapper/ubuntu--vg-ubuntu--lv  hoặc /dev/sda3, /dev/nvme0n1p2, v.v.

Hoặc chi tiết hơn:

Bash
findmnt ~/n8n_ngrok

Cách 4 – One-liner biết luôn nằm trên ổ SSD hay HDD

Bash
echo "Thư mục n8n_ngrok đang nằm trên:" && \
df -h ~/n8n_ngrok | tail -1 | awk '{print $1 " → " $6 " (" $5 " đã dùng)"}' && \
lsblk -d -o NAME,ROTA,MODEL $(df ~/n8n_ngrok | tail -1 | awk '{print $1}' | cut -d'/' -f3) | tail -1 | awk '{if($2==1) print "→ HDD"; else print "→ SSD/NVMe"}'

Ví dụ kết quả anh sẽ thấy:

text
Thư mục n8n_ngrok đang nằm trên:
/dev/mapper/ubuntu--vg-ubuntu--lv → / (41% đã dùng)
nvme0n1          0 → SSD/NVMe

→ Tóm lại: thư mục n8n_ngrok của anh đang nằm trên ổ chính /, cùng phân vùng với hệ điều hành, còn dư 56 GB → cực kỳ thoải mái để chạy n8n, Docker, log, database, v.v.

Không cần lo gì cả, cứ scale worker thoải mái!


Dưới đây là combo lệnh nhanh + đẹp để xem realtime tài nguyên CPU, RAM, Disk I/O, Network mà các container Docker đang ăn – anh chỉ cần copy-paste từng lệnh là ra ngay:

1. Cách nhanh nhất, đẹp nhất (khuyên dùng 99%)

Bash
docker stats

→ Realtime, cập nhật mỗi giây, thấy ngay %CPU, RAM, Net I/O, Block I/O Nhấn Ctrl+C để thoát.

2. Xem 1 lần duy nhất (không loop, dễ paste vào chat)

Bash
docker stats --no-stream

3. Chỉ hiện các container đang chạy + sort theo CPU/RAM (rất tiện)

Bash
# Sort theo CPU cao nhất
docker stats --no-stream --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.MemPerc}}\t{{.NetIO}}\t{{.BlockIO}}" | sort -k2 -hr

# Sort theo RAM cao nhất
docker stats --no-stream --format "table {{.Name}}\t{{.MemPerc}}\t{{.MemUsage}}\t{{.CPUPerc}}" | sort -k2 -hr

4. Xem chi tiết tài nguyên từng container riêng (ví dụ n8n-worker-1)

Bash
docker stats n8n-worker-1
# hoặc nhiều cái cùng lúc
docker stats n8n-main n8n-worker-1 n8n-worker-2 redis postgres

5. Xem tổng tài nguyên Docker đang ăn (image, container, volume, build cache)

Bash
docker system df -v

6. Top realtime bên trong container (giống htop, xem process nào đang ăn nhiều)

Bash
# Ví dụ xem worker nào đang ăn CPU nhất
docker top n8n-worker-3

# Hoặc vào thẳng container xem htop (nếu có cài htop trong image)
docker exec -it n8n-worker-3 htop

7. One-liner siêu gọn để theo dõi khi scale nhiều worker

Bash
watch -n 2 'docker stats --no-stream --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.MemPerc}}" | sort -k2 -hr'

→ Cập nhật mỗi 2 giây, tự sort theo CPU cao nhất.

Ví dụ thực tế anh chạy ngay (để xem n8n của anh đang ăn bao nhiêu)

Bash
docker stats --no-stream --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.MemPerc}}" | grep -E "n8n|redis" | sort -k2 -hr

Chạy xong paste kết quả ra đây là mình đọc giúp luôn: biết ngay worker nào đang "cày" nhiều nhất, có nên tăng N8N_WORKER_CONCURRENCY nữa không, hay cần thêm worker.


3. Test kết nối trực tiếp từ bên trong Docker network (chuẩn nhất)

Bash
# Test n8n1
docker exec n8n_cloudflare_cloudflared_1 curl -I http:// TMS://n8n1-main:5678

# Test n8n2  
docker exec n8n_cloudflare_cloudflared_1 curl -I http://n8n2-main:5680

Xác định xem cổng active hay không
curl -I http://127.0.0.1:5680/

Xem log
docker logs -f n8n_cloudflare_cloudflared_1 --tail 50



















 

0 comments:

Post a Comment