Ghost Self-Hosting with Docker 自部署最佳实践
CC(知识共享许可协议): BY(署名)-NC(非商业性)-SA(相同方式共享)
本文目标
- 基于 Docker Compose 快速部署 Ghost + MySQL 服务。
- 解决 Ghost 中 登录、搜索、评论 等模块无法使用的问题(原因:依赖外部 jsdeliver 资源,且国内访问困难)
- 备份与升级方案(TODO)
- 进阶:零停机升级方案(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.js 、xxx/sodo-search.min.js 、xxx/sodo-search.css 、xxx/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.jsP.S. 您仍需要修改 docker-compose.yml 文件,添加 environment 相关字段。
数据备份与版本升级
TODO
零停机升级(Zero Downtime Upgrade)
TODO
附件
包含:第三方替换资源压缩包