Hướng dẫn cài đặt Ghost trên Ubuntu Server 20.04LTS

Giới thiệu Ghost

  • Ghost là gì: Ghost là CMS (Content Management System) miễn phí tương tự như Wordpress. Điểm khác biệt là Wordpress chạy trên nền PHP còn Ghost chạy trên nền NodeJS.
  • Ghost là một nển tảng viết blog dễ sử dụng, nhanh, mạnh và chuyên nghiệp. Tuy nhiên, Ghost ít phổ biến hơn Wordpress, lý do là vì để cài đặt Ghost blog cần yêu cầu có kiến thức về Linux, VPS, nginx, NodeJS... khiến cho các blogger chuyên viết khó khăn trong việc tiếp cận.

● Bài viết này sẽ hướng dẫn bạn qua từng bước cài đặt Ghost một cách đơn giản nhất.
● Mô tả sơ qua về server mình định làm: ghost chạy trên nền NodeJS ở cổng 2368, nginx làm nhiệm vụ reverse proxy và trả về trên domain ở cổng 80 (cho người dùng truy cập), chứng chỉ SSL của Let’s Encrypt.

Yêu cầu

  • Ubuntu Server: 16.04, 18.04 hoặc 20.04 (mình đang dùng phiên bản này). Tham khảo
  • Systemd
  • MySQL 5.7 or 8.0
  • NGINX (tối thiểu 1.9.5 cho SSL).
  • NodeJS
  • Server với ít nhất 1Gb RAM
  • Tên miền (nếu để test có thể sử dụng của dot.tk, còn khi chuyên nghiệp thì hãy mua 1 domain riêng, cũng khá rẻ mà)(*1)

Cài đặt

Bước 1. Cài đặt Ghost-CLI

Đăng nhập vào SSH

ssh your_user@your_server_ip

Cập nhập danh sách package

sudo apt-get update
#nhập mật khẩu (mặc định sẽ không hiển thị gì hết, cứ nhập đúng và Enter là được)

Cập nhập các package mới nhất

sudo apt-get upgrade

Cài đặt Ghost-CLI, Ghost-CLI là công cụ dòng lệnh giúp bạn cài và cấu hình Ghost một cách dễ dùng, nhanh và đơn giản.

sudo npm install ghost-cli@latest -g
Sau khi cài đặt, có thể dùng lệnh "ghost help" để xem qua trợ giúp về lệnh này.

Bước 2. Cài đặt Ghost

  • Tạo tài khoản mới (cần thiết)
sudo adduser <user>

Nhập và xác nhận mật khẩu mới (cần thiết), các thông tin sau đó tùy ý có thể nhập hay bỏ qua.

Chú ý:Tránh đặt là ghost vì xung đột với tài khoản hệ thống, ở đây mình đặt là blogghost cho dễ nhớ
Thêm người dùng vào nhóm superuser để mở khóa các đặc quyền của quản trị viên
sudo usermod -aG sudo <user>
#Đăng nhập vào tài khoản mới đó
su - <user>

Tạo thư mục

sudo mkdir -p /var/www/ghost.local #thư mục tên tùy ý
ghost-sitename là tên thư mục chứa ghost, đặt bất cứ tên gì mà bạn thích, hoặc là dễ quản lý nếu có nhiều site.
Đổi chủ sở hữu thư mục
sudo chown -R <user>:<user> /var/www/ghost.local

Đổi  thành tên user bạn sử dụng
Đặt quyền truy nhập

sudo chmod -R 775 /var/www/ghost.local

Truy cập vào thư mục

cd /var/www/ghost.local

Chuyển sang user vừa tạo

su <user>

Tiến hành cài đặt

ghost install

Trong quá trình cài đặt, Ghost-CLI sẽ hỏi một số câu hỏi để cấu hình site của bạn
→ Blog URl: nhập tên URL trang web của bạn, cần nhập chính xác HTTP hay HTTPS, nếu như sử dụng HTTPS, Ghost-CLI sẽ giúp bạn cài đặt SSL. Ví dụ như https://manhha.dev. Chú ý: nếu sử dụng địa chỉ IP, có thể gây ra lỗi.
→ MySQL hostname: localhost
→ MySQL username / password: tài khoản MySQL
→ Ghost database name: Nhập tên cơ sở dữ liệu. Nó sẽ tự động thiết lập cho, trừ khi đang sử dụng user MySQL không phải root. Trong trường hợp đó, cơ sở dữ liệu phải tồn tại và có quyền chính xác với user đó.
→ Cài đặt ghost MySQL user: nếu tài khoản MySQL bên trên bạn nhập là root, Ghost-CLI có thể giúp bạn tạo tài khoản MySQL tùy chọn, tài khoản này chỉ có thể truy cập/sửa Ghost database này của bạn. (Nên chọn)
→ Cài đặt nginx: tự động để cấu hình nginx giúp trang web có thể truy cập từ internet. (Nên chọn)
→ Cài đặt SSL: nếu sử dụng HTTPS, nên chọn để cấu hình SSL cho trang web và sẽ tự động lấy chứng chỉ SSL từ Let’s Encrypt cho bạn. Ngoài ra bạn thực hiện việc này sau bằng cách chạy "ghost setup ssl" bất cứ lúc nào. Nếu bạn chọn tùy chọn này, tiếp theo Ghost-CLI sẽ yêu cầu bạn nhập vào địa chỉ email để thông báo vấn đề về chứng chỉ của bạn hoặc khi cần gia hạn. Mình thì đã lấy sẵn chứng chỉ SSL và tự cấu hình SSL nên bỏ qua bước này.
→ Cài đặt systemd: chọn yes để Ghost-CLI tự cấu hình giúp bạn.
Start Ghost? Chọn yes để chạy Ghost và làm cho trang của bạn hoạt động.

