树莓派.png

起因(废话)

个人站点服务从最早期的单纯云服务器部署,到结合家用NAS部署,来到现在的弃用NAS使用树莓派部署,一路走来经历10年时间。

一代目 -> 二代目

到底为什么会沦落至此? —— 穷

云服务器费用不断涨价,从最初的40~50块一年新人尝新价,到现在动辄一年大几百,只能放弃昂贵的云服务器;改用超低配云服务器作为入口打头阵,其他服务都本地部署的方案。

加上现在内网穿透已经十分方便,正是折腾的好时候!

二代目 -> 三代目

为啥又从NAS换到了树莓派? —— 吵

最近NAS换了便宜的东芝硬盘(14TB),真的没想到以前的希捷硬盘算是安静的了,东芝硬盘有时读写起来像敲鼓一样,又不方便把NAS挪到其他位置,于是想就每天定时快关机,正好也能让硬盘多用几年。

手头正好有个10年前买的RaspberryPi 3B,性能不算太好,四核1.2GHz + 1G RAM,手头宽裕的仗打完了,要节衣缩食了。

方案

以前博客程序使用的是 Halo(基于 Java 开发),在树莓派上算是小马拉大车,着实有些带不动了,在 Google Gemini 的推荐下改用 Typecho(基于 PHP 开发),再加上一个 Memos(基于 Go 开发,类似微博),使用 Docker 部署,部署后内存占用 42%。

必须的配置(Ubuntu Server)

设置时区

sudo timedatectl set-timezone Asia/Shanghai

添加国内软件源

# 备份文件
sudo cp /etc/apt/sources.list.d/ubuntu.sources /etc/apt/sources.list.d/ubuntu.sources.bak
# 编辑文件
sudo vim /etc/apt/sources.list.d/ubuntu.sources

在编辑器中添加以下内容

Types: deb
URIs: https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/
Suites: noble noble-updates noble-backports
Components: main universe restricted multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg

Types: deb
URIs: https://mirrors.tuna.tsinghua.edu.cn/ubuntu-ports/
Suites: noble-security
Components: main universe restricted multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg

更新源

sudo apt update

安装 Docker

# 1. 下载官方安装脚本
curl -fsSL https://get.docker.com -o get-docker.sh

# 2. 运行脚本(由于换了源,速度应该很快)
sudo sh get-docker.sh

# 3. 将你的用户 (aclyyx) 添加到 docker 组
# 这样以后运行 docker 命令就不需要每次都加 sudo 了
sudo usermod -aG docker $USER

验证安装结果

docker version
docker compose version

安装配置 ZeroTier

安装

curl -s https://install.zerotier.com | sudo bash

加入网络

 sudo zerotier-cli join xxxxxx

应用部署

Memos

docker-compose.yml

services:
  memos:
    image: docker.gh-proxy.com/neosmemo/memos:stable
    container_name: memos
    restart: always
    volumes:
      - /home/aclyyx/d/server/memos/:/var/opt/memos
    ports:
      - "5230:5230"
    # Memos 默认使用 SQLite,无需额外数据库配置
    deploy:
      resources:
        limits:
          memory: 128M
    # 建议限制日志大小,防止撑爆 SD 卡
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "3"

Typecho

services:
  typecho:
    image: docker.gh-proxy.com/joyqi/typecho:nightly-php8.2-apache
    container_name: typecho
    restart: always
    ports:
      - "8090:80"  # 依然占用 8090 端口,这样你不用改路由器转发
    environment:
      - TYPECHO_SITE_URL=https://www.aclyyx.top
    volumes:
      - /home/aclyyx/d/server/typecho_data:/app/usr # 挂载数据目录,方便备份和迁移附件
    # 相比 Halo 的 512MB,这里给 128MB 都算豪华了
    deploy:
      resources:
        limits:
          memory: 128M

Docker

启动服务

sudo docker compose up -d

停止服务

sudo docker compose down

设置 Docker 服务开机启动

sudo systemctl enable docker.service
sudo systemctl enable containerd.service

数据备份

因为树莓派的系统、服务、数据都是跑在 TF 卡上的,数据安全方面稍微差那么一点点,于是想到定时备份;可备份也是在 TF 卡上,于是想到备份到 USB 硬盘上;可每次操作太麻烦了,于是想到是不是可以插硬盘自动备份。

创建备份脚本

vim /home/xxx/backup.sh

脚本文件内容

#!/bin/bash

# --- 配置区 ---
TARGET_UUID="A78E-CB4F"  # 从 blkid 命令获取
MOUNT_PATH="/mnt/usb_backup"      # 临时挂载点
SOURCE_DIR="/home/aclyyx/d/server"
DATE=$(date +%Y%m%d_%H%M%S)

echo "--- 备份任务开始: $DATE ---"

# 1. 创建挂载点目录(如果不存在)
mkdir -p $MOUNT_PATH

# 2. 尝试挂载磁盘
echo "正在尝试挂载 U 盘 (UUID: $TARGET_UUID)..."
mount -U $TARGET_UUID $MOUNT_PATH

# 3. 检查是否挂载成功
if [ $? -eq 0 ]; then
    echo "挂载成功,开始执行压缩备份..."
    
    # 执行备份(压缩 server 文件夹到 U 盘)
    tar -czf $MOUNT_PATH/backup_$DATE.tar.gz -C $SOURCE_DIR .
    
    if [ $? -eq 0 ]; then
        echo "备份文件创建成功!"
    else
        echo "备份失败:tar 命令执行出错。"
    fi

    # 4. 备份完成后卸载磁盘(重要:为了安全拔出)
    echo "正在卸载 U 盘以确保数据安全..."
    umount $MOUNT_PATH
    echo "--- 备份已完成,现在可以安全拔出 U 盘 ---"
else
    echo "错误:无法找到或挂载指定的 UUID 设备,请检查 U 盘是否插好。"
    exit 1
fi

获取 USB 设备的特征信息

为了防止随便插个 U 盘都运行备份,我们需要锁定你的备份盘。

  1. 插上你的 USB 备份盘。
  2. 输入以下命令查看它的 ID_VENDOR_ID (厂商 ID) 和 ID_MODEL_ID (产品 ID)
udevadm info -a -n /dev/sda1 | grep -E "idVendor|idProduct" | head -n 2

创建 udev 规则文件

sudo vim /etc/udev/rules.d/99-usb-backup.rules

粘贴以下内容(请将 12345678 替换为你刚才查到的值):

ACTION=="add", SUBSYSTEM=="block", ATTRS{idVendor}=="1234", ATTRS{idProduct}=="5678", RUN+="/usr/bin/systemctl start usb-backup.service"

创建 Systemd 服务

sudo vim /etc/systemd/system/usb-backup.service

文件内容

[Unit]
Description=Auto USB Backup Service

[Service]
Type=oneshot
User=root
ExecStart=/bin/bash /home/xxx/backup.sh

重载配置

sudo udevadm control --reload-rules
sudo systemctl daemon-reload

完成自动备份配置

至此,就可以插入 USB 磁盘自动完成数据备份了

我的服务器照片
我的服务器照片.jpg