Docker compose 安裝 Ghost 5.0

自從 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 了!