如何在 Ubuntu 上安装和设置 Ghost CMS
Ghost 是一个用 Javascript 编写的免费开源博客平台,于 2013 年首次发布。它支持使用 WYSIWYG(所见即所得)编辑器和 Markdown 语言撰写帖子。与 WordPress 不同,它专注于简单性和纯粹的博客平台,因此它包括开箱即用的 SEO 和社交共享功能。 Ghost 提供现成的托管服务 Ghost(Pro),但可以轻松地自行托管。
在本教程中,我们将了解如何在 Ubuntu 上以开发和生产模式安装和设置 Ghost 博客平台。
在本教程中您将学习:
如何在开发模式下手动或使用 Docker 快速安装 Ghost
如何在生产中设置 Ghost
如何设置 UFW 以允许流量通过端口 80 和 443
介绍
Ghost 可以在开发或生产模式下运行。开发模式是当我们需要快速创建项目或者开发主题时我们想要使用的模式。在这种模式下,使用sqlite作为数据库,并且不需要安装专用的Web服务器。相反,在生产模式下,必须安装适当的堆栈:官方支持的堆栈包括 MySQL 8 作为数据库和 NGINX Web 服务器。
这两种安装模式的共同要求之一是 Node,因为 Ghost 是用 Javascript 编写的,并在服务器端 Node.js 引擎上运行。支持的节点版本为 14.x 和 16.x。很可能在我们运行的平台上这些版本不可用,因此我们必须从第三方软件源获取它们:在这种情况下,我们将使用 NodeSource。
安装最新的 Node.js LTS 版本
最新的 Node.js 版本是 16.x;让我们看看如何从 NodeSource 存储库将其安装到 Ubuntu 上。我们需要做的第一件事是下载 NodeSource 存储库签名密钥,解除其防护,然后将其复制到 /usr/share/keyrings
目录中:
$ curl -s https://deb.nodesource.com/gpgkey/nodesource.gpg.key | gpg --dearmor | sudo tee /usr/share/keyrings/nodesource.gpg > /dev/null
下一步,我们将 NodeSource 存储库添加到我们的软件源中。我们创建/etc/apt/sources.list.d/nodesource.list
文件,并在其中写入以下内容:
deb [signed-by=/usr/share/keyrings/nodesource.gpg] https://deb.nodesource.com/node_16.x jammy main
deb-src [signed-by=/usr/share/keyrings/nodesource.gpg] https://deb.nodesource/com/node_16.x jammy main
接下来,我们同步存储库并最终安装 nodejs
包。节点包管理器 (npm) 将作为依赖项安装:
$ sudo apt-get update && sudo apt-get install nodejs
在开发模式下安装 Ghost
让我们看看如何在开发模式下安装 Ghost。我们要做的第一件事是安装 Ghost-cli,这是一个旨在帮助管理 Ghost 安装的实用程序。
安装 Ghost-cli 和 Ghost
要获取最新版本的 Ghost-cli,我们必须使用 npm
。通常,使用节点包管理器全局安装包的建议方法是运行前缀为 sudo 的“npm install”命令。然而,这不是一个好主意,因为任意代码可以作为包安装的一部分执行,并且我们不希望该代码以管理权限运行。
另一种方法是使用 --prefix
选项运行 npm。此选项采用路径作为参数,用于指定包的安装位置。在这种情况下,只需为我们的用户安装该实用程序就足够了,因此我们可以将其安装在我们的主页中;在 ~/.npm/
目录中,例如:
$ npm --prefix=~/.npm install ghost-cli@latest -g
上面的命令将“ghost”二进制文件安装为 ~/.npm/bin/ghost
。为了避免通过完整路径调用该实用程序,我们可以将 ~/.npm/bin
目录添加到我们的 PATH 中。安装完成后,我们可以使用 Ghost 实用程序来部署 Ghost。首先我们创建将托管我们的项目的目录,然后在其中安装 Ghost:
$ mkdir ghost-project && ~/.npm/bin/ghost install local --dir ghost-project
Ghost 将以本地/开发模式安装。安装完成后,我们应该会看到类似于以下内容的消息:
Ghost was installed successfully! To complete setup of your publication, visit:
http://localhost:2368/ghost/
访问该页面,系统会提示我们提供一些基本的项目信息:
如果由于某种原因我们想要卸载Ghost,我们可以使用ghost实用程序的“卸载”命令:
$ ~/.npm/bin/ghost uninstall --dir ghost-project
相反,要启动和停止 Ghost 实例,我们可以分别使用“start”和“stop”命令。
使用 Docker 在本地安装 Ghost
我们可以用来快速开始 Ghost 项目的另一种非常方便的选择是使用 Ghost 社区提供的 Docker 镜像。在本教程的这一部分中,我假设您已经熟悉 Docker。要构建 Ghost docker 镜像并启动基于它的容器,我们可以使用以下命令:
$ sudo docker run -d --name ghostproject -e NODE_ENV=development -p 2368:2368 ghost
通过运行上面的命令,将下载“ghost”镜像(如果我们的机器上不存在),然后启动基于它的容器。由于我们使用了 -d 选项,容器将以分离模式启动(它将在后台运行,不会阻塞终端)。使用 --name
选项,我们指定了容器名称(在本例中为“ghostproject” - 否则将生成一个随机名称):我们可以将其用作快速且人性化的参考。相反,我们使用 -e
选项定义了 NODE_ENV
环境变量的值:它在容器内部用于建立环境模式。最后,我们使用 -p 选项将主机系统上的端口 2368 映射到同一个容器端口;这样,我们将能够通过导航到:http://localhost:2368/ghost
来访问“dockerized”Ghost 实例。
在生产中部署 Ghost
到现在为止我们已经了解了如何在开发模式下快速安装 Ghost。当我们需要在生产中部署 Ghost 时,我们必须设置 MySQL8 作为数据库并使用 NGINX 作为 Web 服务器(这是推荐设置)。官方文档建议在以下 Ubuntu 版本之一上执行安装:
16.04
18.04
20.04
22.04
为了本文的目的,我们将使用最新的 Ubuntu LTS 版本 (22.04),因为在此版本中默认存储库中提供了 MySQL8。
安装 MySQL 和 NGINX
在Ubuntu 22.04上安装MySQL8和NGINX是一个非常简单的操作。我们所要做的就是运行以下命令:
$ sudo apt install mysql-server nginx
作为安装的一部分,mysql 和 nginx 服务都将在引导时启动并启用。
为 Ghost 创建数据库
我们现在需要为我们的项目创建一个数据库。我们需要做的第一件事是登录 MySQL shell:
$ sudo mysql -u root
从将打开的 MySQL shell 中,我们可以发出以下查询来为我们的项目(“ghostproject”)创建数据库和具有所有权限的数据库用户(“ghostuser”):
mysql> CREATE DATABASE ghostproject;
mysql> CREATE USER 'ghostuser'@'localhost' IDENTIFIED BY 'password';
mysql> GRANT ALL PRIVILEGES ON ghostproject.* TO 'ghostuser'@'localhost';
mysql> FLUSH PRIVILEGES;
mysql> quit;
设置项目目录
下一步是创建项目目录。由于我们在生产中部署 Ghost,因此我们将在 /var/www
目录中创建它:
$ sudo mkdir /var/www/ghost-project
接下来,我们想要将此目录的所有权授予标准用户(在本例中为“egdoc”)。该用户必须是“ghost”以外的用户,因为“ghost”用户和组将由 ghost-cli
作为安装的一部分创建:
$ sudo chown egdoc:egdoc /var/www/ghost-project
此时,我们项目的目录已准备就绪,但我们尚未安装 Ghost-cli 实用程序。正如官方文档本身所建议的,执行安装的最简单方法是调用以下命令:
$ sudo npm install ghost-cli@latest -g
上面的命令将在 /usr/local/bin
目录中安装 Ghost-cli,该目录已经在我们的用户 PATH 中。使用管理权限运行 npm,正如我们已经说过的,是一个坏习惯,因此我们可以使用 --prefix
来指定安装目录。该目录必须可供 Ghost 用户访问,因为自动创建的 systemd 服务将以此用户身份运行。在这个例子中,我们将在 /opt
中创建一个目录,并将其命名为“ghost”:
$ sudo mkdir /opt/ghost && sudo chown egdoc:egdoc /opt/ghost
$ npm --prefix=/opt/ghost install ghost-cli@latest -g
安装该实用程序后,我们可以使用它来设置 Ghost:
$ /opt/ghost/bin/ghost install --dir /var/www/ghost-project
作为安装过程的一部分,将执行一些检查,然后下载并安装所需的依赖项。最后,系统会提示我们输入一些信息。除此之外,我们还会被要求输入博客的 URL(这里我只使用了“ghostproject.lan”)、MySQL 服务器主机名和数据库名称、用户名和密码:
? Enter your blog URL: http://ghostproject.lan
? Enter your MySQL hostname: localhost
? Enter your MySQL username: ghost
? Enter your MySQL password: [hidden]
? Enter your Ghost database name: ghostproject
该脚本还会询问我们的“sudo”密码,以便执行某些需要管理权限的操作:
创建“ghost”系统用户和组(用户将使用 –system 选项创建,因此其 UID 将< 1000)
将“content”项目子目录(本例中为
/var/www/ghost-project/content
)的所有权递归分配给 Ghost 用户和 Ghost 组询问我们是否希望它自动为项目创建 NGINX VirtualHost
询问我们是否希望它使用 Let's crypt 自动设置 SSL
询问我们是否应该为该项目创建一个 systemd 服务单元
在该过程结束时,我们将被询问是否要启动 Ghost:这可能需要一段时间,因为将在数据库中创建必要的表。准备就绪后,即可通过指定的 URL 访问该博客。这是为此项目创建的 NGINX VirtualHost 文件:
server {
listen 80;
listen [::]:80;
server_name ghostproject.lan;
root /var/www/ghost-project/system/nginx-root; # Used for acme.sh SSL verification (https://acme.sh)
location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $http_host;
proxy_pass http://127.0.0.1:2368;
}
location ~ /.well-known {
allow all;
}
client_max_body_size 50m;
}
相反,下面的是自动启动(和重新启动)ghost 项目所需的生成的 systemd 服务 (/lib/systemd/system/ghost_ghostproject-lan.service):
[Unit]
Description=Ghost systemd service for blog: ghostproject-lan
Documentation=https://ghost.org/docs/
[Service]
Type=simple
WorkingDirectory=/var/www/ghost-project
User=998
Environment="NODE_ENV=production"
ExecStart=/usr/bin/node /opt/npm/bin/ghost run
Restart=always
[Install]
WantedBy=multi-user.target
设置防火墙
如果我们的计算机上运行了防火墙(我们确实应该有!),我们需要通过所需端口授权流量,在本例中为端口 80/tcp
和 443/tcp
如果我们设置 SSL。在下面的示例中,我假设正在使用 UFW(简单防火墙),因为它是 Ubuntu 中的默认设置。我们需要运行的命令是:
$ sudo ufw allow "Nginx Full"
结论
Ghost 是一个使用 Javascript 构建的免费开源博客平台。在本教程中,我们学习了如何在系统中快速安装 Ghost 的本地实例以进行测试和开发,以及如何在生产中部署 Ghost 博客。如果您想了解更多关于该平台的信息,您可以访问项目官方网站。