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)
→ 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
→ 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)
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
Có 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ả)
→ 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:
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%)
→ 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)
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)
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