Ghost Blog安装笔记

Jaxson Wang 奇淫技巧 阅读量

Cap1 前言

本文在2021.03.30更新。

目前 Ghost 已经升级到 4.x 大版本了。

大概用了接近三年的 WordPress 博客平台,因为诸多原因放弃了它,目前看好的依然是Ghost平台,现在版本已经更新到 Version 2,本地测试下的确不错,所以写下这篇文章。

由于 Version 2 还没好很好的解决从 WordPress 过渡,所以我放弃原来的文章转移并且转移到 Hexo博客 上。目前博客当作新博客来写作吧。

Cap2 安装Node.js环境

目前主机配置是腾讯云低配机:1 CPU/1G RAM/1Mbps/40G ROM,系统是 Ubuntu 20.04。关于系统脚手架只支持:Ubuntu 16.04, Ubuntu 18.04Ubuntu 20.04。Ghost博客需要在 Node.js 环境下运行,查看Ghost文档有了自己脚手架:Ghost-Cli,所以很大的程度上比之前方便多了。

nvm是一个nodejs版本管理的工具,为什么需要nvm?nodejs版本迭代很快,而且转移包依赖很麻烦,总之nvm解决很对版本问题。具体可以查看Github的说明:nvm

由于 Ghost 不允许 root 安装,所以需要新建一个普通的账户:

adduser <user> # ghost不允许root用户安装,所以需要新建个<user>用户
usermod -aG sudo <user> # 给予<user>用户为超级权限
su - <user> # 登录用户
sudo apt update
sudo apt upgrade # 更新软件

这里的 <user> 用户名可以自己任意修改,例如 jaxsonubuntu 等。

但请不要使用 ghost 作为用户名,因为和 ghost-cli 用户名产生冲突。

2020.12.31更新:

安装 Node.js 没有上面那么麻烦,直接执行下面命令就行了:

# 添加 Nodejs 14 源
curl -sL https://deb.nodesource.com/setup_14.x | sudo -E bash
 
# 安装 Node.js
sudo apt-get install -y nodejs # 大陆服务器暂时别执行这一步,看看下面的内容

国内的机器安装可能比较慢,因为不可描述的原因导致的,如果着急的话可以使用下面的方法。

2020.12.31更新:

针对国内服务器修改 Node.js 源:

sudo cp /etc/apt/sources.list.d/nodesource.list /etc/apt/sources.list.d/nodesource.list.bak # 备份
sudo vim /etc/apt/sources.list.d/nodesource.list

将里面的内容修改成,注意系统代号 focal

deb https://mirrors.ustc.edu.cn/nodesource/deb/node_14.x focal main
deb-src https://mirrors.ustc.edu.cn/nodesource/deb/node_14.x focal main

参考文档:中国科学技术大学 Node 源

保存后执行安装 Nodejs

sudo apt update
sudo apt-get install -y nodejs # 安装 Node.js

设置npm镜像源(非中国大陆机器不用设置):

npm config set registry https://r.npm.taobao.org # npm 镜像替换为淘宝npm节点
npm config set disturl https://npm.taobao.org/dist # node-gyp 编译依赖的 node 源码镜像
npm config set node_sqlite3_binary_host_mirror https://npm.taobao.org/mirrors # sqlite3 镜像
npm config set sqlite3_binary_site https://npm.taobao.org/mirrors/sqlite3/
npm config set sharp_dist_base_url https://npm.taobao.org/mirrors/sharp-libvips # sharp 镜像
sudo npm install -g npm # 更新 npm

# ghost-cli 使用 yarn 包管理器,所以进行源配置
sudo npm install -g yarn
yarn config set registry https://r.npm.taobao.org # yarn 镜像替换为淘宝npm节点
yarn config set sharp_dist_base_url https://npm.taobao.org/mirrors/sharp-libvips # sharp 镜像
yarn config set disturl https://npm.taobao.org/dist # node-gyp 编译依赖的 node 源码镜像
yarn config set node_sqlite3_binary_host_mirror https://npm.taobao.org/mirrors # sqlite3 镜像
yarn config set sqlite3_binary_site https://npm.taobao.org/mirrors/sqlite3/ # sqlite3 镜像

Cap3 安装Nginx环境

如果你需要SSL配置需要NGINX 1.9.5或更高版本,当然你可以选择下载Nginx源码进行编译安装,省事可以直接执行:

sudo apt-get install nginx
nginx -v # 输出版本号

如果ufw已激活,则防火墙允许HTTP和HTTPS连接,所以打开防火墙:

