鬼 是一个 开源内容管理系统 适用于博客、时事通讯或会员网站。
它是超快的和 SEO 优化的。 我们喜欢 Linux 手册。 当然,我们的网站使用 Ghost。
现在,你可以 选择托管 Ghost 实例 来自 Ghost 本身的制造者。 这会花费您很多,但您不必费力部署 Ghost、更新和维护它。 当然,它也有助于 Ghost 项目的开发。
如果您想避免花费大量资金或采用“自己动手”的方式处理事情,您可以在您的服务器上自行托管 Ghost。
在本教程中,我将向您展示使用 Docker 部署 Ghost 的步骤。
使用 Docker 的自托管 Ghost
事情就是这样。 一些云服务器提供商喜欢 数字海洋 还提供一键Ghost部署。 如果您不想在最初的 Ghost 设置和配置中遇到麻烦,这可能是一种简单的方法。
除此之外,让我们看看在 Linux 服务器上使用 Docker 部署 Ghost 需要什么。
要求
除了熟悉 Linux 命令之外,了解 Docker Compose 的基础知识在这里也会有所帮助。
- Linux 服务器。 您可以使用物理服务器、虚拟机或云服务器。 你可以 与我们的合作伙伴 Linode 签约 并获得 100 美元的免费积分。
- Docker 和 Docker Compose 安装在您的服务器上。
- 访问要部署 Ghost 的域的 DNS。
- 带有 www/non-www 重定向和允许上传限制的 Nginx 反向代理设置。
第 0 步:准备好初始设置
您需要在系统上安装 Docker 和 Docker Compose。 您可以参考这些教程以获取有关 Ubuntu 的说明。
除此之外,您还需要设置 Ngnix 反向代理。 如果您想在同一台服务器上安装多个 Ghost 或其他一些 Web 服务,这将非常有用。
现在,我已经在下面链接的教程中详细介绍了这个主题,所以我不会在这里重复相同的步骤。 但是,您必须在系统上进行此设置。
按照本教程直到第 4 步:
第 1 步:准备 Ghost 的部署
我在这里使用 Jwilder 反向代理方法,因为它考虑了 SSL 证书、www/non-www 重定向和允许的上传限制。
如何处理 SSL 证书已在上面要求部分中共享的链接中进行了描述。 此外,我将描述如何启用 www/non-www 重定向并增加允许的上传限制。
WWW/非WWW重定向
根据您的 SEO 偏好,您可能希望将 www 重定向设置为非 www,反之亦然。 为了 example,如果您的博客托管在 domain.com 上,则必须将访问 www.domain.com 的用户重定向到它(只是如何 GitHub 的域名 作品)。
同样,如果您将其托管在 www.domain.com,访问 domain.com 的用户必须被重定向(只是如何 Linode的域 作品)。
WWW 到非 WWW
创建一个名为 www.domain.com
在 nginx docker compose 目录中包含以下内容并保存:
rewrite ^/(.*)$ https://domain.com/$1 permanent;
非万维网到万维网
创建一个名为 domain.com
在 nginx docker compose 目录中包含以下内容并保存:
rewrite ^/(.*)$ https://www.domain.com/$1 permanent;
现在,假设您想使用 WWW 到非 WWW 重定向。 您所要做的就是将文件绑定挂载到 Nginx 服务配置的卷部分中:
- ./www.domain.com:/etc/nginx/vhost.d/www.domain.com
增加允许的上传限制
图像上传可能会受到默认最大上传大小 50 MB 的影响。 设置最大上传限制并避免 上传图片时的问题 在 Docker 上,比如 1 GB,创建一个名为 client_max_upload_size.conf
并将其保存为以下内容:
client_max_body_size 1G;
稍后您需要按照上一个文件的描述安装它:
- ./client_max_upload_size.conf:/etc/nginx/conf.d/client_max_upload_size.conf
跑 docker-compose up -d
从 Nginx 目录更新您的 Nginx 配置。
首先,Ghost 部署配置本质上由两个主要组件组成:
由于您使用 Docker 部署 Ghost,因此上述所有组件都设置为各自的容器。
对于数据库服务,我将使用一个名为 ghost
因为它只需要对 Ghost 服务可见。
networks:
- ghost
但是对于 Ghost 服务,当然是一样的 net
反向代理配置中使用的网络必须与 ghost
网络,然后才有可能使用 Nginx Docker 容器启动并运行它。
networks:
- net
- ghost
现在考虑如何使用 Docker Compose 单独配置它们:
对于 MariaDB,我使用 Docker Hub 上提供的官方 MariaDB 10.5.3 映像:
ghostdb:
image: mariadb:10.5.3
volumes:
- ghostdb:/var/lib/mysql
restart: on-failure
env_file:
- ./mariadb.env
networks:
- ghost
在这里,我使用了一个名为 ghostdb
将数据库数据存储在 /var/lib/mysql
. 我还在 env_file
叫 mariadb.env
:
MYSQL_RANDOM_ROOT_PASSWORD=1
MYSQL_USER=mariadbuser
MYSQL_PASSWORD=mariadbpassword
MYSQL_DATABASE=ghost
对于 Ghost 服务本身,而不是使用 latest
标记,我特别喜欢使用开发人员推出的 Docker Hub 上标记的版本号作为稳定版本。 在这里,在撰写本文时,它是 4.5.0
:
ghost:
image: ghost:4.5.0
volumes:
- ghost:/var/lib/ghost/content
- ./config.json:/var/lib/ghost/config.production.json
env_file:
- ./ghost-mariadb.env
restart: on-failure
depends_on: ghostdb
networks:
- net
- ghost
绑定安装 config.json
文件由 SMTP(Mailgun)和基本的日志轮换(以错误为中心)设置组成:
{
"url": "https://localhost:2368",
"server": {
"port": 2368,
"host": "0.0.0.0"
},
"mail": {
"transport": "SMTP",
"options": {
"service": "Mailgun",
"host": "smtp.eu.mailgun.org",
"port": 465,
"secureConnection": true,
"auth": {
"user": "replace-me-with-a-mailgun-configured-email-address",
"pass": "replace-me-with-the-relevant-mailgun-apikey-of-50-characters"
}
}
},
"logging": {
"path": "content/logs/",
"level": "error",
"rotation": {
"enabled": true,
"count": 10,
"period": "1d"
},
"transports": [
"file",
"stdout"
]
},
"process": "systemd",
"paths": {
"contentPath": "/var/lib/ghost/content"
}
}
如果必须使用 MySQL/MariaDB,则 Ghost 服务必须依赖 ghostdb
服务使其正常运行。 仅当您绑定安装了 ghost-mariadb.env
具有正确数据库配置的文件(显示在 Ghost 数据库服务的卷部分) mariadb.env
在数据库服务中,这将是: database__client
, database__connection__host
, database__connection__user
, database__connection__password
和 database__connection__database
.
我还将分配每个环境变量 VIRTUAL_HOST
和 LETSENCRYPT_HOST
二者皆是 domain.com
也 www.domain.com
分别,以确保两者都存在。 这绝对可以确保重定向和 SSL 证书顺利运行而不会出现问题。 我希望我的主 URL 没有 www 所以我将其设置为 url=https://domain.com
. 由于您将使用此设置进行生产级使用,因此 NODE_ENV
变量设置为生产模式。 这些细节也需要添加。
因此,完整的环境文件(ghost-mariadb.env
) 对于 Ghost 服务将是:
VIRTUAL_HOST=domain.com,www.domain.com
LETSENCRYPT_HOST=domain.com,www.domain.com
url=https://domain.com
NODE_ENV=production
database__client=mysql
database__connection__host=ghostdb
database__connection__user=mariadbuser
database__connection__password=mariadbpassword
database__connection__database=ghost
上述数据的不一致可能会使 Ghost 错误地切换到 SQLite。 你不想要那个。 所以请确保上述所有参数与所讨论的数据库服务正确对应 mariadb.env
多于。
每个数据库服务都有自己的 Docker 卷,用于存储用户和内容数据。 我将它们创建为外部卷:
docker volume create ghostdb
docker volume create ghost
现在你需要包括一个 volumes
docker compose 文件中的部分,其中包含以下详细信息:
volumes:
ghost:
external: true
ghostdb:
external: true
您现在拥有部署 Ghost 所需的组件。
第 2 步:部署 Ghost
现在您应该准备好 docker-compose 文件。 是时候使用这个文件了。
在您的服务器上创建 Ghost docker compose 目录:
mkdir ghost
进入目录编辑必要的文件:
cd ghost
现在根据我们目前的讨论创建以下 docker-compose 文件:
version: '3.7'
services:
ghostdb:
image: mariadb:10.5.3
volumes:
- ghostdb:/var/lib/mysql
restart: on-failure
env_file:
- ./mariadb.env
networks:
- ghost
ghost:
image: ghost:4.5.0
volumes:
- ghost:/var/lib/ghost/content
- ./config.json:/var/lib/ghost/config.production.json
env_file:
- ./ghost-mariadb.env
restart: on-failure
depends_on:
- ghostdb
networks:
- net
- ghost
volumes:
ghost:
external: true
ghostdb:
external: true
networks:
net:
external: true
ghost:
internal: true
另外,不要忘记创建上面讨论的其他配置文件: config.json
, mariadb.env
和 ghost-mariadb.env
在同一目录中。
启动 Ghost 实例:
docker-compose up -d
使用您指定的域 URL 访问配置中指定的 Ghost 域。
第 3 步:设置您的 Ghost 管理员帐户
请注意,为了设置您的管理员帐户,您必须转到 domain.com/ghost 并按照屏幕上的说明进行操作,直到您将您的网站声明为幽灵 admin.
要仔细检查,请确认您确实使用的是 MySQL/MariaDB 而不是 SQLite。 导航到左下角的用户图标:

现在您可以确定您实际使用的是单独的数据库容器,该容器将显示为 mysql
无论您使用的是 MySQL 还是 MariaDB Docker 映像:

您还可以看到,其他三个参数:Version、Environment 和 Mail,根据我们上面提到的步骤按预期设置。 就是这样了! 您已成功将 Ghost 部署为服务器上的自托管实例!
维护自托管 Ghost 实例的提示
这里有一些技巧可以帮助您维护 Ghost 实例。
实时监控 Ghost 日志
如果要在实时部署容器时检查容器的日志,可以运行:
docker logs -f ghost_ghost_1
无需停机即可备份和还原 Ghost 卷
使用云 + 本地方法,您可以在不停机的情况下备份和恢复您的虚拟卷。
无需停机即可更新 Ghost 容器
随着 --scale
Docker Compose 上的标志,您可以基于最新版本的 Ghost 创建一个新容器。 完成后,您可以删除旧的。 这导致零停机时间。
您可以在下面的文章中阅读更多提示。
您可能还想使用 GitHub Actions 部署和管理 Ghost 主题以简化您的工作。
如果您遇到错误,有问题或有建议,请在下面留下评论让我知道。