feat(deploy): add deploy script and per-device config files
deploy/deploy.sh — automated deploy: arch detection, scp .app, write seed.json, verify. Supports single laptop, list, or "all"; --seed-only flag skips .app copy for key-rotation runs. deploy/devices.conf — all 19 laptops (num / IP / event_device_id). deploy/event.env.example — template for gitignored event.env (API key). README updated: deploy/ table, script usage, manual steps moved to reference section. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
128
README.md
128
README.md
@@ -18,6 +18,15 @@ This application serves as the "Native Mode" runtime for Aether podiums and devi
|
||||
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.
|
||||
|
||||
Deploy files live in `deploy/`:
|
||||
|
||||
| File | Purpose |
|
||||
| --- | --- |
|
||||
| `deploy/deploy.sh` | Deploy script — handles arch detection, scp, and seed.json |
|
||||
| `deploy/devices.conf` | Laptop list: number, IP, `event_device_id` |
|
||||
| `deploy/event.env` | **Gitignored** — per-event API key and URLs (create from example) |
|
||||
| `deploy/event.env.example` | Template for `event.env` |
|
||||
|
||||
### Step 1 — Build the app (workstation)
|
||||
|
||||
```bash
|
||||
@@ -29,35 +38,62 @@ npm run package:mac
|
||||
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
|
||||
### Step 2 — Create event.env
|
||||
|
||||
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)
|
||||
cp deploy/event.env.example deploy/event.env
|
||||
# Edit deploy/event.env — fill in AETHER_API_KEY
|
||||
```
|
||||
|
||||
Copy from the workstation (replace `103` with the target IP last octet):
|
||||
Create the API key in the Aether admin panel before the show (Core → Accounts or Events →
|
||||
Devices API key section). All laptops share one key per event. Delete it after the show.
|
||||
|
||||
### Step 3 — Run the deploy script
|
||||
|
||||
```bash
|
||||
# Intel (current hardware):
|
||||
# Deploy specific laptops:
|
||||
./deploy/deploy.sh 01 02 03
|
||||
|
||||
# Deploy all laptops in devices.conf:
|
||||
./deploy/deploy.sh all
|
||||
|
||||
# Update seed.json only (no .app copy — e.g. when rotating the API key):
|
||||
./deploy/deploy.sh --seed-only all
|
||||
```
|
||||
|
||||
The script auto-detects each Mac's CPU architecture, copies the correct `.app` build, writes
|
||||
`seed.json`, and verifies. One SSH connection failure won't abort the batch — it logs and
|
||||
continues, then reports which laptops need a retry.
|
||||
|
||||
### Step 4 — Verify and launch
|
||||
|
||||
After the script completes, launch the app on each laptop and confirm it connects and shows
|
||||
the correct device name in the Launcher UI.
|
||||
|
||||
### 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 deploying.
|
||||
|
||||
---
|
||||
|
||||
### Manual deploy reference
|
||||
|
||||
The script covers the normal case. For one-off fixes or if the script isn't available:
|
||||
|
||||
```bash
|
||||
# Detect arch
|
||||
ssh "speaker ready"@192.168.32.103 "uname -m"
|
||||
# x86_64 → darwin-x64 | arm64 → darwin-arm64
|
||||
|
||||
# Copy .app (Intel example):
|
||||
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
|
||||
# Write seed.json:
|
||||
ssh "speaker ready"@192.168.32.103 "cat > ~/seed.json" << 'EOF'
|
||||
{
|
||||
"event_device_id": "DEVICE_ID_FOR_THIS_LAPTOP",
|
||||
@@ -67,57 +103,13 @@ ssh "speaker ready"@192.168.32.103 "cat > ~/seed.json" << 'EOF'
|
||||
"onsite_api_base_url": null
|
||||
}
|
||||
EOF
|
||||
|
||||
# Verify:
|
||||
ssh "speaker ready"@192.168.32.103 "cat ~/seed.json"
|
||||
```
|
||||
|
||||
`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
|
||||
|
||||
Reference in New Issue
Block a user