## 范围与边界 **本次只改代码层**:客户端包名、Android/iOS/macOS 标识、环境变量前缀、Rust crate 名、 类名/文件名、以及全部文案与注释。**数据层标识一处未动**(卷名 `pmon_pg_data`、 `POSTGRES_USER/DB`、连接串默认值),那些在阶段 B 单独做迁移,理由见下。 统计:**114 个文件、1687 处**替换 + **8 个文件/目录重命名**。 ## 改了什么 | 类别 | 旧 | 新 | |---|---|---| | Dart 包名 | `pmon_client` | `inkwatch_client`(41 个文件的 import 同步) | | Android namespace | `com.pmon.pmon_client` | `com.inkwatch.eink` | | Android applicationId | `com.inkwatch.eink` | **保持不变** —— 它本来就已是新名 | | Kotlin 包目录 | `kotlin/com/pmon/pmon_client/` | `kotlin/com/inkwatch/eink/` | | macOS bundle | `com.pmon.pmonClient` | `com.inkwatch.eink` | | 环境变量 | `PMON_*`(12 个) | `INKWATCH_*` | | Rust crate | `pmon-core` / `pmon_core` | `inkwatch-core` / `inkwatch_core` | | 动态库 | `libpmon_core.dylib` | `libinkwatch_core.dylib` | | 类/文件 | `PmonApp` `PmonColors` `PmonChannel` `PmonCollectorService` `pmon_agent.dart` … | `Inkwatch*` / `inkwatch_*.dart` | ## 三处**必须单独说**的判断 **① applicationId 刻意没动。** `build.gradle.kts:49` 有既有说明:水墨屏专属版用 `com.inkwatch.eink`,与主干通用版**刻意不同**,为的是两版本能在同一台手机上共存 (versionCode 各自递增,同包名会互相覆盖且降级被拒装)。它已经是新名,动它反而 破坏这个设计。我改的是 `namespace`(内部分包名,只影响编译期),并把它统一到同一个 `com.inkwatch.eink`。 **② 局域网 P2P 线协议前缀一起改了**(`PMON-PUNCH:` / `PMON-PONG:` / `PMON-FRAME:` → `INKWATCH-*`)。这**不是纯文案**:两端必须同时升级,否则新旧版本在同一局域网里互不 认。判断依据是这三个前缀只用于同一用户的两台设备直连,且当前尚未对外发布;若以后 要支持跨版本,正确做法是加协议版本协商而不是回退旧前缀。 **③ 数据层标识一处未动。** `deploy/` 下 28 个文件仍是 `pmon`,因为卷名/库名/库用户 的改动会直接导致连不上库或指向新空卷(`docker-compose.all.yml:26-29` 里写着: 改名会让 compose 去找 `inkwatch_pg_data` 这套新空卷,等于把生产清库)。实测当前 数据是 **2.5GB、128 个账号、58 台设备**,不是测试库。 ## 安全网 动手前做了完整备份: `.backup-rename-20261108/pmon_before_rename.dump`(`pg_dump -Fc`,152MB), 并记录了迁移前各表行数基线,供阶段 B 逐表比对。 ## 验证 客户端全量 **595 通过 / 2 失败** —— 与改名前的数字**完全一致**,两条仍为 `libinkwatch_core.dylib` 未编译(Rust 核心未构建,环境缺口)。**数字一致**是这次 改名的核心判据:一个纯机械改名必须不改变任何测试结果,若通过数变了就说明改坏了东西。 服务端代码只动了注释与环境变量名,逻辑零改动,阶段 B 后一并回归。
69 lines
2.8 KiB
Bash
Executable File
69 lines
2.8 KiB
Bash
Executable File
#!/bin/sh
|
||
# 把仓库里的接入层配置落到 1Panel OpenResty(自动替换脱敏 IP)
|
||
#
|
||
# ── 为什么要有这个脚本 ───────────────────────────────────────────────
|
||
# `openresty-inkwatch-ip.conf` 里的 server_name 是**脱敏占位** `203.0.113.10`
|
||
# (仓库不写真实 IP 是纪律)。直接 `scp` 覆盖生产会栽:
|
||
# server_name 不匹配任何真实 Host → 落到 1Panel 的 default_server
|
||
# → 那个站带着 WAF → **所有请求 403**,而且 `/healthz` 仍是 200,
|
||
# 极容易误判为"配置生效了、服务是好的"(2026-10-17 实际踩过)。
|
||
#
|
||
# ── 用法 ─────────────────────────────────────────────────────────────
|
||
# ./apply-openresty.sh <SERVER_IP> # 在服务器上跑
|
||
# ./apply-openresty.sh <SERVER_IP> --dry-run # 只打印将要写入的内容
|
||
#
|
||
# 前提:本脚本在**服务器上**执行(需要 sudo 与 openresty 容器)。
|
||
set -eu
|
||
|
||
IP="${1:-}"
|
||
MODE="${2:-}"
|
||
CONF_DIR=/opt/1panel/www/conf.d
|
||
SRC="$(dirname "$0")/openresty-inkwatch-ip.conf"
|
||
DST="$CONF_DIR/inkwatch-ip.conf"
|
||
|
||
if [ -z "$IP" ]; then
|
||
echo "用法: $0 <真实IP> [--dry-run]" >&2
|
||
exit 2
|
||
fi
|
||
|
||
[ -f "$SRC" ] || { echo "找不到 $SRC(请在仓库 deploy/ 目录下执行)" >&2; exit 1; }
|
||
|
||
TMP=$(mktemp)
|
||
# **全文**替换:模板里有两处占位——server_name 与"客户端指向这里"的文案。
|
||
# 只换 server_name 会让文案仍写着 203.0.113.10(自检会拦下,这是好事)。
|
||
sed "s/203\.0\.113\.10/$IP/g" "$SRC" > "$TMP"
|
||
|
||
# 自检:替换后必须**不再**含占位 IP,否则说明模板变了、sed 失配
|
||
if grep -q '203\.0\.113\.10' "$TMP"; then
|
||
echo "✗ 替换失败:生成的文件里仍含占位 IP 203.0.113.10" >&2
|
||
echo " 检查 openresty-inkwatch-ip.conf 的 server_name 行是否被改过" >&2
|
||
rm -f "$TMP"; exit 1
|
||
fi
|
||
|
||
if [ "$MODE" = "--dry-run" ]; then
|
||
echo "── 将写入 $DST 的内容(前 40 行)──"
|
||
head -40 "$TMP"
|
||
rm -f "$TMP"; exit 0
|
||
fi
|
||
|
||
sudo cp "$TMP" "$DST"
|
||
sudo chmod 600 "$DST"
|
||
rm -f "$TMP"
|
||
echo "✓ 已写入 $DST(server_name=$IP)"
|
||
|
||
# 容器名带随机后缀,动态取
|
||
C=$(docker ps --format '{{.Names}}' | grep -m1 '1Panel-openresty' || true)
|
||
[ -n "$C" ] || { echo "✗ 找不到 1Panel-openresty 容器" >&2; exit 1; }
|
||
|
||
docker exec "$C" nginx -t
|
||
docker exec "$C" nginx -s reload
|
||
echo "✓ 已 reload($C)"
|
||
|
||
echo
|
||
echo "── 自检(从本机回环,带真实 Host)──"
|
||
for p in /healthz /health; do
|
||
printf ' %-10s ' "$p"
|
||
curl -s -m 5 -o /dev/null -w '%{http_code}\n' -H "Host: $IP" "http://127.0.0.1$p" || true
|
||
done
|
||
echo " 期望:/healthz 200、/health 200(若 /health 403 说明 WAF 覆盖没生效或 server_name 不对)"
|