- Stable udev device symlinks (/dev/jmri/nce, /dev/jmri/loconet, /dev/jmri/lcc) - jmri-monitor: polls Leviton Decora Smart switch to start/stop JMRI automatically - Quiet hours 1-10 AM (no polling) - 30s off-delay before shutdown - LCRR config cloned from Gitea (ssh://gitea.mk-labs.cloud:2221/rblundon/LCRR.git) - ~/.jmri symlinked to LCRR repo for GitOps config management - jmri-gui: X11 remote GUI access (PanelPro/DecoderPro) via ssh -X as jmri user - Stops daemon, launches GUI, restarts daemon on exit if layout still on - jmri user gets login shell + SSH key for GUI sessions - Full JRE installed (openjdk-21-jre) for AWT/X11 support
32 lines
835 B
Django/Jinja
32 lines
835 B
Django/Jinja
[Unit]
|
|
Description=JMRI Server (JmriFaceless)
|
|
Documentation=https://www.jmri.org/
|
|
# jmri-monitor starts and stops this service based on LocoNet traffic.
|
|
# Do NOT enable this unit directly — it is managed by jmri-monitor.service.
|
|
After=network.target systemd-udev-settle.service
|
|
|
|
[Service]
|
|
Type=simple
|
|
User={{ jmri_user }}
|
|
Group={{ jmri_group }}
|
|
WorkingDirectory={{ jmri_install_dir }}
|
|
ExecStart={{ jmri_install_dir }}/JmriFaceless --profile={{ jmri_profile_id }}
|
|
|
|
# Monitor owns lifecycle — do not auto-restart
|
|
Restart=no
|
|
|
|
# Give hardware time to settle on start
|
|
TimeoutStartSec=30
|
|
|
|
# Logging — view with: journalctl -u jmri -f
|
|
StandardOutput=journal
|
|
StandardError=journal
|
|
SyslogIdentifier=jmri
|
|
|
|
# Serial device access
|
|
SupplementaryGroups=dialout
|
|
|
|
[Install]
|
|
# Intentionally no WantedBy — started only by jmri-monitor
|
|
WantedBy=
|