Appearance
Appliance System: Hostname, Time, Power and Services
Last updated
Appliance → System (admin only) shows the health of the hardware and data stores and lets you rename the appliance, set its clock and time zone, restart services, and reboot or shut down.
System information
The top card shows the board model (e.g. the appliance Rev 1.1), the OS, and four tiles, refreshed every 10 seconds:
| Tile | Meaning | Watch for |
|---|---|---|
| CPU Temp | SoC temperature | Shown in red above 75 °C; the Pi throttles at about 80 °C |
| Load (1m) | One-minute load average | Above 4 on the appliance (4 cores) means work is queuing |
| Memory | Percent used, GB free of total | Bar turns red above 90% |
| Disk | Percent used on / | Bar turns red above 90%; the historian stops writing when the disk is full |
Below: Uptime, Kernel, Host.
Data Stores
| Row | Healthy | Down means |
|---|---|---|
| Config DB (SQLite) | ok · N MB (quick integrity check and total size including WAL) | Integrity problem — run the full health check |
| Historian (InfluxDB) | vX.Y · db "scadaink" | InfluxDB is not answering on its URL within 3 s (unreachable — historian disabled); tag history is not being stored. Try Restart InfluxDB. |
Hostname
Click Edit, type the new name, Save. Letters, digits and hyphens, starting with a letter or digit, up to 63 characters (Invalid hostname (letters, digits, hyphens; max 63 chars)). The HTTPS certificate is re-issued automatically so the new name is covered (unless you installed your own). Clients that reach the appliance by <hostname>.local must use the new name.
Date & Time
| Control | What it does |
|---|---|
| Device clock | The appliance's current time, shown in your browser's time zone |
| Sync automatically (NTP) | Turns systemd time synchronization on or off immediately. When on, the badge shows synced or syncing… |
| Timezone | Pick from the system list and click Set |
- NTP uses the servers set on the Time Servers (NTP) card below, or the operating system's defaults (the Debian public pool) when none are set. On an air-gapped network, enter a time server on that network there. Without one the badge stays syncing… and the clock drifts. If the appliance has no battery-backed clock, the time may be wrong after a power cut until NTP succeeds.
- With Sync automatically (NTP) off, a Set the time by hand field appears. Type the date and time, or click Copy from this computer to take it from the browser, then Set. The time is read in the appliance's own time zone, so set the zone first. The same thing over the API:
PUT /api/appliance/system/timewith{ "ntpEnabled": false, "manualTime": "2026-09-15T14:30:00Z" }. - The time zone affects shift boundaries, schedules, report periods and the time shown in logs. Set it before configuring shifts.
- Wrong time breaks two-factor codes and makes certificates look not-yet-valid.
Time Servers (NTP)
Choose the NTP servers the appliance's clock syncs to, and see how syncing is going.
| Row | Shows |
|---|---|
| Status | synced, syncing…, or NTP off (turn it on under Date & Time) |
| Syncing to | The server the clock is following now, and its address |
| Offset | How far the clock was from that server at the last exchange, and the round-trip delay |
| Stratum | The server's distance from a reference clock (1 = attached to one), and the current poll interval |
| Last sync | When the clock last synchronized successfully |
Type one server per line — a host name or an IP address, at most 8 — and click Apply servers. The change takes effect at once: the appliance writes the servers to its own systemd-timesyncd setting (/etc/systemd/timesyncd.conf.d/scada-ink.conf) and restarts time syncing. While servers are set, only those servers are used: the public fallback pool is turned off, so an isolated network does not keep trying the internet. Clear the list and apply to go back to the system defaults, which the hint under the box names.
- The card needs systemd-timesyncd, which Raspberry Pi OS uses. On an appliance running chrony it says so and leaves the servers to
/etc/chrony/chrony.conf. - An appliance installed before this card existed needs its installer run once more before it may change time servers. Until then the card says This appliance needs its installer run once more before it may change time servers with a See Installer update link, and Apply servers reports This appliance is not yet permitted to change its time servers. See Installer update below.
- Each change is in the audit log as
appliance.system.ntp.
Installer update
A software update installed from the Software update card replaces the application only. Some features also need something set up in the operating system: a permission in the appliance's sudo allowlist, a program, a capability on a program, a folder or a setting. Only the installer (deploy/install-pi.sh) sets those up, so an appliance first installed with an older version lacks them until the installer is run again.
The Installer update card (under Data Stores) checks each of them on the appliance itself, shortly after the API starts, every 6 hours, and when you click Check again. The checks only look: they read the sudo allowlist (sudo -n -l), a program's capabilities (getcap) and whether files and folders exist. They never run the commands they check.
| Item | Needed by |
|---|---|
| Permission to change network settings | Network tab |
| Permission to rename the appliance | Hostname |
| Permission to set the time zone, NTP and the clock | Date & Time |
| Permission to set time servers and restart time syncing; the time-server settings folder | Time Servers (NTP) |
| Permission to restart the API, driver and InfluxDB services | Power & Services |
| Permission to reboot and shut down | Power & Services |
| Permission to start the software updater; the software updater service; an API service definition that supports software updates | Software updates |
Permission to reload the web server after a certificate change; the web server's HTTPS site; the certificate folder setting (TLS_DIR) | HTTPS certificates |
| The arp-scan program; raw network access for arp-scan (CAP_NET_RAW) | Network scanner (devices on other subnets) |
| Chromium | PDF and scheduled reports |
The script host service (scada-ink-scripts); the mount point for the sandboxed script runner; a script host service that runs the installed version's script runner and Python runtime; membership of the scadaink-scripts group | Scripts and workflow expressions, and Python scripts |
The Python package store (/var/lib/scada-ink-python/packages) | Python scripts and the Python Packages page |
The script host runs the script runner and the offline Python runtime straight from the installed version, read-only, so a software update brings a new runner with it. Appliances installed before October 19, 2026 ran a copy made by the installer, which software updates never refreshed: the card lists A script host service that runs the installed version's script runner and Python runtime as missing on those until the installer is run once more. | Access to the service logs (systemd-journal group) | Service log viewer | | Data Tables stored outside the install folder (SQLITE_USERDATA_PATH) | Data Tables | | This appliance's signing and encryption keys in the settings file (JWT_SECRET) | Sign-in and stored secrets |
When everything is present the card says Everything the installer sets up for this version is in place. Otherwise it says This appliance needs its installer run once more, lists the Missing items with the feature that needs each, and gives the fix. Show all checks lists the ones that pass too. An item it could not check shows Unknown.
To fix: copy the Scada.Ink release folder for the installed version, or a newer one, to the appliance (usually ~/Scada-ink), and from that folder run:
sudo bash deploy/install-pi.shDo not run the copy in /opt/scadaink. Software updates do not refresh it, and it would rebuild an older version over the installed one. The installer is safe to run again: it keeps your database and settings, and restarts the services (data collection pauses for a minute or two). Take a backup first all the same. Then click Check again.
While anything is missing, administrators also see a strip under the top bar, Some features need this appliance's installer run once more, with a Show what is missing link to the card. Dismissing it hides it in that browser until a different item goes missing.
The same answer is the tag _STATUS/System/InstallerUpdateNeeded on the Local Tags device (true while anything is missing), so you can put an alarm rule on it like any other tag.
On a development machine, or anything that is not an installed Linux appliance, the card says the checks do not apply.
Per-appliance secrets and admin password
Every appliance has its own JWT_SECRET and JWT_REFRESH_SECRET in /opt/scadaink/.env. They sign sign-in sessions, and JWT_SECRET is also the key that stored secrets, database and broker passwords, and two-factor secrets are encrypted with. The installer writes them once:
| Appliance | What the installer does |
|---|---|
| New install | Generates a random value for each |
Installed before this, secrets in apps/api/data/.jwt-secret and .jwt-refresh-secret | Copies those same values into .env — nothing changes, nobody is signed out |
.env already has them | Leaves them alone, every time |
On a new install it also generates the admin password; see First login. An existing appliance keeps its password; the installer warns if admin@scada.ink still uses admin.
The API refuses to start as a production service when a secret is shorter than 32 characters, is a placeholder (such as changeme), when both are the same, or when neither .env nor the old file holds one. The service log then says why, starting Refusing to start in production. Never put a new value in by hand on a running appliance: everything encrypted under the old one becomes unreadable.
Power & Services
| Button | What happens | Use it when |
|---|---|---|
| Restart API | Restarts scada-ink-api. The UI disconnects until the service is back; alarms, workflows, scripts and ladder logic stop during the restart and live tag values go stale. The sandboxed script host (scada-ink-scripts, which runs scripts and workflow expressions) restarts with it. | After a backup import, factory reset or selective import; after changing .env |
| Restart Drivers | Restarts scada-ink-drivers; every device disconnects and reconnects | Devices stuck in error after network changes |
| Restart InfluxDB | Restarts the historian database; history writes pause | Historian row shows DOWN |
| Reboot | Asks Reboot the appliance? (unreachable for ~30–60 seconds), then reboots after 1.5 s | Kernel or OS updates, hardware hangs |
| Shut Down | Asks Shut down the appliance? (must be switched on physically to return) | Before removing power or opening the enclosure |
Every button asks first — for example Restart the API? — and does nothing until you confirm; Cancel or Esc backs out. A restart then shows Restart command sent. All actions are recorded in the audit log (appliance.system.restart, appliance.system.reboot, appliance.system.shutdown).
Warning: Everything that controls equipment — ladder logic outputs, workflow and script writes — stops during an API restart or reboot. Put the process in a safe state first.
Cloud health and software updates
The Cloud health reporting and software update cards at the bottom of this tab are described in Getting Started.
| Method | Endpoint | Purpose |
|---|---|---|
| GET | /api/appliance/system | Model, OS, temperature, load, memory, disk, time zone, NTP status |
| GET | /api/appliance/system/datastores | SQLite and InfluxDB health |
| GET | /api/appliance/system/timezones | Time zone list |
| PUT | /api/appliance/system/hostname | { "hostname": "scada-line3" } |
| PUT | /api/appliance/system/time | { "timezone": "America/Chicago" }, { "ntpEnabled": true }, or manual time |
| GET | /api/appliance/system/ntp | Time servers set, system defaults, sync status, current server, offset, delay, stratum, last sync |
| PUT | /api/appliance/system/ntp | { "servers": ["192.168.10.1", "ntp.plant.local"] }; [] returns to the system defaults |
| GET | /api/appliance/system/requirements | What the installer must have set up: each item's id, feature, status (ok, missing or unknown) and fix (last result, cached) |
| POST | /api/appliance/system/requirements/recheck | Check them again now |
| POST | /api/appliance/system/service/:service/restart | service = api, drivers or influxdb |
| POST | /api/appliance/system/power | { "action": "reboot" } or "shutdown" |
Troubleshooting
| Symptom / message | Cause | Fix |
|---|---|---|
| CPU Temp shows — | Not a Pi, or the thermal sensor is unreadable | None needed off-Pi |
Errors mentioning sudo on Save/Set/restart | A permission problem on the appliance itself | Contact Scada.Ink support or your integrator |
| Time zone list is empty | The appliance can't report time zones | Contact Scada.Ink support or your integrator |
| NTP stays syncing… | No time server reachable from the appliance's network | Enter a time server on that network under Time Servers (NTP), or turn NTP off and set the time by hand |
| "…" is not a host name or IP address | A server entry has spaces, punctuation or other characters a server name can't have | Enter just the name or address, one per line |
| This appliance is not yet permitted to change its time servers | Installed before the Time Servers card existed | Run the installer once, as the Installer update card says |
| Banner Some features need this appliance's installer run once more, or the Installer update card lists Missing items | The appliance was updated in the app, and the new version needs a permission, program or folder that only the installer sets up | Run the installer once from the release folder of the installed version or newer (usually ~/Scada-ink): sudo bash deploy/install-pi.sh. Then click Check again |
| Installer update item shows Unknown | The check itself could not run (for example getcap is not installed, or sudo failed for another reason) | Run the installer once; if it stays unknown, contact Scada.Ink support or your integrator |
| Page stops loading after Restart API | Normal while the service comes back | Wait 30 s and reload |