sudo ufw allow 'Nginx Full'

Cap4 安装数据库

Ghost安装数据库推荐的是MySQL:

sudo apt install mysql-server

如果运行的是Ubuntu 18.04,则需要输入密码以确保MySQL与Ghost-CLI兼容:

# 进入数据库管理
sudo mysql
 
# 执行下列语句进行修改数据库密码
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '这是你要替换的密码';
 
# 退出数据库管理
quit;
 
# 退出mysql用户并且登录用户账户
su - <user>

不推荐安装 MariaDB 是因为不支持了,建议使用 MySQL,如果使用 MySQL8.x 大版本内存不足可以看看下面的解决方案。

Cap5 安装 Ghost-Cli & Ghost

sudo npm install ghost-cli@latest -g # 安装Ghost脚手架

创建网站目录:

# 创建ghost文件夹的网站目录,这个名字可以自己随便定义
sudo mkdir -p /var/www/ghost
 
# 使文件夹拥有权限,<user>是当前用户名
# 例如当前用户名是ubuntu,那么应该是:sudo chown ubuntu:ubuntu /var/www/ghost
sudo chown <user>:<user> /var/www/ghost
 
# 设置读写权限
sudo chmod 775 /var/www/ghost
 
# 定位
cd /var/www/ghost
 
# 进行Ghost博客平台安装
ghost install

安装过程根据主机性能来决定,下面是选项配置讲解:

  • Enter your blog URL: 博客展示地址,格式:http(s):(www.)example.com,不支持ip地址。
  • Enter your MySQL hostname: 数据库主机地址,回车默认是localhost
  • Enter your MySQL username: / Enter your MySQL password: 数据库用户名/密码,上面安装的数据库用户名是root,密码是自己设置的。
  • Enter your Ghost database name: Ghost博客数据库名
  • Do you wish to set up "ghost" mysql user? 设置数据库用户名为ghost,这个为了避免权限太大导致数据瞎搞,Ghost官方推荐是y
  • Do you wish to set up Nginx? 自动化Nginx,推荐y
  • Do you wish to set up SSL? 配置SSL证书,推荐y,如果你有证书问题,请查看文章最下面的问题。
  • Enter your email (For SSL Certificate):个人邮箱,配置ssl证书需要的邮箱地址。
  • Do you wish to set up Systemd? 使用ghost进程管理工具,推荐y,个人觉得海星。
  • Do you want to start Ghost? 启动Ghost博客就可以进入网址访问。

Cap6 异常解决

如果在安装 Ghost 过程中经常性卡住,就需要一些特殊的方法,例如脚手架经常在第五步卡住,可以停止服务删除安装目录下所有文件重新执行:

