Ghost 博客部署,我的最爱

♥️ 强烈推荐 Ghost 博客,我的最爱,之前断断续续瞎折腾过几个博客,始终没有找到合适的,中间还一度自己做了个博客的版本,直到我用上了 Ghost blog,我就停止了折腾。

1️⃣ 主题市场很精美且丰富,超过绝大部分竞品

2️⃣ 开源: 可以在自己的 VPS 上直接部署,完全可控

3️⃣ 性能强大,博客编辑,后台设置,功能非常丰富

4️⃣ SEO 友好,支持 Code 嵌入,三方插件集成,如 Stripe, Zapier 等

5️⃣ 邮件订阅支持,Stripe 支付接入,可以对订阅收费

优点

Ghost 是非常完善的博客系统,也是基于 Nodejs 开发的,不仅提供了 Cloud 版本,也提供了开源版本,当前我这个站点用的就是 Docker 部署的 Ghost,非常方便,弄个 VPS,直接一年省去大几百的费用。

部署过程

我是在 VPS 上使用 Docker + Nginx 进行部署的,SSL 证书是从 Cloudflare 上申请的,可以参考我的文章[Cloudflare 的免费 SSL 证书,可用 15 年 🤩],域名是在 NameSilo 注册的,VPS 是购买的 Hostinger , 推荐注册入口

自部署 Ghost 安装文档入口

Tips: 注意这里对于 Ubuntu 文档,只支持到 22.04 LTS,现在我的服务器在 24 版本了,我按照 Ubuntu 的这个文档安装,一直在坑里。

这里选择 Docker 安装即可,Ghost 官方镜像地址,对应的配置,如端口、mysql、volume,按需配置即可,Ghost 使用 Mysql 进行数据存储。

version: '3.1'

services:

  ghost:
    image: ghost:5-alpine
    restart: always
    ports:
      - 8080:2368
    environment:
      # see https://ghost.org/docs/config/#configuration-options
      database__client: mysql
      database__connection__host: db
      database__connection__user: root
      database__connection__password: example
      database__connection__database: ghost
      # 这里记得替换为自己的网站地址
      url: https://meepo.me
      # contrary to the default mentioned in the linked documentation, this image defaults to NODE_ENV=production (so development mode needs to be explicitly specified if desired)
      #NODE_ENV: development
    volumes:
      # 如果后续迁移服务器的 image,media 等文件,这里最好挂载一个地址专门存放
      - ghost:/var/lib/ghost/content

  db:
    image: mysql:8.0
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: example
    volumes:
      - db:/var/lib/mysql

volumes:
  ghost:
  db:

配置Nginx,配置文件如下,这样可以做到

  • 支持 https 的访问
  • http 自动跳转 https
  • https://www.meepo.me 自动跳转到 https://meepo.me,这一步需要结合 Cloudflare 的 www 自动跳转到根域名,参考
  • http 到 https 的自动跳转,然后再结合 Cloudflare 的 www 自动跳转到根域名,这一步需要进行策略配置

首先这里需要 SSL 证书文件,可以参考我的 [Cloudflare 的免费 SSL 证书,可用 15 年 🤩] 去申请一个免费的 SSL 证书,然后存放在服务器,稍后配置在 Nginx 中即可。

然后在 sites-available 文件夹新建 meepo.me.conf 文件

server {
    listen 80;
    listen [::]:80;
    server_name meepo.me www.meepo.me;
    return 301 https://$server_name$request_uri;
}
​
# HTTPS 配置
server {
    listen 443 ssl;
    listen [::]:443 ssl;
    server_name meepo.me www.meepo.me;
​
    # SSL 证书配置
    ssl_certificate /root/ghost/certs/meepo.me.pem;
    ssl_certificate_key /root/ghost/certs/meepo.me.key;
​
    # SSL 优化配置
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
    ssl_prefer_server_ciphers off;
    ssl_session_timeout 1d;
    ssl_session_cache shared:SSL:50m;
    ssl_session_tickets off;
​
    # ... 其他配置保持不变 ...
    location / {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host $http_host;
        proxy_pass http://localhost:8080;
        
        # WebSocket 支持
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
​
    location /assets/ {
        proxy_pass http://localhost:8080;
        expires 30d;
        add_header Cache-Control "public, no-transform";
    }
​
    client_max_body_size 50m;
}

然后执行

sudo ln -s /etc/nginx/sites-available/meepo.me.conf /etc/nginx/sites-enabled/

执行 nginx -t 检查配置文件是否正确,如果 ok 的话,执行 systemctl reload nginx 重新加载 nginx 配置。

Bingo,按照如上配置,你就可以拥有一个和我一样的博客系统了。