docs: add onsite deployment guide and device reference table
- Step-by-step SSH deployment instructions (build, copy .app, write seed.json) - Multi-laptop deployment loop example - Device reference table: all 19 laptops with IPs and event_device_ids - Clarify seed.json location, format, and per-event API key workflow - Document architecture detection (x64 vs arm64) and SSH key setup
This commit is contained in:
157
README.md
157
README.md
@@ -10,6 +10,147 @@ This application serves as the "Native Mode" runtime for Aether podiums and devi
|
||||
- **Hardware Telemetry:** Direct access to CPU, RAM, and Network interface data.
|
||||
- **Remote Control:** Slide navigation and application control via WebSocket intents.
|
||||
|
||||
## 🖥️ Onsite Deployment
|
||||
|
||||
**Current hardware:** MacBook Air 2018 — Intel x64. All current deployments use `aether_launcher-darwin-x64`.
|
||||
**Future hardware:** Apple Silicon Macs use `aether_launcher-darwin-arm64`. Windows and Linux builds are planned.
|
||||
|
||||
SSH user on all laptops: **`speaker ready`**
|
||||
IP pattern: `192.168.32.1XX` (XX = zero-padded laptop number, e.g. 03 → `.103`). Find/replace this prefix for other onsite environments.
|
||||
|
||||
### Step 1 — Build the app (workstation)
|
||||
|
||||
```bash
|
||||
cd ~/OSIT_dev/aether_app_native_electron
|
||||
npm run package:mac
|
||||
# Produces builds/aether_launcher-darwin-x64/aether_launcher.app ← the one to deploy
|
||||
```
|
||||
|
||||
Only rebuild if source code has changed. The `.app` bundle is identical for all Intel laptops —
|
||||
only `~/seed.json` differs per device.
|
||||
|
||||
### Step 2 — Determine target architecture and copy the .app
|
||||
|
||||
Check the target Mac's CPU if unsure:
|
||||
```bash
|
||||
ssh "speaker ready"@192.168.32.103 "uname -m"
|
||||
# x86_64 → use aether_launcher-darwin-x64 (MacBook Air 2018 and all current Intel Macs)
|
||||
# arm64 → use aether_launcher-darwin-arm64 (Apple Silicon M1/M2/M3/M4)
|
||||
```
|
||||
|
||||
Copy from the workstation (replace `103` with the target IP last octet):
|
||||
```bash
|
||||
# Intel (current hardware):
|
||||
scp -r builds/aether_launcher-darwin-x64/aether_launcher.app \
|
||||
"speaker ready"@192.168.32.103:/Applications/aether_launcher.app
|
||||
|
||||
# Apple Silicon (future hardware):
|
||||
scp -r builds/aether_launcher-darwin-arm64/aether_launcher.app \
|
||||
"speaker ready"@192.168.32.103:/Applications/aether_launcher.app
|
||||
```
|
||||
|
||||
If `/Applications/aether_launcher.app` already exists, `scp -r` overwrites it. No need to
|
||||
remove the old version first.
|
||||
|
||||
### Step 3 — Write seed.json on the target laptop
|
||||
|
||||
The seed file lives at `~/seed.json` (`/Users/speaker ready/seed.json`) on each Mac.
|
||||
It is intentionally outside the app bundle so it can be updated without redeploying.
|
||||
|
||||
```bash
|
||||
ssh "speaker ready"@192.168.32.103 "cat > ~/seed.json" << 'EOF'
|
||||
{
|
||||
"event_device_id": "DEVICE_ID_FOR_THIS_LAPTOP",
|
||||
"aether_api_key": "YOUR_API_KEY",
|
||||
"primary_api_base_url": "https://api.oneskyit.com",
|
||||
"backup_api_base_url": "https://bak-api.oneskyit.com",
|
||||
"onsite_api_base_url": null
|
||||
}
|
||||
EOF
|
||||
```
|
||||
|
||||
`event_device_id` values by laptop — see the **Device Reference** table below.
|
||||
|
||||
### Step 4 — Verify
|
||||
|
||||
```bash
|
||||
# Confirm seed.json landed correctly
|
||||
ssh "speaker ready"@192.168.32.103 "cat ~/seed.json"
|
||||
|
||||
# Confirm the .app is present
|
||||
ssh "speaker ready"@192.168.32.103 "ls /Applications/aether_launcher.app"
|
||||
```
|
||||
|
||||
Then launch the app on the laptop and confirm it connects and shows the correct device name
|
||||
in the Launcher UI.
|
||||
|
||||
### Updating seed.json only (no app reinstall)
|
||||
|
||||
If only the device config needs updating (e.g. changing `event_device_id` or `onsite_api_base_url`):
|
||||
|
||||
```bash
|
||||
ssh "speaker ready"@192.168.32.103 "cat > ~/seed.json" << 'EOF'
|
||||
{ ... }
|
||||
EOF
|
||||
```
|
||||
|
||||
No need to re-copy the `.app`. Restart the Electron app after writing the new seed.
|
||||
|
||||
### Deploy to multiple laptops at once
|
||||
|
||||
Repeat Steps 2–3 for each laptop, or use a loop:
|
||||
|
||||
```bash
|
||||
for OCTET in 103 104 105 106; do
|
||||
echo "=== Deploying to 192.168.32.$OCTET ==="
|
||||
scp -r builds/aether_launcher-darwin-x64/aether_launcher.app \
|
||||
"speaker ready"@192.168.32.$OCTET:/Applications/aether_launcher.app
|
||||
done
|
||||
```
|
||||
|
||||
`seed.json` must still be written per-device (each has a unique `event_device_id`).
|
||||
|
||||
### Adding SSH key to a new laptop (first time only)
|
||||
|
||||
```bash
|
||||
ssh-copy-id "speaker ready"@192.168.32.1XX
|
||||
```
|
||||
|
||||
Run once per laptop before attempting any of the deploy steps above.
|
||||
|
||||
---
|
||||
|
||||
## 📋 Device Reference
|
||||
|
||||
| Laptop | IP Address | event_device_id | Notes |
|
||||
|--------|------------------|-----------------|--------------------------|
|
||||
| 01 | 192.168.32.101 | tFLL1fLQfnk | |
|
||||
| 02 | 192.168.32.102 | rpbfunVPEzw | |
|
||||
| 03 | 192.168.32.103 | 1EPfPX8kfw8 | |
|
||||
| 04 | 192.168.32.104 | zvgyLM5yieU | |
|
||||
| 05 | 192.168.32.105 | QOc046GoeSc | |
|
||||
| 06 | 192.168.32.106 | 2o8j6eb0L6s | |
|
||||
| 07 | 192.168.32.107 | Oa1tlxPEVSQ | |
|
||||
| 08 | 192.168.32.108 | fY4yznpUZ48 | |
|
||||
| 09 | 192.168.32.109 | YlgGCyjo9bY | |
|
||||
| 10 | 192.168.32.110 | GcTnFsp1mHI | |
|
||||
| 11 | 192.168.32.111 | 6z88m9oEZio | |
|
||||
| 12 | 192.168.32.112 | EggJqL2kWkA | |
|
||||
| 13 | 192.168.32.113 | O11eckHFdVE | |
|
||||
| 14 | 192.168.32.114 | reI0SecUEhI | |
|
||||
| 15 | 192.168.32.115 | crozxT8mA44 | |
|
||||
| 16 | 192.168.32.116 | 0nP4VZsvr2Q | |
|
||||
| 17 | 192.168.32.117 | Gm2gNqPGzLA | |
|
||||
| 19 | 192.168.32.119 | 6tpukvRVugU | (no laptop 18) |
|
||||
| x20 | 192.168.32.120 | rwLYnKUNd1M | old 04, spare/retired |
|
||||
|
||||
`aether_api_key`: all laptops share a single key per event deployment. The key is created in
|
||||
the Aether admin panel before the show and deleted after. Check `builds/seed.json` for the
|
||||
current key, or create a new one in Aether (Core → Accounts or Events → Devices API key section)
|
||||
before each deployment.
|
||||
|
||||
---
|
||||
|
||||
## ⚙️ Configuration
|
||||
|
||||
The application requires a `seed.json` file to identify the device and connect to the Aether API.
|
||||
@@ -19,20 +160,22 @@ The application requires a `seed.json` file to identify the device and connect t
|
||||
**Location: `~/seed.json`** (user's home directory — external to the app bundle by design)
|
||||
|
||||
This file is intentionally kept outside the application bundle so it can be edited per-device
|
||||
without re-signing or repackaging the app. On macOS this is `/Users/<username>/seed.json`.
|
||||
without re-signing or repackaging the app. On macOS this is `/Users/speaker ready/seed.json`.
|
||||
|
||||
Create/edit `~/seed.json`:
|
||||
Seed file format:
|
||||
```json
|
||||
{
|
||||
"event_device_id": "YOUR_DEVICE_ID",
|
||||
"event_device_id": "tFLL1fLQfnk",
|
||||
"aether_api_key": "YOUR_API_KEY",
|
||||
"primary_api_base_url": "https://api.yourdomain.com",
|
||||
"backup_api_base_url": null
|
||||
"primary_api_base_url": "https://api.oneskyit.com",
|
||||
"backup_api_base_url": "https://bak-api.oneskyit.com",
|
||||
"onsite_api_base_url": null
|
||||
}
|
||||
```
|
||||
|
||||
> **Note:** The `event_device_id` and `aether_api_key` values come from the Aether admin panel
|
||||
> (Events → Devices). Each physical device gets its own record and key.
|
||||
`event_device_id` is the `id_random` from the Aether `event_device` record for that physical
|
||||
laptop — see the Device Reference table above. `aether_api_key` is a shared key created per
|
||||
event deployment and deleted after the show.
|
||||
|
||||
### 2. Development Setup
|
||||
```bash
|
||||
|
||||
Reference in New Issue
Block a user