Ghost Self-Hosting with Docker 自部署最佳实践

Ghost Self-Hosting with Docker 自部署最佳实践
CC(知识共享许可协议): BY(署名)-NC(非商业性)-SA(相同方式共享)

本文目标

  1. 基于 Docker Compose 快速部署 Ghost + MySQL 服务。
  2. 解决 Ghost 中 登录、搜索、评论 等模块无法使用的问题(原因:依赖外部 jsdeliver 资源,且国内访问困难)
  3. 备份与升级方案(TODO)
  4. 进阶:零停机升级方案(Zero Downtime Upgrade)(TODO)

服务部署

容器编排脚本

创建 docker-compose.yml 文件,并粘贴以下内容。

version: "3.7"
services:
  ghost:
    image: ghost:5.126-alpine
    restart: unless-stopped
    ports:
      - "80:2368"
    environment:
      url: <你的站点URL地址>
      database__client: mysql
      database__connection__host: db
      database__connection__user: root
      database__connection__password: ${DB_PASSWORD}
      database__connection__database: ghost
      # 邮箱配置(如不需要用户登录可移除)
      mail__transport: SMTP
      mail__from: <系统邮箱地址,例如:noreplay@example.com>
      mail__options__host: <邮箱服务地址,例如阿里云:smtpdm.aliyun.com>
      mail__options__port: <端口号,例如阿里云:465>
      mail__options__secure: true
      mail__options__auth__user: <用户名,一般与 mail__from 一致>
      mail__options__auth__pass: ${MAIL_PASSWORD}
    volumes:
      - ./data/ghost:/var/lib/ghost/content
  db:
    image: mysql:8
    restart: unless-stopped
    environment:
      MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
    volumes:
      - ./data/db:/var/lib/mysql

你需要根据自己的需要和条件,修改所有被尖括号(<>)包裹的内容,例如:

url: <你的站点URL地址>
 |
改为
 ↓
url: https://blog.qiqi1996.com

其他可选修改说明:

  • image: ghost:5.126-alpine 镜像版本可在 Docker Hub 自行查询最新版本。
  • - "80:2368" 服务端口 80 可根据需要自行修改(例如:你可能会通过反向代理服务器来访问服务)。

环境变量

与 docker-compose.yml 同目录下创建 .env 文件,填入自己定义的数据库密码和邮箱密码:

DB_PASSWORD=<你的数据库密码>
MAIL_PASSWORD=<你的邮箱密码>

💡Tips:遵循最小权限原则,密钥等敏感信息仅在最终被用到的时候再呈现。因此,不要把 .env 文件同步到你的 git 仓库中。而是直接在服务器上创建。

启动服务

使用命令 docker compose up -d 启动服务,访问站点按照 Ghost 的引导进行初始化,确保站点可以正常访问。

使用命令 docker compose down && docker compose up -d 可以重启服务。

替换第三方资源

由于 Ghost 的一些功能模块(登录、搜索、评论 等)是加载的第三方 jsdeliver 的文件,且该站点在国内访问比较困难,通常会加载失败。因此我们需要自己托管这些静态文件。

访问你的站点,然后通过开发者工具检查所有失败的静态资源请求(xxx/portal.min.jsxxx/sodo-search.min.jsxxx/sodo-search.cssxxx/comments-ui.min.js)。复制这些资源的 URL,想办法下载下来(你也可以使用文末我提供的预先下载好的资源包)。

成功启动服务后,由于配置了 volumes 映射,会在 docker-compose.yml 文件所在目录产生数据文件夹 data ,这里包含了 Ghost 运行时的数据和静态资源。我们将下载好的第三方资源,复制到 data/ghost/files/self-host 目录中(self-host 目录应该不存在,自己通过 mkdir 创建出来)

然后在 docker-compose.yml 中的 environment 配置中增加字段,然后重启服务即可:

# 替换 jsdeliver 资源依赖
portal__url: /content/files/self-host/portal.min.js
sodoSearch__url: /content/files/self-host/sodo-search.min.js
sodoSearch__styles: /content/files/self-host/sodo-search.css
comments__url: /content/files/self-host/comments-ui.min.js
💡
如果您使用我们在附件中提供的,预先下载好的资源包。可以将资源包(self-host.zip)放在 docker-compose.yml 文件同目录下,然后执行命令:unzip -d ./data/ghost/files/self-host/ ./self-host.zip 即可。

P.S. 您仍需要修改 docker-compose.yml 文件,添加 environment 相关字段。

数据备份与版本升级

TODO

零停机升级(Zero Downtime Upgrade)

TODO

附件

包含:第三方替换资源压缩包

This post is for subscribers only

Already have an account? Sign in.