写在开头

  最近从柜子里面翻出来了一片树莓派 5 8GB 版本,尝试开机却卡在却发现里面的 128G TF 卡已经挂了,在存储价格暴涨的当下又损失了一笔:(

吃灰的两台树莓派,两台都是卡坏了又懒得刷新系统
吃灰的两台树莓派,两台都是卡坏了又懒得刷新系统

  但是秉承着旧物利用的想法,我又翻柜子找出了一张 64G 的 TF 卡,刷入了最新的 ubuntu 25.1 server,尝试看看能做点什么。

  忽然想起之前看到的一个博客站,使用 Typecho + VOID 主题搭建并魔改,效果非常的好,本人作为简洁主题爱好者决定在迁移到固态硬盘之前就先跑这种小服务了;正好也写写文活动一下几年没有认真写作的大脑,也把踩过的坑详细说说,希望能帮助读者。

优缺点概述

优点

  1. 使用树莓派 + 容器运行,无需公网 IP,对配置要求低,并且此方案也可以扩展到别的 Linux 机型。
  2. 使用 Cloudflare 进行内网穿透,可以利用 Cloudflare 强大的全球 CDN 资源进行全球访问优化。
  3. 博客数据便于迁移导出,只需要复制数据库文件夹和内容文件夹,使用相同的 Docker 配置文件即可在任何地方重新部署。

缺点

  1. 现在树莓派和存储价格起飞,只推荐树莓派吃灰人士部署在树莓派上。
  2. 需要一些基础的计算机知识和 Linux 操作系统知识。
  3. 使用 TF 卡存储数据时 TF 卡易损坏并且由于读写速度太慢导致卡顿。
  4. 没有魔法的情况下一些步骤非常耗时间。

详细流程

你需要

  1. 一台树莓派,最好是五代,四代也可以,另外最好有一块闲置的硬盘,因为 TF 卡的寿命实在太差,可能一段时间后就会挂掉,推荐把系统装在硬盘里面。
  2. 此外还需要一台电脑,至少烧录镜像的时候需要,手机理论上可以但是十分的麻烦。
  3. (非必须)软路由进行透明代理,这样可以节省大量的时间在下载上,也不用十分麻烦的配置 linux 上的代理。
  4. 一个域名,可以去买一个,一年80左右,最好是 Cloudflare 的,这样可以方便用隧道直接映射。如果实在不想花钱的话就去 freenom 获取一个免费的子域名也可以。
  5. Cloudflared Token,打开 Cloudflare dashboard 登陆,点击边栏的网络 - 连接器,点击创建隧道,点击选择 Cloudflared,命名后,找到安装并运行连接器,找到:

      运行以下命令:cloudflared.exe service install eyJhIjo......, 把 eyJ 开头的 Token 复制到一个文档里面保存;

    找到上面的已发布应用程序路由,配置你的域名,下面的服务类型选择 HTTP , URL 填写 typecho-app:80

烧录镜像

  下载官方推出的镜像烧录工具 Raspberry Pi Imager 烧录镜像,先选择你的板子型号

选择型号
选择型号

  再选择其他系统

选择系统
选择系统

  之后选择 Ubuntu,然后选择 Ubuntu 的 Server 系统

选择 Server
选择 Server

  之后把 TF卡或者硬盘插到电脑上,选择后点击下一步,之后就是设置初次启动配置了。由于 Server 系统没有桌面,所以所有的系统配置(主机名、区域设置、用户名密码、网络设置、远程管理)都要通过一个配置文件写入系统镜像,在系统首次启动时配置这些内容,接下来讲解如何设置:

  Hostname:主机名,填自己喜欢的即可,通常叫做 raspberrypi + 描述。

  Localisation:区域设置,填写你所在的区域,键盘布局中国大陆填写 US 即可。

  User:用户设置:填写你的用户名和密码,只要你能记住就行。

  Wi-Fi:无线网络设置:填写无线局域网的信息,如果是通过网线接入则可以留空。

  Remote access:远程控制设置:重要,如果填错的话就只能把树莓派连接到键盘和显示器来修改,请确认你勾选了开启 SSH 的开关,并且选择的使用密码登陆。

  一切完成后点击 WRITE 确认烧录, 工具会先从官网下载镜像,解压后注入生成好的首次启动配置文件之后写入存储卡;这个过程如果网络环境不佳的话可能会花费超过 1 小时时间。

  显示完成后就可以把卡插到树莓派里面了,首次启动推荐连接显示器,能看见进度条的安心感还是很重要的(雾)。接下来就是插电,然后耐心的等待,如果连接显示器可以看见首次配置的进度,否则就只能干等了,一般要耗费 20 分钟 - 1 小时不等。推荐半小时后尝试是否配置完成。

  接下来就是远程连接到树莓派了,以后的操作只需要确保树莓派的网络正常即可;打开 Windows 终端,输入ssh username@server_address ,username 换成你设置的用户名,server_address 填写你设置的主机名或者树莓派的 IP 地址。

  如果显示连接失败,首先建议再等等,但是如果过了一个小时以上还是失败的话就应该把树莓配连接到键盘显示器了,确认系统已经完全启动并且网络正常(使用 ip a命令)。此处默认已经能够正常连接上。

配置环境

  连接完成后第一步就是更新系统软件包:

  输入并回车

apt update
sudo apt upgrade -y

  接下来就是漫长的等待,等到屏幕上显示所有的工作都已经完成后就可以下一步了,如果网络错误请参考 更换国内镜像源

  接下来就是安装 Docker 了,如果网络环境在中国大陆请使用

# 阿里云镜像脚本安装 curl 
fsSL https://get.docker.com | bash -s php --mirror Aliyun

  如果有软路由请使用

curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh

  等待执行完成后将当前用户加入到 docker 用户组:

sudo usermod -aG docker $USER

  回车后按 Ctrl + C 退出 SSH 重新登陆,然后修改 Docker 镜像源配置文件:

sudo mkdir -p /etc/docker
sudo nano /etc/docker/daemon.json

  粘贴镜像源内容

{
    "registry-mirrors": [
    "https://docker.m.daocloud.io",
    "https://docker.imgdb.de",
    "https://docker-0.unsee.tech",
    "https://docker.hlmirror.com",
    "https://cjie.eu.org"
    ]
}

  这个时候如果运行 docker 的结果是这样说明安装成功了

docker 运行结果
docker 运行结果

配置容器

  首先创建目录

mkdir -p ~/my-blog/typecho_site
cd ~/my-blog

  然后编写 docker-compose.yml

nano docker-compose.yml

  填写以下的内容

version: '3.9'

services:
  # 数据库服务
  typecho-db:
    image: mariadb:10.11
    container_name: typecho-db
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: your_password # 替换成你的密码,记得住就行
      MYSQL_DATABASE: typecho
      MYSQL_USER: typecho_user
      MYSQL_PASSWORD: your_password # 替换成你的密码,记得住就行
    volumes:
      - ./typecho_db:/var/lib/mysql
    # 限制日志大小,如果使用非 TF 卡运行可以删除
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "3"

  # Typecho 程序服务
  typecho-app:
    build: .
    container_name: typecho-app
    restart: always
    ports:
      - "8090:80"
    environment:
      - TZ=Asia/Shanghai
    volumes:
      - ./typecho_site:/var/www/html
    depends_on:
      - typecho-db

  # Cloudflare 内网穿透服务
  cloudflared:
    image: cloudflare/cloudflared:latest
    container_name: cloudflared-tunnel
    restart: always
    command: tunnel --no-autoupdate run
    environment:
      - TUNNEL_TOKEN=your_Token # 替换成你的 Zero Trust Token
    depends_on:
      - typecho-app

  然后编写 Dockerfile 文件

nano Dockerfile

  填写以下的内容

FROM php:7.4-apache

# 安装扩展 + 开启重写模块 + 允许 .htaccess 覆盖配置
RUN apt-get update && apt-get install -y \
        libpng-dev \
        libjpeg-dev \
        libfreetype6-dev \
    && docker-php-ext-configure gd --with-freetype --with-jpeg \
    && docker-php-ext-install pdo pdo_mysql gd \
    && a2enmod rewrite \
    && sed -i 's/AllowOverride None/AllowOverride All/g' /etc/apache2/apache2.conf

# 修正网站目录所有者
RUN chown -R www-data:www-data /var/www/html

  然后下载 Typecho 源码到文件夹内

cd ~/my-blog/typecho_site
# 下载 unzip
sudo apt install unzip
# 下载源代码
wget https://github.com/typecho/typecho/releases/latest/download/typecho.zip
# 解压
unzip typecho.zip
# 清理压缩包
rm typecho.zip
# 修正权限
sudo chown -R 33:33 ~/my-blog/typecho_site

简单解说

  此处一共部署了三个容器,分别为

typecho-db

  MariaDB 数据库容器,里面运行着一个 MySQL 服务,里面存储了上传的文章、用户信息等信息。

  运行在 Docker 的私有网络内,只能由容器内部访问。

  数据存储在 ./typecho_db 内。

typecho-app

  PHP-Apache 容器,运行 php:7.4-apache ,通过Dockerfile 文件安装一些必要的库。

  也负责存储用户上传的图片等文件,用于生成网页发送给用户。

  数据存储在 ./typecho_site 内,从而实现修改源代码实时生效的功能。

cloudflared

  Cloudflare Tunnel 容器,里面运行 Cloudflare Zero Trust 服务,用于内网穿透。

启动容器

  回到 my-blog 根目录,开启服务:

cd ~/my-blog
docker compose up -d --build

  这个时候应该会提示正在下载或者转圈,由于 TF 读写速度太慢或者网络问题,这一步会花费很久的时间,如果出现下载失败的提示,请检查网络或者配置软路由或者代理,或者配置上面的镜像地址。笔者在这一步花费了有 1 个小时以上。

  如果一切准备就绪,浏览器尝试访问你的树莓派 IP ,端口号8090(例如 http://192.168.8.209:8090)如果没有问题的话将会看到 Typecho 的安装界面,请原封不动按照下面填写:

项目填写内容说明
数据库类型Pdo 驱动 Mysql 适配器
数据库地址typecho-db填容器名
数据库用户名typecho_user与 yml 文件一致
数据库密码your_password与 yml 文件一致
数据库名typecho与 yml 文件一致
表前缀typecho_保持默认即可
高级选项 -> 启用数据库 SSL 服务端证书验证不启用

  点击下一步后设置你的后台管理用户和密码,同样设置你能记住的密码即可,然后继续点下一步,此时你应该看到博客安装成功的页面,说明此时博客已经成功安装!

美化界面

  这个时候博客已经可以正常运作了,可以尝试使用在 Cloudflare 里面设置的域名访问,但是 Typecho 默认的主题有些简陋,这个时候我们可以上传主题来自定义界面。

  为了方便 Windows 和 Linux 之间传输文件,建议下载 WinSCP 为了不破坏文件权限的同时对文件进行读写操作,应该使用 root 账户登陆;

设置允许 root 账户远程登陆

  需要先设置一个 root 账户密码

sudo passwd root

  按照提示输入两次你想设置的 root 密码。

  之后设置 ssh 设置:

sudo nano /etc/ssh/sshd_config

  在文件中找到 #PermitRootLogin prohibit-password 这一行将其修改为:

PermitRootLogin yes

  去掉前面的 # 号,并将后面的内容改为 yes,保存退出。

  然后重启 SSH 服务

sudo systemctl restart ssh

  然后打开 WinSCP 使用 root 账户登陆即可。

下载主题并传输

  由于 VOID 主题的稳定版在 2019 年就已经停止更新,所以我们需要下载作者在 2023 年重新修改后的测试版;

  首先下载测试版,解压,在 WinSCP的右侧找到目录 /home/kulib/my-blog/typecho_site/usr/themes 把解压后的文件夹拖进去。

  然后下载配套插件,解压文件找到配套插件文件夹内的 VOID 文件夹,在 WinSCP的右侧找到目录 /home/kulib/my-blog/typecho_site/usr/plugins 把解压后的文件夹拖进去。

  接下来打开 Typecho 的后台控制面板,控制台 - 插件 / 外观,分别启用对应的插件和主题。

一些设置

  首先打开设置 - 基本设置,里面可以设置网站名称和描述;

  找到站点地址一栏,里面应该是你的树莓派的内网地址,你需要将其改成你的 Cloudflare 设置的内网穿透的域名,点击保存设置。网站会拿这个地址生成对应的 CSS / JS 文件的地址,如果在外网访问的话需要使用可以访问的地址来生成,否则页面将会是没有样式的纯 HTML 页面。

  然后打开控制台 - 外观 - 设置外观,此处可以自定义博客的顶栏、底栏等内容。

魔改

  接下来可以把主题文件复制一份到你的源代码文件夹,使用 vscode 打开,就可以愉快的魔改了,放个看板娘、把文章样式边框去掉、改改自定义渲染什么的,当你的修改完成后直接使用 WinSCP 用修改后的主题覆盖旧主题,直接刷新界面就看到效果。

  注意:找到站点地址一栏,你需要将你的 Cloudflare 设置的内网穿透的域名改回内网地址,因为 Cloudflare CDN同步很慢,会导致你的变更无法实时预览,在你确认魔改完成后将地址改回你的 Cloudflare 设置的内网穿透的域名即可。

  建议新建对应的文件覆写 CSS / JS 在对应文件底部引用,这样可以在最小程度改动源文件的同时修改样式,也可以防止改到后面自己都不知道改了什么:)

写在最后

  从零开始折腾还是很麻烦的,毕竟这个项目已经处于半无人维护的状态了,中间有很多的坑,每踩一个都要花费大量的时间去解决,希望我这篇文章能帮到一些同样使用低性能主机想建立一个简单美观博客的人,如果参考的时候出现了一些其他的问题也欢迎在留言区留下联系方式。