ghost uninstall # 卸载原有 ghost 程序
sudo rm -rf /var/www/ghost/*
npm cache clean --force # 清空缓存
ghost install -V # -V 是把所有的安装日志打印到控制台,方便查看安装日志 不过大量的日志输出可能导致安装失败,所以在特殊情况下使用。

然后大部分安装或者升级的时候卡在:

node-pre-gyp WARN Using request for node-pre-gyp https download

如果卡在这边基本上是下载 sqlite3 卡住了,所以需要设置镜像:

npm config set registry https://r.npm.taobao.org # npm镜像替换为淘宝npm节点
npm config set disturl https://npm.taobao.org/dist # node-gyp 编译依赖的 node 源码镜像
npm config set node_sqlite3_binary_host_mirror https://npm.taobao.org/mirrors # sqlite3 镜像
ghost install -V # 重新安装
ghost upgrade -V # 升级博客

如果这样再不行建议大家安装 tbify 这个插件:

npm install -g tbify
tbify ghost install

插件详细介绍:https://github.com/fjc0k/tbify

如果遇到错误没有能力解决的,请在 ghost install -V 或者 ghost upgrade -V 执行中所有的命令贴上发送到我的邮箱或者评论中,这样我尽力为你解决问题。

Cap7 图片优化

图床使用的是 Ghost qiniu 图床:https://github.com/JaxsonWang/Ghost-QiNiu-Store

之前使用别人开源的图床插件,但是升级到 v3 版本后出现各种问题,无奈之下自己动手开发一套了,支持最新版。

例如在/var/www/ghost/content/adapters文件下新建个storage文件夹

cd /var/www/ghost/content/adapters/storage # 定位
git clone https://github.com/JaxsonWang/Ghost-QiNiu-Store.git qn-store # 拉取源码
cd qn-store # 定位
npm install # 安装模块依赖

然后打开/var/www/ghost/config.production.json文件,添加代码:

{
  // ...
  "storage": {
    "active": "qn-store",
    "qn-store": {
      "accessKey": "your access key", // https://portal.qiniu.com/user/key获取AK密匙
      "secretKey": "your secret key", // https://portal.qiniu.com/user/key获取SK密匙
      "bucket": "your bucket name", // 存储对象空间名字
      "domain": "http://xx.xx.xx.glb.clouddn.com", // 七牛CDN地址
      "format": "${year}/${month}/${name}${ext}"
    }
  }
  // ...
}

然后重启Ghost:

cd /var/www/ghost
ghost restart

Cap8 SSL错误

如果你域名设置@域名例如:https://iiong.com,访问是没有问题,但如果是访问www.iiong.com就会报错,如何解决这个问题呢:

  • 重新配置:ghost config url https://www.mydomain.com

  • 执行ghost setup nginx ssl

  • 再修改回来:ghost config url https://mydomain.com

  • 打开 /var/www/ghost/system/files/ 下的俩个www.*.conf文件,添加301跳转到顶级域名代码:

    if ($ssl_protocol = "") {
        return 301 https://$host$request_uri;
    }
    if ($host != iiong.com) {
        return 301 $scheme://iiong.com$request_uri; #请注意这里的iiong.com替换你的域名。
    }
    
  • 重启sudo nginx -s reload服务

如果 /var/www/ghost/system/files/ 文件夹不存在,请在 /etc/nginx/sites-available 目录下修改文件。

Cap9 SSL 续费

参考:Ghost Let's Encrypt 得知:

/etc/letsencrypt/acme.sh --home "/etc/letsencrypt"

是证书管理目录,根据 acme.sh 得知手动续签执行:

/etc/letsencrypt/acme.sh --cron --home "/etc/letsencrypt"

不过我这个告知没有 root 权限:

sudo /etc/letsencrypt/acme.sh --cron --home "/etc/letsencrypt"

又被告之不推荐使用 sudo 执行,可以强制忽略:

sudo /etc/letsencrypt/acme.sh --cron --force --home "/etc/letsencrypt"

这样应该就可以了。

Cap10 内存不足

如果你的系统一直提示系统内存不足请参考:腾讯云开启 swap 分区

Cap11 自动化备份

如果需要自动化备份请参考:Ghost 实现自动化备份

Cap12 删除会员系统

升级到 4.x 大版本前端会有个接口 /members/api/member/ 401 报错和一个外链 https://unpkg.com/@tryghost/portal@1.1.1/umd/portal.min.js 指向,很明显现在系统彻底整入会员系统,在国内上面的外链会拖慢前端网页加载速度,所以我做个脚本来优化下,在你的 Ghost 安装目录下新建 remove-members.js 脚本:

'use strict'

const fs = require('fs')

// 绝对路径默认设置如下
// 如果设置相对路径,需要将文件放在 Ghost 根目录下,并且 ghostRoot 设置 '.'
const ghostRoot = '/var/www/ghost'

try {
  const regex = /head\.push\(getMembersHelper\(options\.data\)\);/mgiu
  const filePath = '/current/core/frontend/helpers/'
  const fileName = 'ghost_head.js'
  fs.copyFileSync(ghostRoot + filePath + fileName, ghostRoot + filePath + 'ghost_head.bak.js')
  const data = fs.readFileSync(ghostRoot + filePath + fileName, { encoding: 'utf8' })
  const result = data.replace(regex, '')
  fs.writeFileSync(ghostRoot + filePath + fileName, result, { encoding: 'utf8' })
} catch (error) {
  console.log('执行错误:', error.toString())
}

保存之后执行 node remove-members.js 即可,记得重启 ghost 服务。

每次升级都需要执行下脚本,因为升级文件会覆盖之前的文件:

ghost upgrade && node remove-members.js && ghost restart
喵~
Jaxson Wang
永远年轻,永远热泪盈眶!
Nuxt.js学习笔记
Nuxt.js学习笔记

由于公司业务所需,再加上之前掌握Vue.js相关知识,正好趁着业务的需求,大致学习下Nuxt.js框架。 Nuxt.js是Vue.js通用框架,其实它就是Vue.js的SSR简化版,无非把配置调整更加简单。

7 分钟阅读
Hello,World
Hello,World

你好,欢迎来到我的新博客。

1 分钟阅读