
起因(废话)
个人站点服务从最早期的单纯云服务器部署,到结合家用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: 128MDocker
启动服务
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 盘都运行备份,我们需要锁定你的备份盘。
- 插上你的 USB 备份盘。
- 输入以下命令查看它的 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粘贴以下内容(请将 1234 和 5678 替换为你刚才查到的值):
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 磁盘自动完成数据备份了
我的服务器照片