Ghost là một nền tảng blog rất mạnh về SEO, tốc độ và newsletter. Còn Coolify thì giống như “Vercel tự host” dành cho anh em thích làm chủ VPS của mình. Nghe thì rất mượt, cho đến khi deploy Ghost xong, mở trình duyệt và thấy dòng chữ lạnh lùng:
no available server
Cảm giác lúc đó kiểu: container thì healthy, proxy cũng healthy, nhưng website thì im lặng như người yêu cũ.
Bài viết này sẽ hướng dẫn bạn cách kiểm tra và khắc phục lỗi “no available server” khi cài Ghost trên Coolify một cách chi tiết, dễ hiểu và áp dụng được ngay.
Môi trường triển khai
- VPS Ubuntu
- Docker
- Coolify 4
- Traefik Proxy
- Ghost 5
- MySQL 8
Mô hình hoạt động cơ bản:
Internet
↓
Traefik / Coolify Proxy
↓
Ghost Container :2368
↓
MySQL
Triệu chứng lỗi
Sau khi deploy Ghost trên Coolify, bạn thấy:
- Ghost container báo
Running (healthy) - MySQL báo
Running (healthy) - Coolify tạo link domain thành công
Ví dụ domain tạm:
http://ghost-abcxyz.94.72.120.172.sslip.io
Nhưng khi truy cập thì trình duyệt báo:
no available server
Nguyên nhân chính
Lỗi này thường không có nghĩa là Ghost đã chết. Trong nhiều trường hợp, Ghost vẫn chạy bình thường.
Nguyên nhân phổ biến là:
Traefik của Coolify chưa route đúng request từ domain vào container Ghost.
Nói đơn giản:
Internet → Traefik OK
Traefik → Ghost chưa OK
Bước 1: Kiểm tra container Ghost
SSH vào VPS và chạy:
docker ps
Kết quả đúng sẽ tương tự:
CONTAINER ID IMAGE STATUS
d2d185d2026c ghost:5 Up 24 minutes (healthy)
Nếu Ghost ở trạng thái Exited, Restarting hoặc không xuất hiện, bạn cần xem log Ghost trước. Nhưng nếu container healthy thì chuyển sang bước tiếp theo.
Bước 2: Kiểm tra Traefik Proxy
Chạy lệnh:
docker ps | grep -i traefik
Hoặc:
docker ps | grep -i proxy
Nếu thấy container coolify-proxy đang chạy, nghĩa là Traefik vẫn hoạt động.
Ví dụ:
traefik:v3.6 Up 3 days (healthy) coolify-proxy
Bước 3: Kiểm tra Traefik label của container Ghost
Lấy container ID của Ghost:
docker ps | grep -i ghost
Sau đó kiểm tra Traefik label:
docker inspect <container-id> | grep -i traefik
Ví dụ thực tế:
docker inspect d2d185d2026c | grep -i traefik
Kết quả đúng cần có các dòng tương tự:
"traefik.enable": "true"
"traefik.http.routers.http-0-xxxx-ghost.rule": "Host(`ghost-xxxx.94.72.120.172.sslip.io`) && PathPrefix(`/`)"
"traefik.http.services.http-0-xxxx-ghost.loadbalancer.server.port": "2368"
Dòng quan trọng nhất là:
loadbalancer.server.port = 2368
Vì Ghost mặc định chạy ở port 2368. Nếu port này sai, Traefik sẽ không biết phải đẩy request vào đâu.
Bước 4: Không test sai bằng localhost ngoài VPS
Nhiều người chạy lệnh này trên VPS:
curl -I http://localhost:2368
Và nhận lỗi:
Failed to connect to localhost port 2368
Thế là tưởng Ghost chết. Nhưng chưa chắc.
Vì Ghost đang chạy bên trong Docker network nội bộ, không nhất thiết bind trực tiếp ra localhost:2368 của VPS.
Cách test đúng là vào bên trong container Ghost:
docker exec -it <container-id> sh
Sau đó test:
wget -qO- http://localhost:2368
Lưu ý: container Ghost có thể không có curl, nên dùng wget. Nếu trả về HTML thì Ghost vẫn sống khỏe. Chỉ là proxy đang hơi “lag cảm xúc”.
Bước 5: Restart Coolify Proxy
Đây là bước thường khắc phục được lỗi trong thực tế:
docker restart coolify-proxy
Chờ khoảng 10–30 giây rồi truy cập lại domain:
http://ghost-xxxx.94.72.120.172.sslip.io
Nếu mọi thứ ổn, Ghost sẽ hiển thị trang setup đầu tiên:
/ghost/#/setup
Đến đây có thể thở phào. Website không chết, chỉ là Traefik cần được “đánh thức nhẹ nhàng”.
Vì sao restart proxy lại hết lỗi?
Khi deploy hoặc thay đổi cấu hình domain/service trong Coolify, Traefik cần nhận route mới. Đôi khi quá trình này chưa sync kịp hoặc network routing chưa cập nhật đúng.
Các nguyên nhân thường gặp:
- Traefik chưa nhận router mới
- Container vừa deploy nhưng proxy chưa reload đúng
- Service đổi domain nhiều lần
- Network attach chưa đồng bộ
- Route cũ bị cache
Lưu ý khi dùng domain sslip.io
Coolify có thể tạo domain tạm dạng:
ghost-xxxx.94.72.120.172.sslip.io
sslip.io là dịch vụ giúp domain tự trỏ về IP nằm trong tên miền. Ví dụ:
94.72.120.172.sslip.io → 94.72.120.172
Domain này rất tiện để test nhanh. Tuy nhiên, khi chạy production, bạn nên dùng domain thật như:
https://blog.yourdomain.com
Sau khi Ghost chạy được cần làm gì?
1. Tạo tài khoản admin
Truy cập:
http://domain-cua-ban/ghost
Sau đó tạo tài khoản quản trị đầu tiên.
2. Gắn domain thật
Ví dụ:
https://blog.example.com
3. Cấu hình biến môi trường URL
Trong Coolify, bạn cần đặt biến môi trường:
url=https://blog.example.com
Ghost rất nhạy với URL. Nếu cấu hình sai, bạn có thể gặp lỗi redirect, lỗi ảnh, lỗi admin hoặc lỗi canonical SEO.
4. Bật HTTPS
Sau khi domain thật đã trỏ đúng về VPS, bật SSL/HTTPS trong Coolify.
Checklist khắc phục nhanh
| Việc cần kiểm tra | Lệnh |
|---|---|
| Kiểm tra container | docker ps |
| Kiểm tra Traefik | docker ps | grep -i traefik |
| Kiểm tra Ghost | docker ps | grep -i ghost |
| Kiểm tra Traefik labels | docker inspect <container-id> | grep -i traefik |
| Restart proxy | docker restart coolify-proxy |
Kết luận
Lỗi “no available server” khi cài Ghost trên Coolify thường khiến nhiều người nghĩ rằng Ghost bị lỗi hoặc database có vấn đề. Nhưng trong thực tế, nếu container Ghost và MySQL đều healthy, nguyên nhân rất hay nằm ở tầng reverse proxy Traefik.
Cách xử lý nhanh nhất thường là:
docker restart coolify-proxy
Sau đó kiểm tra lại domain HTTP trước. Khi Ghost chạy ổn, bạn mới nên gắn domain thật, cấu hình biến url và bật HTTPS.
Ghost + Coolify là một combo rất đáng dùng cho blog SEO, newsletter và hệ thống nội dung chuyên nghiệp. Còn lỗi “no available server” thì cứ bình tĩnh, chưa chắc website đã chết — có thể proxy chỉ đang cần một cú restart nhẹ cho tỉnh ngủ mà thôi.