Giờ bạn truy cập vào trang web của bạn, như vậy là đã cài đặt ghost thành công rồi đó

Tiếp theo, truy cập vào http://ghost.local/ghost/ để cấu hình thông tin cơ bản về blog của bạn.

Kiểm tra trang thái

ghost status
Chú ý: Mọi thao tác liên quan đến lệnh ghost đều chỉ có thể thực hiện trong thư mục cài ghost. Ở đây, mình đang cài ở thư mục "/var/www/ghost.local" nên lệnh ghost chỉ có hiệu lực trong thư mục này.

Bước 3. Lấy chứng chỉ SSL

OK. Vậy là quá trình cài đặt Ghost đã hoàn thành. Nếu như bạn lựa chọn Ghost-CLI lấy chứng chỉ SSL cho bạn thì bạn có thể truy cập vào trang web của mình và bắt đầu blogging với Ghost. Còn nếu bạn chọn lấy chứng chỉ SSL thủ công thì tự cấu hình SSL theo mình như sau.
Tại sao mình chọn cách này: bởi vì chứng chỉ SSL của Let’s Encrypt có thời hạn 3 tháng, sau 3 tháng phải gia hạn, và chứng chỉ Ghost-CLI lấy giúp bạn có vẻ (có vẻ) không tự động gia hạn giúp bạn, vì vậy mình chọn lấy chứng chỉ thủ công (ngoài Ghost ra mình còn một số web khác cần SSL) và tự động gia hạn bằng cronjob.
→ Lấy chứng chỉ SSL thủ công và tự động gia hạn bằng cronjob.
Cấu hình nginx
Tạo file cấu hình nginx

sudo nano /etc/nginx/sites-availabe/ghost-sitename.conf
```javascript
và nhập vào nội dung sau
```javascript
#HTTP
server {
    listen 80;
    listen [::]:80;
    server_name ghost-sitename;
    root /var/www/ghost-sitename/system/nginx-root; 
    client_max_body_size 50m;
}
#HTTPS
server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    server_name ghost-sitename;
    root /var/www/ghost-sitename/system/nginx-root;

    ssl_certificate /etc/letsencrypt/live/ghost-sitename/fullchain.cer;
    ssl_certificate_key /etc/letsencrypt/live/ghost-sitename/ghost-sitename.key;
    include /etc/nginx/snippets/ssl-params.conf;
	#(*2) chứng chỉ SSL đã lấy từ trước
	
    location / {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Host $http_host;
        proxy_pass http://127.0.0.1:2368; #(*3)
    }

    location ~ /.well-known {
        allow all;
    }

    client_max_body_size 50m;
}

→ Lưu file lại và kích hoạt máy chủ ảo mới này bằng cách tạo một liên kết tượng trưng:

sudo ln -s /etc/nginx/sites-available/ghost-sitename.conf /etc/nginx/sites-enabled/ghost-sitename.conf

→ Kiểm tra và khởi động lại nginx

sudo nginx -t
#nếu không lỗi, khởi động lại nginx
sudo systemctl restart nginx
```javascript

HOÀN THÀNH! Như vậy là bạn đã cài đặt xong Ghost trên server của bạn.
Nếu có khó khăn hay có câu hỏi gì hãy đừng ngại ngần mà viết comment ở phần bên dưới nhé.

(*1) Nếu server bạn đặt ở nhà, không có IP tĩnh thì bạn có thể trỏ domain về cloudflare, từ cloudflare có thể trỏ về server của bạn theo hướng dẫn ở bài viết <link>
(*2) Chứng chỉ SSL lấy từ trước do Let’s Encrypt cung cấp thường được lưu ở /etc/letsencrypt/live/ghost-sitename
(*3) 2368 là cổng mặc định khi cài Ghost, lúc cài đặt sẽ hiện ra, hoặc có thể kiểm tra bằng lệnh sau
```javascript	
ghost status #Nhìn phần port

Đọc thêm:

Hướng dẫn highlight code cho bài viết trong Ghost CMS
Chèn Disqus comment cho blog ghost
Chèn Facebook comment cho blog ghost