Docker compose 安裝 Ghost 5.0

自從 Ghost 預告將 database 轉成 MySQL 就知道這次升級無可避免要重新安裝所有東西,果然在 Docker 安裝 MySQL 遇到很多問題。記錄這次重要的升級,希望可以幫到遇到相同問題的朋友!

Docker compose 安裝 Ghost 5.0
install Ghost 5.0 with Docker

自從 Ghost 預告將 database 轉成 MySQL 就知道這次升級無可避免要重新安裝所有東西,果然在 Docker 安裝 MySQL 遇到很多問題。記錄這次重要的升級,希望可以幫到遇到相同問題的朋友!

由於上次使用的 CoreOS 已經沒有再更新,所以我使用了 Alpine Linux 為基底,可以參考這篇如何在 Alpine 安裝 Docker CE。

用 Alpine Linux 取代 CoreOS
自從 CoreOS 被 Redhat 收購後就傳出會停止開發的消息,最終在2020年5月26日停止更新。雖然之後有釋後其後繼平台 Fedora CoreOS,一套跟 Redhat 原本的 container OS - Fedora Atomic Host 合而為一的 OS。但是各大 VPS 一直也沒有提供安裝,要自訂 Image 也太麻煩了,經過幾次測試後,決定用 Docker Image 愛用的 Alpine Linux 取代 CoreOS 作為 Docker 的基底 OS。

然後就是準備好我的 Docker Compose 檔案。

今次會使用 nginx-proxy 做自動的 SSL 更新,詳情可以參考這篇文章。

Docker 一分鐘完成自動更新 SSL 証書的 nginx-proxy 設置
一分鐘即可以簡單的完成nginx-proxy + 自動更新 SSL的docker compose設定。
services:

  # nginx-proxy的設置
  nginx-proxy:
    image: nginxproxy/nginx-proxy:alpine
    container_name: nginx-proxy
    restart: always
    ports:
      - 80:80
      - 443:443
    volumes:
      - conf:/etc/nginx/conf.d
      - vhost:/etc/nginx/vhost.d
      - html:/usr/share/nginx/html
      - dhparam:/etc/nginx/dhparam
      - certs:/etc/nginx/certs:ro
      - /var/run/docker.sock:/tmp/docker.sock:ro
    environment:
      - ENABLE_IPV6=true
    networks:
      - nginx-proxy

  # 自動更新SSL
  acme-companion:
    image: nginxproxy/acme-companion
    container_name: acme-companion
    volumes_from:
      - nginx-proxy
    volumes:
      - certs:/etc/nginx/certs:rw
      - acme:/etc/acme.sh
      - /var/run/docker.sock:/var/run/docker.sock:ro
    environment:
      - DEFAULT_EMAIL=你的電郵地址.com
    networks:
      - nginx-proxy  
      
  # Ghost的設置
  ghost:
    image: ghost:alpine
    container_name: ghost
    restart: always
    volumes: # 將 content mount /ghost/content
      - ./ghost/content:/var/lib/ghost/content
    environment:
      - database__client=mysql
      - database__connection__host=db #連到下面db
      - database__connection__user=root #一定要root
      - database__connection__password=password #改成你的密碼
      - database__connection__database=ghost #一定要ghost
      - url=https://yourdomain.com #網址全寫連https
      - VIRTUAL_HOST=yourdomain.com
      - LETSENCRYPT_HOST=yourdomain.com
    depends_on:
      - db
    links:
      - db
    networks:
      - nginx-proxy
      - ghost

  db: # 如果改了名要對感上面的 db host
    image: mysql:latest
    container_name: db
    restart: unless-stopped
    ports:
      - 3306:3306
    volumes:
      - db:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=password #改成你的密碼
    command: 
      - --default-authentication-plugin=mysql_native_password
    networks:
      - ghost


volumes:
  conf: {}
  vhost: {}
  html: {}
  dhparam: {}
  certs: {}
  acme: {}
  db:
    driver: local
    
networks:
  nginx-proxy: {}
  ghost: {}

要注意的重點:

  • Ghost 跟 nginx-proxy及acme-companion 一定要放同一個network
  • Ghost 要depends_on MySQL 及 links MySQL
  • 初次 docker compose up 時 MySQL 因為要初始化,Ghost 可能會發出不能找到 database 的訊息,等一下 MySQL ready 就可以
  • 密碼跟 domain 要改成你自己的

整個結構會如下:

初次 docker compose up 時 acme-companion 會自動申請 SSL Cert 然後儲起。只要第一次取得 SSL 成功,之後也會自動定時檢查及更新。用家瀏覽你的 Ghost 時會經nginx-proxy 取得 Ghost 的內容,同時也有 cache 及保護作用。

如果還在用 Sqlite 做 database 的 Ghost 用家,就要快點升級 5.0 用 MySQL database 了,因為下個版本更新就完全強制做用 MySQL 了!