在之前的教程中,我们介绍了如何在一台 VPS 上部署 Ghost 博客。尽管这种方式适合单个项目的运行,但当你需要在一台 VPS 上部署多个项目时,管理变得复杂起来。为了简化这个过程,我们可以借助 HestiaCP 来管理多个项目,并充分利用其内置的备份功能。
如果你对 HestiaCP 还不太熟悉,建议先查看我们的系列教程,了解它的基础操作和功能。通过 HestiaCP,管理多个项目会变得非常方便,尤其是它自带的备份功能,可以让你轻松地备份和恢复项目。
准备
官方推荐的生产安装需要以下堆栈:
在开始之前,您应该从您的域设置一个有效的 DNS A 记录,指向服务器的 IP 地址。必须提前完成此操作,以便在设置期间配置 SSL。
我们按照介绍,使用hestiacp一步一步部署环境就好。
需要注意的是,HestiaCP 目前还不支持通过运行安装脚本来添加或删除额外的软件包。这个功能仍在开发中,作者目前还在完善。正因如此,在一开始安装 HestiaCP 时,你需要特别注意选择合适的数据库版本。
安装 HestiaCP 时,一定要选择安装 MySQL 8,而不是默认的 MySQL。MySQL 8 与 Ghost 的兼容性更好,能避免许多潜在问题。如果你已经安装了 HestiaCP 并且选择了错误的数据库版本,也不用担心,接下来的教程中我们会详细介绍如何解决这些问题。
创建新用户
在hestiacp创建一个用户。
ghost
会与 Ghost-CLI 发生冲突,因此强烈建议使用其他用户名然后打开高级选项-->SSH访问控制,选择bash,保存退出。
在 HestiaCP(或任何其他 Linux 系统)中,通过 ssh
访问控制用户时,可以为用户指定不同的 shell,以限制用户的访问权限或功能。
1. Bash (Bourne Again SHell)
- 解释:
bash
是大多数 Linux 发行版的默认 shell,也是最常用的命令行解释器。 - 用途: 提供了完整的 shell 功能,用户可以执行各种命令、脚本、文件管理等操作。
- 适合场景: 普通用户和管理员登录系统后常用的 shell,适合日常操作。
2. Dash (Debian Almquist Shell)
- 解释:
dash
是一种轻量级的 shell,兼容 POSIX 标准,但比bash
更加精简。 - 用途: 执行基本的 shell 脚本和命令,但它不提供
bash
的扩展功能(如命令别名、数组等)。 - 适合场景: 主要用于系统启动过程,作为系统脚本的默认 shell,以提高效率;不适合终端交互。
3. nologin
- 解释:
nologin
并不是一个真正的 shell,而是用于禁止用户登录的工具。 - 用途: 如果用户的 shell 设置为
nologin
,那么用户无法通过 SSH 登录系统,但其他服务(如邮件、FTP 等)可能仍能工作。 - 适合场景: 禁止用户通过 SSH 登录,而不完全禁用该用户的账户。多用于系统服务账户。
4. rbash (Restricted Bash)
- 解释:
rbash
是bash
的受限版本,用户在其中的行为受到限制。 - 用途: 禁止用户改变工作目录、设置环境变量、执行
bash
中某些功能等,以限制用户的系统访问。 - 适合场景: 当你希望用户能够通过 SSH 登录并执行有限的操作时,可以使用
rbash
作为受限 shell。
5. screen
- 解释:
screen
并不是一个 shell,而是一个终端复用工具。它允许用户在多个虚拟终端中运行和管理程序,即使用户断开连接,程序仍然可以继续运行。 - 用途: 主要用于保持会话活跃,让程序可以在后台继续执行。
- 适合场景: 当需要长时间运行的任务时,或者你希望在断开 SSH 连接后程序仍继续运行。
6. sh (Bourne Shell)
- 解释:
sh
是原始的 Bourne shell,符合 POSIX 标准,但功能比bash
少。sh
通常作为系统启动脚本的执行器。 - 用途: 提供基本的 shell 功能,适合执行脚本和简单的命令,但不如
bash
功能全面。 - 适合场景: 一般用于脚本执行和系统管理,不常用于交互式登录。
总结权限排名:
- Bash(权限最大)
- Sh
- Dash
- Screen(依赖于 shell)
- Rbash
- Nologin(无权限)
然后打开ssh软件,以你创建的新用户登录vps,为新增用户添加 sudo 权限。
usermod -aG sudo <user>
创建 Mysql 8.0 数据库
MySQL 8 是生产中唯一受支持的数据库。
作为一个开发免费开源软件的小团队,ghost提供了一组受官方支持的有限环境,以确保维护易于管理。Ghost 专为与 Ubuntu、MySQL 8、nginx 和 Node.js LTS 配合使用而构建。
MySQL 8 提供了适合 Ghost 安装的功能,包括存储 JSON 的能力,以及帮助实现性能改进的功能。
如果对数据库互操作性很感兴趣,请考虑支持knex项目。
hestiacp目前不支持运行安装脚本来添加/删除额外的包。此功能作者还在咕咕中。
所以,我们一开始安装hestiacp的时候就一定要选择安装mysql8而不是mysql。
你在安装的时候肯定会遇到一些问题。
上面的文章,你可以找到完整的解决办法。
安装完后,就可以在hestiacp创建数据库了。这里不再赘述。
安装 Node.js
查看可安装的 Node.js 版本
需要按照以下所述的方式在系统范围内安装受支持的 Node 版本。如果你的设置不同,可能会遇到问题。
我们选择使用NVM安装 20.x (Node v20 Iron LTS)。
记得先切换到新建的用户。
su - user
安装nvm
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash
在 Linux 上,运行安装脚本后,如果nvm: command not found
也就是没有收到或看到终端的反馈,只需关闭当前终端,打开一个新终端,然后再次尝试验证。
在终端中运行以下命令:
nvm ls-remote
该命令会列出所有可以安装的 Node.js 版本,包括历史版本、当前版本以及 LTS 版本。输出中,你会看到类似以下的列表:
v0.12.18
v4.9.1
v5.12.0
v6.17.1
v8.17.0
v10.24.1
...
v16.20.2
v18.17.1
v20.5.0 (Iron LTS)
带有 "LTS" 标记的版本(如 v20.x.x (Iron LTS)
)表示是长期支持的版本。
你可以根据输出的列表选择你想要安装的具体版本,例如 v20.5.0
,然后使用以下命令安装:
nvm install v20.5.0
如果你只想安装最新的 LTS 版本,也可以运行:
nvm install --lts
安装 Ghost-CLI
Ghost-CLI是一个命令行工具,可帮助您快速轻松地安装和配置 Ghost。
npm install ghost-cli@latest -g
安装后,您可以随时运行ghost help
以查看可用命令的列表。
安装 Ghost
首先在hestiacp中,对应的用户下创建一个新网站。然后进入网站目录
/home/user/web/domain/public_html/
删掉目录里两个默认文件。
改一下权限
sudo chmod 775 /home/user/web/domain/public_html
然后使用cd
命令进入网站目录,开始安装ghost。
我们使用hestiacp管理ssl,配置nginx等,所以一些地方的设置我们要特别注意。下面是安装示例:
hosteye@foxcoo3900:~/web/test.hosteye.net/public_html$ ghost install
Love open source? We’re hiring JavaScript Engineers to work on Ghost full-time.
https://careers.ghost.org
✔ Checking system Node.js version - found v20.18.0
✔ Checking current folder permissions
✔ Checking memory availability
✔ Checking free space
✔ Checking for latest Ghost version
✔ Setting up install directory
✔ Downloading and installing Ghost v5.96.1
✔ Finishing install process
? Enter your blog URL: http://localhost:2368
? Enter your MySQL hostname: 127.0.0.1
? Enter your MySQL username: hostey
? Enter your MySQL password: [hidden]
? Enter your Ghost database name: hostey
✔ Configuring Ghost
✔ Setting up instance
+ sudo useradd --system --user-group ghost
+ sudo chown -R ghost:ghost /home/***/web/***/public_html/content
✔ Setting up "ghost" system user
ℹ Setting up "ghost" mysql user [skipped]
Your url contains a port. Skipping Nginx setup.
ℹ Setting up Nginx [skipped]
Nginx setup task was skipped, skipping SSL setup
ℹ Setting up SSL [skipped]
? Do you wish to set up Systemd? Yes
+ sudo mv /tmp/localhost/ghost_localhost.service /lib/systemd/system/ghost_localhost.service
+ sudo systemctl daemon-reload
✔ Setting up Systemd
+ sudo systemctl is-active ghost_localhost
? Do you want to start Ghost? Yes
+ sudo systemctl start ghost_localhost
+ sudo systemctl is-enabled ghost_localhost
+ sudo systemctl enable ghost_localhost --quiet
✔ Starting Ghost
Ghost uses direct mail by default. To set up an alternative email method read our docs at https://ghost.org/docs/config/#mail
------------------------------------------------------------------------------
Ghost was installed successfully! To complete setup of your publication, visit:
http://localhost:2368/ghost/
hosteye@foxcoo3900:~/web/test.hosteye.net/public_html$
配置 NGINX
hestiacp配置nginx,模板是必不可少的。
你可以使用我下面提供的模板
.tpl
#=========================================================================
# Default Web Domain Template
# DO NOT MODIFY THIS FILE! CHANGES WILL BE LOST WHEN REBUILDING DOMAINS
# https://hestiacp.com/docs/server-administration/web-templates.html
#=========================================================================
server {
listen %ip%:%proxy_port%;
server_name %domain_idn% %alias_idn%;
error_log /var/log/%web_system%/domains/%domain%.error.log error;
include %home%/%user%/conf/web/%domain%/nginx.forcessl.conf*;
location ~ /.well-known {
allow all;
}
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;
}
include %home%/%user%/conf/web/%domain%/nginx.conf_*;
}
.stpl
#=========================================================================
# Default Web Domain Template
# DO NOT MODIFY THIS FILE! CHANGES WILL BE LOST WHEN REBUILDING DOMAINS
# https://hestiacp.com/docs/server-administration/web-templates.html
#=========================================================================
server {
listen %ip%:%proxy_ssl_port% ssl;
server_name %domain_idn% %alias_idn%;
error_log /var/log/%web_system%/domains/%domain%.error.log error;
ssl_certificate %ssl_pem%;
ssl_certificate_key %ssl_key%;
ssl_stapling on;
ssl_stapling_verify on;
# TLS 1.3 0-RTT anti-replay
if ($anti_replay = 307) { return 307 https://$host$request_uri; }
if ($anti_replay = 425) { return 425; }
include %home%/%user%/conf/web/%domain%/nginx.hsts.conf*;
location ~ /.well-known {
allow all;
}
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;
}
proxy_hide_header Upgrade;
include %home%/%user%/conf/web/%domain%/nginx.ssl.conf_*;
}
防火墙放行端口
安装完成后,你会看到如下提示
Ghost was installed successfully! To complete setup of your publication, visit:
http://localhost:2368/ghost/
所以需要放行2368端口
完成
访问 https://domain/ghost/
进行设置吧!