Skip to content

Commit c2f9a85

Browse files
Sbussisoclaude
andcommitted
docs: align CloudNode docs with foreground-TUI + system-FFmpeg reality
Reality drift since v0.1.31 / v0.1.35: the Windows Service is no longer the recommended runtime (the Start menu shortcut launches a foreground TUI dashboard), and FFmpeg is not bundled (the wizard offers winget / brew / apt install). The docs site still described the old world, which made the install saga we just lived through harder than it needed to be. Fixes: - CloudNodeSetup.jsx — primary path = Start menu shortcut / foreground TUI; service section reframed as optional 24/7 path. FFmpeg description now points to system package managers, not a 150 MB auto-download. Data-dir resolution clarified for Windows. - Troubleshooting.jsx — FFmpeg recovery references winget / brew / apt instead of the deleted ./ffmpeg/bin/ auto-download path. - Faq.jsx — replaces "MSI vs PowerShell installer" question (the PowerShell installer was retired in v0.1.31) with "How do I install on Windows?" pointing at the actual current flow. - Deployment.jsx — systemd unit now matches what install.sh actually writes (~/.sourcebox-sentry/, sourcebox-sentry-cloudnode run, SupplementaryGroups=video, NO_COLOR/TERM env). Adds note that the install script offers to write the unit automatically. - GettingStarted.jsx — drops "installer downloads FFmpeg automatically on Windows" line. - context.jsx — fixes the OsTabs MSI blurb claiming the service auto-starts; updates the comment about why PowerShell installer was retired. Frontend build is clean (vite dist generated, 492ms). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent b0714e4 commit c2f9a85

6 files changed

Lines changed: 111 additions & 64 deletions

File tree

frontend/src/pages/docs/CloudNodeSetup.jsx

Lines changed: 35 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,15 @@ function CloudNodeSetup() {
1717
<OsTabs id="cn" />
1818
<p style={{ marginTop: '0.75rem', fontSize: '0.9rem', color: 'var(--text-muted)' }}>
1919
{os === 'windows'
20-
? 'After the MSI finishes, open PowerShell as Administrator to run setup.'
21-
: 'Run in your terminal.'}
20+
? 'After the MSI finishes, click the SourceBox Sentry CloudNode shortcut from the Start menu — first launch runs the setup wizard, every launch after streams cameras directly.'
21+
: 'Run in your terminal. The script downloads the binary, runs setup, and (on Linux + systemd) optionally installs a service unit so the node restarts on boot.'}
2222
</p>
2323

