Files
inkwatch/deploy/apply-openresty.sh
jkooe 5f419bcb91 refactor(rename): pmon → inkwatch 全量改名(阶段 A:代码层,不碰数据层标识)
## 范围与边界

**本次只改代码层**:客户端包名、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 后一并回归。
2026-11-08 20:07:30 +08:00

69 lines
2.8 KiB
Bash
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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 不对)"