# 运维手册（`__PACKAGE_ARCH__`）

## 安装

```bash
./scripts/install.sh
```

安装脚本是幂等的：

- 已有 `.env` 不覆盖；
- 已安装 Docker/Compose 则跳过；
- 包内 runtime、metrics、Prometheus、Grafana 对应架构镜像重复加载是安全的；
- 数据目录已存在则复用；
- 默认要求宿主与包架构匹配。

## 启动

```bash
./scripts/start.sh
```

如需后台启动后不等待首轮 snapshot：

```bash
./scripts/start.sh --no-wait-first-run
```

如需显式允许异构主机通过 QEMU/binfmt 跑包，先在 `.env` 中设置：

```bash
ALLOW_CROSS_ARCH=1
```

然后重新执行 `./scripts/install.sh` 或 `./scripts/self-check.sh`，脚本才会尝试启用对应 binfmt。

## 停止和重启

```bash
./scripts/stop.sh
./scripts/restart.sh
```

## 状态检查

```bash
./scripts/status.sh
./scripts/self-check.sh
```

重点检查项：

- Docker/Compose 可用；
- runtime、metrics、Prometheus、Grafana 镜像存在；
- `HOST_DATA_DIR` 可写；
- Compose 配置合法；
- 最新 run 状态；
- metrics、Prometheus、Grafana endpoint；
- `host_arch`、`package_arch`、`arch_mode` 是否符合预期。

`status.sh` 还会显示：

- `package_arch`
- `package_platform`
- `runtime_image`
- `metrics_image`
- `allow_cross_arch`
- `periodic_snapshot_reset`
- `periodic_snapshot_max_deltas`
- `rtr_report_dir`
- `rtr_report_container_dir`

如需确认 RTR report 已接入：

```bash
./scripts/register_rtr_monitor.sh --report-dir /root/rpki/report --dry-run
./scripts/register_rtr_monitor.sh --report-dir /root/rpki/report
./scripts/status.sh
curl -s "http://127.0.0.1:${METRICS_PORT:-9556}/metrics" | grep '^ours_rp_rtr_' | head
```

注册只支持同机的绝对目录。注册命令会保留一份带时间戳的 `.env` 备份，并且只更新 metrics、Prometheus、Grafana 三个旁路容器；`ours-rp-soak` 的容器 ID 应保持不变。

## 升级

把新安装包解压到新目录后，推荐通过升级脚本显式复用旧 `.env`：

```bash
./scripts/upgrade.sh --reuse-env-from /path/to/old-installer/.env
```

配置按以下优先级合并，右侧同名键覆盖左侧：

```text
新包 .env.example < 旧 .env < 本次 upgrade 命令的环境变量
```

例如，临时调整下轮触发间隔和 Grafana 密码：

```bash
INTERVAL_SECS=300 GRAFANA_ADMIN_PASSWORD='new-password' \
  ./scripts/upgrade.sh --reuse-env-from /path/to/old-installer/.env
```

升级会在加载镜像或启动容器前检查：新模板声明的所有变量在最终 `.env` 中都必须存在且非空。显式传入空值会失败，例如 `INTERVAL_SECS= ./scripts/upgrade.sh ...`。旧 `.env` 中已不在新模板内的键不会复制，脚本只输出相关键名而不会输出密码等值。

installer 按与 Compose 一致的 dotenv 赋值格式读取 `.env`。不要在文件中使用 Shell 命令替换或 `$HOME` 一类环境变量引用；请使用确定的值，或在执行 upgrade 时通过命令环境变量覆盖。

如果新目录已经存在 `.env`，升级脚本会保留它，不覆盖；此时 `--reuse-env-from` 不会再次导入旧配置，但本次命令的环境变量仍会覆盖已存在的 `.env`。

旧 `.env` 缺少新版本新增的键时，新包 `.env.example` 的默认值会保留在最终 `.env` 中；任一最终值为空则升级会在 Docker 操作前失败。

升级不会删除以下数据：

- `runs/`
- `logs/`
- `state/rsync-mirror`
- `.env` 对应的运行配置
- Prometheus / Grafana 数据

验证定期 forced snapshot 时，可临时设置：

```bash
PERIODIC_SNAPSHOT_RESET=1
PERIODIC_SNAPSHOT_MAX_DELTAS=2
```

然后检查最新 `run-meta.json` 应出现：

```bash
snapshot_reason=periodic_snapshot_delta_limit
```

并检查独立 lifecycle 状态：

```bash
jq '{last_run,last_success_snapshot,successful_deltas_since_snapshot,state_health}' \
  "${HOST_DATA_DIR}/state/run-lifecycle-state.json"
```

验证完成后恢复：

```bash
PERIODIC_SNAPSHOT_MAX_DELTAS=100
```

## 清理

```bash
./scripts/cleanup.sh --keep-runs 100
./scripts/cleanup.sh --keep-runs 100 --execute
```

默认 dry-run，确认后加 `--execute`。
