3 min read

利用 Cloudflare Ghost RaspberryPi NAS 搭建个人博客

利用 Cloudflare Ghost RaspberryPi NAS 搭建个人博客
cloudflare for self hosted

Cloudflare 真可谓是业界良心,对个人来说免费的服务已经可以跑的很 high 了。对于中小企业来说,25刀一个月可以说是超值大礼包。

这里 FOMO 下CF的股票代码 NET, 支持他就买cf的股票。

随着消费降级,也打算把自己的 blog 缩减一下成本。本来是 nextjs + django + postgresql。很多时候是给自己练手用的。现在迁移到 ghost, 也可以充分利用家里 raspberrypi 4。而且,人到中年懒的再继续折腾了。同时也要更好的利用中年三宝。

以上都是个人些感想。


硬件设备

  • RaspberryPI 4 4G
  • Synology DS720 Plus 6G (中年三宝之一)

首先, 在 raspberrypi 上安装 cloudflared:

  1. 添加 cloudflare 安装包签名
sudo mkdir -p --mode=0755 /usr/share/keyrings
curl -fsSL https://pkg.cloudflare.com/cloudflare-main.gpg | sudo tee /usr/share/keyrings/cloudflare-main.gpg >/dev/null
  1. 添加 cloudflare apt 源
echo "deb [signed-by=/usr/share/keyrings/cloudflare-main.gpg] https://pkg.cloudflare.com/cloudflared $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/cloudflared.list
  1. 更新 apt 源并且安装 cloudflare
sudo apt-get update && sudo apt-get install cloudflared

接着, 验证你的 cloudflare 账号:

cloudflared tunnel login

运行以上命令后,会打开浏览器授权,并选择一个 domain name 链接 raspberrypi

然后,创建一个 tunnel 并且给 tunnel 取名字:

cloudflared tunnel create ghost-raspi

这里把 tunnel 命名为 ghost-raspi, 然后验证 tunnel 是否创建成功

cloudflared tunnel list

You can obtain more detailed information for each tunnel with `cloudflared tunnel info <name/uuid>`
ID                                   NAME            CREATED              CONNECTIONS
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx ghost-raspi     2024-07-17T13:07:41Z 2xsjc06, 2xsjc08

接着继续,创建一个配置文件:

在 /home/xxx/ 下的 .cloudflared/ 目录下创建一个 config.yml 配置文件

url: http://localhost:8080
tunnel: <Tunnel-UUID>
credentials-file: /root/.cloudflared/<Tunnel-UUID>.json

配置路由:

分配一条 CNAME 记录,将流量指向隧道 subdomain:

cloudflared tunnel route dns <UUID or NAME> <hostname>

让 Cloudflare tunnel 奔跑起来

cloudflared tunnel run <UUID or NAME>

最后,检查 cloudflared 服务运行状态

通过以下命令获得 cloudflared 相关信息

cloudflared tunnel info <UUID or NAME>

以上是 cloudflare 的安装与配置。更具体的可以参考官方文档


安装配置 ghost

ghost 我使用 Docker 安装,方便快捷

首先创建一个 ghost 目录,然后进入目录,创建 docker-compose.yaml 和 config.production.json 文件

mkdir ghost
cd ghost
touch docker-compose.yaml
touch config.production.json

将一下内容复制到 docker-compose.yaml 文件里

# by default, the Ghost image will use SQLite (and thus requires no separate database container)
# we have used MySQL here merely for demonstration purposes (especially environment-variable-based configuration)

version: '3.1'

services:

  ghost:
    image: ghost:alpine
    restart: unless-stopped
    ports:
      - 8080:2368
    volumes:
      - ./content:/var/lib/ghost/content
      - ./config.production.json:/var/lib/ghost/config.production.json
    environment:
      # see https://ghost.org/docs/config/#configuration-options
      database__client: mysql
      # this url value is just an example, and is likely wrong for your environment!
      url: https://www.example.com
      # 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

config.production.json 可以参考 ghost 官方文档

在之前建立的 ghost 目录下输入一下命令,就可以启动 ghost 服务了

docker-compose up -d 

结论

Synology 上安装 mysql 几乎是傻瓜式,这里就不阐述了。这个时代可以问问 gpt 怎么折腾,应该挺方便。

后续,为了稳定性,可能会考虑 UPS 以防止跳电。预算充足的话也可以弄三个 raspberrypi 4/5 部署 k3s,防止单点故障。 (这里不推荐使用 3代,即使跑 k3s 还是很吃力)。