One-line install: a node still needs a manual git clone before setup.sh can run #4
Open
opened 2026-08-23 12:57:52 -04:00 by logan
·
3 comments
No Branch/Tag Specified
main
feat/45-trunk-recorder
fix/44-upload-spool
feat/41-disk-reporting
fix/41-updater-prune
fix/discord-voice-join
fix/updater-safe-directory
fix/28-amd64-images
fix/18-install-token-argv
fix/19-image-tag-skew
feat/discord-system
feat/24-p25-conventional
feat/local-ui-usable
fix/14-15-provision-ota
feat/sdr-pins
feat/secondary-sdr-priority
feat/second-sdr-adsb-ais
feat/publish-public-images
fix/install-rerun-pickup
pulse-recorder
v1.1.0
v1
Labels
Clear labels
area/ai-pipeline
area/auth
area/billing
area/correlation
area/discord
area/frontend
area/governance
area/growth
area/infra-deploy
area/legal
area/map
area/mqtt
area/node-ota
area/osint
area/recording-audio
area/sdr-radio
area/transcription
board
board:agenda
Scene/entity extraction, summarizer, AI providers, embeddings
AuthN/Z, roles, tenancy/org scoping, API keys, credentials
Plans, entitlements, AI spend accounting and caps
Incident correlation, linking, lifecycle, severity, corr_debug
Discord bot, radio bots, voice streams, bot tokens, webhooks
Web UI: Next.js app and the edge-node local dashboard
Board process, minutes, unattended runner, agent tooling
Go-to-market, outreach, cold email, discovery conversations
CI/CD, VM, registry, Firestore rules/indexes deploy, Terraform/Caddy
ToS, retention, licences/DAAs, CAN-SPAM, E&O, name suppression
Live map: pins, paths, tiles, legend, geocoding
Node-C2 MQTT, checkins, commands, node sweeper, dynsec
Node install, enrollment, OTA updater, image skew
External feeds: cameras, 511, ADS-B, AIS, outages, and their licences
Call capture, boundaries, PulseAudio, ring buffer, trimming, attribution
OP25 decode, SDR hardware/tuning, conventional, second SDR, mesh radio
STT, transcript correction, place verification, name accuracy
Board process: minutes and board-filed items
Needs board scoping at the next sitting; CEO removes the label once scoped
kind
behavior-bug
Wrong product behavior; the instrument reads it correctly
kind
measurement-bug
Corrupts the recording/instrument (debug data, evals, health checks), not behavior
priority
p0
Drop everything: prod broken, live exposure, or owner-ruled P0
priority
p1
Next up: blocks a gate, a customer, or core incident quality
priority
p2
Normal: real defect or planned work, schedule in turn
priority
p3
Low: minor, cosmetic, or someday
status
blocked
Waiting on an external party, spend, or another issue
status
in-progress
Branch or PR open against it
status
needs-decision
Waiting on an owner or board ruling before work
status
needs-info
Root cause or repro unknown; needs a reading first
type
bug
Something built is wrong: code, data, or a measurement
type
chore
Maintenance, refactor, tests, pinning, cleanup: no user-visible change
type
decision
A ruling to make or record: board minutes, owner calls, legal reviews
type
docs
Docs, runbooks, CLAUDE.md, skills, SOPs
type
feature
New capability or an extension of an existing one
type
security
Security, privacy, credential or tenant-isolation exposure
type
tracking
Tracker, checklist, initiative or punch-list spanning several changes
Milestone
No items
No Milestone
Projects
Clear projects
No projects
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: logan/node-26#4
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Bringing a node online is currently: clone the repo by hand,
cp .env.example .env, runbash setup.sh, answer its prompts, thenmake up. The product copy promises something quite different —drb-frontend/app/page.tsx:39says "Deploy a node — point a field SDR node at your local P25 or analog system", and the closing CTA says a user can "add a node, and start seeing incidents within minutes of your first call". There is no path that matches that.What exists.
Client/setup.shalready does most of the real work: installs Docker/make/curl via apt, writes.env, optionally builds and starts the stack. But it begins withcd "$(dirname "$0")"— it assumes the repo is already on the machine, so it cannot be the thing a user runs first. It is also fully interactive, which rules out an unattended flash-and-boot.What's missing is the step before it, and the credential plumbing:
That should: install prerequisites, fetch the node repo (or a release tarball) to a known path, write
.envwith the enrollment token and the C2 URL baked in, and bring the stack up — with no prompts when--tokenis supplied.The token half already works. Per-org enrollment tokens exist (
server-26routers/enrollment.py,X-Enrollment-Token), are minted from Settings → Nodes, and a node presents one toPOST /nodes/enrollto land in the right org. So the one-liner has a natural credential to carry, and this is what turns "clone and configure" into "paste one command".The frontend half is small and belongs with it:
drb-frontend/app/settings/nodes/page.tsx:87currently shows the raw token with "copy it now, it won't be shown again". It should show the whole install command with the token already in it, since that is the only thing anyone does with the token. Filing here because the script is the substantial part; the frontend change is a few lines once the URL is settled.Worth deciding as part of this:
install.shis hosted. Caddy already fronts the domain, so serving one static file is the cheap option; the alternative israw.git.vpn.cusano.net, which is not public.main. A one-liner that tracksmainmeans a node installed today and one installed next month are different software.setup.shkeeps its interactive mode or becomes the non-interactive tail ofinstall.shwith flags. Two scripts that both write.envwill drift..env.Deferred by board minutes #62 (2026-08-24), with a reason. Label
board:agendaremoved. Revisit at the first signed customer.CTO draft (server-26#60 rec. 8): Gate A blocks publishing any price, so there is no self-serve customer to onboard. Building install automation now is ahead of the funnel - it would be finished work sitting idle behind a gate that has not moved. COO wanted it done this week; overruled on sequencing, not on merit.
This is a deferral with a trigger, not a shelving: the first signed customer reopens it.
Binding condition if it ever proceeds, from CISO (server-26#61): the enrollment token must never appear as a plaintext CLI argument - shell history and
psboth expose it. Design for stdin or a file path.Refs server-26#62.
Board ruling — server-26 FINAL MINUTES #97, 2026-09-01. Held, with a date for its date.
This is blocked on a hosting decision for
install.shand a pin-vs-track-main call (DEFERRED.md), and it is not on the path to the 2026-09-05 beachhead checkpoint. It stays held.The COO (#90) was right that leaving it undated in the backlog is not a decision, so: this issue is re-dated at the 2026-09-05 sitting, not before. Owner: COO (#97 D8). Holding an item is legitimate; holding it undated is not, which is why the re-dating itself now has a date.
Note for whoever picks it up: the marketing copy already promises add a node, and start seeing incidents within minutes, and the real path is clone, copy
.env, answer prompts. That gap is a claims-accuracy problem as much as an onboarding one.Both halves are up as PRs:
feat/one-shot-install) —install.shone-shot bootstrap (preflight → docker → clone at pinned ref →.env→ enroll viaPOST /nodes/enroll+ credential poll, verified againstenrollment.py→compose pull && up -d→ approval step).setup.shdeleted; Makefile + README updated.feat/mint-panel-install-command) — the mint panel renders the full paste-readycurl … | sudo bashline.Owner TODO after both merge: re-cut
v1on node-26 at PR #5's merge commit so the tag containsinstall.sh(git tag -f v1 <sha> && git push -f origin v1). Runnpm run typecheckindrb-frontend/before merging #106 (not runnable in the authoring env).Still open (own issues, not this one): client-side enrollment belongs in the edge-node app (
mqtt_manager.py:73-85); compose source-overlay hazard (pinned ref vs image tags);install.shunrun on a real clean Pi OS.