前言

差不多一年半前的某天产生了“我要建个人网站”这个想法。在向好友们寻求意见的时候得到了“要不要用 Ghost 建你的博客?”的建议。日后反复对比了 Ghost 、 WordPress 等开源博客程序与 Medium/Tumblr/Blogger 等传统博客,认定了 Ghost 并开始做准备。然而准备工作一拖就是一年多,直到2017年的9月才付诸实施建成自己的博客。
时隔一年发现 Ghost 早已发布 1.0 版本,通过 Ghost-CLI 安装相当简便;Let's Encrypt 的部署也已经可以一键完成,只想让人感慨拖延真不是什么好习惯时间可以让问题不再是问题。

在此记录一下完整安装过程。

安装前的准备工作

1. VPS
  • 1GB 内存
2. 域名
  • 为 Blog.Asakawa.com 设置 DNS 解析记录
    域名解析服务选择 CloudFlare
    提前将域名解析到 VPS 的 IP 地址以方便部署 HTTPS
    重要 如果希望一键启用 HTTPS 则不要使用 CloudFlare 的 CDN
3. 系统
  • Ubuntu 16.04
    Ghost 官方推荐使用 Ubuntu 16.04,个人用的是 Ubuntu 17.10。
  • 一个非 root 用户
  • MySQL
  • Nginx
  • Node V6 或更高

使用 Ghost-CLI 安装 Ghost

首先执行

apt update
apt upgrade
apt install -y build-essential
安装 Nginx
apt install -y nginx 
ufw allow 'Nginx Full'     #允许 Nginx 通过 ufw
安装 MySQL

如果不使用远程数据库需要安装 MySQL。

apt-get install mysql-server
mysql_secure_installation     #进行 MySQL 安全检查,删除匿名用户、删除 Test 数据库、禁止远程登录等
mysql -u root -p
mysql> CREATE DATABASE ghost;     #创建名为 ghost 的数据库
mysql> exit

运行 Ghost 需要创建一个 MySQL 用户,可以在之后的安装过程中一并完成设置。

安装 Node.js 和 Ghost-CLI
curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -
apt-get install -y nodejs
npm i -g ghost-cli

安装 ghost-cli 时可能会报错,不过实际操作下来后续步骤没受到什么影响。

安装 Ghost
adduser <user>     #创建一个非 root 用户
usermod -aG sudo <user>

由于 Ghost-CLI 运行时会自动创建 ghost 用户,所以在这里创建的非 root 用户要另选用户名

mkdir -p /var/www/ghost     #创建安装目录
chown [user]:[user] /var/www/ghost     #授权
cd /var/www/ghost
su <user>

在目录 /var/www/ghost 下安装 Ghost

$ ghost install

Ghost 将会自动安装。
系统不是Ubuntu 16.04,是否继续安装? Y

安装完成后按提示输入
域名 https://blog.asakawa.com/

MySQL主机 localhost 或者远程主机
用户名 root 或者其他有权限的用户
密码 上述用户的密码
数据库名 为 Ghost 创建一个新的数据库
之后会依次询问
是否为 Ghost 设置 MySQL 用户 如果没有自行创建可输入Y,为 Ghost 创建新的 MySQL 用户。

是否设置Nginx Y
是否设置SSL N
Ghost-CLI 会自动设置 Nginx 的配置。如果这里选择设置 SSL,Ghost-CLI 会使用 acme.sh 申请 Let's Encrypt 证书并自动添加到 Nginx 的配置中。

完善 Ghost 的配置

vim /var/www/ghost/config.production.json

可以看到刚刚的urldatabase等设置,这里需要修改的是mail部分使用 Mailgun 发送 Ghost 的邮件,当然也可以使用其他邮件服务。

    "mail": {
        "from": "[email protected]",
        "transport": "SMTP",
        "options": {
            "service": "Mailgun",
            "auth": {
                "user": "[email protected]",
                "pass": "password"
            }
        }
    },

保存退出,

sudo ghost restart

重启应用设置。
到此为止 Ghost 的安装已经完成,访问 blog.asakawa.com 可以看到 Ghost 登陆面板,在第一时间通过 blog.asakawa.com/ghost/ 完成主用户注册。

设置 SSL

此前由于安全性原因,通过 certbot-nginx 签发 Let's Encrypt 证书被暂停,目前已经修复可以正常使用。

最后要做的是申请 Let's Encrypt 证书为网站启用 HTTPS。
Certbot 提供了 Nginx 插件,非常简单就能完成 Let's Encrypt 证书的部署,管理也很方便。没有使用 Ghost-CLI 来配置 SSL 是因为除了 Ghost 还想要在主机上尝试搭建其他网站。

首先安装 CertbotCertbot-nginx 插件,

apt-get update
apt-get install software-properties-common
add-apt-repository ppa:certbot/certbot
apt-get update
apt-get install python-certbot-nginx

接下来只需要执行

certbot --nginx

Certbot 会自动读取 Nginx 设置,可以按提示选择要验证的域名或者直接验证所有域名。
证书申请完成后会依次询问
是否直接为 Nginx 添加 SSL 设置 Y
是否设置 HTTP 自动跳转为 HTTPS Y
执行
systemctl restart nginx
再访问 blog.asakawa.com 即可看到绿锁。

测试 Certbot 的证书续期能否运行
certbot renew --dry-run
提示正确后就可以为设置证书的定时续期了。
执行
crontab -e
添加

0 4 1 * * certbot renew  #每月自动续期

保存退出
到此为止完成启用 HTTPS 的设置。

吃一堑长一智的插曲

Ghost-CLI 与 LNMP 一键包有冲突。最开始知识有限,排查了多次才意识到这个问题。

特别感谢

Higan 向我推荐了 Ghost


参考:

  1. Ghost Docs [1]
  2. EFF's Certbot [2]
  3. 免费资源部落 [3]

  1. Ghost Install & Setup (production) ↩︎

  2. Certbot Instruction: Nginx on Ubuntu 17.04 (zesty) ↩︎

  3. Ghost博客安装与使用教程 ↩︎