# Ghost

> Cài nền tảng blog và newsletter Ghost từ Kho ứng dụng, cấu hình SMTP, tạo tài khoản chủ sở hữu sau khoá thiết lập, sao lưu và cập nhật Ghost.

Source: https://zopanel.net/vi/docs/app-ghost  
Updated: 2026-10-09

Ghost là nền tảng xuất bản cho blog, tạp chí và newsletter, có trình soạn thảo nhanh, giao diện (theme) và sẵn tính năng đăng ký thành viên. ZoPanel chạy Ghost 5 trong container với database SQLite, phù hợp cho blog cá nhân hoặc doanh nghiệp nhỏ mà không cần máy chủ database riêng.

## Yêu cầu

| Mục | Giá trị |
| --- | --- |
| Image | `ghost:5-alpine` (Ghost 5) |
| Giới hạn RAM | 768 MB, 1 CPU |
| Dung lượng trống khi cài | Khoảng 2 GB trên ổ chứa Docker (image cộng 1 GB chừa lại cho server) |
| Cơ sở dữ liệu | SQLite, file `content/data/ghost.db` trong thư mục dữ liệu của ứng dụng |
| Email | Máy chủ SMTP (tuỳ chọn), nhập khi cài |

Website được tính vào giới hạn số website của tài khoản. Nếu bạn là khách hàng, gói hosting phải cho phép ứng dụng Docker và còn trống 768 MB **RAM (MB)**.

**Lưu ý:** Ghost chính thức chỉ hỗ trợ MySQL 8 cho môi trường production; với SQLite, Ghost chạy ở chế độ development (`NODE_ENV=development`), đúng cách image Docker chính thức hỗ trợ SQLite. Cách này chạy tốt cho một blog có lượng truy cập vừa phải. Container không kết nối được MySQL của chính server (xem mục Giới hạn mạng bên dưới), nên ZoPanel dùng SQLite.

## Chuẩn bị trước khi cài

1. Trỏ bản ghi A của tên miền về server.
2. Quyết định về email. Ghost cần máy chủ SMTP để gửi lời mời cộng tác viên, email đặt lại mật khẩu, và link đăng nhập/đăng ký cho thành viên. Không có email, bạn vẫn đăng bài được, nhưng không đặt lại mật khẩu qua email được và thành viên không đăng nhập được.
3. Nếu dùng hộp thư trên chính server này, tạo hộp thư trước ở trang **Email** (ví dụ `blog@example.com`) và ghi lại tên máy chủ mail.

**Quan trọng:** Các trường SMTP chỉ nhập được lúc cài. ZoPanel không có form để sửa sau (xem mục Đổi cấu hình email về sau).

## Cài Ghost

1. Mở **Kho ứng dụng**, bấm **Cài đặt** trên thẻ **Ghost**. Khách hàng thấy **Kho ứng dụng** trên menu của mình; thẻ trên cùng cho biết gói còn bao nhiêu ứng dụng và RAM.
2. Điền các trường bên dưới rồi bấm **Cài đặt**.
3. Theo dõi log tác vụ. Lần khởi động đầu mất một đến hai phút.