2424
<h3>Setup Wizard</h3>
2525
<p>
26-
After installation, run the wizard to enrol the node and detect cameras:
26+
On Windows the Start menu shortcut launches the wizard automatically the first time.
27+
On Linux/macOS the install script invokes it inline. To re-run the wizard later
28+
(e.g. to re-enrol or change the API URL):
2729
</p>
2830
<div className="docs-code-block">
2931
<code>{os === 'windows' ? 'sourcebox-sentry-cloudnode.exe setup' : 'sourcebox-sentry-cloudnode setup'}</code>
@@ -33,29 +35,33 @@ function CloudNodeSetup() {
3335
<ol>
3436
<li>
3537
<strong>Prerequisites</strong> — detects platform, finds your USB cameras, verifies FFmpeg.
36-
On Windows, if FFmpeg isn't installed the wizard offers to{' '}
37-
<strong>download it for you</strong> (~150 MB, lands under{' '}
38-
<code>C:\ProgramData\SourceBoxSentry\ffmpeg\</code>). Linux/macOS users get pointed
39-
at <code>apt install ffmpeg</code> / <code>brew install ffmpeg</code>.
38+
If FFmpeg isn't on PATH the wizard offers to install it via the OS package manager:{' '}
39+
<code>winget install Gyan.FFmpeg</code> on Windows, <code>brew install ffmpeg</code> on
40+
macOS, the matching <code>apt</code> / <code>dnf</code> / <code>pacman</code> command
41+
on Linux. CloudNode always uses the system FFmpeg — there is no bundled copy.
4042
</li>
4143
<li><strong>Configuration</strong> — prompts for your Node ID + API key (from Command Center → Settings → Add Node).</li>
4244
<li><strong>Install</strong> — saves the encrypted config and detects the best video encoder (NVENC / QSV / AMF, or libx264 fallback).</li>
4345
<li><strong>Verify</strong> — round-trips a credential check against Command Center.</li>
4446
<li><strong>Launch</strong> — optionally auto-starts the node.</li>
4547
</ol>
46-
<p style={{ fontSize: '0.9rem', color: 'var(--text-muted)' }}>
47-
On a fresh Windows machine with no FFmpeg, the whole flow takes about
48-
2 minutes including the FFmpeg download (depends on your connection).
49-
</p>
5048

5149
{os === 'windows' && (
5250
<>
53-
<h3>Running as a Windows Service (MSI install)</h3>
51+
<h3>Running on Windows</h3>
52+
<p>
53+
The Start menu shortcut launches CloudNode as a foreground app — a terminal window
54+
opens with the live dashboard, FFmpeg starts pushing segments, and the node stays
55+
online for as long as the window is open. This is the recommended path for everyday
56+
use: you can see what's happening, hit a slash command, and close it cleanly.
57+
</p>
58+
59+
<h4>Auto-start on boot (optional)</h4>
5460
<p>
55-
If you installed via the MSI, CloudNode is registered as the{' '}
56-
<code>SourceBoxSentryCloudNode</code> service but is set to manual start so the first
57-
run can't fail before you've completed setup. After running setup, start it once
58-
and then flip it to auto-start so it survives reboots:
61+
For 24/7 unattended operation, the MSI also registers a Windows Service named{' '}
62+
<code>SourceBoxSentryCloudNode</code> set to <strong>manual start</strong>. Flip it
63+
to automatic if you want CloudNode to come up after a reboot without anyone logging
64+
in:
5965
</p>
6066
<div className="docs-code-block">
6167
<code>{`Start-Service SourceBoxSentryCloudNode
@@ -68,26 +74,26 @@ Set-Service -Name SourceBoxSentryCloudNode -StartupType Automatic`}</code>
6874
<li><code>Stop-Service SourceBoxSentryCloudNode</code> / <code>Restart-Service SourceBoxSentryCloudNode</code></li>
6975
<li><code>Get-Content -Wait C:\ProgramData\SourceBoxSentry\logs\cloudnode-service.<i>YYYY-MM-DD</i></code> — tail today's service log</li>
7076
</ul>
77+
<p style={{ fontSize: '0.9rem', color: 'var(--text-muted)' }}>
78+
Don't run the foreground TUI and the service at the same time — only one process
79+
should hold the cameras.
80+
</p>
7181

7282
<h3>Uninstalling</h3>
7383
<p>
7484
Use <strong>Settings → Apps → Installed apps → SourceBox Sentry CloudNode → Uninstall</strong>.
75-
That stops the service, removes the binary, removes the Windows Service
76-
registration, and removes everything under{' '}
77-
<code>C:\ProgramData\SourceBoxSentry\</code> — including your encrypted config,
78-
recordings, and the auto-installed FFmpeg. After uninstall the machine is
79-
in a true "never installed" state.
85+
That stops the service (if running), removes the binary, removes the Windows Service
86+
registration, and wipes <code>C:\ProgramData\SourceBoxSentry\</code> — including your
87+
encrypted config and recordings. FFmpeg installed via <code>winget</code> stays put
88+
because it's a separate package owned by the OS package manager.
8089
</p>
8190
<p style={{ fontSize: '0.9rem', color: 'var(--text-muted)' }}>
82-
Upgrades (re-running a newer MSI) preserve everything under ProgramData;
83-
only an explicit uninstall wipes it. The CLI{' '}
84-
<code>sourcebox-sentry-cloudnode uninstall</code> subcommand is for source-built
85-
installs and redirects MSI users to Settings → Apps if you accidentally
86-
run it on an MSI machine.
91+
Upgrades (re-running a newer MSI) preserve everything under ProgramData; only an
92+
explicit uninstall wipes it.
8793
</p>
8894

8995
<p>
90-
See the CloudNode <a href="https://github.com/SourceBox-LLC/opensentry-cloud-node#running-as-a-windows-service" target="_blank" rel="noopener noreferrer">README</a> for the full reference.
96+
See the CloudNode <a href="https://github.com/SourceBox-LLC/opensentry-cloud-node#quick-start" target="_blank" rel="noopener noreferrer">README</a> for the full reference.
9197
</p>
9298
</>
9399
)}
@@ -98,8 +104,8 @@ Set-Service -Name SourceBoxSentryCloudNode -StartupType Automatic`}</code>
98104
</p>
99105
<ul>
100106
<li><code>$SOURCEBOX_SENTRY_DATA_DIR/node.db</code> if the env var is set (Docker)</li>
101-
<li><code>./data/node.db</code> if it already exists (legacy / <code>cargo build</code> installs)</li>
102-
<li><code>C:\ProgramData\SourceBoxSentry\node.db</code> on Windows MSI installs</li>
107+
<li><code>./data/node.db</code> if it already exists — Linux/macOS only, for legacy <code>cargo build</code> installs (Windows always uses the platform default below)</li>
108+
<li><code>C:\ProgramData\SourceBoxSentry\node.db</code> on Windows</li>
103109
<li><code>./data/node.db</code> otherwise (fresh manual install on Linux/macOS)</li>
104110
</ul>
105111
<p>The API key is encrypted at rest. Key settings:</p>

frontend/src/pages/docs/Deployment.jsx

Lines changed: 44 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -83,37 +83,70 @@ cargo build --release
8383
</div>
8484

8585
<h3>systemd service (Linux)</h3>
86-
<p>To run CloudNode as a background service on boot, create <code>/etc/systemd/system/sourcebox-sentry-cloudnode.service</code>:</p>
86+
<p>
87+
The easiest path is the install script — after the wizard finishes, it offers to write
88+
the systemd unit and enable it for you. If you'd rather wire it up manually, the unit
89+
below mirrors what the script would have written. It assumes the binary lives at{' '}
90+
<code>~/.sourcebox-sentry/sourcebox-sentry-cloudnode</code> (the install script's
91+
default <code>INSTALL_DIR</code>) and the wizard wrote <code>node.db</code> under{' '}
92+
<code>$HOME</code>; substitute your own paths if you installed elsewhere.
93+
</p>
94+
<p>Drop into <code>/etc/systemd/system/sourcebox-sentry-cloudnode.service</code>:</p>
8795
<div className="docs-code-block">
8896
<code>{`[Unit]
8997
Description=SourceBox Sentry CloudNode
98+
Documentation=https://opensentry-command.fly.dev
9099
After=network-online.target
91100
Wants=network-online.target
92101
93102
[Service]
94103
Type=simple
95-
User=sentry
96-
WorkingDirectory=/opt/sourcebox-sentry
97-
ExecStart=/opt/sourcebox-sentry/sourcebox-sentry-cloudnode
98-
Restart=on-failure
99-
RestartSec=5
104+
User=YOUR_USER
105+
# 'video' is the standard group that owns /dev/video* on Debian / Ubuntu /
106+
# Raspberry Pi OS — needed to open USB cameras.
107+
SupplementaryGroups=video
108+
# Inherit a sane PATH so ffmpeg (system-installed) is found even when
109+
# systemd's default PATH skips /usr/local/bin.
110+
Environment=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
111+
# Suppress the TUI's ANSI cursor escapes so journalctl entries stay
112+
# line-oriented instead of full-screen redraws.
113+
Environment=NO_COLOR=1
114+
Environment=TERM=dumb
100115
Environment=RUST_LOG=info
116+
WorkingDirectory=/home/YOUR_USER
117+
ExecStart=/home/YOUR_USER/.sourcebox-sentry/sourcebox-sentry-cloudnode run
118+
StandardOutput=journal
119+
StandardError=journal
120+
Restart=on-failure
121+
RestartSec=5s
122+
# Stop retrying after 5 failures in a minute so logs stay readable.
123+
StartLimitIntervalSec=60
124+
StartLimitBurst=5
101125
102126
[Install]
103127
WantedBy=multi-user.target`}</code>
104128
<button className="docs-copy-btn" onClick={() => copyToClipboard(`[Unit]
105129
Description=SourceBox Sentry CloudNode
130+
Documentation=https://opensentry-command.fly.dev
106131
After=network-online.target
107132
Wants=network-online.target
108133
109134
[Service]
110135
Type=simple
111-
User=sentry
112-
WorkingDirectory=/opt/sourcebox-sentry
113-
ExecStart=/opt/sourcebox-sentry/sourcebox-sentry-cloudnode
114-
Restart=on-failure
115-
RestartSec=5
136+
User=YOUR_USER
137+
SupplementaryGroups=video
138+
Environment=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
139+
Environment=NO_COLOR=1
140+
Environment=TERM=dumb
116141
Environment=RUST_LOG=info
142+
WorkingDirectory=/home/YOUR_USER
143+
ExecStart=/home/YOUR_USER/.sourcebox-sentry/sourcebox-sentry-cloudnode run
144+
StandardOutput=journal
145+
StandardError=journal
146+
Restart=on-failure
147+
RestartSec=5s
148+
StartLimitIntervalSec=60
149+
StartLimitBurst=5
117150
118151
[Install]
119152
WantedBy=multi-user.target`)}>Copy</button>

frontend/src/pages/docs/Faq.jsx

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,17 +11,19 @@ function Faq() {
1111
"mute" toggle yet — remove or mute the input source if you need silent-only.
1212
</p>
1313

14-
<h3>Should I use the Windows MSI or the PowerShell installer?</h3>
14+
<h3>How do I install CloudNode on Windows?</h3>
1515
<p>
16-
Use the MSI for any node you want running 24/7 — it registers CloudNode as a
17-
Windows Service that auto-starts on boot, runs as <code>LocalSystem</code> (so
18-
it works without you being logged in), and lives under <code>C:\Program Files</code> /{" "}
19-
<code>C:\ProgramData</code> like a proper system service. The PowerShell one-liner
20-
installer is fine for a quick test or a personal-use foreground install, but
21-
once you log out the cameras stop streaming. The MSI is currently unsigned —
22-
SmartScreen warns "Windows protected your PC" on first run; click{" "}
23-
<strong>More info → Run anyway</strong>. See the{" "}
24-
<a href="#cloudnode-setup">CloudNode Setup</a> section for the full service flow.
16+
Download <code>sourcebox-sentry-cloudnode-windows-x86_64.msi</code> from the{" "}
17+
<a href="https://github.com/SourceBox-LLC/opensentry-cloud-node/releases/latest" target="_blank" rel="noopener noreferrer">latest GitHub release</a>{" "}
18+
and run it. The MSI is unsigned today, so SmartScreen will warn "Windows protected
19+
your PC" on first run — click <strong>More info → Run anyway</strong>. After install,
20+
click the <strong>SourceBox Sentry CloudNode</strong> shortcut from the Start menu —
21+
first launch runs the setup wizard, every launch after streams cameras directly. For
22+
24/7 unattended operation, the MSI also registers an optional Windows Service named{" "}
23+
<code>SourceBoxSentryCloudNode</code> that you can flip to auto-start; see the{" "}
24+
<a href="#cloudnode-setup">CloudNode Setup</a> section for details. There is no
25+
PowerShell one-liner installer — that path was retired in v0.1.31 because the MSI
26+
is the only Windows install that handles upgrades and Add/Remove Programs cleanly.
2527
</p>
2628

2729
<h3>Can I use IP cameras (RTSP) instead of USB?</h3>

frontend/src/pages/docs/GettingStarted.jsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ function GettingStarted() {
7070
<li>A USB webcam (built-in laptop cameras work too)</li>
7171
<li>A SourceBox Sentry account (free tier covers up to 5 cameras across 2 nodes, with 30 viewer-hours/month of live playback)</li>
7272
<li>A Linux, Windows, or macOS machine for CloudNode</li>
73-
<li>FFmpeg installed (or Docker) — the installer downloads it automatically on Windows</li>
73+
<li>FFmpeg installed (or Docker) — the setup wizard offers to install it via your OS package manager (<code>winget</code> on Windows, <code>brew</code> on macOS, <code>apt</code>/<code>dnf</code>/<code>pacman</code> on Linux)</li>
7474
<li>Outbound HTTPS access from the CloudNode machine to the internet</li>
7575
</ul>
7676

@@ -95,7 +95,7 @@ function GettingStarted() {
9595
<div className="docs-step-content">
9696
<h4>Install CloudNode</h4>
9797
<OsTabs id="qs" />
98-
<p>The installer downloads CloudNode, checks for FFmpeg, and walks you through setup.</p>
98+
<p>The installer downloads CloudNode and walks you through setup. If FFmpeg isn't already on the system, the wizard offers to install it via your OS package manager.</p>
9999
</div>
100100
</div>
101101
<div className="docs-step">

frontend/src/pages/docs/Troubleshooting.jsx

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,15 +24,20 @@ sudo usermod -a -G video $USER
2424
<p><strong>macOS:</strong> grant camera access in <strong>System Settings &gt; Privacy & Security &gt; Camera</strong> — you'll need to approve the terminal app running CloudNode.</p>
2525

2626
<h3>FFmpeg not found</h3>
27-
<p><strong>Windows:</strong> re-run <code>sourcebox-sentry-cloudnode setup</code>. The wizard downloads a portable FFmpeg into <code>./ffmpeg/bin/</code> if it's missing.</p>
28-
<p><strong>Linux / macOS:</strong> install via your package manager:</p>
27+
<p>CloudNode looks for FFmpeg on PATH. Install it via your OS package manager:</p>
2928
<div className="docs-code-block">
30-
<code>{`sudo apt install ffmpeg # Ubuntu / Debian
29+
<code>{`winget install Gyan.FFmpeg # Windows
30+
brew install ffmpeg # macOS
31+
sudo apt install ffmpeg # Ubuntu / Debian
3132
sudo dnf install ffmpeg # Fedora
32-
sudo pacman -S ffmpeg # Arch
33-
brew install ffmpeg # macOS`}</code>
34-
<button className="docs-copy-btn" onClick={() => copyToClipboard('sudo apt install ffmpeg')}>Copy</button>
33+
sudo pacman -S ffmpeg # Arch`}</code>
34+
<button className="docs-copy-btn" onClick={() => copyToClipboard('winget install Gyan.FFmpeg')}>Copy</button>
3535
</div>
36+
<p>
37+
Re-run <code>sourcebox-sentry-cloudnode setup</code> — the wizard offers to run the right
38+
command for your platform if FFmpeg still isn't on PATH. After a Windows winget install,
39+
open a new terminal so the updated PATH is picked up.
40+
</p>
3641

3742
<h3>Stream won't play in the dashboard</h3>
3843
<ol>

frontend/src/pages/docs/context.jsx

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,10 @@ export function DocsProvider({ children }) {
4949
const base = window.location.origin
5050
// Windows is intentionally absent — that platform installs via the MSI
5151
// from GitHub Releases (rendered as a download button in OsTabs) rather
52-
// than a curl-style one-liner. The PowerShell installer was retired
53-
// when the MSI shipped: the MSI registers a Windows Service, which is
54-
// the right execution model for an always-on camera node.
52+
// than a curl-style one-liner. There used to be a PowerShell installer
53+
// alongside the MSI; it was retired in v0.1.31 because the MSI is the
54+
// only Windows install path that handles upgrades + Add/Remove Programs
55+
// cleanly.
5556
const installCommands = {
5657
linux: `curl -fsSL ${base}/install.sh | bash`,
5758
macos: `curl -fsSL ${base}/install.sh | bash`,
@@ -146,9 +147,9 @@ export function OsTabs({ id }) {
146147
</a>
147148
<p style={{ marginTop: "0.75rem", fontSize: "0.9rem", color: "var(--text-muted)" }}>
148149
Run the MSI (UAC prompt; SmartScreen → <strong>More info → Run anyway</strong>),
149-
then open PowerShell as Administrator and run{" "}
150-
<code>sourcebox-sentry-cloudnode setup</code>. The MSI registers
151-
a Windows Service that auto-starts on boot.
150+
then open the <strong>SourceBox Sentry CloudNode</strong> shortcut from the
151+
Start menu. First launch runs the setup wizard; every launch after streams
152+
cameras directly.
152153
</p>
153154
</div>
154155
)}

0 commit comments

Comments
 (0)