# Operations Guide (`__PACKAGE_ARCH__`) ## Install ```bash ./scripts/install.sh ``` The installer is idempotent: - existing `.env` is kept; - existing Docker/Compose installation is reused; - repeated loading of packaged runtime, metrics, Prometheus and Grafana images for the package architecture is safe; - existing data directory is reused; - matching host/package architecture is required by default. ## Start ```bash ./scripts/start.sh ``` Start without waiting for the first snapshot: ```bash ./scripts/start.sh --no-wait-first-run ``` If you intentionally want to run this package on a different host architecture through QEMU/binfmt, first set: ```bash ALLOW_CROSS_ARCH=1 ``` Then rerun `./scripts/install.sh` or `./scripts/self-check.sh`, and only then will the scripts attempt to enable the matching binfmt handler. ## Stop and Restart ```bash ./scripts/stop.sh ./scripts/restart.sh ``` ## Status Checks ```bash ./scripts/status.sh ./scripts/self-check.sh ``` Important checks: - Docker/Compose availability; - runtime, metrics, Prometheus and Grafana images exist; - `HOST_DATA_DIR` is writable; - Compose config is valid; - latest run status; - metrics, Prometheus and Grafana endpoints; - whether `host_arch`, `package_arch`, and `arch_mode` match expectations. `status.sh` also prints: - `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` To verify RTR report ingestion: ```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 ``` Registration accepts only an absolute directory on the same host. The command retains a timestamped `.env` backup and updates only the metrics, Prometheus, and Grafana sidecars; the `ours-rp-soak` container ID must remain unchanged. ## Upgrade Extract the new package into a new directory and explicitly reuse the existing `.env` through the upgrade script: ```bash ./scripts/upgrade.sh --reuse-env-from /path/to/old-installer/.env ``` Configuration is merged in this order, with a key on the right overriding the same key on the left: ```text new .env.example < old .env < environment variables on this upgrade command ``` For example, override the next-run interval and Grafana password for this upgrade: ```bash INTERVAL_SECS=300 GRAFANA_ADMIN_PASSWORD='new-password' \ ./scripts/upgrade.sh --reuse-env-from /path/to/old-installer/.env ``` Before any image is loaded or container is started, upgrade verifies that every key declared by the new template is present and non-empty in the final `.env`. An explicit empty assignment fails, for example `INTERVAL_SECS= ./scripts/upgrade.sh ...`. Removed keys from an old `.env` are not copied, and the script reports key names only, never password-like values. The installer reads `.env` as Compose-compatible dotenv assignments. Do not put shell command substitutions or environment references such as `$HOME` in the file; use concrete values or command-level overrides instead. If the new package directory already has a `.env`, the upgrade script keeps it. In that case `--reuse-env-from` is not imported again, but environment variables from the current command still override the existing `.env`. When an older `.env` lacks a key introduced by the new package, the new `.env.example` default remains in the final `.env`. Upgrade fails before Docker operations if any final declared value is empty. Upgrade does not delete: - `runs/` - `logs/` - `state/rsync-mirror` - runtime configuration referenced by `.env` - Prometheus / Grafana data To validate periodic forced snapshot behavior, temporarily set: ```bash PERIODIC_SNAPSHOT_RESET=1 PERIODIC_SNAPSHOT_MAX_DELTAS=2 ``` Then confirm the latest `run-meta.json` contains: ```bash snapshot_reason=periodic_snapshot_delta_limit ``` And inspect the independent lifecycle state: ```bash jq '{last_run,last_success_snapshot,successful_deltas_since_snapshot,state_health}' \ "${HOST_DATA_DIR}/state/run-lifecycle-state.json" ``` After validation, restore: ```bash PERIODIC_SNAPSHOT_MAX_DELTAS=100 ``` ## Cleanup ```bash ./scripts/cleanup.sh --keep-runs 100 ./scripts/cleanup.sh --keep-runs 100 --execute ``` Cleanup is dry-run by default. Add `--execute` after reviewing the output.