| Trường | Nhập gì |
| --- | --- |
| **Tên miền** | Tên miền hoặc tên miền phụ của blog, không kèm `http://`. Địa chỉ của Ghost được đặt là `https://<tên miền>`. |
| **Chủ sở hữu** | Chỉ quản trị viên thấy: tài khoản hosting sở hữu ứng dụng. |
| **SMTP server (optional, for email)** | Tên máy chủ hoặc IP của máy chủ mail, ví dụ `mail.example.com`. Để trống nếu không dùng email; khi đó các trường email còn lại bị bỏ qua. |
| **SMTP port (587 or 465)** | `587` (STARTTLS) hoặc `465` (TLS). Để trống nghĩa là `587`. ZoPanel chỉ bật chế độ secure của Ghost khi cổng là `465`. |
| **SMTP user name** | Thường là địa chỉ hộp thư đầy đủ. |
| **SMTP password** | Mật khẩu hộp thư. |
| **Sender address (e.g. blog@your-domain)** | Địa chỉ người gửi (From). Nên trùng với hộp thư dùng làm SMTP user, vì phần lớn máy chủ mail từ chối người gửi khác. |
| **SSL miễn phí (Let's Encrypt)** | Giữ bật. Ghost chuyển hướng sang `https://`, nên blog chỉ chạy được khi đã có chứng chỉ. |

Nhãn các trường SMTP lấy từ danh mục ứng dụng nên luôn hiển thị bằng tiếng Anh, dù panel đang dùng ngôn ngữ nào. ZoPanel truyền chúng cho Ghost dưới dạng `mail__options__host`, `mail__options__port`, `mail__options__auth__user`, `mail__options__auth__pass`, `mail__from`, và thêm `mail__transport=SMTP`.

## Tạo tài khoản chủ sở hữu sau khoá thiết lập

Người đầu tiên mở trang thiết lập của Ghost sẽ thành chủ sở hữu, nên ZoPanel giữ bản cài mới ở chế độ riêng tư.

1. Kiểm tra tab **SSL**: chứng chỉ phải được cấp xong mới làm tiếp, vì Ghost chỉ chạy trên `https://`.
2. Ở tab **Docker**, bấm **Mở ứng dụng (chỉ mình tôi)**. Trình duyệt nhận cookie thiết lập (hiệu lực 30 ngày) và mở blog.
3. Vào `https://<tên miền>/ghost`.
4. Điền form thiết lập: tên website, họ tên, email và mật khẩu (Ghost yêu cầu tối thiểu 10 ký tự). Bấm nút tạo tài khoản.
5. Quay lại tab **Docker**, bấm **Đã thiết lập xong — mở công khai**.

Trước bước 5, khách truy cập chỉ thấy "This app is being set up"; công cụ tìm kiếm, trình đọc RSS và thành viên đều chưa vào được blog.

## Thiết lập cần làm trong Ghost

Các mục sau nằm trong Ghost Admin (`https://<tên miền>/ghost`), phần **Settings**:

- **General:** tiêu đề, mô tả, múi giờ và ngôn ngữ xuất bản.
- **Design và theme:** chọn hoặc tải lên theme. Theme tải lên được lưu trong thư mục dữ liệu.
- **Staff:** mời biên tập viên, tác giả. Lời mời gửi qua email nên cần SMTP.
- **Membership:** cho phép độc giả đăng ký hay không. Link đăng nhập được gửi qua email nên cũng cần SMTP.
- **Newsletter:** Ghost chỉ gửi newsletter hàng loạt qua **Mailgun**, không qua SMTP. Muốn gửi newsletter, nhập domain và API key Mailgun trong phần cài đặt email newsletter của Ghost. Container gọi API Mailgun qua internet bình thường.

Để thử email, mời một tài khoản staff bằng địa chỉ bạn đọc được, hoặc dùng **Forgot password** ở trang đăng nhập.

### Đổi cấu hình email về sau

Panel không có form sửa biến môi trường của Ghost sau khi cài, mà Ghost đọc cấu hình email từ các biến đó. Quản trị viên có thể cài lại Ghost với thông số SMTP mới mà vẫn giữ nội dung, vì thư mục dữ liệu được đặt tên theo tên miền:

1. Sao lưu trước (**Sao lưu ngay** trong thẻ **Sao lưu**, xem bên dưới).
2. Xoá website, **không** tích **Xoá luôn toàn bộ file**. Container bị gỡ nhưng `/var/lib/zopanel-apps/<instance>/` vẫn còn.
3. Cài lại Ghost trên đúng tên miền đó với thông số SMTP mới. Ghost khởi động trên nội dung và database cũ. Khoá thiết lập bật lại: mở ứng dụng, kiểm tra đăng nhập được, rồi bấm **Đã thiết lập xong — mở công khai**.

**Cẩn thận:** Xoá website cũng xoá vùng DNS trên server này có tên trùng khớp hoàn toàn với tên miền, và bị từ chối khi tên miền email trùng tên còn hộp thư ("… has N mailboxes: delete its email domain first (Email page)"). Vì vậy cách này đơn giản nhất khi Ghost chạy trên tên miền phụ như `blog.example.com`.

## Dữ liệu và sao lưu

| Nội dung | Vị trí trên server |
| --- | --- |
| Database, ảnh, theme, file cấu hình | `/var/lib/zopanel-apps/<instance>/content/` (gắn vào `/var/lib/ghost/content`) |
| Database SQLite | `/var/lib/zopanel-apps/<instance>/content/data/ghost.db` |
| File biến môi trường chứa mật khẩu SMTP (chỉ root đọc) | `/var/lib/zopanel-apps/<instance>/.env` |
| Tên container | `zp-app-<instance>` |

`<instance>` là tên miền với dấu chấm đổi thành gạch ngang: `blog.example.com` thành `blog-example-com`.

**Bản sao lưu tài khoản của ZoPanel không gồm thư mục này.** Bản sao lưu đầy đủ và bản sao lưu gia tăng chỉ chứa thư mục website của tài khoản trong `/home`, database và email; nội dung Ghost nằm ở `/var/lib/zopanel-apps`, ngoài tài khoản, và được sao lưu bằng thẻ **Sao lưu** trong tab **Docker** của website. Thư mục này cũng không tính vào quota ổ đĩa của tài khoản.

Để sao lưu Ghost, bấm **Sao lưu ngay** trong thẻ **Sao lưu** ở tab **Docker** của website. Quản trị viên còn đặt được **Lịch** (**Tắt**, **Mỗi ngày** hoặc **Mỗi tuần**; mặc định tắt) và số bản **Giữ lại** (1–60, mặc định 7), rồi bấm **Lưu**. Mỗi bản sao lưu nén `/var/lib/zopanel-apps/<instance>/` thành `/var/backups/zopanel-apps/<instance>/YYYYMMDD-HHMMSS.tar.gz`, trong thư mục chỉ root đọc được và không tính vào dung lượng đĩa của tài khoản. Container được tạm dừng (pause, không phải stop) trong vài giây sao chép, nên database SQLite nhất quán. Các bản cũ vượt quá số **Giữ lại** bị xoá, và khi một lần sao lưu theo lịch thất bại, quản trị viên nhận cảnh báo **Sao lưu thất bại**.

Để khôi phục, quản trị viên bấm **Khôi phục** cạnh một bản sao lưu. Ghost được dừng và dữ liệu được thay bằng nội dung file nén; dữ liệu hiện tại được giữ riêng tới khi ứng dụng khôi phục khởi động được, và được đặt lại nếu nó không khởi động. Mọi thay đổi sau thời điểm sao lưu sẽ mất. Mỗi bản sao lưu còn có nút xoá (chỉ quản trị viên), và xoá ứng dụng kèm file của nó cũng xoá luôn các bản sao lưu. Khách hàng có thể bấm **Sao lưu ngay** và xem danh sách; việc đặt lịch và khôi phục do nhà cung cấp thực hiện.

Các file nén vẫn ở trên cùng máy chủ. Hãy chép những bản quan trọng ra ngoài (ví dụ bằng `scp` hoặc `rclone` từ `/var/backups/zopanel-apps/<instance>/`) và lưu ở dạng mã hoá, vì chúng chứa mật khẩu SMTP. Để khôi phục trên máy chủ khác, cài Ghost với cùng tên miền ở đó, chép file nén vào `/var/backups/zopanel-apps/<instance>/` trên máy chủ mới rồi bấm **Khôi phục** trong thẻ **Sao lưu** của nó. Cách này chỉ làm được khi hai server dùng cùng dải `dockremap` (`grep dockremap /etc/subuid`).

Chức năng xuất nội dung (JSON) trong Ghost Admin là một bản sao phụ hữu ích, nhưng không chứa ảnh và theme.

## Cập nhật Ghost

Quản trị viên bấm **Cập nhật bản mới** ở tab **Docker**: ZoPanel kéo lại `ghost:5-alpine`, tạo lại container với cùng biến môi trường và giữ thư mục nội dung. Bản cập nhật chỉ nằm trong dòng Ghost 5. Ghost chuyển đổi database khi khởi động, nên hãy sao lưu trước (**Sao lưu ngay**). Khách hàng nhờ nhà cung cấp cập nhật.

## Giới hạn mạng

Container ứng dụng bị chặn khỏi mạng nội bộ của server:

- **Email vẫn gửi được.** Container được kết nối tới địa chỉ công khai của chính server ở cổng 25, 465, 587, và tới mọi dịch vụ mail trên internet, nên hộp thư trên server này, Mailgun, Brevo hay Amazon SES đều dùng được. Hãy dùng tên máy chủ mail công khai, không dùng `localhost` hay `127.0.0.1`.
- **Không dùng database của server.** Ghost không kết nối được MySQL/MariaDB hay Redis của server; Ghost dùng SQLite.
- **Tích hợp và webhook** tới địa chỉ HTTPS công khai hoạt động bình thường; đích nằm trên địa chỉ private (`10.x`, `192.168.x`, `172.16–31.x`) hoặc địa chỉ metadata của cloud bị từ chối.

## Xử lý sự cố

| Hiện tượng hoặc thông báo | Cách xử lý |
| --- | --- |
| "the SMTP server must be a host name or IP address" | Chỉ nhập tên máy chủ, ví dụ `mail.example.com`, không kèm `smtp://` hay cổng. |
| "invalid SMTP port" | Nhập số từ 1 đến 65535, thường là `587` hoặc `465`. |
| "invalid sender address" | Nhập địa chỉ email đơn thuần như `blog@example.com`. |
| Trình duyệt báo lỗi chứng chỉ hoặc blog chuyển hướng vòng lặp | Chưa có SSL. Kiểm tra DNS đã trỏ về server và cấp chứng chỉ ở tab **SSL**. |
| "This website is very busy right now" sau khi cài | Ghost vẫn đang khởi động (tới hai phút). Trang tự tải lại. |
| Không nhận được email mời hay đặt lại mật khẩu | Xem lỗi email trong **Log ứng dụng** ở tab **Docker**. Nguyên nhân thường gặp: sai mật khẩu, địa chỉ người gửi khác SMTP user, dùng cổng 465 với máy chủ chỉ hỗ trợ 587. |
| Không gửi được newsletter | Cấu hình Mailgun trong phần cài đặt newsletter của Ghost; newsletter không đi qua SMTP. |
| "the app did not start listening: …" | Đọc các dòng log trong thông báo rồi bấm **Khởi động lại**. Container bị dừng vì vượt giới hạn RAM sẽ hiện trạng thái không chạy; cân nhắc giảm tích hợp hoặc dùng server lớn hơn. |

## Xem thêm

- [Kho ứng dụng và lưu trữ S3](/vi/docs/apps)
- [Từng ứng dụng dùng để làm gì](/vi/docs/app-catalog)
- [Email](/vi/docs/email)
- [Sao lưu](/vi/docs/backups)
- [Cấu hình Ghost: mail](https://docs.ghost.org/config/#mail)
- [Các database Ghost hỗ trợ](https://docs.ghost.org/faq/supported-databases)
