Cài đặt blog cá nhân với Ghost

Blog Jun 19, 2025

Gần đây sau nhiều năm không viết blog cá nhân. Data các blog cũ cũng đã archived, giờ quay lại viết trên site này, hy vọng nó trụ được lâu tí.
Nền tảng lần này mình dùng là Ghost thay vì Wordpress, với các tiêu chí sau:

  • Nhẹ, nhanh
  • Deploy đơn giản (1 file docker-compose là xong)
  • Không có nhu cầu code, style
  • CMS đơn giản, trực quan

Thế thôi. Cách cài đặt thì cũng khá đơn giản. Bạn cần chuẩn bị trước 1 VPS đã cài đặt docker, ở đây mình dùng Debian 12 với kernel 6, ngoài ra dùng Ubuntu 24.04 cũng tương tự. Ubuntu thì nó khá là nặng và thiên về GUI nhiều hơn, package update thường xuyên hơn Debian. Bù lại Debian nhẹ hều, file iso có 600MB.

Bắt đầu cài docker & docker compose V2

sudo snap install docker
sudo snap install docker-compose

Tạo thư mục chứa file docker-compose.yaml

mkdir /opt/docker/ghost
cd /opt/docker/ghost

Tạo file compose.yml với nội dung sau

version: '3'

services:
  ghost:
    image: ghost:5-alpine
    restart: always
    ports:
      - 2368:2368
    volumes:
      - ./ghost_content:/var/lib/ghost/content
    environment:
      url: https://mrtuan.us #Thay bằng url của bạn

Mặc định Ghost chạy sẽ dùng SQLite, nếu bạn muốn dùng MySQL, tạo file compose như sau

services:
  ghost:
    image: ghost:5-alpine
    restart: always
    ports:
      - 2368:2368
    environment:
      url: https://blog.mrtuan.us #thay domain của bạn vào đây
      database__client: mysql
      database__connection__host: db
      database__connection__user: ghost
      database__connection__password: ghost 
      database__connection__database: ghost_db
      trusted_proxies: 0.0.0.0/0
    volumes:
      - ghost_content:/var/lib/ghost/content
    depends_on:
      - db

  db:
    image: mysql:8
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: abcdxyz #đặt password root cho MySQL
      MYSQL_DATABASE: ghost_db
      MYSQL_USER: ghost
      MYSQL_PASSWORD: ghost #user, password phải giống với ghost config
    volumes:
      - mysql_data:/var/lib/mysql

volumes:
  ghost_content:
  mysql_data:

Chạy thôi

docker compose up -d

Bạn cần thêm 1 reverse proxy handle port 80 nếu muốn domain blog của bạn ra ngoài nó đẹp nữa. Cái này bạn có thể dùng Nginx hay Traefik. Cái này mình sẽ viết tiếp phần sau.

Tags