Files
kit-busrouter/docs/device-identity-synology.md
T
allen f15ac69925 feat: kit-busrouter v2.0 — complete Synology + GL fleet router platform
Includes:
- package/ GL-XE3000 kit-busrouter (opkg)
- scripts/provision.sh (GL) and provision-synology.sh (Synology)
- syno-balance/ — new WAN balancer replacing aiwanbal (SmartWAN adapter)
- kit-connect/ — unified connectivity SPK (Tailscale + reverse SSH)
- docs/deployment/synology-rt2600ac-checklist.md — 62-point checklist
- docs/provisioning/device-identity.md — fleet identity spec
- docs/pilot/checklist.md — field pilot validation
- x4078_20260721.dss — reference config backup

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-22 00:07:14 +00:00

172 lines
6.0 KiB
Markdown

# Pioneer Bus Router — Device Identity & Provisioning (Synology SRM)
**Last updated:** 2026-07-21
**Target hardware:** Synology RT2600ac, SRM 1.3.1+
---
## 1. Fleet-wide constants
| Parameter | Value |
|-----------|-------|
| WiFi SSID (2.4 + 5 GHz) | `<DEVICE_ID>` — SSID = device ID (e.g. `B0042`) |
| WiFi password | `Pioneer123` |
| Admin SSH user | `root` (enabled via SRM Control Panel → Terminal & SNMP) |
| Admin password | `Pioneer321!` |
| Timezone | `UTC` |
| Cellular modem | Eyeride Eyenet (OpenWrt) at `192.168.10.1:8080` |
| WAN balancer | aiwanbal (SPK package), environment=**mobile** |
| VPN transport | **Tailscale** (not WireGuard) |
| Fleet hub Tailscale IP | `100.76.128.1` (the hub's Tailscale address) |
| Telemetry endpoint | `http://<HUB_TAILSCALE_IP>:8080/api/telemetry` |
| Telemetry interval | 60 s (via cron) |
| Telemetry buffer dir | `/tmp/busrouter/telemetry-buf/` (60-file cap) |
| SSH jump key | `busfleet-hub-jump` (ed25519) |
**Platform identifier:** `"platform":"synology"` in telemetry JSON payloads.
---
## 2. Per-device parameters
| DEVICE_ID | Tailscale IP | Eyeride IP | Notes |
|-----------|-------------|------------|-------|
| `bus02` | *(auto)* | `192.168.10.1` | bench unit |
| `B0002` | *(auto)* | `192.168.10.1` | first production Synology unit |
Tailscale IPs are auto-assigned by the coordination server (100.x.y.z range).
---
## 3. Provisioning procedure
### Prerequisites
- SRM 1.3.1+ with SSH enabled (Control Panel → Terminal & SNMP → Enable SSH)
- SD card inserted
- LAN access at `192.168.1.1`
- `aiwanbal-latest.spk` at `/tmp/` on the router
- Tailscale SPK installed
- Tailscale auth key generated
- Eyeride Eyenet reachable at `192.168.10.1`
### Steps
```sh
# 1. Build + copy files
cd /home/node/workspace/aiwanbal && bash build.sh
scp -O scripts/provision-synology.sh \
package/kit-busrouter/files/usr/lib/busrouter/telemetry-synology.sh \
kitadmin@192.168.1.1:/tmp/
scp -O aiwanbal-*.spk kitadmin@192.168.1.1:/tmp/aiwanbal-latest.spk
# 2. SSH in and run
ssh kitadmin@192.168.1.1
sudo -i
chmod +x /tmp/provision-synology.sh /tmp/telemetry-synology.sh
/tmp/provision-synology.sh B0042 "tskey-auth-xxxx"
# Reboots after 5 s.
```
### Verification
```sh
ssh root@<router-ip>
cat /etc/busrouter/device-id # B0042
synopkg status aiwanbal # "started"
tailscale status # "active"
grep telemetry /etc/crontab # cron job present
/usr/lib/busrouter/telemetry-synology.sh # dry-run
```
---
## 4. Architecture differences: GL vs Synology
| Component | GL-XE3000 (OpenWrt) | Synology RT2600ac (SRM) |
|-----------|--------------------|--------------------------|
| WAN balancer | kit-busrouter + mwan3 | aiwanbal + SRM SmartWAN |
| State dir | `/tmp/busrouter/` | `/tmp/aiwanbal/` |
| VPN tunnel | WireGuard (`wgclient1`) | Tailscale (`tailscale0`) |
| Hub IP | `10.88.0.1` (WG) | `100.76.128.1` (Tailscale) |
| Telemetry trigger | daemon loop (30s) | cron (60s) |
| GPS source | Quectel AT commands | Eyeride ubus JSON-RPC |
| Modem signal | Quectel ubus | aiwanbal-modem.sh drivers |
| Starlink | gRPC to dish | aiwanbal-starlink.sh |
| Package mgmt | opkg | synopkg |
| Init system | procd | start-stop-status |
| Identity file | `/etc/busrouter/device-id` | `/etc/busrouter/device-id` *(same)* |
---
## 5. Telemetry JSON schema
```json
{
"device_id": "B0042",
"timestamp": 1737500000,
"uptime": 86400,
"version": "1.0",
"platform": "synology",
"sel_primary": "wan1",
"gps": {"lat": 40.7128, "lon": -74.0060, "fix": 2},
"wan": {
"wan1": {"score": 85, "latency_ms": 15, "dl_mbps": 50.0, "ul_mbps": 10.0,
"jitter_ms": 2, "loss_pct": 0, "rsrp_dbm": -80, "rsrq_db": -12,
"sinr_db": 8, "technology": "5G-NR", "carrier": "Eyeride"},
"wan2": {"score": 70, "latency_ms": 25, "dl_mbps": 30.0, "ul_mbps": 5.0,
"jitter_ms": 5, "loss_pct": 1, "rsrp_dbm": -90, "rsrq_db": -15,
"sinr_db": 3, "technology": "LTE", "carrier": "Peplink"}
},
"starlink": {"quality": 0, "latency_ms": null, "obstructed": 0, "outage": 0}
}
```
### Field mapping: aiwanbal state → telemetry JSON
| Telemetry field | aiwanbal state file | Notes |
|----------------|--------------------|-------|
| `wan.*.score` | `wanN_score_avg` | 3-sample rolling average |
| `wan.*.dl_mbps` | `wanN_throughput` | B/s → Mbps |
| `wan.*.ul_mbps` | `wanN_upload` | B/s → Mbps |
| `wan.*.latency_ms` | `wanN_latency` | ping probe result |
| `wan.*.jitter_ms` | `wanN_jitter` | ping jitter |
| `wan.*.loss_pct` | `wanN_packet_loss` | % |
| `wan.*.rsrp_dbm` | `wanN_rsrp` | cellular signal |
| `wan.*.technology` | `wanN_technology` | "5G-NR", "LTE", etc. |
| `wan.*.carrier` | `wanN_modem_type` | mapped to name |
| `sel_primary` | `wan0_mode` + states | "wan1" or "wan2" |
| `gps.*` | Eyeride ubus | null if unavailable |
| `starlink.*` | `wan0_starlink_*` | null if no dish |
### Hub-side: GL vs Synology payloads
| Field | GL value | Synology value |
|-------|---------|---------------|
| `platform` | absent or `"openwrt"` | `"synology"` |
| `wan` keys | `modem_0001`, `wan` | `wan1`, `wan2` |
| `sim_slot` | present (1 or 2) | absent |
The hub should handle both schemas.
---
## 6. Checklist — new Synology device before field deployment
- [ ] Device ID assigned and recorded in fleet registry
- [ ] SD card inserted and mounted
- [ ] SRM updated to latest 1.3.1+
- [ ] SSH enabled
- [ ] Tailscale SPK installed and authenticated
- [ ] aiwanbal SPK built and installed
- [ ] aiwanbal configured: ENVIRONMENT=mobile, SPEEDTEST_AUTO=0
- [ ] Eyeride Eyenet reachable at `192.168.10.1:8080`
- [ ] `provision-synology.sh` run end-to-end; device rebooted cleanly
- [ ] WiFi visible as `<DEVICE_ID>`, pw `Pioneer123`
- [ ] SSH to `root@<router-ip>` succeeds
- [ ] `synopkg status aiwanbal` shows "started"
- [ ] `tailscale status` shows "active"
- [ ] `/etc/busrouter/device-id` correct
- [ ] Telemetry cron job present
- [ ] Telemetry dry-run produces valid JSON
- [ ] Hub receiving telemetry payloads with `"platform":"synology"`