GHOST部署教程
前言 在我自己搭建HOSTEYE博客系统的过程中,经历了许多挑战和困惑。虽然网上有很多优秀的教程可以参考,但我决定将自己的搭建经验整理成一个教程,希望踏上Ghost博客路上朋友们提供一些帮助。 本教程不仅会介绍Ghost的安装与配置,更会针对我在搭建过程中所遇到的各种问题进行详细的解答。从域名购买到服务器搭建,再到主题选择和插件优化,我将全面详细的写出教程。无论你是技术上的小白,还是有一定经验的用户,都希望本教程能够对你有所启发。 在开始构建你的 GHOST 博客之旅之前,请务必心怀耐心和热情。技术世界中的探索与发现永无止境,并且建立自己的博客也是一段愉快而神奇的过程。 如果您在阅读过程中有任何疑问或困惑,请随时向我提问。 关于Ghost,为什么选择Ghost? 关于Ghost:https://zh.wikipedia.org/zh-cn/Ghost_(博客平台) 我认为 GHOST 适合那些想要专注于创作内容的人。 它的设置非常简单,Ghost内置了针对SEO(加载速度等)的全面优化,可以让启动博客之前的学习和折腾个人的成本降低到最低。就我而言,

在之前的教程中,我们介绍了如何在一台 VPS 上部署 Ghost 博客。尽管这种方式适合单个项目的运行,但当你需要在一台 VPS 上部署多个项目时,管理变得复杂起来。为了简化这个过程,我们可以借助 HestiaCP 来管理多个项目,并充分利用其内置的备份功能。

如果你对 HestiaCP 还不太熟悉,建议先查看我们的系列教程,了解它的基础操作和功能。通过 HestiaCP,管理多个项目会变得非常方便,尤其是它自带的备份功能,可以让你轻松地备份和恢复项目。

HestiaCP - HOSTEYE

准备

How to install & setup Ghost on Ubuntu 20.04 or 22.04
A full production install guide for how to install the Ghost professional publishing platform on a production server running Ubuntu 20.04 or 22.04.

官方推荐的生产安装需要以下堆栈:

  • Ubuntu 20.04 或 Ubuntu 22.04
  • NGINX(SSL 最低版本为 1.9.5)
  • 受支持Node.js版本
  • MySQL 8
  • 系统化
  • 至少具有 1GB 内存的服务器
  • 注册域名

在开始之前,您应该从您的域设置一个有效的 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)

  • 解释: rbashbash 的受限版本,用户在其中的行为受到限制。
  • 用途: 禁止用户改变工作目录、设置环境变量、执行 bash 中某些功能等,以限制用户的系统访问。
  • 适合场景: 当你希望用户能够通过 SSH 登录并执行有限的操作时,可以使用 rbash 作为受限 shell。

5. screen

  • 解释: screen 并不是一个 shell,而是一个终端复用工具。它允许用户在多个虚拟终端中运行和管理程序,即使用户断开连接,程序仍然可以继续运行。
  • 用途: 主要用于保持会话活跃,让程序可以在后台继续执行。
  • 适合场景: 当需要长时间运行的任务时,或者你希望在断开 SSH 连接后程序仍继续运行。

6. sh (Bourne Shell)

  • 解释: sh 是原始的 Bourne shell,符合 POSIX 标准,但功能比 bash 少。sh 通常作为系统启动脚本的执行器。
  • 用途: 提供基本的 shell 功能,适合执行脚本和简单的命令,但不如 bash 功能全面。
  • 适合场景: 一般用于脚本执行和系统管理,不常用于交互式登录。

总结权限排名:

  1. Bash(权限最大)
  2. Sh
  3. Dash
  4. Screen(依赖于 shell)
  5. Rbash
  6. Nologin(无权限)

然后打开ssh软件,以你创建的新用户登录vps,为新增用户添加 sudo 权限。

usermod -aG sudo <user>

创建 Mysql 8.0 数据库

Supported databases in production for self-hosting Ghost - Ghost Developers
Find out what databases are supported for a production install of Ghost, and learn how to migrate your database.

MySQL 8 是生产中唯一受支持的数据库。

作为一个开发免费开源软件的小团队,ghost提供了一组受官方支持的有限环境,以确保维护易于管理。Ghost 专为与 Ubuntu、MySQL 8、nginx 和 Node.js LTS 配合使用而构建。

MySQL 8 提供了适合 Ghost 安装的功能,包括存储 JSON 的能力,以及帮助实现性能改进的功能。

如果对数据库互操作性很感兴趣,请考虑支持knex项目。

hestiacp目前不支持运行安装脚本来添加/删除额外的包。此功能作者还在咕咕中。

所以,我们一开始安装hestiacp的时候就一定要选择安装mysql8而不是mysql。

你在安装的时候肯定会遇到一些问题。

HestiaCP 在 Debian 12 上的安装问题与修复方法
许多用户曾选择宝塔面板及其海外版 aapanel,但由于安全性问题,尤其是被曝出的后门让许多人在使用时感到不安。这促使我决定转向 HestiaCP,这款开源面板不仅提供了更高的安全性,还拥有简洁的用户界面。 然而,在使用 HestiaCP 的过程中,我也遇到了一些 bug。为了帮助其他用户更顺利地使用这个面板,我整理了一些问题及其解决办法,希望能对大家有所帮助。 Hestia Control Panel | Open-source web server control panel.Open-source web server control panel.Get started 系统要求 项目 最低 推荐 CPU 1 核心, 64 位 4 核心 内存 1 GB (不使用 SpamAssassin 和 ClamAV)

上面的文章,你可以找到完整的解决办法。

安装完后,就可以在hestiacp创建数据库了。这里不再赘述。

安装 Node.js

查看可安装的 Node.js 版本

需要按照以下所述的方式在系统范围内安装受支持的 Node 版本。如果你的设置不同,可能会遇到问题。

Supported node versions for self-hosted installs of Ghost
Self-hosted installs of Ghost are recommended to use the supported node versions to ensure you don’t run into any common errors. Find out more information.

我们选择使用NVM安装 20.x (Node v20 Iron LTS)。

GitHub - nvm-sh/nvm: Node Version Manager - POSIX-compliant bash script to manage multiple active node.js versions
Node Version Manager - POSIX-compliant bash script to manage multiple active node.js versions - nvm-sh/nvm

记得先切换到新建的用户。

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/ 进行设置吧!

包含的标签:

教程, HestiaCP

最后更新: October 16, 2024