机架管理前后端(rack/):FastAPI + SQLite + Vue3,经统一门户上线

- 后端 prrack:MQTT(phonerail-backend @ 127.0.0.1:1884)↔ 遥测入库 / 事件增量同步 / WebSocket 推送;
  命令白名单 + 重传同 seq;审计记门户 X-Auth-User(只绑 127.0.0.1,main.py 拒绝非回环)。
- 自动恢复:只看电流(平线 / 过低,服务器够不到手机 adb),先长按电源再断电重启,
  每小时限次后停手;默认逐台关闭。adb 探活接口 recovery.Prober 预留。
- 前端:总览 / 板子页(五路操作、电流电压曲线)/ 事件 / 操作记录 / 自动恢复;手机宽度可用。
- 部署 deploy/deploy.sh:服务器 Python 3.8 上先跑测试再替换;systemd phonerail-rack,每日备份。
- 门户应用 id 16、key rack(phonerail 已被需求文档站占用),授权 admin + staff。

测试 26 例(本机 3.14 / 服务器 3.8 均过)。线上板 b81f3fc9c8bc 在线,WS 经门户 101 + 1 条/s 遥测。

Co-Authored-By: Claude Opus 5.5 <[email protected]>
这个提交包含在:
zhou yang
2026-09-27 12:33:28 +08:00
共同撰写人 Claude Opus 5.5
父节点 a32fa06c43
当前提交 26c04ce878
共修改 34 个文件,包含 4031 行新增和 0 行删除
+8
查看文件
@@ -0,0 +1,8 @@
#!/bin/sh
# 每日 03:40 备份 rack.db(/etc/cron.d/phonerail-rack-backup),留 14 份。
# 用 sqlite3 .backup 而不是 cp:WAL 模式下直接拷文件可能拷到半个事务。
set -e
D=/root/phonerail-rack
mkdir -p $D/backup
sqlite3 $D/data/rack.db ".backup $D/backup/rack-$(date +%Y%m%d).db"
ls -1t $D/backup/rack-*.db | tail -n +15 | xargs -r rm -f
+40
查看文件
@@ -0,0 +1,40 @@
#!/usr/bin/env bash
# 本机 Git Bash 里跑:构建前端 → 传后端与 dist → 装依赖 → 服务器上跑测试 → 重启服务。
# bash rack/deploy/deploy.sh (默认走 home.example;内网通时 HOST=10.5.5.13)
set -euo pipefail
HOST=${HOST:-home.example}
R=/root/phonerail-rack
cd "$(dirname "$0")/.."
(cd frontend && pnpm build)
ssh "$HOST" "mkdir -p $R/backend $R/frontend $R/data $R/deploy"
tar --exclude='__pycache__' --exclude='.pytest_cache' --exclude='*.db*' -C backend -cf - . \
| ssh "$HOST" "rm -rf $R/backend.new && mkdir $R/backend.new && tar -xf - -C $R/backend.new"
tar -C frontend -cf - dist | ssh "$HOST" "rm -rf $R/frontend/dist.new && mkdir -p $R/frontend/dist.new && tar -xf - -C $R/frontend/dist.new --strip-components=1"
tar -C deploy -cf - . | ssh "$HOST" "tar -xf - -C $R/deploy"
ssh "$HOST" bash -s <<REMOTE
set -euo pipefail
cd $R
[ -x venv/bin/python ] || python3 -m venv venv
venv/bin/pip install -q -U pip 2>/dev/null
venv/bin/pip install -q -r backend.new/requirements.txt pytest httpx 2>&1 | grep -v InsecureRequestWarning || true
# 先在新代码上跑测试(Python 3.8 + 锁定版本),不过就不换上去
(cd backend.new && ../venv/bin/python -m pytest -q tests 2>&1 | tail -3)
rm -rf backend.old && [ -d backend ] && mv backend backend.old || true
mv backend.new backend
rm -rf frontend/dist.old && [ -d frontend/dist ] && mv frontend/dist frontend/dist.old || true
mv frontend/dist.new frontend/dist
chmod +x deploy/backup.sh
cp deploy/phonerail-rack.service /etc/systemd/system/phonerail-rack.service
echo '40 3 * * * root /root/phonerail-rack/deploy/backup.sh' > /etc/cron.d/phonerail-rack-backup
touch /var/log/phonerail-rack.log
systemctl daemon-reload
systemctl enable -q phonerail-rack
systemctl restart phonerail-rack
sleep 3
systemctl is-active phonerail-rack
curl -s http://127.0.0.1:7764/api/health; echo
ss -tlnp | grep 7764
REMOTE
+23
查看文件
@@ -0,0 +1,23 @@
[Unit]
Description=PhoneRail 机架管理(FastAPI,只绑 127.0.0.1:7764,经统一门户 phonerail.home.example:7755 访问)
After=network-online.target mosquitto.service
Wants=mosquitto.service
[Service]
Type=simple
WorkingDirectory=/root/phonerail-rack/backend
ExecStart=/root/phonerail-rack/venv/bin/python -m prrack.main \
--db /root/phonerail-rack/data/rack.db \
--static /root/phonerail-rack/frontend/dist \
--mqtt-env /root/phonerail/mqtt.env \
--bind 127.0.0.1 --port 7764
Restart=on-failure
RestartSec=3
StandardOutput=append:/var/log/phonerail-rack.log
StandardError=append:/var/log/phonerail-rack.log
NoNewPrivileges=true
ProtectSystem=full
PrivateTmp=true
[Install]
WantedBy=multi-user.target