Separate installation rollback from stopped full-state recovery, correct the install guide's automatic-backup promise and name the verified limited published snapshots. Keep shipped help matched, reject the original unsafe claims and exercise desktop and phone Docs links without claiming the unready backend has shipped. Contract-Neutral: Documentation and help verification only; no updater runtime or API contract changes. Change-source: pulse-maintainer
12 KiB
Pulse Server Automatic Updates
Pulse supports one-click server updates for supported deployment types. This document describes the Pulse server runtime, not installed Pulse Agents.
See Releases and update channels for Stable and Preview expectations, beta and RC testing stages, and the checks required before a release becomes stable.
Eligible v6 agents update asynchronously through their own update client. A
server update changes their target version but does not prove fleet convergence.
For v5, PVE, disabled, or failed agent updates, use Agent Doctor at
/settings/infrastructure?agentDoctor=1 or the installer in
Settings → Infrastructure → Install on a host. See
Unified Agent.
Supported Deployment Types
| Deployment | Auto-Update | Method |
|---|---|---|
| ProxmoxVE LXC | ✅ Yes | In-app update button |
| Systemd Service | ✅ Yes | In-app update button |
| Docker | ❌ Manual | Pull new image |
| Source Build | ❌ Manual | Git pull + rebuild |
Using One-Click Updates
When an Update is Available
- Navigate to Settings → System → Updates
- If an update is available, you'll see an "Install Update" button
- Click the button to open the confirmation dialog
- Review the update details:
- Current version → New version
- Estimated time
- Changelog highlights
- Click "Install Update" to begin
Update Process
- Download: New version is downloaded, its signature and checksum are verified
- Validate: The new binary is executed with
--versionto prove it runs on this host and reports the expected version, before anything is touched - Backup: Current installation is backed up
- Apply: Files are updated
- Restart: Service restarts automatically
- Verify: Health check confirms success
Progress Tracking
A real-time progress modal shows:
- Current step
- Download progress
- Any warnings or errors
- Automatic page reload on success
Configuration
Update Preferences
In Settings → System → Updates:
| Setting | Description |
|---|---|
| Update Channel | Stable (recommended for production) or Pre-release (opt-in preview) |
| Auto-Check | Enable or disable automatic updates |
Stored Settings (system.json)
Auto-update preferences are stored in system.json and edited via the UI.
{
"autoUpdateEnabled": false,
"updateChannel": "stable"
}
Note: The update schedule itself lives in the systemd timer (daily at 02:00 plus up to 4 hours of random delay), not in system.json. The legacy autoUpdateCheckInterval and autoUpdateTime fields were never consumed by anything and are ignored if present in older files.
Channel policy note: stable is the default and only recommended channel for paid or production environments. rc remains the internal channel key, but the user-facing meaning is an explicit pre-release preview path. In v6, unattended systemd auto-updates remain stable-only even if updateChannel is set to rc.
Manual Update Methods
Docker
Use Docker server updates. Change the configured image to
the exact release first, then pull and recreate only the Pulse service with the
same mounted data. Pulling another tag alone does not change the image in your
Compose file. Do not run docker compose down for a Pulse-only update or remove
its data volume.
Private Pro installs must keep the private image supplied by the
download page; replacing it with
rcourtman/pulse changes the runtime edition. Server updates and monitored
container updates are separate operations.
ProxmoxVE LXC (Manual)
sudo /bin/update
/bin/update is installed by the supported Pulse server installer and preserves the signed-installer trust chain. If your host does not have it yet, use the signed server-installer flow in INSTALL.md. Agent updates still use the /install.sh command generated in Settings → Infrastructure → Install on a host.
Systemd Service (Manual)
sudo /bin/update
/bin/update is installed by the supported Pulse server installer and preserves the signed-installer trust chain. If your host does not have it yet, use the signed server-installer flow in INSTALL.md. Agent updates still use the /install.sh command generated in Settings → Infrastructure → Install on a host.
Source Build
cd /path/to/pulse
git pull
make build
sudo systemctl restart pulse
Rollback
An update error or a stuck progress modal does not prove that the old version is still running. Check the running version and service health before retrying or restoring anything; preserve the update error, logs and history. Do not run another update just to reproduce a failure.
Before any rollback, take a consistent private backup of the current state and check the proposed backup's scope. Keep the failed installation and update snapshots until recovery is verified. Returning to an older binary is not a full-state recovery. Restoring a matching data snapshot can discard settings, alert changes and history written since that snapshot.
Automatic Rollback
The in-app updater creates an installation snapshot before applying files. If applying files fails, it attempts to restore that snapshot and logs any restore error. This is not a guarantee that every update failure restores all state or restarts successfully. Confirm the running version, connections and service health afterwards; a progress message alone is not recovery evidence.
Roll back from Update History
If your installed version offers it, open Settings → System → Updates → Update History. Roll back is offered for a successful in-app update with a retained backup. The confirmation names the version before that update and Pulse restarts to use the restored binary. Check that version and the actual backup contents before confirming.
Update History is not a full-state recovery tool. Its restore scope depends
on the installed updater. Older updaters may replace data/, config/ and
.env under the installation directory, but omit active data stored elsewhere.
Do not assume later settings and alert changes will be reverted, even if the
confirmation says so. If active data shares those installation paths, do not
restore it while Pulse is running; use the stopped-service procedure in
Manual Rollback.
Older versions may not have this control. An absent button or backup does not justify deleting data or creating an empty configuration. Docker server installs use their previous image and matching data backup, not this in-app rollback.
What an update snapshot contains
In-app snapshots normally live at backup-<timestamp>/ under the runtime data
directory (usually /etc/pulse), with /tmp/pulse-backup-<timestamp> as a
low-space fallback. Use the backup_path recorded for the actual update in
update-history.jsonl, rather than guessing a timestamp. The updater retains
the most recent three snapshots; a /tmp snapshot may also be lost on reboot.
Snapshot scope is version-specific. The published v6.4.5 and v6.4.6-rc.1 in-app updaters use the limited installation snapshot described below. Do not assume a backup made by another updater version has the same contents or restore behaviour.
The limited snapshot copies the running server binary, available VERSION and
.env files, and available data/ and config/ directories under
PULSE_INSTALL_DIR (default /opt/pulse). It is not necessarily a complete
backup of the active PULSE_DATA_DIR, external metrics/audit stores, service
units, bundled agents or update helpers. Copy errors can leave a partial
snapshot: a recorded path is not proof that every file was saved.
A backup's existence, or the presence of a database file, does not establish completeness, consistency or that Update History will restore it. A snapshot that includes active data still needs a verified, stopped-service recovery procedure; its presence is not permission to rewind live runtime stores.
Verify the backup against your effective service paths and update logs. Preserve
the active data directory, matching .encryption.key, audit history and its
signing key together, including custom paths and organisation directories. Use
a stopped, consistent filesystem/volume backup; copying a live .db file alone
can omit SQLite sidecar files. Keep these backups private, not in an issue or
diagnostic attachment. See configuration paths and
audit storage and safe recovery.
Manual Rollback
If Pulse cannot start, work inside the Pulse host or LXC, not on the Proxmox host itself. Start with read-only service discovery:
systemctl is-active pulse
systemctl show pulse --property=FragmentPath --property=DropInPaths
An inactive service makes is-active return non-zero; that is useful evidence,
not a reason to reset it. Inspect the named unit and drop-ins locally for the
effective executable, PULSE_INSTALL_DIR and PULSE_DATA_DIR. Do not post full
service environments or .env contents; they may contain credentials.
- Stop Pulse before taking the failed-state backup or replacing files. Preserve
the actual executable, distribution files, unit/drop-ins and every active
data path, not just a guessed
/opt/pulse/datadirectory. - Match the retained backup to the intended pre-update version. Check its files and the update log for missing/copy-failed entries. If the backup is missing, partial or has the wrong scope, stop here; do not delete live directories to make a restore fit.
- Prefer restoring a verified pre-update filesystem/volume snapshot with your host backup tooling. Check it in an isolated recovery instance first, with no access to monitored systems or notification destinations. Do not start a second connected copy with the same agent identities.
- For a file-level repair, stage verified replacements and keep reversible copies of the failed state. Restore only the confirmed paths, ownership and permissions for this deployment. Do not merge unrelated snapshots, delete data/configuration directories, or regenerate encryption or signing keys.
- Start Pulse and verify the running version and edition, service health, saved connections, agent identities and retained history. If any check fails, preserve the error and backups rather than retrying the update blindly.
For Docker, change the configured image back to the recorded previous tag or digest and recreate only Pulse with its existing volume. An older image may not understand data migrated by the newer version; use a verified matching data backup when required. Never remove the volume or initialise a fresh one as a rollback shortcut. An image change alone is not a data rollback.
Update History
History entries are stored in update-history.jsonl under the Pulse data directory (/etc/pulse or /data), and exposed via GET /api/updates/history (admin auth required).
Systemd/LXC update runs write detailed logs to /var/log/pulse/update-<timestamp>.log.
Troubleshooting
Update button not showing
- Check if your deployment supports auto-update
- Verify an update is actually available
- Ensure you have the latest frontend loaded (hard refresh)
Update failed
- Check the error message in the progress modal
- Review logs:
journalctl -u pulse -n 100or/var/log/pulse/update-<timestamp>.log - Verify disk space is available for both the extracted release payload and a rollback snapshot of your current install
- Check network connectivity to GitHub
Service won't restart after update
- Check systemd status:
systemctl status pulse - View recent logs:
journalctl -u pulse -f - Manually restore from backup if needed