Ghost CMS đăng nhập được máy này nhưng máy khác không được là lỗi gì?
Một tình huống khá dễ gặp khi tự host Ghost CMS là bạn vẫn đăng nhập Ghost Admin bình thường trên máy tính đang sử dụng, nhưng khi mở Ghost trên một máy tính khác thì đăng nhập lại không thành công.
Một số lỗi thường xuất hiện trong Developer Console hoặc log của Ghost như:
Failed to load resource: the server responded with a status of 403
You are not authorised to make this request.
Hoặc:
POST /ghost/api/admin/session 500
và:
Failed to send email. Please check your site configuration and try again.
Trong trường hợp này, lỗi chưa chắc nằm ở tài khoản hoặc mật khẩu.
Từ Ghost 6.x, Ghost có cơ chế Device Verification dành cho tài khoản staff. Khi đăng nhập từ một thiết bị mới hoặc chưa được nhận diện, Ghost có thể yêu cầu mã xác minh được gửi tới email của tài khoản. Ghost cho biết tính năng xác minh thiết bị và email-based 2FA được thiết kế như một lớp bảo vệ bổ sung cho tài khoản staff.
Nếu hệ thống email của Ghost chưa được cấu hình hoặc đang gửi mail thất bại, quá trình tạo session đăng nhập có thể không hoàn tất. Khi đó giao diện Admin tiếp tục gọi các API như /ghost/api/admin/users/me/ nhưng Ghost trả về 403.
Dấu hiệu để xác định đúng nguyên nhân
Mở F12 → Console trên máy không đăng nhập được. Nếu bạn thấy các lỗi tương tự:
/ghost/api/admin/users/me/?include=roles
403
You are not authorised to make this request.
và đặc biệt:
/ghost/api/admin/session
500
thì hãy kiểm tra log Ghost.
Trong log, bạn có thể thấy:
Failed to send email. Please check your site configuration and try again.
Error Code: ESOCKET
hoặc:
Missing mail.from config
Đây là dấu hiệu cho thấy Ghost đang cố thực hiện bước xác minh đăng nhập nhưng hệ thống email chưa hoạt động đúng.
Cách 1: Sửa Ghost CMS chạy bằng Docker
Đây là cách phù hợp với những website Ghost được triển khai bằng Docker Compose hoặc Docker trên VPS.
Bước 1: Kiểm tra tên container Ghost
Chạy:
docker ps
Kết quả sẽ hiển thị danh sách container đang chạy, ví dụ:
CONTAINER ID IMAGE PORTS NAMES
xxxxxxxxxxxx ghost:6-alpine 127.0.0.1:2369->2368/tcp your-ghost-container
Hãy xác định tên container Ghost trong cột NAMES. Trong các lệnh bên dưới, thay <ghost-container> bằng tên container thực tế của bạn.
Bước 2: Backup file cấu hình
Trước khi chỉnh sửa, nên tạo một bản sao lưu:
docker exec <ghost-container> cp \
/var/lib/ghost/config.production.json \
/var/lib/ghost/config.production.json.bak
Việc backup giúp bạn dễ dàng khôi phục nếu cấu hình có vấn đề.
Bước 3: Tắt Device Verification
Nếu file cấu hình đã có:
"security": {
"staffDeviceVerification": true
}
hãy đổi thành:
"security": {
"staffDeviceVerification": false
}
Không có trình soạn thảo vi thì làm sao?
Một số image Ghost Alpine không có sẵn các công cụ chỉnh sửa quen thuộc như vi.
Bạn có thể sửa trực tiếp bằng sed:
docker exec <ghost-container> sed -i \
's/"staffDeviceVerification": true/"staffDeviceVerification": false/' \
/var/lib/ghost/config.production.json
Sau đó kiểm tra:
docker exec <ghost-container> grep -A2 staffDeviceVerification \
/var/lib/ghost/config.production.json
Nếu kết quả là:
"staffDeviceVerification": false
thì cấu hình đã được thay đổi.
Bước 4: Restart container Ghost
Chạy:
docker restart <ghost-container>
Chờ container khởi động xong rồi mở lại:
https://domain-cua-ban/ghost/
Sau đó thử đăng nhập trên máy tính trước đó không đăng nhập được.
Nếu file chưa có security
Bạn có thể thêm:
"security": {
"staffDeviceVerification": false
}
Ví dụ:
{
"url": "https://example.com",
"server": {
"port": 2368,
"host": "::"
},
"mail": {
"transport": "Direct"
},
"security": {
"staffDeviceVerification": false
}
}
Sau khi lưu cấu hình:
docker restart <ghost-container>
Cách 2: Sửa Ghost CMS trên cPanel
Nếu Ghost được triển khai trên hosting cPanel thông qua Node.js App, bạn có thể sửa trực tiếp file cấu hình bằng File Manager.
Bước 1: Mở File Manager
Đăng nhập:
cPanel
→ File Manager
Tìm tới thư mục chứa Ghost.
Tìm file:
config.production.json
Bước 2: Mở file config.production.json
Nhấn chuột phải vào file và chọn Edit.
Tìm đoạn:
"security": {
"staffDeviceVerification": true
}
đổi thành:
"security": {
"staffDeviceVerification": false
}
Sau đó nhấn Save Changes.
Nếu file chưa có staffDeviceVerification
Bạn có thể thêm:
"security": {
"staffDeviceVerification": false
}
Ví dụ:
{
"url": "https://example.com",
"server": {
"port": 2368,
"host": "::"
},
"security": {
"staffDeviceVerification": false
}
}
Nếu file đã có object security, không tạo thêm một object security thứ hai. Chỉ cần thêm thuộc tính:
"staffDeviceVerification": false
vào object hiện có.
Bước 3: Restart Node.js App
Sau khi lưu config.production.json, quay lại cPanel:
cPanel
→ Setup Node.js App
Tìm ứng dụng Ghost đang chạy.
Nhấn:
Restart
hoặc Restart App tùy giao diện cPanel.
Sau khi ứng dụng khởi động lại, mở lại:
https://domain-cua-ban/ghost/
và thử đăng nhập trên máy tính khác.
Vì sao sửa staffDeviceVerification lại giải quyết được lỗi?
Ghost có cơ chế xác minh thiết bị đối với staff user. Khi phát hiện đăng nhập từ thiết bị mới, Ghost có thể yêu cầu mã xác minh gửi tới email của tài khoản.
Nếu hệ thống email của Ghost không hoạt động, bước tạo session có thể thất bại.
Khi đó bạn có thể thấy chuỗi lỗi:
POST /ghost/api/admin/session
↓
Failed to send email
↓
Session không được tạo
↓
GET /ghost/api/admin/users/me/
↓
403 Authorization failed
Đây là lý do một máy đã từng đăng nhập có thể vẫn sử dụng Ghost bình thường, trong khi một máy khác lại không thể đăng nhập.
Có nên tắt staffDeviceVerification không?
Có thể tắt, đặc biệt khi bạn đang self-host Ghost và chưa cấu hình email xác minh.
Tuy nhiên cần lưu ý rằng Device Verification là một tính năng bảo mật, không phải tùy chọn thừa. Ghost giới thiệu tính năng này để tăng mức bảo vệ cho staff user khi đăng nhập từ thiết bị mới.
Nếu website của bạn là website production và có nhiều tài khoản quản trị, giải pháp tốt hơn là:
Cấu hình email/SMTP cho Ghost để mã xác minh có thể được gửi thành công, thay vì tắt hoàn toàn cơ chế xác minh thiết bị.
Ghost cũng khuyến nghị self-hosted instance phải cấu hình email đúng để các email liên quan tới staff user hoạt động bình thường.
Cách kiểm tra sau khi sửa
Sau khi restart Ghost, hãy kiểm tra theo thứ tự:
1. Mở Ghost Admin
https://domain-cua-ban/ghost/
2. Đăng nhập từ máy khác
Nhập email và mật khẩu như bình thường.
3. Kiểm tra Developer Console
Nếu lỗi đã được xử lý, các request như:
/ghost/api/admin/users/me/
sẽ không còn trả về:
403
4. Kiểm tra log Docker
Với Docker:
docker logs --tail 100 <ghost-container>
Không nên còn lỗi:
Failed to send email
hoặc:
ESOCKET
Một lưu ý quan trọng với Docker
Nếu bạn sửa trực tiếp:
/var/lib/ghost/config.production.json
bên trong container, thay đổi có thể không phải là nơi cấu hình lâu dài nếu Docker Compose của bạn quản lý cấu hình từ file hoặc biến môi trường bên ngoài.
Vì vậy, sau khi xác nhận lỗi đã được sửa, bạn nên kiểm tra docker-compose.yml và volume của Ghost để biết cấu hình thực sự đang được quản lý ở đâu.
Đặc biệt khi nâng cấp hoặc recreate container, việc sửa trực tiếp bên trong container có thể không được giữ nguyên.
Giải pháp lâu dài: cấu hình email cho Ghost
Tắt:
"staffDeviceVerification": false
là cách xử lý nhanh lỗi đăng nhập trên thiết bị mới.
Nhưng với website production, bạn nên cấu hình email cho Ghost để:
- xác minh thiết bị mới;
- email xác thực staff;
- reset mật khẩu;
- lời mời thành viên trong team;
- các email hệ thống khác
có thể hoạt động bình thường.
Khi email được cấu hình đúng, bạn có thể bật lại:
"staffDeviceVerification": true
để tăng bảo mật cho Ghost Admin.
Tóm tắt cách sửa nhanh
Ghost chạy Docker
Trước tiên, kiểm tra tên container:
docker ps
Sau đó thay <ghost-container> bằng tên container Ghost thực tế:
docker exec <ghost-container> sed -i \
's/"staffDeviceVerification": true/"staffDeviceVerification": false/' \
/var/lib/ghost/config.production.json
docker restart <ghost-container>
Ghost chạy trên cPanel + Node.js App
Mở:
File Manager
→ config.production.json
Sửa:
"staffDeviceVerification": true
thành:
"staffDeviceVerification": false
Nếu chưa có thì thêm:
"security": {
"staffDeviceVerification": false
}
Sau đó:
Save
→ cPanel
→ Setup Node.js App
→ Restart
và thử đăng nhập lại.
Kết luận
Nếu Ghost CMS đăng nhập được trên máy này nhưng không đăng nhập được trên máy khác, đặc biệt khi Console xuất hiện 403 và /ghost/api/admin/session trả 500, hãy kiểm tra Device Verification và cấu hình email trước.
Với trường hợp Ghost không gửi được email xác minh, tạm thời đặt:
"staffDeviceVerification": false
sau đó restart Ghost là cách xử lý nhanh và thực tế.
Tuy nhiên, với website production, nên ưu tiên cấu hình email/SMTP đúng và bật lại Device Verification để giữ lớp bảo vệ cho tài khoản quản trị.