Files
LEDMatrix/systemd/README.md
T
ChuckandClaude Opus 5 1eed7ff485 feat(web): weekly automatic updates with health check and rollback
A General-tab toggle (off by default) checks for and installs LEDMatrix and
plugin updates once a week, overnight in the configured timezone.

- Pre-update checks skip (and report) instead of forcing: local edits or
  commits, merge/live rebase, no upstream, low disk, missing health check, or
  a version that was already rolled back. An abandoned rebase (HEAD back on a
  branch) is cleared, since it would otherwise block every pull.
- The pull reuses the Update Code path (now perform_core_update(), which
  reports dependency install failures as data).
- ledmatrix-update-verify.service, started via a .path unit from a request
  file, restarts the services from its own cgroup, requires them to come up
  and stay up, and otherwise resets to the previous commit and reinstalls the
  previous requirements. It runs a copy of the checker taken before the pull.
- No SSH needed: switching the toggle on restarts the display service, which
  (as root) installs the two units from the repo templates for the web user.
  first_time_install.sh installs them too and takes --enable-auto-update /
  LEDMATRIX_AUTO_UPDATE (passed through by one-shot-install.sh).
- Plugins update after the code passes its check; failures, blocks and
  rollbacks raise an Overview banner and show under the toggle.

Tested end to end on a Pi: web-UI setup, a good update, a broken web service
and a broken display (both rolled back), a blocked local edit, and an
abandoned rebase found on the device.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-14 17:37:35 -04:00

108 lines
4.0 KiB
Markdown

# Systemd Service Files
This directory contains systemd service unit files for LEDMatrix services.
## Service Files
- **`ledmatrix.service`** - Main LED Matrix display service
- Runs the display controller (`run.py`)
- Starts automatically on boot
- Runs as root for hardware access
- **`ledmatrix-web.service`** - Web interface service
- Runs the web interface conditionally based on config
- Starts automatically on boot if `web_display_autostart` is enabled
- Uses `scripts/utils/start_web_conditionally.py`
- **`ledmatrix-update-verify.service`** / **`.path`** - Automatic update health check and rollback
- The path unit starts the service when the web interface creates
`data/auto_update_verify.request` after a weekly automatic update
- Installed by the installers, or by the display service when automatic
updates are turned on in the web UI (`src/auto_update_setup.py`)
- Restarts the services, checks they stay up, and otherwise resets to the
previous commit and its dependencies
- Runs `data/auto_update_verifier.py`, a copy of
`scripts/utils/auto_update_verify.py` taken before the update
- **`ledmatrix-wifi-monitor.service`** - WiFi monitor daemon service
- Monitors WiFi/Ethernet connectivity
- Automatically enables/disables access point mode
- Uses `scripts/utils/wifi_monitor_daemon.py`
- **`ledmatrix-dns-fix.service`** - DNS single-request fix (optional)
- Re-applies `options single-request` to the resolver on every boot,
because whatever manages `resolv.conf` regenerates it and drops the
option again
- Works around glibc's parallel A/AAAA lookup stalling ~5s per name on
routers that answer only the A query, which makes any plugin calling an
external API slow or (for Starlark apps, which have a render timeout)
fail outright
- Uses `scripts/utils/apply_dns_single_request.sh`
- Install only if external API calls are timing out; it is not part of a
normal install
- **`ledmatrix-mqtt-bridge.service`** - Home Assistant MQTT bridge (optional)
- Exposes the display to Home Assistant over MQTT Discovery: force a mode,
stop on-demand, toggle power, set brightness
- Uses `integrations/mqtt_bridge/ledmatrix_mqtt_bridge.py`, which drives the
web API rather than the display directly
- Needs `integrations/mqtt_bridge/bridge_config.json`; see that directory's
README
## Installation
These service files are installed by the installation scripts in `scripts/install/`:
- `install_service.sh` installs `ledmatrix.service`
- `install_web_service.sh` installs `ledmatrix-web.service` and the
`ledmatrix-update-verify` service and path units
- `install_wifi_monitor.sh` installs `ledmatrix-wifi-monitor.service`
- `install_dns_fix.sh` installs `ledmatrix-dns-fix.service` (opt-in, not run
by the normal installer)
- `install_mqtt_bridge.sh` installs `ledmatrix-mqtt-bridge.service` (opt-in)
## Manual Installation
> **Important:** the unit files in this directory contain
> `__PROJECT_ROOT_DIR__` placeholders that the install scripts replace
> with the actual project directory at install time. Do **not** copy
> them directly to `/etc/systemd/system/` — the service will fail to
> start with `WorkingDirectory=__PROJECT_ROOT_DIR__` errors.
>
> Always install via the helper script:
>
> ```bash
> sudo ./scripts/install/install_service.sh
> ```
>
> If you really need to do it by hand, substitute the placeholder
> first:
>
> ```bash
> PROJECT_ROOT="$(pwd)"
> sed "s|__PROJECT_ROOT_DIR__|$PROJECT_ROOT|g" systemd/ledmatrix.service \
> | sudo tee /etc/systemd/system/ledmatrix.service > /dev/null
> sudo systemctl daemon-reload
> sudo systemctl enable ledmatrix.service
> sudo systemctl start ledmatrix.service
> ```
## Service Management
```bash
# Check status
sudo systemctl status ledmatrix.service
# Start/stop/restart
sudo systemctl start ledmatrix.service
sudo systemctl stop ledmatrix.service
sudo systemctl restart ledmatrix.service
# Enable/disable autostart
sudo systemctl enable ledmatrix.service
sudo systemctl disable ledmatrix.service
# View logs
journalctl -u ledmatrix.service -f
```